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

如果之前已經安裝過顯卡驅動,這里就不需要選擇第一個了
Install

添加環境變數
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

nvcc -V

- 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下載

OpenCV 4.3.0 官網下載

-
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

-
f.點擊Finsh

-
g.選擇需要的引數(?或者選擇路徑)

官方引數說明,友友們根據需要選擇
CMAKE_BUILD_TYPE = RELEASE
WITH_QT = √ #使用QT支持
WITH_OPENGL = √ #
OPENCV_EXTRA_MODULES_PATH= /home/joy/opencv-4.3.0/build #opencv_contrib modules路徑
-
h.點擊Configure

如果報錯提示缺少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.安裝插件

-
b.登錄github


-
c. fork yolov4倉庫并克隆到VS Code中,選擇一個檔案夾保存到本地


-
現在就可以愉快的commit、push到遠程github倉庫上了

3.編譯
- 編輯Makefile檔案

Makefile官方說明

- make編譯

編譯成功后會生成如圖darknet檔案

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檔案內的路徑為自己的本地資料集路徑(相對路徑和絕對路徑都可以)



- 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檔案
官方說明

[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
如圖表示開始訓練
訓練結束(模型保存在darknet/backup/檔案夾下)

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
輸入測驗圖片路徑
輸出結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282244.html
標籤:AI
