微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
ONNX格式输入与输出
python export.py --weights yolov5s-seg.pt --include onnx
运行结果如下:
OpenCV DNN推理
def detect(image, net):
# 1x3x640x640
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (INPUT_WIDTH, INPUT_HEIGHT), swapRB=True, crop=False)
net.setInput(blob)
preds = net.forward()
return preds
修改为:
def detect(image, net):
rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)
input_image = cv.resize(src=rgb, dsize=(INPUT_WIDTH, INPUT_HEIGHT))
blob_img = np.float32(input_image) / 255.0
input_x = blob_img.transpose((2, 0, 1))
input_blob = np.expand_dims(input_x, 0)
net.setInput(input_blob)
layer = net.getUnconnectedOutLayersNames()
masks, preds = net.forward(layer)
return preds, masks
color_mask = np.zeros((fh, fw, 3), dtype=np.uint8)
black_mask = np.zeros((fh, fw), dtype=np.float32)
mv = cv.split(color_mask)
for i in range(len(boxes)):
x1, y1, x2, y2 = boxes[i]
x1 = max(0, x1)
y1 = max(0, y1)
classid = class_ids[i]
m1 = masks[i]
mask = np.reshape(sigmoid(np.matmul(m1, mask2)), (160, 160))
mx1 = max(0, np.int((x1 * sx)/x_factor))
mx2 = max(0, np.int((x2 * sx)/x_factor))
my1 = max(0, np.int((y1 * sy)/y_factor))
my2 = max(0, np.int((y2 * sy)/y_factor))
mask_roi = mask[my1:my2,mx1:mx2]
result_mask = cv.resize(mask_roi, (x2-x1, y2-y1))
result_mask[result_mask > 0.5] = 1.0
result_mask[result_mask <= 0.5] = 0.0
rh, rw = result_mask.shape
if (y1+rh) >= fh:
rh = fh - y1
if (x1+rw) >= fw:
rw = fw - x1
black_mask[y1:y1+rh, x1:x1+rw] = result_mask[0:rh, 0:rw]
mv[2][black_mask == 1], mv[1][black_mask == 1], mv[0][black_mask == 1] = \
[np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]
color = colors[int(classid) % len(colors)]
cv.rectangle(frame, (x1, y1), (x2, y2), color, 2)
cv.rectangle(frame, (x1, y1 - 20), (x2, y1), color, -1)
cv.putText(frame, class_list[classid], (x1, y1 - 10), cv.FONT_HERSHEY_SIMPLEX, .5, (0, 0, 0))
把这段代码放在NMS之后,替换YOLOv5对象检测的NMS之后的解析代码即可。最终Python版本OpenCV DNN推理的运行效果如下:
速度这么慢,怒而改成OpenCV DNN C++推理,N卡加持:
基本上可以跑到40FPS左右,感觉很不错了!
扫码查看OpenCV+OpenVIO+Pytorch系统化学习路线图
推荐阅读
CV全栈开发者说 - 从传统算法到深度学习怎么修炼
2022入坑深度学习,我选择Pytorch框架!
Pytorch轻松实现经典视觉任务
教程推荐 | Pytorch框架CV开发-从入门到实战
OpenCV4 C++学习 必备基础语法知识三
OpenCV4 C++学习 必备基础语法知识二
OpenCV4.5.4 人脸检测+五点landmark新功能测试
OpenCV4.5.4人脸识别详解与代码演示
OpenCV二值图象分析之Blob分析找圆
OpenCV4.5.x DNN + YOLOv5 C++推理
OpenCV4.5.4 直接支持YOLOv5 6.1版本模型推理
OpenVINO2021.4+YOLOX目标检测模型部署测试
比YOLOv5还厉害的YOLOX来了,官方支持OpenVINO推理