如何进行YOLO模型转换

Viewed 127

我目前使用的转模型代码如下

from ultralytics import YOLO
import cv2
import time
import nncase
import onnx

modelname = "E:\Project\model\yolov8n"
# 加载预训练的YOLO模型
model = YOLO(modelname + ".pt")
path = model.export(format="onnx")
# 加载ONNX模型
onnx_model = onnx.load(modelname + ".onnx")
# 设置编译选项
compile_options = nncase.CompileOptions()
compile_options.target = 'k230'
compile_options.preprocess = True                    # 启用预处理
compile_options.swapRB = False                        # 不交换RB通道
compile_options.input_shape = [1, 3, 640, 640]        # 设置输入形状
compile_options.input_type = 'uint8'                  # 输入图像数据类型
compile_options.input_range = [0, 1]                  # 输入图像反量化范围
compile_options.mean = [0, 0, 0]                      # 预处理均值
compile_options.std = [1, 1, 1]                       # 标准差设为1,不进行归一化
compile_options.input_layout = "NCHW"                 # 输入数据格式
# 创建编译器实例
compiler = nncase.Compiler(compile_options)
import_options = nncase.ImportOptions()
# 导入ONNX模型
compiler.import_onnx(onnx_model.SerializeToString(),import_options)
# 编译模型
compiler.compile()
# 生成KModel文件
kmodel_data = compiler.gencode_tobytes()
with open(modelname + ".kmodel", "wb") as f:
    f.write(kmodel_data)

代码运行无异常,导出模型大小只有12MB,但在设备中运行模型时间非常长(具体超过5分钟一次),而后将预处理关闭,则设备中跑模型会报错
89f112fa33ede232269abd5a16a53f4d.png

请问,以上问题是哪里的原因?应该怎么解决?

2 Answers

完全按照上述方式,使用conda实现了模型转换,但是我使用从官网上下载的模型yolov5nu.pt,在设备上运行时也同样能成功,但是结果的序列超出默认的80个,导致提示IndexError: list index out of range
但是使用yolov5n.pt可以正常运行,但是识别能力比较弱
上面的报错是否正常?如何修改?

不正常,你看一下模型输入输出是否和配置的参数适配?

目前查了一下,是yolov5官方给了两个版本,yolov5u和yolov5,然后默认使用yolov5u,然后这个带u的模型在k230里面跑好像不太行,我换了yolov11好了,但是我发现模型在我电脑上跑的结果和在设备中运行结果并不一致,这个你有遇到过嘛?

模型速度慢是因为输入分辨率640 * 640太大了,只能用320 * 320的输入分辨率

试了一下,把分辨率改成
compile_options.input_shape = [1, 3, 320, 320] # 设置输入形状
但是运行时间依然没有改善