RK3588跑通YOLOv5+DeepSORT

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;
}

最终结果

在这里插入图片描述
参考文章:

  1. http://runxinzhi.com/gjianw217-p-3228455.html
  2. https://blog.csdn.net/weixin_55015419/article/details/131021128?ydreferer=aHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDEwLjIxMzUuMzAwMS41NDQ4
  3. https://blog.csdn.net/Zhang_Chen_/article/details/86769552
  4. https://blog.csdn.net/Damon_Sandy/article/details/131995799
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
【资源介绍】 基于RK3588上部署yolov5s模型源码(实时摄像头检测)+部署说明文档.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 yolov5模型(.pt)在RK3588(S)上的部署(实时摄像头检测) - 所需: - 安装了Ubuntu20系统的RK3588 - 安装了Ubuntu18的电脑或者虚拟机 <details> <summary>一、yolov5 PT模型获取</summary> [Anaconda教程](https://blog.csdn.net/qq_25033587/article/details/89377259)\ [YOLOv5教程](https://zhuanlan.zhihu.com/p/501798155)\ 经过上面两个教程之后,你应该获取了自己的`best.pt`文件 </details> <details> <summary>二、PT模型转onnx模型</summary> - 将`models/yolo.py`文件中的`class`类下的`forward`函数由: ```python def forward(self, x): z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training: # inference if self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) if isinstance(self, Segment): # (boxes + masks) xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4) xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf.sigmoid(), mask), 4) else: # Detect (boxes only) xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4) xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, self.na * nx * ny, self.no)) return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) ``` 改为: ```python def forward(self, x): z = [] # inference

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值