UNeedCryDear / yolov5-opencv-dnn-cpp

使用opencv模块部署yolov5-6.0版本
Apache License 2.0
134 stars 37 forks source link

获取预测结果时,forward输出的数据指针netOutputImg[0].data无效 #5

Closed stirwl closed 2 years ago

stirwl commented 2 years ago

你好,直接编译然后使用yolov5s.pt导出的onnx是好的。 但是我需要检测小目标,所以训练的时候把网络分辨率调高了(--imgsz 1824) 然后把yolo.h的netWidth、netHeight也改成了1824,但是运行的时候发现yolo.cpp:53 (float*)netOutputImg[0].data这个数据指针无效。 似乎是forward以后没有产生正确的数据。 直接用yolo5de detect是好的。 有啥建议吗?

Thread 1 received signal SIGSEGV, Segmentation fault. 0x0000000000402314 in Yolo::Detect (this=0x71fcd0, SrcImg=..., net=..., output=std::vector of length 0, capacity 0) at yolo.cpp:62 62 float box_score = pdata[4]; //Sigmoid(pdata[4]);

UNeedCryDear commented 2 years ago

你导出的onnx的长宽是多少,你这个提示是段错误,应该是越界了,你看下你的export.py导出onnx的时候的img参数是多少,需要你导出的时候是1824x1824才行,和你训练是多少关系并不是很大。你可以用metron(netron.app)打开你的onnx,看下入口出的image的长宽是多少

stirwl commented 2 years ago

我export的时候也是设置的1824 python export.py --weights runs/train/exp35/weights/best.pt --img 1824 --opset 12 --include onnx

Netron打开输入层的images也是1x3x1824x1824

pdata[4]按说应该是bbox的概率,pdata指针来自netOutputImg[0].data,netOutputImg[0].data又是通过net forward得到的。 我看了一下netOutputImg,这个向量是由值的,长度为1。 但是netOutputImg[0].data这个数据指针是无效。 可能是个OpenCV dnn库的问题……

(gdb) p netOutputImg
$1 = std::vector of length 1, capacity 1 = {{flags = 1124024325, dims = 3, rows = -1, cols = -1,
    data = 0x2df25080 "\374\377?A\346\377?A", datastart = 0x2df25080 "\374\377?A\346\377?A", dataend = 0x2e49c424 "",
    datalimit = 0x2e49c424 "", allocator = 0x0, u = 0x4899ac0, size = {p = 0x5b0c01c}, step = {p = 0x5b0c000, buf = {
        0, 0}}}}
    net.forward(netOutputImg, net.getUnconnectedOutLayersNames());
...
    float* pdata = (float*)netOutputImg[0].data;
UNeedCryDear commented 2 years ago

我大概知道你哪里的问题了。。你类别名没改?你看下是不是你的类别数目不对?如果你是自己的模型的话,类名需要修改的,原来的coco的数据集是80类,如果你类别数目少于80,就会出现这个越界的情况的。 在yolo.h里面改下className这个vector,改成你自己的类名,名字不重要,重要的是数目一定要对。

stirwl commented 2 years ago

确实是类的数量没改,改完就好了。 中间发现另一个小问题,试了一下好像没有什么影响,就是imgsz应该是64的倍数,我用的1824不是。

3Q, IHaveNoCryDear today.

UNeedCryDear commented 2 years ago

确实是类的数量没改,改完就好了。 中间发现另一个小问题,试了一下好像没有什么影响,就是imgsz应该是64的倍数,我用的1824不是。

实际上没影响是因为你用的是正常的P5(yolov5l,m,n,s,x)模型,只要是32的倍数就行了,而P6模型(yolov5s6,l6,m6,n6,x6)就需要是64的倍数才行.