RK3588跑通YOLOv5+DeepSORT
本帖子用于记录复现时遇到的问题和解决方案
安装ffmpeg
1、安装依赖
sudo apt-get install yasm
sudo apt-get install build-essential
sudo apt-get install -y libass-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libsdl2-dev
sudo apt-get install libtheora-dev
sudo apt-get install libva-dev
sudo apt-get install libvdpau-dev
sudo apt-get install libvorbis-dev
sudo apt-get install libxcb1-dev
sudo apt-get install libxcb-shm0-dev
sudo apt-get install libxcb-xfixes0-dev
sudo apt-get install texinfo
sudo apt-get install zlib1g-dev
sudo apt-get install git
sudo apt-get install cmake
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
2、编译安装NASM
https://www.linuxfromscratch.org/blfs/view/svn/general/nasm.html
./configure --prefix=/安装路径
make
make install
3、编译安装x264
https://www.videolan.org/developers/x264.html
./configure --enable-shared --enable-static --prefix=/安装路径
make
make install
4、安装ffmpeg
https://ffmpeg.org/download.html#releases
关于版本选择大家可以参考博客:https://blog.csdn.net/Damon_Sandy/article/details/131995799,在opencv源码文件夹下的3rdparty-ffmpeg中找到cmake文件查看对应版本号
# --extra-cflags和--extra-ldflags指定x264库的位置
./configure --prefix=安装路径 --enable-shared --enable-gpl --enable-libx264 --extra-cflags=-I/home/firefly/Downloads/x264/include --extra-ldflags=-L/home/firefly/Downloads/x264/lib
make
make install
注意:
如果遇到问题ERROR: libx264 not found,可以参考以下解决方案:
- http://blog.csdn.net/ljh081231/article/details/7595556
- http://blog.csdn.net/webdisk008/article/details/6618777
- http://code.google.com/p/x264-ffmpeg-up-to-date/issues/detail?id=13
我的解决方案:
sudo vi /etc/ld.so.conf
# 将libx264所在的目录,添加到文件ld.so.conf中
sudo ldconfig /etc/ld.so.conf
配置:
sudo vi /etc/ld.so.conf.d/ffmpeg.conf
# 加入ffmpeg动态库的路径
sudo ldconfig
安装OpenCV
使用的版本是4.7.0
1、安装依赖
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install cmake-qt-gui
如果libjasper-dev安装遇到问题:
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev
2、下载opencv源码
(1)在opencv官方仓库下载需要版本的opencv源码,并解压
(2)创建两个文件夹分别作为opencv的构建目录和安装目录
mkdir /home/firefly/Downloads/build_opencv //构建路径
mkdir /home/firefly/Downloads/install_opencv //安装路径
# 源码路径 /home/firefly/Downloads/opencv-4.7.0
3、下载Eigen
sudo apt install libeigen3-dev
4、配置cmake
cmake-gui
(1)选择源码目录和build目录,选择默认编码器
(2)点击finish,然后再点击configure,配置参数(一定要注意修改CMAKE_INSTALL_PREFIX为安装路径/home/firefly/Downloads/install_opencv),然后点击configure,直到没有红色为止,然后点击generate
(3)开始编译
进入/home/firefly/Downloads/build_opencv文件
make -j16 #如果性能不够可以-j4、-j8
make install
配置:
sudo vi /etc/ld.so.conf.d/opencv.conf
# 加入opencv动态库的路径
sudo ldconfig
至此编译完成!!!
代码调试
参考代码:https://github.com/Zhou-sx/yolov5_Deepsort_rknn
1、修改CMakeLists
在./CMakeLists.txt和./deepsort/CMakeLists.txt中
更改set(OpenCV_DIR /home/wjp/opencv4.6.0/install/lib/cmake/opencv4) # 填入OpenCVConfig.cmake
后面的路径是OpenCV的OpenCVCondif.cmake的路径
2、替换项目第三方库或修改cmakelist中第三方库引用位置
由于项目使用的rga和librknn版本可能与板卡不一样,所以需要用find命令找到板卡上的librknn_api.so、librknnrt.so、librga.so进行替换
3、修改yolov5_deeposort.cpp文件中的一系列地址
项目里的rknn模型感觉有问题,这里我是换成了官方给的yolov5s.rknn
4、修改./include/common.h文件
(1)修改IMG_WIDTH, IMG_HEIGHT, IMG_PAD, OBJ_CLASS_NUM为视频大小等参数
(2)在./yolov5/src/decode.cpp中修改LABEL_NALE_TXT_PATH, 该txt储存的是视频中类别名称, 必须与 OBJ_CLASS_NUM对应
5、编译运行
# 进入到build文件夹
cmake ..
make -j8
./yolov5_deepsort
注意:
(1)在make阶段可能遇到的报错
eigen在头文件中的位置有问题,使用find命令找到板卡eigen所在的位置,并根据报错提示修改相应头文件
(2)视频编码错误(这是我本人花最长时间解决的错误!!!!!)
报错示例:
关于opencv视频编码的几种类型大家可以去自行查阅
修改./yolov5/src/videoio.cpp文件,在videowrite函数中,修改video_probs.Video
_fourcc为CV_FOURCC(‘M’,‘J’,‘P’,‘G’)
代码如下:
void videoWrite(const char* save_path,int cpuid)
{
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(cpuid, &mask);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
cerr << "set thread affinity failed" << endl;
printf("Bind videoWrite process to CPU %d\n", cpuid);
cv::VideoWriter vid_writer;
while(1)
{
if(queueInput.size() > 0)
{
cout << save_path << " " << endl;
# 增加这一句!!!!
video_probs.Video_fourcc = CV_FOURCC('M','J','P','G');
vid_writer = cv::VideoWriter(save_path, video_probs.Video_fourcc, video_probs.Fps,
cv::Size(video_probs.Video_width, video_probs.Video_height));
break;
}
}
while (1)
{
// queueOutput 就尝试写
if (queueOutput.size() > 0) {
mtxQueueOutput.lock();
imageout_idx res_pair = queueOutput.front();
queueOutput.pop();
mtxQueueOutput.unlock();
draw_image(res_pair.img, res_pair.dets);
vid_writer.write(res_pair.img); // Save-video
}
// 最后一帧检测/追踪结束 bWriting置为false 此时如果queueOutput仍存在元素 继续写
else if(!bTracking){
vid_writer.release();
break;
}
}
cout << "VideoWrite is over." << endl;
}
最终结果
参考文章:
- http://runxinzhi.com/gjianw217-p-3228455.html
- https://blog.csdn.net/weixin_55015419/article/details/131021128?ydreferer=aHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDEwLjIxMzUuMzAwMS41NDQ4
- https://blog.csdn.net/Zhang_Chen_/article/details/86769552
- https://blog.csdn.net/Damon_Sandy/article/details/131995799