EADST

YOLOv5: Infer the Image with ONNX

YOLOv5: Infer the Image with ONNX

Convert to the onnx model from our well-trained pt model

python export.py --weights ./runs/train/exp/best.pt --include onnx

Infer the image with the onnx model

import os
import cv2
import numpy as np
import onnxruntime
import time

CLASSES=["b", "t"]

class YOLOV5(): def init(self,onnxpath): self.onnx_session=onnxruntime.InferenceSession(onnxpath) self.input_name=self.get_input_name() self.output_name=self.get_output_name()

def get_input_name(self):
    input_name=[]
    for node in self.onnx_session.get_inputs():
        input_name.append(node.name)
    return input_name

def get_output_name(self):
    output_name=[]
    for node in self.onnx_session.get_outputs():
        output_name.append(node.name)
    return output_name

def get_input_feed(self,img_tensor):
    input_feed={}
    for name in self.input_name:
        input_feed[name]=img_tensor
    return input_feed

def inference(self,img_path):
    img=cv2.imread(img_path)
    or_img=cv2.resize(img,(640,640))
    img=or_img[:,:,::-1].transpose(2,0,1)  #BGR2RGB and HWC2CHW
    img=img.astype(dtype=np.float32)
    img/=255.0
    img=np.expand_dims(img,axis=0)
    input_feed=self.get_input_feed(img)
    pred=self.onnx_session.run(None,input_feed)[0]
    return pred,or_img

def nms(dets, thresh): x1 = dets[:, 0] y1 = dets[:, 1] x2 = dets[:, 2] y2 = dets[:, 3]

areas = (y2 - y1 + 1) * (x2 - x1 + 1)
scores = dets[:, 4]
keep = []
index = scores.argsort()[::-1]

while index.size > 0:
    i = index[0]
    keep.append(i)

    x11 = np.maximum(x1[i], x1[index[1:]]) 
    y11 = np.maximum(y1[i], y1[index[1:]])
    x22 = np.minimum(x2[i], x2[index[1:]])
    y22 = np.minimum(y2[i], y2[index[1:]])

    w = np.maximum(0, x22 - x11 + 1)                              
    h = np.maximum(0, y22 - y11 + 1)

    overlaps = w * h

    ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)
    idx = np.where(ious <= thresh)[0]
    index = index[idx + 1]
return keep

def xywh2xyxy(x): # [x, y, w, h] to [x1, y1, x2, y2] y = np.copy(x) y[:, 0] = x[:, 0] - x[:, 2] / 2 y[:, 1] = x[:, 1] - x[:, 3] / 2 y[:, 2] = x[:, 0] + x[:, 2] / 2 y[:, 3] = x[:, 1] + x[:, 3] / 2 return y

def filter_box(org_box,conf_thres,iou_thres): org_box=np.squeeze(org_box) conf = org_box[..., 4] > conf_thres box = org_box[conf == True]

cls_cinf = box[..., 5:]
cls = []
for i in range(len(cls_cinf)):
    cls.append(int(np.argmax(cls_cinf[i])))
all_cls = list(set(cls))

output = []
for i in range(len(all_cls)):
    curr_cls = all_cls[i]
    curr_cls_box = []
    curr_out_box = []
    for j in range(len(cls)):
        if cls[j] == curr_cls:
            box[j][5] = curr_cls
            curr_cls_box.append(box[j][:6])
    curr_cls_box = np.array(curr_cls_box)
    # curr_cls_box_old = np.copy(curr_cls_box)
    curr_cls_box = xywh2xyxy(curr_cls_box)
    curr_out_box = nms(curr_cls_box,iou_thres)
    for k in curr_out_box:
        output.append(curr_cls_box[k])
output = np.array(output)
return output

def draw(image,box_data):

boxes=box_data[...,:4].astype(np.int32) 
scores=box_data[...,4]
classes=box_data[...,5].astype(np.int32)

for box, score, cl in zip(boxes, scores, classes):
    top, left, right, bottom = box
    print('class: {}, score: {}'.format(CLASSES[cl], score))
    print('box left,top,right,down: [{}, {}, {}, {}]'.format(top, left, right, bottom))

    text_left = left
    text_top = top         
    color = (255, 0, 0)
    if CLASSES[cl] == "b":
        text_left += 50
        text_top -= 20     
        color = (0, 0, 255)
    cv2.rectangle(image, (top, left), (right, bottom), color, 2)
    cv2.putText(image, CLASSES[cl],
                (text_top, text_left),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.6, color, 2)

if name=="main": onnx_path = "best.onnx" model = YOLOV5(onnx_path) img_path = "0_0.jpg" output, img = model.inference(img_path) outbox = filter_box(output,0.5,0.5) draw(img, outbox) cv2.imwrite(img_path[:-4]+"_res.jpg", img)

Reference:

YOLOV5模型转onnx并推理

相关标签
About Me
XD
Goals determine what you are going to be.
Category
标签云
Proxy uwsgi Land Card Markdown 音频 Windows 图标 腾讯云 Transformers Clash COCO Plate 域名 GoogLeNet RAR git-lfs git Excel 第一性原理 UI SPIE Website PDB Animate 净利润 Augmentation WebCrawler LLAMA TSV Heatmap Django Tiktoken ONNX 搞笑 Firewall NLTK Cloudreve Claude Qwen2 Michelin CC Mixtral Base64 Rebuttal BTC Paddle Ubuntu Food ResNet-50 uWSGI Git Pickle 顶会 Python Safetensors Color Vim CEIR SAM Bitcoin 多进程 tar Web Sklearn Magnet Pillow Nginx 公式 FastAPI diffusers C++ Ptyhon 签证 FlashAttention Plotly tqdm Algorithm TTS JSON Paper IndexTTS2 llama.cpp FP8 icon QWEN Numpy 云服务器 Bert Baidu Conda Template 报税 Dataset Hotel Shortcut OpenCV HaggingFace XML News v0.dev Pytorch Distillation API Diagram 关于博主 InvalidArgumentError SQLite Tracking Zip Pandas Hilton PyCharm CAM Logo Gemma VSCode Search Miniforge MD5 Vmess Translation ChatGPT LoRA scipy PIP YOLO TensorFlow Docker FP16 AI 继承 Bin Permission DeepStream 飞书 Random Llama Anaconda hf VGG-16 Interview Video Image2Text CSV 多线程 v2ray Statistics 证件照 Linux CUDA Knowledge NameSilo Use GIT DeepSeek WAN Github XGBoost BF16 Jupyter 阿里云 torchinfo Google RGB OpenAI logger Review Agent BeautifulSoup Freesound Attention CTC CV Datetime 图形思考法 算法题 FP64 Quantization Streamlit NLP Crawler Disk 版权 EXCEL Tensor Math Quantize Qwen OCR LLM LaTeX PyTorch VPN FP32 GPT4 ModelScope Qwen2.5 PDF SQL SVR Input Breakpoint TensorRT CLAP 财报 Jetson HuggingFace Domain UNIX Hungarian printf Password LeetCode mmap 递归学习法 强化学习 Data GGML transformers Bipartite GPTQ
站点统计

本站现有博文323篇,共被浏览795415

本站已经建立2493天!

热门文章
文章归档
回到顶部