yolov8检测模型pt转rknn

前言:

步骤是pt转onnx再转rknn。以下有些要点,请看代码备注。

一、pt2onnx.py

python 复制代码
import argparse
import cv2
import numpy as np
import onnxruntime as ort
import torch
from ultralytics import YOLO

model = YOLO("runs/detect/train3/weights/best.pt")
# 导出为 ONNX 格式,并指定保存路径
output_path = "runs/detect/train3/weights"  # 自定义路径
 # 指定保存目录  特别注意点:opset = 12
model.export(format="onnx", save_dir="custom_directory",opset = 12) 

二、onnx转rknn

onnx2rknn.py

注意点

  1. 准备校准图片
  2. 注意写好对应的相机型号
  3. 此转换过程是在pc端进行的
python 复制代码
from rknn.api import RKNN
import os


# ===================== 配置(v2.3.2 严格兼容版) =====================
ONNX_MODEL = "./runs/detect/train3/weights/best.onnx"    # 新导出的标准ONNX
RKNN_MODEL = "./runs/detect/train3/weights/obstacle_det.rknn"
TARGET_PLATFORM = "rk3588"   # 根据你使用的相机型号进行替换
CALIB_DIR = "./calib_images/"  # INT8校准图目录(10-50张同分布图片)
CALIB_LIST = "./calib_list.txt"  # 🔧 必须是.txt文件路径,不能是列表

# ===================== 自动生成校准数据集(关键修复) =====================
def get_calib_dataset(calib_dir, CALIB_LIST):
    # 自动遍历文件夹,获取所有图片路径
    img_ext = [".jpg", ".jpeg", ".png", ".bmp"]
    calib_data = []
    for root, _, files in os.walk(calib_dir):
        for file in files:
            if any(file.lower().endswith(ext) for ext in img_ext):
                calib_data.append(os.path.join(root, file))
    if len(calib_dataset) == 0:
        print("❌ calib_images目录下无图片,请放入10-50张校准图")
        exit(1)
    # 写入列表文件
    with open(OUTPUT_LIST, "w") as f:
        for path in calib_dataset:
            f.write(path + "\n")
    return CALIB_LIST
    # return calib_data



# ===================== 初始化RKNN =====================
rknn = RKNN(verbose=True)

# 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_platform=TARGET_PLATFORM,
    quantized_dtype="w8a8",  # INT8量化
    optimization_level=3
)

# 删除inputs/outputs/input_size_list,让RKNN自动读取ONNX维度
print("=== 加载ONNX模型 ===")
ret = rknn.load_onnx(model=ONNX_MODEL)
if ret != 0:
    print("❌ 加载ONNX失败")
    exit(ret)

# 自动生成校准数据集,传入build函数
print("=== 加载校准图 ===")
CALIB_LIST = get_calib_dataset(CALIB_DIR, CALIB_LIST)

# ===================== 构建INT8 RKNN模型 =====================
print("=== 构建INT8 RKNN模型 ===")
ret = rknn.build(
    do_quantization=True,
    dataset=CALIB_LIST  # 校准图目录
)
if ret != 0:
    print("❌ 构建RKNN失败")
    exit(ret)

# ===================== 导出RKNN模型 =====================
print("=== 导出RKNN模型 ===")
ret = rknn.export_rknn(RKNN_MODEL)
if ret != 0:
    print("❌ 导出RKNN失败")
    exit(ret)

print(f"\n🎉 RK3588专用INT8 RKNN模型生成完成:{RKNN_MODEL}")
rknn.release()

三、最终验证步骤

  1. 放图:把 10~50 张图放进 calib_images/
  2. 生成列表:运行上面的生成脚本
  3. 转换:运行 python onnx2rknn.py
  4. 结果:生成 yolov8s_rk3588_int8.rknn
相关推荐
清华kenny21 小时前
安徽亳州中医AI健康辨识仪品牌排名前十之适用场景解析
人工智能·安徽晓得养
郑鱼咚21 小时前
大胆点,向 AI 要你真正想要的结果
人工智能
信可维1 天前
多个 AI 同时改一个仓库:先划边界,再谈并行
人工智能
尺度商业1 天前
科技牛错杀与换挡的底层逻辑
人工智能·科技
宅小年1 天前
Grok Bot 两周实测:把 6 个 Bot 拉进群,我给自己搭了协同小队
人工智能
东华果汁哥1 天前
【Spring AI 实战】从零开始调用大模型接口,构建 Java AI 应用
java·人工智能·spring
漫步的猪1 天前
# 告别混乱与付费墙!Linkit:完全免费、本地优先的开源 AI 智能书签与收藏夹管理神器
人工智能·ai·开源·react·免费·书签·收藏夹
深圳市益普科技有限公司1 天前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”1 天前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc
xsd202411181 天前
Hy Image3.5:一张提示词,怎么撑起一整套品牌广告
人工智能