yolov8检测模型pt转rknn
前言步骤是pt转onnx再转rknn。以下有些要点请看代码备注。一、pt2onnx.pyimportargparseimportcv2importnumpyasnpimportonnxruntimeasortimporttorchfromultralyticsimportYOLO modelYOLO(runs/detect/train3/weights/best.pt)# 导出为 ONNX 格式并指定保存路径output_pathruns/detect/train3/weights# 自定义路径# 指定保存目录 特别注意点opset 12model.export(formatonnx,save_dircustom_directory,opset12)二、onnx转rknnonnx2rknn.py注意点准备校准图片注意写好对应的相机型号此转换过程是在pc端进行的fromrknn.apiimportRKNNimportos# 配置v2.3.2 严格兼容版 ONNX_MODEL./runs/detect/train3/weights/best.onnx# 新导出的标准ONNXRKNN_MODEL./runs/detect/train3/weights/obstacle_det.rknnTARGET_PLATFORMrk3588# 根据你使用的相机型号进行替换CALIB_DIR./calib_images/# INT8校准图目录10-50张同分布图片CALIB_LIST./calib_list.txt# 必须是.txt文件路径不能是列表# 自动生成校准数据集关键修复 defget_calib_dataset(calib_dir,CALIB_LIST):# 自动遍历文件夹获取所有图片路径img_ext[.jpg,.jpeg,.png,.bmp]calib_data[]forroot,_,filesinos.walk(calib_dir):forfileinfiles:ifany(file.lower().endswith(ext)forextinimg_ext):calib_data.append(os.path.join(root,file))iflen(calib_dataset)0:print(❌ calib_images目录下无图片请放入10-50张校准图)exit(1)# 写入列表文件withopen(OUTPUT_LIST,w)asf:forpathincalib_dataset:f.write(path\n)returnCALIB_LIST# return calib_data# 初始化RKNN rknnRKNN(verboseTrue)# mean_values长度匹配3通道删除input_size_list等手动指定参数print( 配置RKNN模型RK3588 v2.3.2兼容 )rknn.config(mean_values[[0,0,0]],std_values[[255,255,255]],target_platformTARGET_PLATFORM,quantized_dtypew8a8,# INT8量化optimization_level3)# 删除inputs/outputs/input_size_list让RKNN自动读取ONNX维度print( 加载ONNX模型 )retrknn.load_onnx(modelONNX_MODEL)ifret!0:print(❌ 加载ONNX失败)exit(ret)# 自动生成校准数据集传入build函数print( 加载校准图 )CALIB_LISTget_calib_dataset(CALIB_DIR,CALIB_LIST)# 构建INT8 RKNN模型 print( 构建INT8 RKNN模型 )retrknn.build(do_quantizationTrue,datasetCALIB_LIST# 校准图目录)ifret!0:print(❌ 构建RKNN失败)exit(ret)# 导出RKNN模型 print( 导出RKNN模型 )retrknn.export_rknn(RKNN_MODEL)ifret!0:print(❌ 导出RKNN失败)exit(ret)print(f\n RK3588专用INT8 RKNN模型生成完成{RKNN_MODEL})rknn.release()三、最终验证步骤放图把 10~50 张图放进 calib_images/生成列表运行上面的生成脚本转换运行 python onnx2rknn.py结果生成 yolov8s_rk3588_int8.rknn