FeiGeChuanShu / ncnn-android-yolov8

Real time yolov8 Android demo by ncnn
432 stars 83 forks source link

yolov8 官方导出ncnn seg模型使用异常 #24

Open linfengca opened 1 year ago

linfengca commented 1 year ago
ex.input("in0", in_pad);

ncnn::Mat out;
ex.extract("out0", out);

ncnn::Mat mask_proto;
ex.extract("out1", mask_proto);

输入的图片大小in_pad之后w是640,h是512, out0取出的w是8400,h是37,导致后面generate_proposals中const float scores = pred.row(i) + 4 reg_max_1; 取值越界, mask_proto取出的貌似没有问题,是w160,h280

请教一下是什么原因?

linfengca commented 1 year ago

yolov8 官方导出:yolo export model=runs\segment\train10\weights\best.pt format=ncnn ncnn模型图如下: image

linfengca commented 1 year ago

补充异常时的内存数据值 image image

linfengca commented 1 year ago

使用官方自己的yolov8s-seg.pt导出ncnn模型,yolov8 官方导出:yolo export model=yolov8s-seg.pt format=ncnn 再使用上述代码,同样异常。

对比之后,发现作者自己的yolov8s-seg.bin ncnn模型 ex.extract("output", out); 取出的out,w=176, h=5040 而官方导出的ncnn模型,ex.extract("out0", out); 取出的out,w=8400, h=116(4+80+32), 而const float scores = pred.row(i) + 4 reg_max_1; 中, row(i)的实现为 w 乘以 y,w太大了: NCNN_FORCEINLINE const float Mat::row(int y) const { return (const float)((unsigned char)data + (size_t)w y * elemsize); }

下图是作者的ncnn模型输出: image

下图是yolov8官方导出的ncnn模型输出: 1690881050607

linfengca commented 1 year ago

使用 yolo predict task=segment model=runs\segment\train10\weights\best_ncnn_model imgsz=640 source=... 测试是没有问题的。

Digital2Slave commented 1 year ago

https://github.com/Digital2Slave/ncnn-android-yolov8-seg/wiki/Convert-yolov8%E2%80%90seg-to-ncnn-model-step-by-step

19920716 commented 11 months ago

@linfengca 你好,我也遇到和你相同的问题,你解决了吗

linfengca commented 11 months ago

@linfengca 你好,我也遇到和你相同的问题,你解决了吗

没有,换了个推理框架,openvino可以