[图像算法][RDK X5][yolov8-seg按照示例导出bin文件与案例不匹配问题]

按照yolov8-seg的指导案例,rdk_model_zoo/demos/Seg/YOLOv8-Seg/README_cn.md at main · D-Robotics/rdk_model_zoo,导出结果与最后输出结果不一致

也参考了论坛帖子https://developer.d-robotics.cc/forumDetail/266442473063437635中wu chao的回复,chao在这个帖子中提到了要注意以下关系 你好,需要根据bin模型的10个输出头顺序,调转后处理代码里面的索引顺序:

以下为顺序的关系(注:不是下列顺序,而是关系)

s_bbox = (1, 80, 80, 64)
m_bbox = (1, 40, 40, 64) 
l_bbox = (1, 20, 20, 64)  

s_cls = (1, 80, 80, 类别数量) 
m_cls = (1, 40, 40, 类别数量) 
l_cls = (1, 20, 20, 类别数量) 

s_mcs = (1, 80, 80, 32) 
m_mcs = (1, 40, 40, 32) 
l_mcs = (1, 20, 20, 32) 
mask = (1, 160, 160, 32)

回溯整个转换过程,发现与案例不一致的地方,主要体现在用户转换的branch与案例版本不匹配问题:

1,之前yolov8-seg转案例失败的问题,官方给的回复一直都是严格按照教程案例,但是未提到git的branch,需要求助官方当时转模型使用的ultralytics官方版本当时对应的branch是哪个分支? 当时的main分支已经目前的main分支,按照download模型使用的v8.2.0分支wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-seg.pt,ultralytics切换成v8.2.0时,按照示例提供的“约第51行,Detect类的forward”,v8.2.0版本是44行,“约第180行,Segment类的forward函数替换成以下内容”,在v8.2.0中是115行,整体行数偏差较大。按照目前最新的main分支,“Detect类的forward是67行”,“Segment类的forward”是201行,整体函数内部变更与示例代码对不上

2,按照案例导出的结构,案例导出的output结构是这个

Graph output:     
output0:              shape=[1, 80, 80, 32], dtype=FLOAT32     
output1:              shape=[1, 40, 40, 32], dtype=FLOAT32     
371:                  shape=[1, 20, 20, 32], dtype=FLOAT32     
379:                  shape=[1, 80, 80, 64], dtype=FLOAT32     
387:                  shape=[1, 40, 40, 64], dtype=FLOAT32    
395:                  shape=[1, 20, 20, 64], dtype=FLOAT32     
403:                  shape=[1, 80, 80, 80], dtype=FLOAT32     
411:                  shape=[1, 40, 40, 80], dtype=FLOAT32     
419:                  shape=[1, 20, 20, 80], dtype=FLOAT32     
347:                  shape=[1, 160, 160, 32], dtype=FLOAT32

而根据v8.2.0的branch分支导出的结果是以下结果,要删除的371/387/395节点与v8.2.0的branch分支不符,实际需要与branch对应的结果才能复现示例结果,需要官方提供转换成功案例对应ultralytics对应的branch才能匹配上,看了官方几个案例的回复,一直告知用户严格按照示例教程,但是由于branch分支不对应问题,会导致导出的bin文件与实际并不相符

Graph output:     
output0:              shape=[1, 80, 80, 64], dtype=FLOAT32     
output1:              shape=[1, 80, 80, 80], dtype=FLOAT32     
360:                  shape=[1, 80, 80, 32], dtype=FLOAT32     
368:                  shape=[1, 40, 40, 64], dtype=FLOAT32     
376:                  shape=[1, 40, 40, 80], dtype=FLOAT32     
384:                  shape=[1, 40, 40, 32], dtype=FLOAT32     
392:                  shape=[1, 20, 20, 64], dtype=FLOAT32     
400:                  shape=[1, 20, 20, 80], dtype=FLOAT32     
408:                  shape=[1, 20, 20, 32], dtype=FLOAT32     
419:                  shape=[1, 160, 160, 32], dtype=FLOAT32

README里面有写,调换cv2,cv3,cv4这几个算子的append顺序,从而调整ONNX输出头的顺序

README中的v11版本中提到,是指这个吧,也试了调整这个方式,结果还是不对

def forward(self, x): # RDK X5-
result = []-
for i in range(self.nl):-
result.append(self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous())-
result.append(self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous())-
result.append(self.cv4[i](x[i]).permute(0, 2, 3, 1).contiguous())-
result.append(self.proto(x[0]).permute(0, 2, 3, 1).contiguous())-
return result-

# 如果发现导出后的ONNX顺序不对,则可以通过调整每个self.cv*[i]的顺序来调整顺序。-
## 然后再重新导出onnx, 编译为bin模型-

def forward(self, x): # RDK X5-
result = []-
for i in range(self.nl):-
result.append(self.cv2[i](x[i]).permute(0, 2, 3, 1).contiguous())-
result.append(self.cv3[i](x[i]).permute(0, 2, 3, 1).contiguous())-
result.append(self.cv4[i](x[i]).permute(0, 2, 3, 1).contiguous())-
result.append(self.proto(x[0]).permute(0, 2, 3, 1).contiguous())-
return result

不仅是顺序不对,节点名称、forward调整代码行数和案例都对不上,关键是当初案例的分支与目前的分支不一致,能提供案例的分支号信息吗,试了目前的v8.2.0与main分支都不对,当初实现案例的分支多少v8.2.5?v8.3.0?

你现在onnx顺序是没问题的,往后走去移除反量化节点就好了。和ultralytics版本无关

按照流程去除反量化节点,结果不对

左侧是自己导出,右侧是官方提供download正常的模型对比,节点名称与顺序均不一致,有几个问题:

1,导出名称与官方对不上是不是不用在意,这个属于正常现象;

2,尝试了README的不同调整序号方式,2种方式都试了,按照流程去除反量化节点,结果还是出错;

3,想了解下这个文档是自己亲自实验过实现完成的吗,按照其他工程师实现后对外宣传的,感觉有些细节还是没有到位;

你的commit不是最新,看YOLO11-Seg

目前尝试复现的是yolov8,yolov8导出结果与官方文档不一致,所以其实还是和git的分支相关?能提供官方导出yolov8成功对应的commit和branch信息吗

或者,你这边抽空能重新复现下yolov8的整体流程吗

不用我花时间,头的顺序搞好就行了。

请问您解决了吗

我也想复现yolov8,也是遇到了和楼主一样的问题,请问我要哪个教程走?上面的11还是下面的v8?

目前推荐使用YOLO11

但是我的模型是yolov8s-seg,可以用yolo11吗?

官方的回复基本是照本宣科,一些细节回复人员自己没实现过
这个问题的后续是要调整python的顺序,按照官方流程,那个是跑不通的,需要自己做一些调整
另外,yolov8模型是没法运行yolov11的,整体框架网络结构和权重都需要重新调整的

1 个赞

您好,请问如何调整呢,而且现在我的模型结构图和model_zoo中的样例一致依旧无检测


我的模型结构图

调整python顺序是什么意思呢?