yolo-fastest模型训练&树莓派部署物体检测模型
0. 文档介绍
本文档分为以下几个部分:
- 模型训练:使用基于 darknet 的 yolofastest 训练生成用于物体检测的模型
- arm 端模型推理:通过 ncnn 在 arm 端的优化,进行模型的推理
- python 调用:ncnn 未提供 python 版本,因此通过 pybind11 生成可用于python 调用的动态链接库
建议顺序: 可先按照[arm端](#2. arm端模型推理环境搭建)进行操作,然后[模型训练](1. 模型训练)进节行模型的训练
如遇到问题:可加 qq群:954757083
1. 模型训练
可主要参考 yolo-fastest,次要参考 darknet
下面所执行环境电脑配置为 ubuntu 16.0.4, cuda 版本为10.0
git clone https://github.com/dog-qiuqiu/Yolo-Fastest.git
cd Yolo-Fastest
vim MakeFile
GPU=1
to build with CUDA to accelerate by using GPU (CUDA should be in/usr/local/cuda
)没有 GPU 设置为 0,有GPU且设置好 CUDA,设置为1
CUDNN=1
to build with cuDNN v5-v7 to accelerate training by using GPU (cuDNN should be in/usr/local/cudnn
)cudnn 和cuda 一般一起安装,上面为0,则这个也为0
CUDNN_HALF=1
to build for Tensor Cores (on Titan V / Tesla V100 / DGX-2 and later) speedup Detection 3x, Training 2x
OPENCV=1
to build with OpenCV 4.x/3.x/2.4.x - allows to detect on video files and video streams from network cameras or web-cams已安装 opencv 则设置 为 1,否则为 0
Set the other options in the
Makefile
according to your need.
make -j2
1.2 生成 COCO 预训练模型
./darknet partial ./Yolo-Fastest/COCO/yolo-fastest.cfg ./Yolo-Fastest/COCO/yolo-fastest.weights yolo-fastest.conv.109 109
1.3 训练配置文件修改
mkdir pupildata
cp ./Yolo-Fastest/COCO/yolo-fastest.cfg ./pupildata/pupil.cfg
step one: 修改 classes=class_num (只有一个 pupil ,即为 1)
step two: 修改[yolo] 上一层 [convolutional] 里的 filters = 3 * (class_num + 5)=18
step three: 修改 max_batches ,steps ,训练批次和训练轮数(max_batches=4000,steps=3200,3600 训练效果良好,可通过观察训练输出avg_loss 来进行调整,avg_loss 达到0.0几效果即可),如要增加max_batches,steps相应修改为 max_batches 的 80% 和 90%。
pupil.cfg 原部分内容:
[net]
batch=128
subdivisions=1
width=320
height=320
channels=3
momentum=0.949
decay=0.0005
angle=0
saturation=1.5
exposure=1.5
hue=.1learning_rate=0.001
burn_in=4000
max_batches=500000
policy=steps
steps=400000,450000
scales=.1,.1[convolutional]
filters=8
size=3
pad=1
stride=2
batch_normalize=1
activation=leaky.........[convolutional]
size=1
stride=1
pad=1
filters=255
activation=linear[yolo]
mask = 3,4,5
anchors = 12, 18, 37, 49, 52,132, 115, 73, 119,199, 242,238
classes=80
num=6
jitter=.15
ignore_thresh = .5[convolutional]
size=1
stride=1
pad=1
filters=255
activation=linear[yolo]
mask = 0,1,2
anchors = 12, 18, 37, 49, 52,132, 115, 73, 119,199, 242,238
classes=80
num=6
jitter=.15
ignore_thresh = .5
truth_thresh = 1
random=0
scale_x_y = 1.00
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
1.4 训练数据所需文件进行配置
touch ./pupildata/pupil.data ./pupildata/pupil.names
pupil.names 为要识别的类的名字,每个名字一行,只有一类则该行内容 “pupil”,内容为:
pupil
pupil.data 内容为关于训练数据的一些内容,内容为:
classes=1 #训练类别的数目 train=/usr/local/zht/Yolo-Fastest/train/train.txt #训练集图片的路径(含义见第 0 部分) valid=/usr/local/zht/Yolo-Fastest/train/val.txt #验证集图片的路径 names=/usr/local/zht/Yolo-Fastest/train/voc.names #训练类别的名字 backup=/usr/local/zht/Yolo-Fastest/train/backup #训练输出模型保存路径#如相对路径不行,换成绝对路径
1.5 进行训练
./darknet detector train ./train/pupil.data ./train/pupil.cfg yolo-fastest.conv.109
视情况而定是否需要添加 -dont_show
voc.data: 训练数据的保存路径
pupil.cfg: 网络结构文件
2. arm 端模型推理环境
模型部署主要是采用腾讯推出的ncnn框架,在2.5–1 和2.5–2 中可直接执行,2.5–1 看到效果。
在树莓派上执行如下操作:
ps: 树莓派4b, 内核版本为 5.4(64bit)
部分工具打包下载地址:
https://wws.lanzous.com/b01toj1ch
密码:7hdj
2.1 编译安装 openssl
https://www.openssl.org/source/openssl-1.1.1h.tar.gz
tar -zxvf openssl-1.1.1h.tar.gz
cd openssl-1.1.1h
./config
make && sudo make install
2.2 编译安装 cmake
https://cmake.org/download/
官网下载 arm 对应cmake 下载地址
进行编译安装:
tar -zxvf cmake-3.18.4.tar.gz
cd cmake
./configure
make && sudo make install
2.3 编译安装 protobuf
官网下载 protobuf 压缩包 下载地址,认准 protobuf-cpp-3.13.0.tar.gz 字样
tar -zxvf protobuf-cpp-3.13.0.tar.gz
cd protobuf-3.13.0/
./configure
make && sudo make install
2.4 编译安装 OpenCV for c++
随着 OpenCV 版本变化,安装方式可能发生改变,可参考官网教程: opencv installation
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-devgit clone https://gitee.com/yijunlog/opencv.git
cd opencv/
mkdir build && cd build
cmake ../
make -j2 && sudo make install
此版本为临时 fork 到 gitee 上的版本,若需要最新版,可到
https://github.com/opencv/opencv.git
2.5–1 和2.5–2 是同级的,为方便贵方使用,将包含有测试文件(位于./build/yolofastest)的内容,一并上传到 gitee 了,只需按2.5–1步骤执行,便可最快看到效果
可能需要用到命令:export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
2.5–1 包含测试程序的ncnn
git clone https://gitee.com/yijunlog/pupillocation.git
cd pupillocation/build
cmake ../
make -j4 && make install
cd yolofastest
./buildyolo.sh
./yolofastest
2.5–2 下载&编译ncnn
此为Tencent 官方 ncnn , 可自行使用
git clone https://gitee.com/yijunlog/ncnn.git
cd ncnn
makedir build && cd build
cmake ../
make && make install
此版本为临时 fork 到 gitee 上的版本,若需要最新版,可到
https://github.com/Tencent/ncnn.git
3. python 调用
ps: 以下测试平台为树莓派4b, 64位系统,内核版本5.4
3.1 pybind11 安装
pip3 install pybind11
3.2 python 调用
cd ~/pupillocation/build/yolofastest
./build2py.sh
./pytest.py
执行完 ./build2py.sh 后,文件夹中出现文件名类似于 “PupilLocation.cpython-37m-aarch64-linux-gnu.so” 的文件
c++ 文件中,未对一些情况做特殊处理,如“输入图片为空”
具体实现,在PupilLocation.cpp 中
pytest.py 介绍:
#!/usr/bin/python3from PupilLocation import *
import cv2
# 根据参数文件和模型文件初始化检测类
a = PupilLocation("model/yolo-fastest.param", "model/yolo-fastest.bin")
b = cv2.imread("image/a.jpg")
# 对读取到的图片,进行检测
res = a.locate(b)
print(res)
#输出为:
[150.89205932617188, 150.56619262695312, 176.99700927734375, 182.978515625, 0.9961637258529663]
#[x1, y1, x2, y2, score] (x1, y1) 检测到的框框左上角,(x2, y2) 检测到的框框右下角,score 置信度
# 返回结果为多个时,顺序依然如此,每5个 为一个item 检测结果
附录: 数据打标
a. 数据打标工具 labelImg
labelImg 下载连接
认准 windows_v***.zip 字样
操作见教程, 标注时请选择 yolo 格式:
b. 生成 train.txt / val.txt
train.txt / val.txt 的每一行,为一张图片的路径
import glob
# 根据需求进行自行更改
path = '/usr/local/zht/yolo_v5/data/pupil/'def generate_train_and_val(image_path, txt_file):with open(txt_file, 'w') as tf:for jpg_file in glob.glob(image_path + '*.jpg'):tf.write(jpg_file + '\n')
# train_images, val_images 分别存放训练,验证图片
generate_train_and_val(path + 'train_images/', path + 'train.txt')
generate_train_and_val(path + 'val_images/', path + 'val.txt')
c. 图片/标注格式
在训练时,通过 train.txt 找到图片,在通过与图片同名文件,找到其标注文件