這一步主要為了方便從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地址,如下
sudo reboot now
安裝Opencv過程中,需要下載ippicv_2019_lnx_intel64_general_20180723.tgz
,boostdesc_bgm.i
等文件,可以直接在百度網盤中找到。
參考博客《Ubuntu18 opencv4.1.1加opencv_contrib-4.1.1(解決沒有face.h的問題)編譯安裝(一條龍過)》
ippicv_2019_lnx_intel64_general_20180723.tgz
不要解壓!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/
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/"
(此處為絕對路徑),然后保存退出。
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
sudo touch /etc/ld.so.conf.d/opencv4.conf
sudo sh -c 'echo "/usr/local/lib" > opencv4.conf'
sudo ldconfig
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
sudo rm /etc/ld.so.conf.d/opencv4.conf
cd ~/opencv-4.1.1/build
sudo make uninstall
參考AlexeyAB的官方文檔,安裝訓練環境。
注意:我在ubuntu 18.04上訓練,使用一張t4卡。
conda create -n TrainYolov4-tiny python=3.8 -y
conda activate TrainYolov4-tiny
cd ~/ && mkdir TrainYolov4-tiny && cd TrainYolov4-tiny
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
主要參考博客《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.txt
、train.txt
、test.txt
和val.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
的目錄結構應如下
數據分析常用模型,主要參考博客《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
這里可能需要注意的是batch
和subdivisions
,如果訓練時發現顯存不足,則將其減小即可。
yolov4-tiny.cfg
復制一份為myyolov4-tiny.cfg
,修改所有yolo層的classes(兩處),以及yolo層前一個卷積層的filters(計算方式為filters=(classes + 5)x3
)yolov4訓練自己的數據。這里,我的類別為1,就是person,所以classes=1,filter=(1+5)x3=18。
在darknet
源碼中,創建mytrain
目錄,在其中分別創建mytrain.data
文件、mytrain.names
文件、runs
目錄
將mydata
目錄中的train.txt
和val.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
目錄下
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
目錄下,如圖所示,
僅測試單張照片推理,使用如下命令
./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批量測試并保存圖片》
選擇的是enazoe/yolo-tensorrt
的開源項目。注意,根據自己的tensorrt版本,選擇對應的項目,如下,
tensorrt 7
:https://hub.xn–p8jhe.tw/enazoe/yolo-tensorrt/tree/mastertensorrt 8
:https://hub.おうか.tw/enazoe/yolo-tensorrt如果網絡不好,可以直接在鏈接下載(內含yolov3-tiny.weights
, yolov4-tiny.weights
)
鏈接:https://pan.baidu.com/s/1z6WtW69zaT8e1WmLWboBlw
提取碼:66tt
下載解壓項目后(這里我解壓到~/
目錄下,項目路徑為~/yolo-tensorrt
),依次進行如下操作。
由于我們自己訓練的是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
目錄下
示例代碼為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);
cd ~/yolo-tensorrt/
mkdir build
cd build/
cmake ..
make
運行命令
cd ~/yolo-tensorrt/build
./yolo-trt
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态