Skip to content

UNeedCryDear/yolov7-opencv-dnn-cpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

yolov7-opencv-dnn-cpp

使用opencv模块部署yolov7-0.1版本和yolov5-6.0以上版本

OpenCV>=4.5.0

python path/to/export.py --weights yolov5s.pt --img [640,640] --opset 12 --include onnx
python path/to/export.py --weights yolov7.pt --img [640,640]
请注意,yolov7导出的时候不要加--grid这个参数(控制detect层),否则opencv读取没问题,推理报错.

可以通过yolo.h中定义的YOLOV5宏定义来切换yolov5和yolov7两个版本,(其实两个版本onnx后处理方式差不多的说

通过yolo.h中定义的YOLO_P6来切换是否使用两者的P6模型。
YOLOV5:true -->yolov5.onnx
YOLOV5:false-->yolov7.onnx

2022.12.13 更新:

  • 如果你的显卡支持FP16推理的话,可以将模型读取代码中的DNN_TARGET_CUDA改成DNN_TARGET_CUDA_FP16提升推理速度(虽然是蚊子腿,好歹也是肉(:

2022-09-06 更新:

  • 最近有些小伙伴使用opencv4.6的版本报错了,经过debug发现,opencv4.6的和4.5.x的forward输出顺序不一样导致的,使用opencv4.6的时候在net.forward之后需要加上一个排序,使得输出口从大到小排序才行。
    std::sort(netOutputImg.begin(), netOutputImg.end(), [](Mat &A, Mat &B) {return A.size[2] > B.size[2]; });//opencv 4.6

2022-10-18 更新:

yolov7目前有些模型低于opencv4.5.5会报错,报错信息类似下面使用opencv4.5.0读取yolov7-d6.pt转出的onnx模型(不能加参数--grid),此时建议升级下opencv的版本

OpenCV(4.5.0) Error: Unspecified error (> Node [Slice]:(341) parse error: OpenCV(4.5.0) D:\opencv\ocv4.5.0\sources\modules\dnn\src\onnx\onnx_importer.cpp:697: error: (-2:Unspecified error) in function 'void __cdecl cv::dnn::dnn4_v20200908::ONNXImporter::handleNode(const class opencv_onnx::NodeProto &)'
Slice layer only supports steps = 1 (expected: 'countNonZero(step_blob != 1) == 0'), where
'countNonZero(step_blob != 1)' is 1
must be equal to
'0' is 0
in cv::dnn::dnn4_v20200908::ONNXImporter::handleNode, file D:\opencv\ocv4.5.0\sources\modules\dnn\src\onnx\onnx_importer.cpp, line 1797

debug可以发现是由于yolov7-d6中使用了ReOrg模块引起的报错,这个模块有点类似早期的yolov5的Facos模块,如果一定要在opencv4.5.0下面运行,需要将ReOrg模块修改成下面的代码。 在models/common.py里面搜索下ReOrg.

class ReOrg(nn.Module):
    def __init__(self):
        super(ReOrg, self).__init__()

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        #origin code
        # return torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)
        self.concat=Contract(gain=2)
        return self.concat(x)

另外关于换行符,windows下面需要设置为CRLF,上传到github会自动切换成LF,windows下面切换一下即可。
贴个yolov7.onnx和yolov5s.onnx的对比
yolo

About

使用opencv部署yolov7

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages