YOLOv5(目标检测)
一、简介
YOLOv5 是由 Ultralytics 公司在 2020 年推出的单阶段目标检测算法,它并非 YOLO 系列原作者 Joseph Redmon 的作品,但基于 YOLOv3 和 YOLOv4 的思想进行了改进和优化,采用 PyTorch 框架实现,具有部署简单、速度快、精度较高的特点,其网络结构包括输入端(Mosaic 数据增强、自适应锚框计算等)、Backbone(使用 CSPDarknet53 作为特征提取网络,包含 CSP 结构和残差连接)、Neck(采用 FPN+PAN 结构进行多尺度特征融合)和输出端(通过 GIOU 损失函数计算边界框损失,支持多类别目标检测),在 COCO 等数据集上表现优异。
工程目录
YOLOV5
│ libsophon_soc_0.5.1-LTS_aarch64.tar.gz ##交叉编译所需环境
│ sophon-mw-soc_0.12.0_aarch64.tar.gz ##交叉编译所需环境
│ sophon-sail_3.8.0.tar.gz ##sail接口所需环境
│ stream_dev.tar ##libc为2.31的docker环境
│
├─cpp ##C++例程
│ ├─dependencies ##所依赖的库
│ │
│ ├─yolov5_bmcv ##bmcv例程
│ │ CMakeLists.txt
│ │ main.cpp
│ │ yolov5.cpp
│ │ yolov5.hpp
│ │ yolov5_bmcv.soc ##提供的执行文件
│ │
│ └─yolov5_sail ##sail例程
│ CMakeLists.txt
│ main.cpp
│ yolov5.cpp
│ yolov5.hpp
│ yolov5_sail.soc ##提供的可执行文件
│
├─datasets ##数据集
│
├─docs ##相关帮助文档
|
├─models ##bmodel文件
│ └─BM1684X
│ yolov5s_v6.1_3output_fp16_1b.bmodel
│ yolov5s_v6.1_3output_fp32_1b.bmodel
│ yolov5s_v6.1_3output_int8_1b.bmodel
│ yolov5s_v6.1_3output_int8_4b.bmodel
│
├─python ##python例程文件
│ postprocess_numpy.py
│ utils.py
│ yolov5_bmcv.py # 使用SAIL解码、SAIL.BMCV前处理、SAIL推理的Python例程
│ yolov5_opencv.py # 使用OpenCV解码、OpenCV前处理、SAIL推理的Python例程
│
├─sophon-sail ##提供的已经编译好的sail库
│
└─tools # 存放精度测试、性能比对等python脚本
compare_statis.py
eval_coco.py
二、运行步骤
1.python例程
1.1配置python环境
bmcv环境(运行yolov5_bmcv.py环境)
修改.bashrc文件,将sophon的python环境引入
sudo vim ~/.bashrc
在文件末尾加上下面字段
export PYTHONPATH=$PYTHONPATH:/opt/sophon/libsophon-current/lib:/opt/sophon/sophon-opencv-latest/opencv-python/
:wq
保存退出后重新加载终端
source ~/.bashrc
可echo $PYTHONPATH
,检查是否是对应字段。
opencv环境(运行yolov5_opencv.py环境)
pip install opencv-python-headless
1.2推理测试
文件参数说明
yolov5_opencv.py和yolov5_bmcv.py的命令参数相同,以yolov5_opencv.py的推理为例,参数说明如下:
usage: yolov5_opencv.py [-h] [--input INPUT] [--bmodel BMODEL] [--dev_id DEV_ID] [--conf_thresh CONF_THRESH] [--nms_thresh NMS_THRESH]
optional arguments:
-h, --help 打印这个帮助日志然后退出
--input INPUT 测试数据路径,可输入整个图片文件夹的路径或者视频路径
--bmodel BMODEL 用于推理的bmodel路径,默认使用stage 0的网络进行推理
--dev_id DEV_ID 用于推理的tpu设备id
--conf_thresh CONF_THRESH
置信度阈值
--nms_thresh NMS_THRESH
nms阈值
图片测试
图片测试实例如下,支持对整个图片文件夹进行测试,进入到对应目录下,例:/data/YOLOv5/
,即可对需要文件进行调试。
python3 python/yolov5_opencv.py --input datasets/test --bmodel models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5
测试结束后,会将预测的图片保存在results/images
下,预测的结果保存在results/yolov5s_v6.1_3output_fp32_1b.bmodel_test_opencv_python_result.json
下,同时会打印预测结果、推理时间等信息。
结果如下:
视频测试
python3 python/yolov5_opencv.py --input datasets/test_car_person_1080P.mp4 --bmodel models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5
测试结束后,会将预测的结果画在results/test_car_person_1080P.avi
中,同时会打印预测结果、推理时间等信息。
yolov5_bmcv.py
不会保存视频,而是会将预测结果画在图片上并保存在results/images
中,且暂时不支持图片上打印文字。
1.3.流程图
yolov5_bmcv.py
和yolov5_opencv.py
中的处理流程,都遵循以下流程图:
2.C++例程
1.交叉编译环境搭建
1.1编译环境
C++程序要在板端运行,是需要对依赖文件进行编译的(也可以直接使用提供的可执行文件)。这里我们为了节省边缘设备的压力,选择使用一个X86的linux环境进行交叉编译。
搭建交叉编译环境,这里提供两种方式:
(1)通过apt安装交叉编译工具链:
如果您的系统和目标SoC平台的libc版本相同(可通过ldd --version
命令进行查询),那么您可以使用如下命令安装:
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
卸载方法:
sudo apt remove cpp-*-aarch64-linux-gnu
如果您的环境不满足上述要求,建议使用第(2)种方法。
(2)通过docker搭建交叉编译环境:
可以使用我们提供的docker镜像--stream_dev.tar
作为交叉编译环境。
如果是首次使用Docker, 可执行下述命令进行安装和配置(仅首次执行):
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
在下载好的镜像目录中加载镜像
docker load -i stream_dev.tar
可以通过docker images
查看加载好的镜像,默认为stream_dev:latest
创建容器
docker run --privileged --name stream_dev -v $PWD:/workspace -it stream_dev:latest
# stream_dev只是举个名字的例子, 请指定成自己想要的容器的名字
#已有docker容器可通过下面命令打开
docker run -v $PWD:/workspace -it stream_dev:latest
容器中的workspace
目录会挂载到您运行docker run
时所在的宿主机目录,您可以在此容器中编译项目。workspace目录在根目录下,该目录下的改动会映射到本地目录中对应文件的改动。
注意:创建容器时需要到soc-sdk(依赖编译环境)的父目录以及以上目录
1.2打包依赖文件
打包libsophon
对libsophon_soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。
# 创建依赖文件的根目录 mkdir -p soc-sdk # 解压libsophon_soc_x.y.z_aarch64.tar.gz tar -zxf libsophon_soc_${x.y.z}_aarch64.tar.gz # 将相关的库目录和头文件目录拷贝到依赖文件根目录下 cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/lib soc-sdk cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/include soc-sdk
打包sophon-ffmpeg和sophon-opencv
对sophon-mw-soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。
# 解压sophon-mw-soc_x.y.z_aarch64.tar.gz tar -zxf sophon-mw-soc_${x.y.z}_aarch64.tar.gz # 将ffmpeg和opencv的库目录和头文件目录拷贝到soc-sdk目录下 cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/lib soc-sdk cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/include soc-sdk cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/lib soc-sdk cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/include soc-sdk
1.3进行交叉编译
**bmcv模式:**交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件。
cd cpp/yolov5_opencv
mkdir build && cd build
#请根据实际情况修改-DSDK的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk/ ..
make
编译完成后在对应的目录会生成.soc
文件,如:cpp/yolov5_bmcv/yolov5_bmcv.soc
。
**sail模式:**如果您使用sophon-sail接口,需要先给soc环境配置sophon-sail。配置方法如下:
通过交叉编译的方式(这里例子使用WSL进行),编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。
如编译平台libc版本与目标版本不同则需要进入docker环境
docker run -v $PWD:/workspace -it stream_dev:latest
#解压sophon-sail_3.8.0.tar.gz
tar -zvxf sophon-sail_3.8.0.tar.gz
#进入到sophon目录下:cd sophon
mkdir build && cd build
cmake -DBUILD_TYPE=soc -DBUILD_PYSAIL=OFF -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake -DLIBSOPHON_BASIC_PATH=../../libsophon_soc_0.5.1-LTS_aarch64/opt/sophon/libsophon-0.5.1/ -DFFMPEG_BASIC_PATH=../../sophon-mw-soc_0.12.0_aarch64/opt/sophon/sophon-ffmpeg_0.12.0/ -DOPENCV_BASIC_PATH=../../sophon-mw-soc_0.12.0_aarch64/opt/sophon/sophon-opencv_0.12.0/ ..
make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建build_soc
,编译结果将安装在build_soc
下面
make install
将build_soc
文件夹下的sophon-sail
拷贝至目标SOC的/opt/sophon
目录下,即可在soc上面进行调用。
交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件。
cd cpp/yolov5_sail
mkdir build && cd build
#请根据实际情况修改-DSDK和-DSAIL_PATH的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/path_to_sdk/soc-sdk -DSAIL_PATH=/wrokspace/sophon-sail/build_soc/sophon-sail ..
make
编译完成后,会在yolov5_sail
目录下生成yolov5_sail.soc
。
因为这里移动sophon-sail
到的是/opt/sophon
目录,如果使用ssh连接进行文件传送需要进入root账户下。root账户无初始密码,使用前需要先用linaro账户做sudo passwd root设置密码。
一般linux系统是默认禁止远程登录root用户,需要进行下面操作:
编辑配置文件
sudo vim /etc/ssh/sshd_config
#文件中加入
PermitRootLogin yes
退出并保存,重启ssh
sudo service sshd restart
在您按照教程将sophon-sail的库文件拷贝到目标soc上之后,您还需要设置以下环境变量:
echo 'export LD_LIBRARY_PATH=/opt/sophon/sophon-sail/lib/:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
2.推理测试
需将交叉编译生成的可执行文件及所需的模型、测试数据拷贝到SoC平台(即BM1684X开发板)中测试,这里推荐进入到/data/YOLOv5/cpp/yolov5_sail
目录下。
参数说明
可执行程序默认有一套参数,请注意根据实际情况进行传参,yolov5_bmcv.soc与yolov5_sail.soc参数相同。
具体参数说明如下:
Usage: yolov5_bmcv.soc [params]
--bmodel (value:../../models/BM1684/yolov5s_v6.1_3output_fp32_1b.bmodel)
bmodel file path
--classnames (value:../../datasets/coco.names)
class names file path
--conf_thresh (value:0.001)
confidence threshold for filter boxes
--dev_id (value:0)
TPU device id
--help (value:true)
print help information.
--input (value:../../datasets/test)
input path, images direction or video file path
--nms_thresh (value:0.6)
iou threshold for nms
图片测试
图片测试实例如下,支持对整个图片文件夹进行测试,以yolov5_sail.soc为例
##先对文件加上可执行权限
chmod +x yolov5_sail.soc
./yolov5_sail.soc --input=../../datasets/test --bmodel=../../models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../datasets/coco.names
测试结束后,会将预测的图片保存在results/images
下,预测的结果保存在results/yolov5s_v6.1_3output_fp32_1b.bmodel_test_bmcv_cpp_result.json
下,同时会打印预测结果、推理时间等信息。
视频推理
cpp例程的视频推理最后狗结果是逐帧保存在results/images
下,预测的结果保存在results/yolov5s_v6.1_3output_fp32_1b.bmodel_test_bmcv_cpp_result.json
下,同时会打印预测结果、推理时间等信息。
./yolov5_sail.soc --input=../../datasets/test_car_person_1080P.mp4 --bmodel=../../models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../datasets/coco.names