yolov3訓練自己的數據集,使用自己的數據訓練Yolov4-tiny模型,并用tensorrt運行(配置github host、編譯安裝opencv4.1.1

 2023-10-21 阅读 18 评论 0

摘要:目錄0. 修改host文件 (選做)1. 編譯安裝opencv 4.1.1+contrib2. 準備訓練環境3. 制作自己的數據集4. 預訓練權重和配置文件5. 創建訓練配置文件6. 訓練7. 測試8. tensorrt運行8.1. 修改配置文件及復制權重文件8.2. 修改sample_detector.cpp8.3. 編譯及運行

目錄

        • 0. 修改host文件 (選做)
        • 1. 編譯安裝opencv 4.1.1+contrib
        • 2. 準備訓練環境
        • 3. 制作自己的數據集
        • 4. 預訓練權重和配置文件
        • 5. 創建訓練配置文件
        • 6. 訓練
        • 7. 測試
        • 8. tensorrt運行
          • 8.1. 修改配置文件及復制權重文件
          • 8.2. 修改sample_detector.cpp
          • 8.3. 編譯及運行

0. 修改host文件 (選做)

這一步主要為了方便從github上下載東西。如果是私人電腦或者服務器,這樣修改host是可以的,對于單位服務器,則不推薦修改host文件。

yolov3訓練自己的數據集、進入https://www.ipaddress.com/,分別查詢以下三個github相關網址

  • 輸入 github.com
    在這里插入圖片描述
    ip地址為140.82.114.3

  • 輸入 github.global.ssl.fastly.net
    在這里插入圖片描述
    ip地址為199.232.69.194

  • 查詢 raw.githubusercontent.com
    在這里插入圖片描述
    ip地址有四個,分別為
    185.199.108.133
    185.199.109.133
    185.199.110.133
    185.199.111.133

  • 大數據模型分不符怎么辦?修改host文件

sudo vim /etc/hosts

在最后面對應輸入上述ip地址,如下
在這里插入圖片描述

  • 重啟以使host生效
sudo reboot now

1. 編譯安裝opencv 4.1.1+contrib

安裝Opencv過程中,需要下載ippicv_2019_lnx_intel64_general_20180723.tgzboostdesc_bgm.i等文件,可以直接在百度網盤中找到。

參考博客《Ubuntu18 opencv4.1.1加opencv_contrib-4.1.1(解決沒有face.h的問題)編譯安裝(一條龍過)》

  • 下載源碼
    鏈接:https://pan.baidu.com/s/1sWbgSO-MK4c7pEKHXNRqCA
    提取碼:f7en
    百度網盤鏈接,下載所有內容,放置于~/Downloads目錄下
    注意ippicv_2019_lnx_intel64_general_20180723.tgz不要解壓!
  • 調整opencv源碼文件,方便編譯
cd ~/Downloads
unzip opencv-4.1.1.zip && unzip opencv_contrib-4.1.1.zip && unzip installFile.zip
cp -r ./installFile/*  ./opencv_contrib-4.1.1/modules/xfeatures2d/src/
mv -f opencv_contrib-4.1.1 ./opencv-4.1.1
mv -f opencv-4.1.1 ../
cd ../opencv-4.1.1
mkdri build
cp -r modules/features2d/ ./build/
  • 修改ippicv.cmake
sudo vim ~/opencv-4.1.1/3rdparty/ippicv/ippicv.cmake

yolov4 dnn 調用yolov5?將第47行的
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}ippicv/"修改為"file:/home/wangxinRS/Downloads/"(此處為絕對路徑),然后保存退出。

  • 添加一個源,方便apt安裝第三方庫
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
  • 安裝第三方庫
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 build-essential libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
  • 編譯安裝
cd ~/opencv-4.1.1/buildcmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local  -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.1.1/modules  ..sudo make -j8sudo make install
  • c++環境配置
sudo touch /etc/ld.so.conf.d/opencv4.conf
sudo sh -c 'echo "/usr/local/lib" > opencv4.conf'
sudo ldconfig
  • 查看opencv4安裝的庫和頭文件
pkg-config --libs opencv4
pkg-config --cflags opencv4
  • 驗證
cd ~/opencv-4.1.1/samples/cpp
g++ `pkg-config --cflags opencv4` drawing.cpp `pkg-config --libs opencv4` -o drawing.out
./drawing.out
  • 后期如果有卸載Opencv重裝的需求,可以考慮如下操作
sudo rm /etc/ld.so.conf.d/opencv4.conf
cd ~/opencv-4.1.1/build 
sudo make uninstall

2. 準備訓練環境

參考AlexeyAB的官方文檔,安裝訓練環境。

注意:我在ubuntu 18.04上訓練,使用一張t4卡。

  • 創建python訓練環境 (個人自愿)
conda create -n TrainYolov4-tiny python=3.8 -y
conda activate TrainYolov4-tiny
  • 創建訓練目錄
cd ~/ && mkdir TrainYolov4-tiny && cd TrainYolov4-tiny
  • 下載AlexeyAB官方源碼 (用代理,這樣下載較快)
git clone https://ghproxy.com/https://github.com/AlexeyAB/darknet
  • 編譯及安裝
cd darknet
mkdir build_release
cd build_release
cmake ..
cmake --build . --target install --parallel 8

3. 制作自己的數據集

主要參考博客《yolov4-tiny訓練自己的數據集》,我們應將自己的數據集最終整理成VOC2007格式

  • 作為最開始的部分,默認你擁有自己的圖片,以及標注信息,即以下兩個文件夾
    在這里插入圖片描述
    這里,JPEGImages文件夾下包含所有的圖片數據,Annotations文件夾下包含各個圖片對應的.xml標注文件,如下
    在這里插入圖片描述

模型,在這里插入圖片描述
.xml標注文件里包含標注信息,包括圖片名稱、圖片高寬、標注類別、標注框左上角和右下角坐標等,如圖
在這里插入圖片描述

  • darknet源碼目錄下創建mydata目錄,并將上述兩個文件夾復制到該目錄下
cd ~/TrainYolov4-tiny/darknet
mkdir mydata
cd mydata

此時,結構如下
在這里插入圖片描述

  • 用如下代碼voc1.py將所有圖片分為訓練集、測試集和驗證集,分的結果保存在ImageSets目錄中
mkdir -p ImageSets/Main
python voc1.py
# voc1.py代碼,應在mydata目錄中
import os
import randomtrainval_percent = 1  #可以自己修改
train_percent = 0.9     #可以自己修改
xmlfilepath = './Annotations'
txtsavepath = './ImageSets/Main'
total_xml = os.listdir(xmlfilepath)num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)ftrainval = open('./ImageSets/Main/trainval.txt', 'w')
ftest = open('./ImageSets/Main/test.txt', 'w')
ftrain = open('./ImageSets/Main/train.txt', 'w')
fval = open('./ImageSets/Main/val.txt', 'w')for i  in list:name=total_xml[i][:-4]+'\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

此時,目錄結構應為
在這里插入圖片描述
其中,ImageSets/Main目錄下包含trainval.txttrain.txttest.txtval.txt

  • 用如下代碼voc2.py將xml轉化為txt格式,將結果保存在labels目錄下
mkdir labels
python voc2.py
# voc2.py的代碼,應在mydata目錄中
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import joinsets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]classes = ["person"] #改為自己數據集的labeldef convert(size, box):dw = 1./size[0]dh = 1./size[1]x = (box[0] + box[1])/2.0y = (box[2] + box[3])/2.0w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)def convert_annotation(image_id):in_file = open('./Annotations/%s.xml'%( image_id))out_file = open('./labels/%s.txt'%(image_id), 'w')tree=ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))bb = convert((w,h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()for year, image_set in sets:image_ids = open('./ImageSets/Main/%s.txt'%( image_set)).read().strip().split()list_file = open('%s.txt'%(image_set), 'w')for image_id in image_ids:list_file.write('%s/JPEGImages/%s.jpg\n'%(wd, image_id))convert_annotation(image_id)list_file.close()

此時,mydata的目錄結構應如下
在這里插入圖片描述

4. 預訓練權重和配置文件

數據分析常用模型,主要參考博客《yolov4-tiny訓練自己的數據集》

  • 預訓練權重yolov4-tiny.conv.29可以直接下載,也可以從百度網盤中獲取
    鏈接:https://pan.baidu.com/s/1sWbgSO-MK4c7pEKHXNRqCA
    提取碼:f7en

  • 標準配置文件yolov4-tiny.cfg位于源碼darknet/cfg/目錄中,該配置文件中的一些參數意義如下

[net]
batch=96 # 每次iteration訓練的時候,輸入的圖片數量
subdivisions=48	# 將每一次的batch數量,分成subdivision對應數字的份數,一份一份的跑完后,在一起打包算作完成一次iteration
width=512 # 大小為32的倍數
momentum=0.9 # 動量,影響梯度下降到最優的速度,一般默認0.9
decay=0.0005 # 權重衰減正則系數,防止過擬合
angle=0 # 旋轉角度,生成更多訓練樣本
saturation=1.5 # 調整飽和度
exposure=1.5 # 調整曝光度
hue=.1 # 調整色調
learning_rate=0.001
burn_in=1000 # 學習率控制的參數,在迭代次數大于burn_in時,采用policy的更新方式:0.001 * pow(iterations/1000, 4)
max_batches=5000 # 最大迭代次數
policy=steps
steps=3000,3500 # 學習率變動步長,Steps和scales相互對應, 這兩個參數設置學習率的變化, 根據batch_num調整學習率
scales=.1,.1 # 學習率變動因子,迭代到400000次時,學習率x0.1; 450000次迭代時,學習率又會在前一個學習率的基礎上x0.1

這里可能需要注意的是batchsubdivisions,如果訓練時發現顯存不足,則將其減小即可。

  • yolov4-tiny.cfg復制一份為myyolov4-tiny.cfg,修改所有yolo層的classes(兩處),以及yolo層前一個卷積層的filters(計算方式為filters=(classes + 5)x3

yolov4訓練自己的數據。這里,我的類別為1,就是person,所以classes=1,filter=(1+5)x3=18。
在這里插入圖片描述

5. 創建訓練配置文件

  • darknet源碼中,創建mytrain目錄,在其中分別創建mytrain.data文件、mytrain.names文件、runs目錄

  • mydata目錄中的train.txtval.txt復制到mytrain目錄中

cd ~/TrainYolov4-tiny/darknet
mkdir mytrain
cd mytrain
cp ../mydata/train.txt ./
cp ../mydata/val.txt ./
touch mytrain.data
touch mytrain.names
mkdir runs

其中,mytrain.names文件中的內容是填寫訓練類別的

person # 我這里就是一個類別 person

yolov3訓練自己的數據,mytrain.data文件中的內容為

classes=1
train=mytrain/train.txt
valid=mytrain/val.txt
names=mytrain/mytrain.names
backup=mytrain/runs

backup是放置訓練結果的文件夾的地址,訓練完成后的訓練結果在runs目錄下

6. 訓練

cd ~/TrainYolov4-tiny/darknet# 這里,我指定在gpu 1上訓練,如果顯存不夠,考慮回到 4. 預訓練權重和配置文件 部分修改配置文件
./darknet detector train mytrain/mytrain.data cfg/myyolov4-tiny.cfg yolov4-tiny.conv.29 -gpus 1

訓練結果保存在mytrain/runs/目錄下。

我將訓練輪數設為5000,在第3000輪的時候學習率乘以0.1,在第3500輪的時候學習率乘再以0.1,這樣最后的損失為0.03左右。

以上三個參數在 4. 預訓練權重和配置文件 中可以見到,如圖
在這里插入圖片描述
此時訓練的模型保存在mytrain/runs目錄下,如圖所示,
在這里插入圖片描述

7. 測試

僅測試單張照片推理,使用如下命令

./darknet detector test mytrain/mytrain.data cfg/mytrain.cfg mytrain/runs/myyolov4-tiny_last.weights mytest/0.jpg

基本格式為

./darknet detector test [.data文件路徑] [.cfg文件路徑] [.weights文件路徑] [待測試文件路徑]

如果需要批量測試圖片,參考博客《YOLOV4-darknet批量測試并保存圖片》

8. tensorrt運行

選擇的是enazoe/yolo-tensorrt的開源項目。注意,根據自己的tensorrt版本,選擇對應的項目,如下,

  • tensorrt 7:https://hub.xn–p8jhe.tw/enazoe/yolo-tensorrt/tree/master
  • tensorrt 8:https://hub.おうか.tw/enazoe/yolo-tensorrt

如果網絡不好,可以直接在鏈接下載(內含yolov3-tiny.weights, yolov4-tiny.weights
鏈接:https://pan.baidu.com/s/1z6WtW69zaT8e1WmLWboBlw
提取碼:66tt

下載解壓項目后(這里我解壓到~/目錄下,項目路徑為~/yolo-tensorrt),依次進行如下操作。

8.1. 修改配置文件及復制權重文件

由于我們自己訓練的是1個類別的yolov4-tiny模型,因此需要修改該項目下的yolov4-tiny.cfg配置文件。具體的

vim ~/yolo-tensorrt/configs/yolov4-tiny.cfg

一樣的,參考 4. 預訓練權重和配置文件 方法,修改所有yolo層的classes(兩處),以及yolo層前一個卷積層的filters(計算方式為filters=(classes + 5)x3,我是1個類別,所以為(1+5)x3=18)。

將訓練好的yolov4-tiny權重文件myyolov4-tiny_last.weights復制到~/yolo-tensorrt/configs目錄下

8.2. 修改sample_detector.cpp

示例代碼為samples/sample_detector.cpp,對其進行編輯

vim ~/yolo-tensorrt/samples/sample_detector.cpp

修改如下內容
在這里插入圖片描述
第一處紅框改成

 Config config_v4_tiny;config_v4_tiny.net_type = YOLOV4_TINY;config_v4_tiny.detect_thresh = conf_thres;config_v4_tiny.file_model_cfg = "../configs/yolov4-tiny.cfg";config_v4_tiny.file_model_weights = "../configs/myyolov4-tiny_last.weights";config_v4_tiny.calibration_image_list_file_txt = "../configs/calibration_images.txt";config_v4_tiny.inference_precison = FP16;config_v4_tiny.detect_thresh = 0.5;

第二處紅框改成

 detector->init(config_v4_tiny);
8.3. 編譯及運行
cd ~/yolo-tensorrt/
mkdir build
cd build/
cmake ..
make

運行命令

cd ~/yolo-tensorrt/build
./yolo-trt

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/156876.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息