踩坑记录2——RK3588跑通YOLO v5+DeepSORT


上篇说到RK3588编译OpenCV, 这篇记录一下跑通YOLO v5+DeepSORT的愉(chi)快(shi)历程.


1. 保证编译OpenCV时关联了ffmpeg

如果本身缺少ffmpeg而编译了没有ffmpeg版本的OpenCV, 则视频无法读取.

解决方案参照优快云, 首先安装ffmpeg:

sudo apt install -y ffmpeg

之后安装一堆dev:

libavcodec-dev 、libavformat-dev、libavutil-dev 、libavfilter-dev、 libavresample-dev、 libswresample-dev、 libswscale-dev

这个时候再去编译OpenCV, 可以看到ffmpeg的选项可以检测出版本了. (我没有做原博客将头文件加入/usr/include, 也是可以的).

在这里插入图片描述

2. 下载代码

采用的代码是Zhou-sx大神的https://github.com/Zhou-sx/yolov5_Deepsort_rknn, 代码到手后, 要跑通自己的视频, 做如下改动:

2.1 更改CMakeLists.txt中OpenCV的位置

./CMakeLists.txt./deepsort/CMakeLists.txt中, 更改

set(OpenCV_DIR /home/wjp/opencv-4.6.0/install/lib/cmake/opencv4)  # 填入OpenCVConfig.cmake

后面的路径是OpenCV的OpenCVCondif.cmake的路径

2.2 更改图像大小和目标类别个数

./include/common.h中修改IMG_WIDTH, IMG_HEIGHT, IMG_PAD, OBJ_CLASS_NUM, 例如:

#define BYTE unsigned char
#define IMG_WIDTH 1024
#define IMG_HEIGHT 540
#define IMG_CHANNEL 3
#define IMG_PAD 640
#define OBJ_CLASS_NUM     1

./yolov5/src/decode.cpp中修改LABEL_NALE_TXT_PATH, 该txt储存的是视频中类别名称, 必须与 OBJ_CLASS_NUM对应:

#define LABEL_NALE_TXT_PATH "../model/hongwai_2_labels_list.txt"

例如只有一类car, 则txt的内容就是

car

2.3 更改主文件中的路径

./yolov5_deepsort.cpp中, 更改模型, 读取视频与写入视频的路径. 模型必须是对应的rknn格式, 如何产生的以后补充.

string PROJECT_DIR = "/home/codes/yolov5_Deepsort_12_28";


string YOLO_MODEL_PATH = PROJECT_DIR + "/model/best.rknn";
string SORT_MODEL_PATH = PROJECT_DIR + "/model/osnet_x0_25_market.rknn";

string VIDEO_PATH = PROJECT_DIR + "/data/M1401.mp4";
string VIDEO_SAVEPATH = PROJECT_DIR + "/data/M1401_results.mp4";

2.4 编译运行

cd build
cmake ..
make
./yolov5_deepsort

3. 优化

原来的代码有输出跟踪框漂移和没有处理检测框异常的功能, 我fork并完善了一下, 改善了这些问题, 减少了报错的可能. 并增加了如下功能, 欢迎star:

本仓库在原仓库的基础上:

  1. 改善了边界框漂移, 完善了当图中没有目标等其他情形出现的bug, 增加了对cost matrix出现nan时的处理
  2. 加入了隔帧检测的功能. 设置方法:

./yolov5/include/detect.h中 将
const int det_interval = 1;改成期望的数值, 例如3, 表示每隔3帧检测一次, 这样可以显著提升速度.
同时, 也需要更改./deepsort/include/deepsort.hline 39const int track_interval = 1; , 数值要和检测的保持一致.

  1. 加入Re-ID多线程的功能

如果您不希望使用多线程, 则在./deepsort/src/deepsort.cppline 144if (numOfDetections < 2)
改成if (true)

自己使用时, 除了更改OpenCV的路径外, 要在./include/common.h中修改IMG_WIDTH, IMG_HEIGHT, IMG_PAD, OBJ_CLASS_NUM
./yolov5/src/decode.cpp中修改LABEL_NALE_TXT_PATH.

https://github.com/JackWoo0831/yolov5_Deepsort_rknn

### RK3588平台 DeepSort 实现与应用 #### 环境准备 为了在RK3588平台上成功部署DeepSort,首先需要准备好相应的软件环境。这包括但不限于安装必要的依赖库和设置好Python虚拟环境。对于基于Android系统的RK3588设备来说,还需要确保已经正确设置了NDK(Native Development Kit),以便支持C++代码编译。 #### 安装依赖项 根据项目需求,在Linux环境下可以过包管理器来安装所需的依赖项。例如: ```bash sudo apt-get update && sudo apt-get install -y python3-pip libopencv-dev ffmpeg pip3 install numpy opencv-python torch torchvision cython filterpy lap ``` 这些命令会安装OpenCV用于图像处理、PyTorch作为深度学习框架以及其他辅助库[^1]。 #### 获取源码并构建 访问指定的GitHub仓库获取最新的`YOLOv8-DeepSORT-Object-Tracking`源码,并按照README.md中的说明完成本地克隆操作。之后进入项目根目录执行如下指令来进行编译工作: ```bash cd yolov8-deepsort-object-tracking/ python setup.py develop ``` 此过程将会自动下载预训练权重文件并将它们放置于合适的位置供后续调用[^4]。 #### 配置模型参数 针对特定硬件优化性能至关重要。考虑到RK3588的特点,建议调整部分超参以适应该平台特性。比如降低输入分辨率、减少batch size等措施有助于提高运行效率而不显著影响精度。具体修改可参照官方文档或社区讨论区内的经验分享[^2]。 #### 测试验证 一切就绪后就可以编写简单的脚本来加载模型并对视频流数据做实时分析了。下面给出了一段示范性的Python代码片段展示如何初始化YOLOv5+DeepSort实例并启动跟踪流程: ```python from deep_sort_realtime.deepsort_tracker import DeepSort import cv2 import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' model = torch.hub.load('ultralytics/yolov5', 'custom', path='path/to/best.pt').to(device) tracker = DeepSort(max_age=30, n_init=2) cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() results = model(frame).pred[0].cpu().numpy() detections = [] for *xyxy, conf, cls in reversed(results): bbox = list(map(int, xyxy)) det = Detection(bbox=bbox[:], confidence=float(conf), class_name=str(cls)) detections.append(det) tracks = tracker.update_tracks(detections=detections, frame_id=None) for track in tracks: if not track.is_confirmed(): continue ltrb = track.to_ltrb() id_ = str(track.track_id) label = f'{id_}' (text_width, text_height), baseline = cv2.getTextSize(label, fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.7e-3 * frame.shape[0], thickness=2)[0] p1 = tuple(map(int, map(round, ltrb[:2]))) p2 = tuple(map(int, map(lambda x,y:x+y, ltrb[:2],[text_width+baseline, -(text_height+baseline)]))) cv2.rectangle(img=frame, pt1=p1, pt2=p2[::-1], color=(255, 255, 255), thickness=-1) cv2.putText(img=frame,text=label, org=tuple(map(int,map(round,ltrb[:2]))), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.7e-3*frame.shape[0], color=(0, 0, 0), thickness=2) cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF if key == ord("q"): break cv2.destroyAllWindows() cap.release() ``` 这段程序实现了基本的目标检测加多目标追踪功能,过摄像头捕获画面并在界面上标注出各个被锁定的对象及其唯一编号[^3]。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值