请问大佬,我照你流程遇到问题
我修改完yolo.py后生成onnx后用你的后处理脚本遇到了一个bug,流程截图如下,通过netron查看是有个红箭头,请问如何解决?




查看一下你的onnx中的“Concat_318”结点存不存在
看了,没有,只有下面这些concat:

我这个https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py代码是基于yolov7s,class_num=4去实现的,如果你的模型和类别与我的不一样,需要修改如下地方:
- 将
Concat_318替换为最后output的结点 https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py#:~:text=if%20node.name%20%3D%3D%20%22-,Concat_318,-%22%5D%5B0%5D - 将
end_conf的维度改为自己的维度https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py#:~:text=values%3Dnp.array(-,%5B1%2C25200%2C9%5D,-%2Cdtype%3Dnp.int64 - 将
label_conf_0的维度改为自己的维度https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py#:~:text=name%3D%27label_conf_0%27%2Cshape%3D-,(1%2C25200%2C4),-%2Cdtype%3Dnp.float32 - 将
label_conf的维度改为自己的维度 https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py#:~:text=name%3D%27label_conf%27%2Cshape%3D-,(1%2C25200%2C4),-%2Cdtype%3Dnp.float32 - 将
scores的维度修改为自己的维度https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py#:~:text=name%3D%22scores%22%2Cshape%3D-,(1%2C25200%2C4),-%2Cdtype%3Dnp.float32 - 修改NMS的类别和阈值(改成自己需要的) https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_nms.py#:~:text=attrs%5B%22numClasses%22%5D%20%3D%204
我的类别为5为,输出改为Concat_722,修改代码如下,但是我在转TRT时还是过不去(找不到Mul_380):



不好意思,我的readme中对yolo.py的修改的截图是有问题的,正确的修改是这样的:

wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i].view(1,self.na,1,1,2)
还有一个view操作我没写,具体的参考https://github.com/DataXujing/YOLOv7/blob/main/models/yolo.py#:~:text=wh%20%3D%20(y%5B...%2C%202%3A4%5D%20*%202)%20**%202%20*%20self.anchor_grid%5Bi%5D.view(1%2Cself.na%2C1%2C1%2C2)
这个是导致你 mul结点报错的原因
why通过你的源码export出来后的模型结尾部分都是断的?
python3 ./models/export.py --weights ./weights/yolov7.pt --img-size 640 640 --grid

链接: https://pan.baidu.com/s/1zE9ULAflecAwSDd1CiX54g 提取码: 0o5b
正常逐步按照README和上述过程修改是完全可以的。我的代码是基于v0.1的, 如果你下载了最新的YOLOv7的代码,请按照上述过程修改自己的代码,也是完全可以正常工作的。我看了你导出的模型,应该不是按照我的export.py导出的,很可能是你的yolo.py没有修改正确,如果修改正确,output输出节点就1个,不会像原来会输出4个

正常逐步按照README和上述过程修改是完全可以的。我的代码是基于v0.1的, 如果你下载了最新的YOLOv7的代码,请按照上述过程修改自己的代码,也是完全可以正常工作的。我看了你导出的模型,应该不是按照我的export.py导出的,很可能是你的yolo.py没有修改正确,如果修改正确,output输出节点就1个,不会像原来会输出4个

我建议检查上述过程,这个过程肯定是work的,我们在YOLOv5, YOLOv6, YOLOX和YOLOv7均验证了,上述操作是可以正常工作的
谢谢大佬,我用了官方的预训练模型是正常可以生成fp32格式的engine,但是在用你的cpp代码推理过程中预测不到box,我改了代码中四个标签部分,还需要做什么修改的?
没有什么需要修改的了。
我还修改了nms部分类别目前可以正常推理,但是用同样的方法尝试yolov7-wd模型却在转trt模型时,同样报了mul380问题,想问下有没有尝试过1280的模型?
已经按照流程修改,使用你开源的源码进行export:
python3 ./models/export.py --weights ./weights/yolov7-w6.pt --img-size 1280 1280 --grid
[08/02/2022-09:24:37] [E] [TRT] ModelImporter.cpp:721: --- Begin node --- [08/02/2022-09:24:37] [E] [TRT] ModelImporter.cpp:722: input: "711" input: "1380" output: "714" name: "Mul_460" op_type: "Mul"
[08/02/2022-09:24:37] [E] [TRT] ModelImporter.cpp:723: --- End node --- [08/02/2022-09:24:37] [E] [TRT] ModelImporter.cpp:726: ERROR: ModelImporter.cpp:179 In function parseGraph: [6] Invalid Node - Mul_460 [graphShapeAnalyzer.cpp::throwIfError::1306] Error Code 9: Internal Error (Mul_460: broadcast dimensions must be conformable ) [08/02/2022-09:24:37] [E] Failed to parse onnx file [08/02/2022-09:24:37] [I] Finish parsing network model [08/02/2022-09:24:37] [E] Parsing model failed [08/02/2022-09:24:37] [E] Engine creation failed [08/02/2022-09:24:37] [E] Engine set up failed &&&& FAILED TensorRT.trtexec [TensorRT v8001] # trtexec --onnx=last_1_nms.onnx --saveEngine=yolov7_wd_fp16.engine --fp16 --workspace=3000 --verbose
input 1280 最终box的数量就不是25200了,需要修改: https://github.com/DataXujing/YOLOv7/blob/main/tensorrt/yolov7_add_postprocess.py#:~:text=boxes%3A%20%5B1%2C25200%2C1%2C4%5D%20%20%23%20x_center%2Cy_center%2C%20w%2Ch%2D%2D%3E%20x1%2Cy1%2Cx2%2Cy2 中的box和score的个数
我修改了yolov7_add_postprocess.py中的所有box部分25200->102000,还尝试了只修改了box和score的个数,还是遇到同样的问题: [08/04/2022-07:05:01] [V] [TRT] Mul_462 [Mul] inputs: [737 -> (1, 3, 160, 160, 2)[FLOAT]], [1412 -> (3, 2)[FLOAT]], [08/04/2022-07:05:01] [V] [TRT] Registering layer: 1412 for ONNX node: 1412 [08/04/2022-07:05:01] [V] [TRT] Registering layer: Mul_462 for ONNX node: Mul_462 [08/04/2022-07:05:01] [E] Error[9]: [graphShapeAnalyzer.cpp::throwIfError::1306] Error Code 9: Internal Error (Mul_462: broadcast dimensions must be conformable ) [08/04/2022-07:05:01] [E] [TRT] ModelImporter.cpp:720: While parsing node number 782 [Mul -> "740"]: [08/04/2022-07:05:01] [E] [TRT] ModelImporter.cpp:721: --- Begin node --- [08/04/2022-07:05:01] [E] [TRT] ModelImporter.cpp:722: input: "737" input: "1412" output: "740" name: "Mul_462" op_type: "Mul"
[08/04/2022-07:05:01] [E] [TRT] ModelImporter.cpp:723: --- End node --- [08/04/2022-07:05:01] [E] [TRT] ModelImporter.cpp:726: ERROR: ModelImporter.cpp:179 In function parseGraph: [6] Invalid Node - Mul_462 [graphShapeAnalyzer.cpp::throwIfError::1306] Error Code 9: Internal Error (Mul_462: broadcast dimensions must be conformable ) [08/04/2022-07:05:01] [E] Failed to parse onnx file [08/04/2022-07:05:01] [I] Finish parsing network model [08/04/2022-07:05:01] [E] Parsing model failed [08/04/2022-07:05:01] [E] Engine creation failed [08/04/2022-07:05:01] [E] Engine set up failed &&&& FAILED TensorRT.trtexec [TensorRT v8001] # trtexec --onnx=last_1_nms.onnx --saveEngine=yolov7_wd_nms_fp16.engine --fp16 --workspace=3000 --verbose
好的,我down模型试一下,看看有没有问题。
大佬想问1280p测试结果怎么样?