RK3588 模型转换+Deepsort 移植

文章讲述了如何将经过训练的pt模型转换为适配RK3588的rknn框架,包括使用onnx-simplifier简化ONNX模型,删除不必要的层以符合rknn要求的三个输入和输出,并详细描述了修改ONNX模型的具体步骤。此外,还提及了Deepsort的部署后续。

RK3588 模型转换+Deepsort 移植

完成pt模型的训练后,现在需要修改生成的pt 模型,让它适应rknn的框架:

1. onnxsim - 让导出的模型具有中间节点的信息:

显然,如果直接用

python export.py 

我们也可以得到一个onnx 模型,但是这个模型是较为复杂的,而且它没有中间节点的输入输出信息,加入我们需要获得中间的节点的shape信息,我们只能自己手动去设置,但是onnxsim 解决了这个问题:

1. 安装onnx-simplifier 包
pip install onnx-simplifier
2.加载onnx文件,simplify处理后重新保存:
from onnxsim import simplify
onnx_model = onnx.load("source_onnx_dir")  # load onnx model
model_simp, check = simplify(onnx_model)
assert check, "Simplified ONNX model could not be validated"
onnx.save(model_simp, "target_onnx_dir")
print('finished exporting onnx')
3. 利用netron查看导出的onnx

打开netron
导入模型:
在这里插入图片描述
这样中间节点的输出也同样被标识出来了,方便我们进行后续的修改

2. 修改onnx模型

1. 查看官方文档

官方的教程是在export 的时候就把 detect 层的forward函数修改掉,但其实他的用意就是修改原model 的detecet层,将detect层完全删掉,因为rknn需要三个输入,还要将模型输出修改为三个。

2. 查看onnx模型

根据查看模型,我们只需要删除最后一个conv层后面的reshape,transpose层,并将输出修改为三个就可以了:

3. 加载模型

具体操作就是遍历模型中的节点,首先确定最后一个卷积层的位置,然后重置这个卷积层的shape为 三个输出
代码后续看情况开源

在这里插入图片描述
成功将模型输出改为1x33x20x20,1x33x40x40,1x33x80x80。

保存模型"yolo.onnx"

至此,我们就成功完成了pt–>onnx 的转换。

下载官方的npu

cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5

在onnx下放入修改好的onnx 模型

打开 onnx2rknn.py

修改:

platform = 'rk3588'
MODEL_PATH = './onnx_models/yolo.onnx'

python onnx2rknn.py

结束!

源代码具体后续我考虑是否开源

deepsort 部署请看后续!

一、基本概念 1. 什么是目标检测 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 计算机视觉中关于图像识别有四大类任务: (1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。 (2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。 (3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。 (4)分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。 所以,目标检测是一个分类、回归问题的叠加。 2. 目标检测的核心问题 (1)分类问题:即图片(或某个区域)中的图像属于哪个类别。 (2)定位问题:目标可能出现在图像的任何位置。 (3)大小问题:目标有各种不同的大小。 (4)形状问题:目标可能有各种不同的形状。 3. 目标检测算法分类 基于深度学习的目标检测算法主要分为两类:Two stage和One stage。 1)Tow Stage 先进行区域生成,该区域称之为region proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。 任务流程:特征提取 --> 生成RP --> 分类/定位回归。 常见tow stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。 2)One Stage 不用RP,直接在网络中提取特征来预测物体分类和位置。 任务流程:特征提取–> 分类/定位回归。 常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD和RetinaNet等。 4. 目标检测应用 1)人脸检测 智能门控 员工考勤签到 智慧超市 人脸支付 车站、机场实名认证 公共安全:逃犯抓捕、走失人员检测 2)行人检测 智能辅助驾驶 智能监控 暴恐检测(根据面相识别暴恐倾向) 移动侦测、区域入侵检测、安全帽/安全带检测 3)车辆检测 自动驾驶 违章查询、关键通道检测 广告检测(检测广告中的车辆类型,弹出链接) 4)遥感检测 大地遥感,如土地使用、公路、水渠、河流监控 农作物监控 军事检测 二、目标检测原理 目标检测分为两大系列——RCNN系列和YOLO系列,RCNN系列是基于区域检测的代表性算法,YOLO是基于区域提取的代表性算法,另外还有著名的SSD是基于前两个系列的改进。 1. 候选区域产生 很多目标检测技术都会涉及候选框(bounding boxes)的生成,物体候选框获取当前主要使用图像分割与区域生长技术。区域生长(合并)主要由于检测图像中存在的物体具有局部区域相似性(颜色、纹理等)。目标识别与图像分割技术的发展进一步推动有效提取图像中信息。 1)滑动窗口 通过滑窗法流程图可以很清晰理解其主要思路:首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。 滑窗法简单易于理解,但是不同窗口大小进行图像全局搜索导致效率低下,而且设计窗口大小时候还需要考虑物体的长宽比。所以,对于实时性要求
### RK3588平台YOLOv5与DeepSort集成实现 #### 环境准备 为了在RK3588平台上成功集成YOLOv5和DeepSort,需先完成基础环境搭建。这包括安装必要的依赖库、设置Android开发环境以及配置RKNN工具链。 - 安装Python及相关依赖包:`opencv-python`, `numpy`, `torchvision`等。 - 下载并编译OpenCV源码以支持硬件加速特性[^1]。 ```bash pip install opencv-python numpy torchvision ``` #### 模型转换 由于RK3588采用的是RKNN作为推理引擎,因此需要将原始的PyTorch版本YOLOv5模型转化为RKNN格式文件(.rknn),以便于后续调用。 - 使用官方提供的脚本或者自定义编写转换程序来处理此过程。 - 转换过程中可能涉及到量化参数调整等问题需要注意解决。 #### 接口设计 针对视频流输入场景下的实时跟踪需求,在应用程序内部构建数据管道连接YOLOv5检测模块同DeepSort追踪组件: - 对每一帧图像执行目标识别操作获取候选框位置信息; - 将上述结果传递给DeepSort算法实例化对象用于身份关联计算; ```python from deep_sort import DeepSort deepsort = DeepSort( max_dist=0.2, nn_budget=None, ) def process_frame(frame): detections = yolov5_model.detect(frame) # 假设此处为已训练好的yolo v5模型预测函数 bboxes = [] confidences = [] for det in detections: bbox = list(map(int,[det['xmin'], det['ymin'], det['xmax'] - det['xmin'], det['ymax'] - det['ymin']])) confidence = float(det['confidence']) bboxes.append(bbox) confidences.append(confidence) outputs = deepsort.update(np.array(bboxes), np.array(confidences)) return outputs ``` #### 应用部署 最后一步就是把整个项目打包成APK形式发布到搭载有RK3588 SoC的实际设备上测试运行效果了。考虑到性能优化方面的要求,建议尽可能利用GPU/CPU协同工作模式加快运算速度。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值