一、训练yolov5模型,转onnx
1、下载yolov5:https://github.com/ultralytics/yolov5
2、创建虚拟环境,安装依赖库
conda create -n yolov5-6.1 python=3.7
conda activate yolov5-6.1
进入yolov5目录,注释 requirements.txt 文件中的 torch、torchvision 行,取消 coremltools、onnx、onnx-simplifier、scikit-learn 行前面的注释,安装依赖库,并在pytorch中安装合适的pytorch版本
pip install -r requirements.txt
conda install pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cudatoolkit=10.2 -c pytorch
3、修改训练参数和模型结构(以yolov5s-6.1为例)
a、创建data/xxx.yaml文件,确认训练数据路径、类别数目、类别名;
b、修改models/yolov5s.yaml文件中类别数目与data/xxx.yaml文件类别数目相同;
c、修改models/yolov5s.yaml中的网络结构,将focus层修改为conv层(caffe不支持focus层),并设置stride为2,如不修改在进行onnx转caffe时会报以下错误:
Traceback (most recent call last):
File "convertCaffe.py", line 159, in <module>
convertToCaffe(graph, prototxt_path, caffemodel_path, exis_focus=True, focus_concat_name="Concat_40", focus_conv_name="Conv_41")
File "convertCaffe.py", line 83, in convertToCaffe
layer = converter_fn(node, graph, err)
File "/home/lcat/Projects/yolov5_onnx2caffe/onnx2caffe/_operators.py", line 505, in _convert_resize
height_scale = scales[2]
IndexError: index 2 is out of bounds for axis 0 with size 0
修改后的yolov5s.yaml文件内容如下:
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# parameters
nc: 2 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 backbone
backbone:
# [from, number, module, args]
#[[-1, 1, Focus, [64, 3]], # 0-P1/2
[[-1, 1, Conv, [64, 3, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]], # 9
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]],
#[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[-1, 1, nn.ConvTranspose2d, [256,256,2,2]],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
#[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[-1, 1, nn.ConvTranspose2d, [128,128,2,2]],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
4、模型训练,修改 train.py 相关训练参数并开始训练
--weights ROOT / 'yolov5s.pt'
--cfg ROOT / 'models/yolov5s.yaml'
--data ROOT / 'data/xxx.yaml'
--epochs 200
--batch-size 8
--imgsz 384
--workers 0
python train.py
5、模型导出,修改 export.py 相关导出参数并导出onnx模型
--data ROOT / 'data/xxx.yaml'
--weights 需要转换的.pt模型路径
--imgsz [384, 384]
python export.py
6、模型简化
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx
二、下载安装caffe,onnx转caffe
1、miniconda创建caffe环境
conda create -n caffe python=3.6
conda activate caffe
pip install pip -U
pip install numpy
2、安装caffe
sudo apt install git
sudo git clone https://github.com/Wulingtian/yolov5_caffe.git
安装caffe-gpu
conda install -c anaconda caffe-gpu
安装onnx
conda install -c conda-forge onnx
安装onnxruntime
conda install -c conda-forge onnxruntime
2、下载yolov5_onnx2caffe,转换为caffe
(1)修改yolov5的 models/yolo.py 文件中的forward函数,如不修改可能会报 keyerror:xxx 错误,修改后的内容如下:
# 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.onnx_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)
# y = x[i].sigmoid()
# if self.inplace:
# y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy
# y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
# else: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
# xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy
# wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
# y = torch.cat((xy, wh, y[..., 4:]), -1)
# z.append(y.view(bs, -1, self.no))
# return x if self.training else (torch.cat(z, 1), x)
def forward(self, x):
z = [] # inference output
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
return x[0],x[1],x[2]
(2)onnx转caffe
git clone https://github.com/Wulingtian/yolov5_onnx2caffe.git
进入yolov5_onnx2caffe目录,修改convertCaffe.py中的模型路径
- onnx_path:需要转换的onnx模型
- prototxt_path:转换为caffe的prototxt保存路径
- caffemodel_path:转换为caffe的caffemodel保存路径
python convertCaffe.py
三、下载安装opencv
1、下载:https://opencv.org/releases/
2、安装
(1)编译
unzip opencv-4.7.0.zip
cd opencv-4.7.0
mkdir build
cd build
sudo apt install cmake
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release -DOPENCV_GENERATE_PKGCONFIG=ON -DOPENCV_ENABLE_NONFREE=True ..
sudo make -j8
sudo make install
(2)配置环境
a、修改etc/bash.bashrc
sudo vim /etc/bash.bashrc
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
sudo updatedb
source /etc/bash.bashrc
报错:sudo: updatedb: command not found
解决:sudo apt install mlocate
b、修改动态库
sudo vim /etc/ld.so.conf.d/opencv.conf
# 在末尾添加
/usr/local/lib
# 更新
sudo ldconfig
(3)检查是否安装成功
pkg-config --modversion opencv4 #查看版本号
pkg-config --libs opencv4 #查看libs库
(4)程序测试
进入~/opencv-4.7.0/samples/cpp/example_cmake$ 目录,执行以下命令:
mkdir build
cd ./build
cmake ..
make
./opencv_example
四、下载安装cuda
1、在cuda官网选择合适版本进入下载页面,本文选择 CUDA Toolkit 11.7.0
下载地址:https://developer.nvidia.com/cuda-toolkit-archive
2.依次选择【Linux】->【x86_64】->【Ubuntu】->【22.04(选择自己的ubuntu版本号)】->【deb(local)】
3、下拉复制框中代码进行安装
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2204-11-7-local_11.7.0-515.43.04-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-11-7-local_11.7.0-515.43.04-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
在用apt-get安装软件包的时候遇到E: Sub-process /usr/bin/dpkg returned an error code (1)问题,解决方法如下:
cd /var/lib/dpkg/
sudo mv info/ info_bak # 现将info文件夹更名
sudo mkdir info # 再新建一个新的info文件夹
sudo apt-get update # 更新
sudo apt-get -f install # 修复
sudo mv info/* info_bak/ # 执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_bak文件夹下
sudo rm -rf info # 把自己新建的info文件夹删掉
sudo mv info_bak info # 把以前的info文件夹重新改回名
4、配置cuda path
vim ~/.bashrc
在文件末尾加入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
source ~/.bashrc # 更新环境变量配置
nvcc -V # 查看cuda的版本号
安装cuda2:
1、下载: http://https://developer.nvidia.com/cuda-toolkit-archive
2、执行官方下载安装命令进行安装
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
sudo sh cuda_11.7.0_515.43.04_linux.run
执行sudo sh cuda_11.7.0_515.43.04_linux.run之后,选择Continue
输入accept
点击空格,取消安装驱动,然后选择Install
安装完成
3、配置环境变量
输入以下命令打开文件
gedit ~/.bashrc
在文件结尾输入以下语句,保存并关闭文档
export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
输入以下命令
source ~/.bashrc
4、查看cuda信息
nvcc -V
五、下载安装cuDNN
1、下载: https://developer.nvidia.com/rdp/cudnn-download
2、安装
(1)查看 Installation Guide
(2)安装Zlib
sudo apt-get install zlib1g
(3)在下载文件目录下解压并安装
tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
(4)验证是否安装成功
sudo cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
六、caffe模型推理
1、下载 yolov5_caffe:
git clone https://github.com/Wulingtian/yolov5_caffe.git
2、修改 yolov5_caffe/tools/caffe_yolov5s.cpp 参数
INPUT_W 模型输入宽度
INPUT_H 模型输入高度
NUM_CLASS 模型有多少个类别
NMS_THRESH 做非极大值抑制的阈值
CONF_THRESH 类别置信度
prototxt_path caffe模型的prototxt路径
caffemodel_path caffe模型的caffemodel路径
pic_path 测试图片路径
3、定位到yolov5_caffe目录下,执行以下命令
make all -j8
cd build
./tools/caffe_yolov5s
执行 make all -j8 命令
报错1:
make: protoc: No such file or directory
解决1:
protoc --version
sudo apt install protobuf-compiler
报错2:
./include/caffe/solver.hpp:3:10: fatal error: boost/function.hpp: No such file or directory
解决2:
sudo apt update
sudo apt install libboost-all-dev
报错3:
./include/caffe/common.hpp:5:10: fatal error: gflags/gflags.h: No such file or directory
解决3:
sudo apt install libgflags-dev
报错4:
./include/caffe/common.hpp:6:10: fatal error: glog/logging.h: No such file or directory
解决4:
sudo apt install libgoogle-glog-dev
报错5:
./include/caffe/util/device_alternate.hpp:34:10: fatal error: cublas_v2.h: No such file or directory
解决5:
a、找到文件路径
find /usr/local/ -name cublas_v2.h
b、添加路径到配置文件
vim ~/.bashrc
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/cuda-11.7/targets/x86_64-linux/include
报错6:
./include/caffe/util/cudnn.hpp:5:10: fatal error: cudnn.h: No such file or directory
解决6:安装cudnn
错误7:
./include/caffe/util/mkl_alternate.hpp:14:10: fatal error: cblas.h: No such file or directory
解决7:
sudo apt install libatlas-base-dev
报错8:
src/caffe/layers/hdf5_data_layer.cu:10:10: fatal error: hdf5.h: No such file or directory
解决8:
sudo apt-get install libhdf5-serial-dev
报错9:
src/caffe/layers/image_data_layer.cpp:2:10: fatal error: opencv2/core/core.hpp: No such file or directory
解决9: