rk3588部署yolov8视频目标检测教程

devtools/2024/12/21 21:19:53/
1. 环境配置
1.1 训练和导出onnx环境
#使用conda创建一个python环境
conda create -n torch python=3.9#激活环境
conda activate torch#安装yolov8
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

1.2 导出rknn环境

安装toolkit2-1.5.2

下载链接:

链接:百度网盘 请输入提取码

提取码:abcf 

下载后对应的文件为 onxx2rknn

下载后,创建一个conda环境,python使用3.6

#创建rknn环境
conda create -n toolkit python=3.6#激活环境
conda activate toolkit-152-py36#进入下载的文件夹 安装依赖库,保证每个都能安装上,如果有安装不上的,-i后面换别的源地址进行安装
pip install -r requirements_cp36-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple#都安装完以后安装rknn_toolkit,还是进入百度云下载的文件夹
pip install rknn_toolkit2-1.5.2+b642f30c-cp36-cp36m-linux_x86_64.whl

1.3 rk3588上opencv编译

编译好的动态库我放到了百度云盘中路径为 opencv4_install,如果板子是rk3588,系统为ubuntu20.04应该是可以用起来的。如果不是的话,可能需要自己编译一下,步骤如下:

参考链接 ubuntu在arm平台下编译安装opencv(亲测可用)_opencv arm-CSDN博客

1.3.1 下载opencv源码

opencv: Release OpenCV 4.4.0 · opencv/opencv · GitHub

opencv_contrib: https://github.com/opencv/opencv_contrib/releases/tag/4.4.0

我已经放到了百度云上,在1.2节的百度云中,对应文件为opencv4.4

下载后放在到办卡上

1.3.2 开始编译

解压opencv和opencv-contrib 代码,在板卡上新建一个opencv4_install文件夹,用于安装opencv,再进入解压后的opencv4.4.0文件夹, 新建文件夹 build,进入build文件夹,打开终端执行以下命令

注意:

  • CMAKE_INSTALL_PREFIX 这个路径改成自己实际的绝对安装地址
  • OPENCV_EXTRA_MODULES_PATH 这个路径换成自己实际的解压后的contrib的绝对地址
  • 下面的OFF,ON表示库是否编译,因为用到的库不多,基本就是图像和视频相关,所以我把别的都关闭了
  • 其中BUILD_SHARED_LIBS表示是否编译为动态库,我关闭后,变成静态库,使用的时候一直报错,所以我还是使用的动态库去链接,有懂的大佬请指教一下
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/home/forlinx/opencv/opencv4_install \
-D OPENCV_EXTRA_MODULES_PATH=//home/forlinx/opencv/opencv_contrib-4.4.0/modules \
-D BUILD_opencv_python3=OFF \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-D WITH_GTK_2_X=ON \
-D BUILD_SHARED_LIBS=ON \
-D WITH_OPENGL=OFF \
-D BUILD_opencv_python3=OFF \
-D BUILD_opencv_apps=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_TESTS=0FF \
-D BUILD_opencv_calib3d=OFF \
-D BUILD_opencv_flann=OFF \
-D BUILD_opencv_stitching=OFF \
-D BUILD_opencv_ts=OFF \
-D BUILD_opencv_feature2d=OFF \
-D BUILD_opencv_superres=OFF \
-D BUILD_opencv_ononfree=OFF \
-D BUILD_opencv_gpu=OFF \
-D BUILD_opencv_stereo=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_opencv_python3=OFF \
-D BUILD_IPP=OFF \
-D BUILD_TBB=OFF \
-D BUILD_opencv_java=OFF \
-D BUILD_JAVA=OFF \
-D BUILD_DOCS=0FF ..

编译的时候,会报错误,缺一些依赖库,参照下面的链接进行解决

(注意需要按照这个这里的链接下载一系列文件

fatal error: boostdesc_bgm.i: No such file or directory · Issue #1301 · opencv/opencv_contrib · GitHub

搜索 leaf918, 把pitch文件下载下来,解压后,

把patch/boostdesc下的内容拷贝到 opencv-4.4.0/.cache/xfeatures2d/boostdesc/

把patch/vgg下面的内容拷贝到opencv-4.4.0/.cache/xfeatures2d/vgg/)

注意:这里缺少的文件我已经放到了百度云

patch文件我已经放到百度云opencv4.4/patch_文件夹下,可以下载放到对应位置后,在重新执行上述指令进行编译,直到无报错为止,再执行make指令进行编译

make -j8#执行完后无报错 进行安装
sudo make install

编译成功后会生成以下文件

编译成功后,打开系统文件

#打开系统文件
vi /etc/profile#在最下面添加如下内容
export LD_LIBRARY_PATH=/opencv4_install/lib:$LD_LIBRARY_PATH
export Opencv_DIR=/opencv4_install#上述路径要按照自己的绝对路径来写
#保存后重启板子
2. 训练部分
#下载yolov8官方代码
git clone https://github.com/ultralytics/ultralytics.git#切换分支
cd ultralytics
git checkout a05edfbc27d74e6dce9d0f169036282042aadb97

2.1 训练脚本
#在ultralytics根目录下新建一个train.py文件
from ultralytics import YOLO
model = YOLO(ultrallytics/cfg/models/v8/yolov8n.yaml).load('yolov8n.pt')
model.train(data='ultralytics/cfg/datasets/VisDrone.yaml',batch=48,epochs=800,imgsz=640,save_period=1,device=0)
  • 我使用的是最轻量化的v8n模型, 所以第一行代码中使用的 yolov8n.yaml,训练时,工程会自动匹配yolov8n的模型,并使用yolov8n.pt作为预训练模型
  • 因为我使用的自定义数据集,我是基于VisDrone数据加上了自己的数据制作的训练集,所以加载的是改造后的VisDrone.yaml文件 数据的转换这里不仔细写了,以后空了我再补充在这里,但是需要注意的是,我是二分类,所以需要修改两处地方,否则训练出来的模型是不正确的

2.2 修改配置

修改1:

代码路径: /ultralytics/cfg/models/v8/yolov8.yaml 第5行修改为自己训练集需要检测目标的类别数量

修改2:

/ultralytics/cfg/datasets/VisDrone.yaml中训练集、测试集、验证集的数据路径以及类别的label

这里修改为自己对应数据的路径和类别,否则跑出来是错误的。

3. pt转onnx
  • 将第二部分修改后的训练代码(修改后的两个配置文件版本),复制一份出来,然后将文件名字改为 ultralytics-export
  • 下载百度云里面的git修改项,路径为 pt2onnx/enpei.modify.patch,将该文件拷贝到 ultralytics-expot文件夹内

#进入ultralytics-export文件,进行代码修改
cd ultraytics-export#应用patch文件进行代码修改
git apply enpei.modify.patch

执行完后如图所示

  • 此时代码已经修改完成,并且在文件下多了一个export_onnx.py文件, 再在ultralytics-export下新建一个文件夹叫 weights,将第2步中的训练好的最优模型best.pt 文件拷贝到weights文件夹下,

  • 打开export_onnx.py文件,如果使用的别的版本v8模型,需要修改对应的模型配置文件

  • 然后打开终端,执行下面的命令进行导出
#激活导出onnx环境
conda activate torch#进入ultralytics-export文件夹
cd ultralytics-export#开始转换
python export_onnx.py

执行完会在终端显示 done! 并且在weights文件夹下生成对应onnx文件,就表示转换成功

4. onnx转rknn

导出工具在百度云下载的文件夹中,路径为onnx2rknn/convert_rknn, 下载后把导出的yolov8.dict.onnx拷贝到该文件夹下

#激活第一步中rknn环境
conda activate toolkit-152-py36#进入转换工具准备转换
cd convert_rknnpython convert_rknn.py

终端就开始量化转换,如图所示:

看到该界面就表示转换完成,可以在convert_rknn文件夹下看到多出来一个 yolov8.int.rknn模型和一个 test_rknn_results.jpg的推理结果,如果test_rknn_results.jpg的推理结果大致没啥问题,那么表示rknn转换无误了。

5. rk3588部署

c++推理代码放到百度云盘地址 rk3588_cplus中的,我把zip和没压缩的都上传上去了,避免下载有问题。此时我把第1.3部分中编译的opencv动态库放到了3rdparty里面的,所以需要修改一下CMakeLists.txt文件就基本可以跑起来了

  • 修改CMakeLists.txt文件第37行代码,把opencv的路径修改为自己板卡上的绝对路径

但是我感觉这句话是多余的,因为在第1.3.2步骤中,已经把动态库的地址写到了系统文件里

  • 修改代码,文件/yolov8_cplus/src/postprocess.cpp中第 59 行代码,修改为自己需要检测类别的数量

  • 修改 标签文件coco_80_labels_list.txt, 将内容修改为自己需要检测的类别

#开始编译
mkdir build && cd build#这里容易报opencv相关的错误,尝试自己解决一下,我编译动态库应该是可以用的
cmake ..#编译
make -j8

若一切顺利的话,这里在build文件下可以生成三个可执行文件,如图所示

分别为yolov8_img 用于检测图像,yolov8_video 用于检测视频,yolov8_thread_pool用于线程池检测视频

#测试
./yolov8_img [模型地址] [图像地址]./yolob8_video [模型地址] [视频地址] [写1或者不写,写1表示将结果存下来,默认不存结果]./yolov8_thread_pool [模型地址] [视频地址] [线程数]

着急下班写的比较粗糙,可能中间过程还有点问题,五一后我再补充 


http://www.ppmy.cn/devtools/30621.html

相关文章

nuxt3使用记录六:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为,今天我突然很好奇,我发现之前构建的自动产生的200.html和404.html足足290k,怎么这么大呢?不是很占用我带宽? 一个啥东西都没有的静态页面,凭啥这么大!所以我就想着手动把他…

华为Pura70发布,供应链公司进入静默保密期

保密措施:与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态,尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感,调动用户的好奇心&#xf…

收单外包机构备案情况分析,广东备案机构遥遥领先

孟凡富 4月30日,中国支付清算协会公示了最新一批收单外包服务备案机构,较上期增加了689家。其中,新增聚合支付技术服务备案机构达6家。截至4月末,备案的收单外包服务机构总数为27714家,同时取消了330家机构的备案资格&…

C++ -- Array 学习

在 C 中,std::array 是标准库提供的一个容器,用于存储固定大小的元素序列。它具有以下特点: 固定大小:std::array 的大小在创建时就被确定,并且不能改变。因此,它适用于需要静态大小的情况。 连续存储&…

《架构即未来》读后感

目录 一、引言 二、《架构即未来》读后感 1、主题的简要介绍 2、我的看法和理解 3、作者的优点和传递的信息 4、思想如何适用于当今社会 三、《架构即未来》对于企业发展的影响具体体现在哪些方面? 一、引言 任何一个持续成长的公司最终都需要解决系统、组织…

Docker-05 Docker容器命令

一、查看容器 查看正在运行的容器: docker ps属性说明CONTAINER ID容器 IDIMAGE所属镜像COMMAND启动容器时运行的命令CREATED创建时间STATUS容器状态PORTS端口NAMES容器名称查看停止的容器: docker ps -f status=exited查看所有容器(包括运行和停止): docker ps -a查看…

opencv_22_图像卷积操作

void blur_demo(Mat& image); void ColorInvert::blur_demo(Mat& image) { Mat dst; blur(image, dst, Size(13, 13), Point(-1, -1)); imshow("图像模糊", dst); }

leetcode84柱状图中最大的矩形

题解&#xff1a; - 力扣&#xff08;LeetCode&#xff09; class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack new Stack<>();int maxArea Integer.MIN_VALUE;for(int i 0;i < heights.length;i){int curHeight hei…