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


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

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

解决方案参照CSDN, 首先安装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 buildcmake ..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