DataXujing / YOLOv9

:fire: YOLOv9 paper解析,训练自己的数据集,TensorRT端到端部署, NCNN安卓手机部署
GNU General Public License v3.0
50 stars 10 forks source link

关于get_ncnn_graph中的class_num是类数量,output_name #4

Closed aaafdsf closed 3 months ago

aaafdsf commented 3 months ago

def get_ncnn_graph(graph,class_num=1,output_name="Concat_1186"):

class_num是类数量,output_name=“output0”还是1747

INPUTS images name:images OUTPUTS output0 name:output0 1747 name:1747

DataXujing commented 3 months ago

output_name是主分支输出的节点名字,我也试过辅助分支的输出,输出结果是一致的。

aaafdsf commented 3 months ago

import onnx_graphsurgeon as gs import numpy as np import onnx

def get_ncnn_graph(graph,class_num=80,output_name="output0"):

input

# Concat_1278时DualDDetection输出的的第二个输出,这个输出时main branch的输出
# 不同于之前的YOLO,该部分已经包含了ancher的映射和处理,直接解析就好了
origin_output = [node for node in graph.nodes if node.name == output_name][0]
print(origin_output.outputs)

graph.outputs = [origin_output.outputs[0]]

graph.cleanup().toposort()
# onnx.save(gs.export_onnx(graph),"./last_1.onnx")

return graph

if name == "main":

onnx_path = "./runs/train/exp/weights/last.onnx"

onnx_path = "./mm/yolov9-c.onnx"
graph = gs.import_onnx(onnx.load(onnx_path))

graph = get_ncnn_graph(graph,class_num=80,output_name="output0")

# 保存图结构
# onnx.save(gs.export_onnx(graph),"./runs/train/exp/weights/last_ncnn.onnx")
onnx.save(gs.export_onnx(graph),"./mm/last_ncnn.onnx")

其中yolov9-c.onnx是官方yolov9-c.pt转换来的,转换命令:python export.py --weights yolov9-c.pt --include onnx --simplify

运行get_ncnn_onnx.py后报错 Traceback (most recent call last): File "get_ncnn_onnx.py", line 44, in graph = get_ncnn_graph(graph,class_num=80,output_name="output0") File "get_ncnn_onnx.py", line 28, in get_ncnn_graph origin_output = [node for node in graph.nodes if node.name == output_name][0] IndexError: list index out of range

DataXujing commented 3 months ago

“output0”不是节点名字,是节点output的名字,你得找节点名字,而不是节点输出输出的名字,用netron看一下,谁的输出是“output0”

------------------ 原始邮件 ------------------ 发件人: aaafdsf @.> 发送时间: 2024年3月30日 20:22 收件人: DataXujing/YOLOv9 @.> 抄送: 徐静 @.>, Comment @.> 主题: Re: [DataXujing/YOLOv9] 关于get_ncnn_graph中的class_num是类数量,output_name (Issue #4)

import onnx_graphsurgeon as gs import numpy as np import onnx

def get_ncnn_graph(graph,class_num=80,output_name="output0"):

input

Concat_1278时DualDDetection输出的的第二个输出,这个输出时main branch的输出

不同于之前的YOLO,该部分已经包含了ancher的映射和处理,直接解析就好了

origin_output = [node for node in graph.nodes if node.name == output_name][0] print(origin_output.outputs) graph.outputs = [origin_output.outputs[0]] graph.cleanup().toposort() # onnx.save(gs.export_onnx(graph),"./last_1.onnx") return graph
if name == "main":

onnx_path = "./runs/train/exp/weights/last.onnx"

onnx_path = "./mm/yolov9-c.onnx" graph = gs.import_onnx(onnx.load(onnx_path)) graph = get_ncnn_graph(graph,class_num=80,output_name="output0") # 保存图结构 # onnx.save(gs.export_onnx(graph),"./runs/train/exp/weights/last_ncnn.onnx") onnx.save(gs.export_onnx(graph),"./mm/last_ncnn.onnx")
其中yolov9-c.onnx是官方yolov9-c.pt转换来的,转换命令:python export.py --weights yolov9-c.pt --include onnx --simplify

运行get_ncnn_onnx.py后报错 Traceback (most recent call last): File "get_ncnn_onnx.py", line 44, in graph = get_ncnn_graph(graph,class_num=80,output_name="output0") File "get_ncnn_onnx.py", line 28, in get_ncnn_graph origin_output = [node for node in graph.nodes if node.name == output_name][0] IndexError: list index out of range

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

aaafdsf commented 3 months ago

已成功转换,感谢指导

aaafdsf commented 3 months ago

新问题,成功转换后,再onnx2ncnn.exe last_ncnn.onnx yolov9-c.param yolov9-c.bin出现下面报错 Unknown data type 0 Unknown data type 0 Unknown data type 0 Unknown data type 0 Unknown data type 0 Unknown data type 0

是不是yolov9-c.pt转yolov9-c.onnx时的转换命令有问题:python export.py --weights yolov9-c.pt --include onnx --simplify 备注:yolov9-c.pt是官方的模型

问这个问题是因为,后面推理的时候,加载param模型时会报错