上篇说到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:
本仓库在原仓库的基础上:
- 改善了边界框漂移, 完善了当图中没有目标等其他情形出现的bug, 增加了对cost matrix出现nan时的处理
- 加入了隔帧检测的功能. 设置方法:
在
./yolov5/include/detect.h
中 将
const int det_interval = 1;
改成期望的数值, 例如3, 表示每隔3帧检测一次, 这样可以显著提升速度.
同时, 也需要更改./deepsort/include/deepsort.h
中line 39
的const int track_interval = 1;
, 数值要和检测的保持一致.
- 加入Re-ID多线程的功能
如果您不希望使用多线程, 则在
./deepsort/src/deepsort.cpp
中line 144
的if (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
.