Ubuntu20.04实现darknet框架下yolov4检测车牌

YOLO v4论文:https://arxiv.org/abs/2004.10934
YOLO v4源码:https://github.com/AlexeyAB/darknet

给学妹写的教程,发上来作为学习记录吧,数据集用的是开源车牌数据集CCPD,本文章介绍的只是检测车牌框,并不带车牌识别功能。有错误或者有疑问的欢迎底下评论。

文章目录

  • 1、环境配置(亲测可用)
  • 2、下载安装
    • 1.CUDA 11.2
    • 2.OpenCV
  • 3、编译Darknet
    • 1.下载安装VS Code
    • 2.本地代码与github同步
    • 3.编译
  • 4、准备数据
    • 1.生成标注文件(txt)
    • 2.修改配置文件
  • 5、训练模型
  • 6、测试模型

1、环境配置(亲测可用)

  • Ubuntu 20.04
  • CUDA 11.2
  • cuDNN
  • OpenCV_contrib 4.3.0
  • OpenCV 4.3.0

2、下载安装

1.CUDA 11.2

  • CUDA下载链接:官网下载
    百度网盘链接 提取码:9oi5
  • CUDA安装

a.禁用集成的nouveau驱动

gedit打开blacklist.conf

sudo gedit /etc/modprobe.d/blacklist.conf

blacklist.conf末尾添加:

blacklist nouveau
options nouveau modeset=0

更新系统

sudo update-initramfs -u

重启系统

reboot

验证nouveau是否禁用(没有任何输出说明已经禁用)

lsmod | grep nouveau

b.运行cuda文件

sudo sh cuda_11.2.0_460.27.04_linux.run

Ubuntu20.04实现darknet框架下yolov4检测车牌_第1张图片
如果之前已经安装过显卡驱动,这里就不需要选择第一个了
Install
Ubuntu20.04实现darknet框架下yolov4检测车牌_第2张图片
添加环境变量

sudo gedit ~/.bashrc

在最后一行加上

export PATH=/usr/local/cuda-11.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH

激活环境变量

source ~/.bashrc

检测是否安装成功

nvidia-smi

Ubuntu20.04实现darknet框架下yolov4检测车牌_第3张图片

nvcc -V

Ubuntu20.04实现darknet框架下yolov4检测车牌_第4张图片

  • cuDNN下载链接:官网下载(需要登录)
    百度网盘链接 提取码:80rv
  • 解压cuDNN压缩包,并在文件夹下的cuda文件夹下打开终端
    在这里插入图片描述
    将include和lib64文件夹下的内容复制到CUDA安装目录下对应名称的文件夹下
sudo cp -r include/* /usr/local/cuda/include/
sudo cp -r lib64/* /usr/local/cuda/lib64/

2.OpenCV

  • 参考:OpenCV官网 友友的博客
  • a.安装依赖
$ sudo apt-get install -y build-essential checkinstall cmake pkg-config yasm git gfortran
# 添加源,防止可能会出现的找不到所需安装的库的情况
$ sudo add-apt-repository -y "deb http://security.ubuntu.com/ubuntu xenial-security main"
$ sudo apt-get update
$ sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
$ sudo apt-get install -y libjpeg8-dev libjasper-dev libpng12-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine2-dev libv4l-dev
$ sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2.0-dev libtbb-dev libatlas-base-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev libxvidcore-dev libopencore-amrnb-dev libopencore-amrwb-dev x264 v4l-utils
  • b.下载两个安装包
    OpenCV_contrib 4.3.0 github下载
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第5张图片

    OpenCV 4.3.0 官网下载
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第6张图片

  • c.解压下载的两个压缩包,并在opencv-4.3.0文件夹下新建一个build文件夹

  • d.安装cmake-gui
    在这里插入图片描述

  • e.
    设置Where is the source code为 /home/joy/下载/opencv-4.3.0(安装包所在位置)
    设置Where to build the binaries为 /home/joy/下载/opencv-4.3.0/build
    点击Configure
    点击Generate
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第7张图片

  • f.点击Finsh
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第8张图片

  • g.选择需要的参数(✔或者选择路径)Ubuntu20.04实现darknet框架下yolov4检测车牌_第9张图片
    官方参数说明,友友们根据需要选择Ubuntu20.04实现darknet框架下yolov4检测车牌_第10张图片

CMAKE_BUILD_TYPE = RELEASE
WITH_QT =#使用QT支持
WITH_OPENGL =#
OPENCV_EXTRA_MODULES_PATH= /home/joy/opencv-4.3.0/build #opencv_contrib modules路径
  • h.点击ConfigureUbuntu20.04实现darknet框架下yolov4检测车牌_第11张图片
    如果报错提示缺少xxx包
    参考:https://blog.csdn.net/a985588764/article/details/103494670
    https://blog.csdn.net/AlexWang30/article/details/99612188

  • i.Config成功后点击Generate

  • j.make编译安装

#使用nproc确定CPU核心数
$ nproc
$ make -j6 #根据CPU核心数确定编译线程数
$ sudo make install #安装

3、编译Darknet

1.下载安装VS Code

官网下载

2.本地代码与github同步

  根据需要选择,不需要的也可以直接在AlexeyAB的仓库中下载压缩包在VS Code中打开
  • a.安装插件
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第12张图片

  • b.登录github
    在这里插入图片描述Ubuntu20.04实现darknet框架下yolov4检测车牌_第13张图片

  • c. fork yolov4仓库并克隆到VS Code中,选择一个文件夹保存到本地
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第14张图片Ubuntu20.04实现darknet框架下yolov4检测车牌_第15张图片

  • 现在就可以愉快的commit、push到远程github仓库上了
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第16张图片

3.编译

  • 编辑Makefile文件
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第17张图片
    Makefile官方说明
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第18张图片
  • make编译
    在这里插入图片描述
    编译成功后会生成如图darknet文件
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第19张图片

4、准备数据

1.生成标注文件(txt)

标注框信息从图片名称中提取,而由于只有一个类(plate),默认标签为0,图片和txt文件要放在一个文件夹下
import os
import re
import cv2
root_path = r'/home/joy/SXH/tensorflow-yolov4-tflite/data/CCPD2019/images/'  # 根据本地自己路径进行更改
file_name = os.listdir(root_path)


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h


for image_id in file_name:
    id = image_id.split('.')[0]
    out_file = open('/home/joy/SXH/tensorflow-yolov4-tflite/data/CCPD2019/images/%s.txt' % id,
                    'w')  # 需要保存的txt格式文件路径
    img = cv2.imread((root_path + image_id))
    height = img.shape[0]
    width = img.shape[1]
    point = image_id.split('.')[0].split('-')[3]
    # Xmin = point.split('_')[2].split('&')[0]
    num = re.findall('\d+\d*', point)  # 正则表达式 从字符串中提取数值
    Xmin = min(num[0::2])  # list[start:stop:step]
    Ymin = min(num[1::2])
    Xmax = max(num[0::2])
    Ymax = max(num[1::2])
    b = (float(Xmin), float(Xmax), float(Ymin),
         float(Ymax))
    bb = convert((width, height), b)
    out_file.write('0' + " " + " ".join([str(a) for a in bb]) + '\n')
print('end')

2.修改配置文件

  • a.生成plate_train.txt和plate_val.txt
    复制/CCPD2019/splits/下的两个txt文件到darknet/data/下并分别改名为plate_train.txt和plate_val.txt
    修改txt文件内的路径为自己的本地数据集路径(相对路径和绝对路径都可以)
    在这里插入图片描述
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第20张图片Ubuntu20.04实现darknet框架下yolov4检测车牌_第21张图片
  • b.在darknet/data/下新建plate.data文件
classes = 1  #类别数量
train = data/plate_train.txt
valid = data/plate_val.txt
#valid = data/coco_val_5k.list
names = data/plate.names
backup = backup/  # 保存模型的位置
  • c.在darknet/data/下新建plate.names文件
plate
  • d.复制darknet/cfg/下yolov4-custom.cfg文件到darknet文件夹下,并重命名为yolov4-plate.cfg
  • e.修改yolov4-plate.cfg文件
    官方说明
    Ubuntu20.04实现darknet框架下yolov4检测车牌_第22张图片
[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=32  # 如果显存不够就调小一点
subdivisions=64
width=512
height=512
max_batches = 6000
policy=steps
steps=4800,5400
scales=.1,.1

#cutmix=1
mosaic=1

#:104x104 54:52x52 85:26x26 104:13x13 for 416
共三处如下图片修改(一样的内容)
[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear


[yolo]
mask = 0,1,2
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=1
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
scale_x_y = 1.2
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
max_delta=5
  • f.下载预训练模型
    百度网盘链接
    提取码:1plh

5、训练模型

在这里插入图片描述

 ./darknet detector train data/plate.data yolov4-plate.cfg yolov4.conv.137 -map

如图表示开始训练
Ubuntu20.04实现darknet框架下yolov4检测车牌_第23张图片训练结束(模型保存在darknet/backup/文件夹下)
Ubuntu20.04实现darknet框架下yolov4检测车牌_第24张图片

6、测试模型

修改yolov4-plate.cfg文件

[net]
# Testing
batch=1
subdivisions=1
# Training
#batch=32
#subdivisions=64
width=512
height=512
channels=3

测试命令

./darknet detector test data/plate.data yolov4-plate.cfg backup/yolov4-plate_best.weights 

输入测试图片路径
Ubuntu20.04实现darknet框架下yolov4检测车牌_第25张图片输出结果
Ubuntu20.04实现darknet框架下yolov4检测车牌_第26张图片

你可能感兴趣的:(深度学习,学妹的教程,深度学习)