AI学习者 · 2021年06月30日

YOLOv5x6模型来了! 同样支持CPU上ONNX部署与推理

转载于:OpenCV学堂
作者:gloomyfish

引言:

说一下是YOLOv5的第五个版本不是YOLO的第五个版本!是YOLOv5又又改进了!

01

YOLOv5x6模型来了

自从Pytorch版本YOLOv5发布之后,经历过了四个版本的升级,YOLOv5的功能与模型精度不断提升。不久之前YOLOv5-Pytorch发布第五个版本,第五个版本跟之前版本最大的差异就是多出了一个输出层,之前的输出层分辨率倍数为:[8、16、32]三个层的输出。现在YOLOv5多出的一个输出层之后,它的输出变为:[8、16、32、64]。但是我找遍了model文件夹中的模型描述文件,没发现跟模型对应的描述文件,所以我就不知道是否可以支持训练。这里我就重点说一下如何使用已经发布的YOLOv5支持四层输出的模型:
image.png
image.png

别担心之前的第四版本模型都可以用,模型命名带数字6的都是支持四个输出层的,以YOLOv5s6为例,转ONNX格式查看截图如下:

image.png

02

数值精度取舍

首先需要需要运行下面的命令行获取整个YOLOv5项目的源码:

git clone https://github.com/ultralytics/yolov5.git

然后测试运行:

image.png

测试没有问题,就可以转换模型yolov5s6为ONNX格式,命令行如下:

image.png

这样就获取到了ONNX格式文件,注意它的对应输出格式为:

1x3x1280x1280

导入模型

model_onnx = "D:/python/yolov5/yolov5s6.onnx"

处理输入图象与推理

rgb = cv.cvtColor(frame, cv.COLOR_BGR2RGB)

解析输出结果:

for out in outs:
    out = np.squeeze(out, 0)
    dims, side_h, side_w, side_data = out.shape
    side_square = side_h * side_w
    stride = get_stride(side_w)
    anchor_index = get_anchor_index(side_w)
    for i in range(side_square):
        for d in range(dims):
            row = i // side_h;
            col = i % side_h;
            box_data = out[d, row, col]
            conf = sigmoid(box_data[4]);
            if conf < 0.25:
                continue
            xx = (sigmoid(box_data[0]) * 2 - 0.5 + col) * stride;
            yy = (sigmoid(box_data[1]) * 2 - 0.5 + row) * stride;
            ww = pow(sigmoid(box_data[2]) * 2, 2) * anchors[anchor_index + d * 2];
            hh = pow(sigmoid(box_data[3]) * 2, 2) * anchors[anchor_index + d * 2 + 1];

            max_prob = -1
            max_index = -1
            for p in range(5, 85, 1):
                prob = sigmoid(box_data[p])
                if prob > max_prob:
                    max_prob = prob
                    max_index = p - 5

            # 转换为top - left, bottom - right坐标
            x1 = int((xx - ww / 2) * sx)
            y1 = int((yy - hh / 2) * sy)
            x2 = int((xx + ww / 2) * sx)
            y2 = int((yy + hh / 2) * sy)

            boxes.append([x1, y1, x2-x1, y2-y1])
            confidences.append(float(conf))
            classIds.append(max_index)

最后NMS输出结果如下:

image.png
image.png

END

推荐阅读

更多嵌入式AI技术干货请关注嵌入式AI专栏。
推荐阅读
关注数
18838
内容数
1371
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息