yolov5训练出pt模型文件,转换成rknn格式并测试。

一、任务介绍

        我的任务是在服务器GPU上训练yolov5后,转换到使用NPU的平台上,对数据集进行测试,查看MAP等模型性能的损失,目前阶段还没有开展检测速度的评估。

        主要分为三个步骤

        1、在服务器GPU上训练出yolov5的模型文件,best.pt,然后使用yolov5中的export转换成onnx格式。

        2、在linux虚拟机上配置python环境并安装格式转换工具rknn-toolkit2,完成onnx格式转换rknn格式。

        3、在NPU上配置rknn_yolov5_demo,修改postrocess.h、main.cc等文件,添加label保存功能。编写sh脚本,实现对一个数据集文件夹检测。

二、具体步骤

2.1、第一步、使用GPU训练yolov5,并把pt文件转换成onnx格式

        训练过程不是格式转换的重点,这里不赘述,只说一些格式转换过程中的注意事项。

2.1.1、首选训练pt的python环境需要向使用的yolov5版本看齐,不必和后面rknn-toolkit2使用的python版本相同。

        比如:我使用的是yolov5-7.0版本、python版本使用的是python 3.10

        而配置rknn-toolkit2环境时使用的python版本是python 3.6

2.1.2、修改yolov5/models/yolo.py文件

        删掉class Detect(nn.Module)类的forward函数(yolo.py文件的第56行,当然yolov5版本不同行数可能会有变化)中一部分,修改结果:

                

        注意:训练的过程中不要使用这个修改的yolo.py训练,这个修改只是rknn格式转换过程中的要求。

2.1.3、运行yolov5/export.py文件

        将你训练yolov5得到的best.pt文件复制到yolov5目录下

<think>好的,我现在需要帮助用户将YOLOv5训练的车牌识别模型转换为RKNN格式部署到RV1106芯片上。首先,我要回顾用户之前的问题和我的回答,确保这次回答的一致性,同时考虑RV1106的特殊需求。 用户之前的问题是关于转换到RK3568或RK3588芯片,现在目标换成了RV1106。我需要确认RV1106的RKNN-Toolkit版本是否不同,因为不同芯片可能需要不同的工具链。查阅资料发现,RV1106通常使用RKNN-Toolkit Lite或特定版本的Toolkit2,可能需要调整环境配置。 接下来,用户需要YOLOv5模型转换的步骤。之前的回答已经涵盖了ONNX导和转换到RKNN的基本流程,但RV1106可能有不同的配置要求。比如,输入尺寸是否需要调整,量化策略是否需要改变,以及部署时的代码是否需要适配。 需要注意RV1106的NPU性能可能较弱,因此模型压缩和优化更为关键。可能需要建议用户简化模型结构,使用onnxsim进行优化,或者在转换时启用更多量化选项以减少计算量。 另外,用户提供的引用中提到CRNN车牌识别部署,但当前问题主要关注YOLOv5的转换。可能需要区分这两个模型的部署步骤,但用户可能后续会整合,所以可以提及多模型协同的可能性,但主要聚焦在YOLOv5部分。 用户可能遇到的常见问题包括模型转换失败、量化精度下降、部署时的性能问题。需要针对RV1106提供特定的解决方案,比如固件版本更新、核心数调整等。 最后,确保所有步骤清晰,环境配置正确,特别是RV1106所需的工具链版本和依赖库。需要提醒用户注意芯片型号与工具版本的兼容性,避免因版本不匹配导致的错误。</think>根据RV1106芯片特性调整后的完整部署方案如下,重点突与RK3568部署的差异点: --- ### 一、RV1106专用转换流程(关键调整) #### 1. 环境配置差异 ```bash # RV1106必须使用rknn-toolkit2 v1.7.5及以上版本 pip install rknn-toolkit2==1.7.5 -i https://pypi.tuna.tsinghua.edu.cn/simple # 必须安装的依赖项 sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0-dev ``` #### 2. 模型特殊设置 ```bash python export.py --weights best.pt \ --include onnx \ --img 320 320 \ # RV1106建议使用320x320输入 --opset 12 \ # 必须指定opset版本 --simplify ``` #### 3. RV1106专用转换脚本 创建`rv1106_convert.py`: ```python from rknn.api import RKNN rknn = RKNN(verbose=True) # RV1106专属配置 rknn.config( target_platform='rv1106', optimization_level=3, # 启用最高优化级别 quantized_algorithm='normal', quantized_method='channel', # 通道级量化提升精度 float_dtype='float16', # 节省内存 batch_size=1 ) # 加载ONNX需添加形状推断 ret = rknn.load_onnx( model='best.onnx', input_size_list=[[3, 320, 320]] # 必须明确指定输入形状 ) # 量化配置需增加校准参数 ret = rknn.build( do_quantization=True, dataset='./calib_data.txt', rknn_batch_size=1, quant_img_num=200, # RV1106建议200张以上校准图 quantized_dtype='dynamic' # 动态量化适配低算力 ) rknn.export_rknn('rv1106_plate.rknn') ``` --- ### 二、RV1106部署关键技巧 #### 1. 内存优化配置 ```python from rknnlite.api import RKNNLite config = { 'target': 'rv1106', 'device_id': 'a0e3b412', # 通过adb devices获取 'performance_mode': 'low', # 低功耗模式 'enable_mem_opt': True, # 开启内存优化 'core_mask': 0b01 # 双核CPU配置 } rknn = RKNNLite() rknn.load_rknn('rv1106_plate.rknn') rknn.init_runtime(**config) ``` #### 2. 输入数据预处理优化 ```python # RV1106推荐使用BGR输入(减少通道转换开销) def preprocess(img): img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) img = cv2.resize(img, (320, 320)) img = np.transpose(img, (2, 0, 1)) # HWC to CHW return img.astype(np.float32)/255.0 # 归一化需与训练一致 ``` #### 3.解析加速方案 ```python # 使用固定大小输缓存(避免动态内存分配) outputs = rknn.inference( inputs=[input_data], outputs=None, inputs_pass_through=[0] # 跳过输入数据拷贝 ) # 使用固定内存地址直接解析 boxes_ptr = outputs[0].ctypes.data_as(ctypes.POINTER(ctypes.c_float)) scores_ptr = outputs[1].ctypes.data_as(ctypes.POINTER(ctypes.c_float)) ``` --- ### 三、RV1106特殊问题解决方案 1. **内存不足错误**: ```python rknn.init_runtime( mem_type='unlimited', # 启用虚拟内存扩展 allocator_type='dmabuf' # 使用DMA缓冲区 ) ``` 2. **量化后检测框偏移**: - 在校准数据集中增加多尺度车牌样本 - 在`rknn.config()`中添加: ```python quantize_input_range=(-1, 1), # 匹配训练时归一化范围 quantized_type='qint8_sym' # 对称量化 ``` 3. **低帧率优化**: ```bash # 编译时启用NEON指令加速 export CFLAGS="-march=armv7-a -mfpu=neon-vfpv4" pip install --force-reinstall numpy # 重装优化版numpy ``` --- ### 四、验证流程 1. **精度验证脚本**: ```bash python tools/val_rknn.py \ --rknn rv1106_plate.rknn \ --data plate.yaml \ --batch-size 4 # RV1106最大支持batch=4 ``` 2. **实时性能测试**: ```python from rknnlite.api import RKNNLite rknn = RKNNLite() rknn.load_rknn('rv1106_plate.rknn') rknn.init_runtime() # 预热 for _ in range(10): rknn.inference(inputs=[dummy_data]) # 正式测试 import time start = time.time() for _ in range(100): outputs = rknn.inference(inputs=[real_data]) print("平均耗时:", (time.time()-start)/100) ``` --- ### 五、部署结构建议 ```mermaid graph TD A[摄像头采集] --> B(图像预处理) B --> C{RV1106 NPU} C -->|YOLOv5 RKNN| D[车牌检测] D --> E[TCP/UDP传输] E --> F[上位机显示] ``` 参考RV1106部署手册:https://github.com/rockchip-linux/docs/tree/master/SoC/rv1106[^1]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值