当前位置: 代码迷 >> 综合 >> yolo-fastest模型训练树莓派部署物体检测模型
  详细解决方案

yolo-fastest模型训练树莓派部署物体检测模型

热度:67   发布时间:2023-11-22 06:05:50.0

yolo-fastest模型训练&树莓派部署物体检测模型

0. 文档介绍

本文档分为以下几个部分:

  1. 模型训练:使用基于 darknet 的 yolofastest 训练生成用于物体检测的模型
  2. arm 端模型推理:通过 ncnn 在 arm 端的优化,进行模型的推理
  3. 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 找到图片,在通过与图片同名文件,找到其标注文件