YOLO v3 安装并训练自己数据
文章目錄
- 1. 安裝
- 1.1 模型安裝
- 1.2 運(yùn)行Demo
- 2.訓(xùn)練自己的數(shù)據(jù)集
- 2.1數(shù)據(jù)集準(zhǔn)備
- 2.2修改配置文件
- 2.2.1修改cfg/voc.data
- 2.2.2修改data/voc.names
- 2.2.3修改cfg/yolo-voc.cfg
- 2.3 訓(xùn)練
- 3. 測試
- 3.1 單張圖像測試
- 3.2多張圖像測試
- 3.3 測試數(shù)據(jù)集測試mAP、recall等參數(shù)
- 命令參數(shù)總結(jié)
- 訓(xùn)練模型
- 單GPU訓(xùn)練
- 多GPU訓(xùn)練
- 測試圖片
- Error
- /bin/sh: 1: nvcc: not found
- ./darknet: error while loading shared libraries: libcurand.so.10.0: cannot open shared object file: No such file or directory
- 參考
?
1. 安裝
1.1 模型安裝
YOLO v3的安裝與YOLO v2的安裝方法一樣
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">git</span> clone https://github.com/pjreddie/darknet </code></span>直接使用上邊的命令下載YOLO安裝包。下載完以后,打開進(jìn)入到安裝包路徑內(nèi)
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">cd</span> darknet </code></span>如果機(jī)器有使用GPU加速的環(huán)境,以及安裝OPENCV了,需要做一下修改
<span style="color:#000000"><code class="language-shell">gedit Makefile </code></span>使用gedit打開編譯文件,將文件前幾行中,對應(yīng)的GPU、CUDNN、OPENCV由0變?yōu)?;
<span style="color:#000000"><code class="language-shell">GPU<span style="color:#6272a4">=</span>1 CUDNN<span style="color:#6272a4">=</span>1 OPENCV<span style="color:#6272a4">=</span>1 </code></span>對Makefile修改結(jié)束以后,就可以進(jìn)行安裝。
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">make</span> -j </code></span>下載YOLO v3權(quán)重
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">wget</span> https://pjreddie.com/media/files/yolov3.weights </code></span>1.2 運(yùn)行Demo
運(yùn)行Demo查看運(yùn)行是否成功。
<span style="color:#000000"><code class="language-shell"> ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg </code></span>2.訓(xùn)練自己的數(shù)據(jù)集
2.1數(shù)據(jù)集準(zhǔn)備
首先將自己的數(shù)據(jù)集生成為VOC數(shù)據(jù)集的格式,至少生成如下格式的文件夾
<span style="color:#000000"><code class="language-shell">Annotations ImageSets--Main--test.txt--train.txt--trainval.txt--val.txt JPEGImages </code></span>接著將上邊四個文件夾放在/darknet/scripts/VOCdevkit/VOC2007內(nèi),這個文件夾需要自己來創(chuàng)建一個。接著對/darknet/scripts/voc_label.py進(jìn)行修改。
第一處
修改第7行
第二處
修改第9行
修改為自己檢測目標(biāo)類別名稱
完成修改以后可運(yùn)行文件,生成YOLO訓(xùn)練時使用的labels
<span style="color:#000000"><code class="language-shell">python voc_label.py </code></span>運(yùn)行結(jié)束以后,可以在/darknet/scripts/VOCdevkit/VOC2007文件夾內(nèi)看到labels文件夾,并且在/darknet/scripts文件夾內(nèi)會生成2007_train.txt、2007_test.txt、2007_val.txt三個文件。到此,數(shù)據(jù)準(zhǔn)備完成。
2.2修改配置文件
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 </code></span>上邊是進(jìn)行訓(xùn)練的命令,可以按照上邊的命令對文件進(jìn)行修改。
2.2.1修改cfg/voc.data
<span style="color:#000000"><code class="language-shell">classes<span style="color:#6272a4">=</span> 3 //修改為訓(xùn)練分類的個數(shù) train <span style="color:#6272a4">=</span> /home/ws/darknet/scripts/2007_train.txt //修改為數(shù)據(jù)階段生成的2007_train.txt文件路徑 valid <span style="color:#6272a4">=</span> /home/ws/darknet/scripts/2007_val.txt //修改為數(shù)據(jù)階段生成的2007_val.txt文件路徑 names <span style="color:#6272a4">=</span> data/voc.names backup <span style="color:#6272a4">=</span> backup </code></span>2.2.2修改data/voc.names
在上邊修改的文件內(nèi)有一個data/voc.names文件,里邊保存目標(biāo)分類的名稱,修改為自己類別的名稱即可。
2.2.3修改cfg/yolo-voc.cfg
第一處
文件開頭的配置文件可以按照下邊的說明進(jìn)行修改
注意:如果修改max_batches總的訓(xùn)練次數(shù),也需要對應(yīng)修改steps,適當(dāng)調(diào)整學(xué)習(xí)率。
具體的含義可以查看YOLO網(wǎng)絡(luò)中參數(shù)的解讀
第二處
修改107行最后一個卷積層中filters,按照filter=5*(classes+5)來進(jìn)行修改。如果類目為3,則為5*(3+5)=40。
第三處
修改類別數(shù),直接搜索關(guān)鍵詞“classes”即可,全文就一個。
2.3 訓(xùn)練
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 <span style="color:#6272a4">>></span> log.txt </code></span>輸入上邊的指令就可以進(jìn)行訓(xùn)練,在命令最后的命令>> log.txt是將輸出的日志保存到log.txt文件內(nèi),這樣便于后期訓(xùn)練結(jié)果的查看。
3. 測試
3.1 單張圖像測試
<span style="color:#000000"><code class="language-shell">./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg </code></span> <span style="color:#000000"><code class="language-shell">./darknet detect <span style="color:#999999">[</span>訓(xùn)練cfg文件路徑<span style="color:#999999">]</span> <span style="color:#999999">[</span>權(quán)重文件路徑<span style="color:#999999">]</span> <span style="color:#999999">[</span>檢測圖片的路徑<span style="color:#999999">]</span> </code></span>按照上邊的規(guī)整進(jìn)行填寫即可。
3.2多張圖像測試
由于博主能力有限,修改YOLO內(nèi)部文件失敗,只能使用shell寫命令來進(jìn)行重復(fù)單張測試的命令
<span style="color:#000000"><code class="language-shell">input_data_folder<span style="color:#6272a4">=</span><span style="color:#f1fa8c">"./data/VOCdevkit/VOC2007/JPEGImages/"</span> output_data_folder<span style="color:#6272a4">=</span><span style="color:#f1fa8c">"./results/CD8"</span> file_name_tmp<span style="color:#6272a4">=</span><span style="color:#ee9900"><span style="color:#ee9900">`</span><span style="color:#8be9fd">ls</span> $input_data_folder<span style="color:#ee9900">`</span></span>file_names<span style="color:#6272a4">=</span><span style="color:#999999">(</span><span style="color:#ee9900"><span style="color:#ee9900">$(</span><span style="color:#ff79c6">echo</span> $file_name_tmp<span style="color:#ee9900">)</span></span><span style="color:#999999">)</span><span style="color:#999999">;</span><span style="color:#ff79c6">for</span> filename <span style="color:#ff79c6">in</span> <span style="color:#ee9900">${file_names[@]}</span> <span style="color:#ff79c6">do</span><span style="color:#ff79c6">echo</span> <span style="color:#f1fa8c">"testing <span style="color:#ee9900">$file</span> ..."</span>./darknet detector <span style="color:#8be9fd">test</span> cfg/inst25.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights <span style="color:#ee9900">$input_data_folder</span><span style="color:#ee9900">$filename</span> -thresh .3 -gpu 0,1 <span style="color:#6272a4">>></span> result.txt<span style="color:#8be9fd">mv</span> predictions.png ./results/CD8_final_thresh_0.3/<span style="color:#ee9900">$filename</span><span style="color:#f1fa8c">'.png'</span><span style="color:#ff79c6">done</span> </code></span>修改相應(yīng)自己存儲圖片的路徑就可以進(jìn)行測試 。
3.3 測試數(shù)據(jù)集測試mAP、recall等參數(shù)
<span style="color:#000000"><code class="language-shell">./darknet detector valid cfg/voc.data cfg/voc.cfg backup/voc_final.weights -out result_ -gpu 0 -thresh .5 </code></span> <span style="color:#000000"><code>./darknet detector valid [data路徑] [cfg路徑] [權(quán)重文件路徑] -out [生成txt文件前綴] -gpu [GPU的ID號] -thresh [門限的大小] </code></span>按照上邊的規(guī)則對測試數(shù)據(jù)集進(jìn)行測試,會在result文件夾內(nèi)生成相應(yīng)的相應(yīng)檢測結(jié)果的文件。
下邊借助Faster R-CNN中voc_eval.py文件進(jìn)行參數(shù)測試。
首先將上邊的命令新建一個python文件,同時將Faster R-CNN中voc_eval.py文件放在一個文件夾內(nèi),這個文件可以能在Github中不能找到,可以去CSDN下載。
命令參數(shù)總結(jié)
訓(xùn)練模型
單GPU訓(xùn)練
<span style="color:#000000"><code class="language-shell">./darknet -i <span style="color:#6272a4"><</span>gpu_id<span style="color:#6272a4">></span> detector train <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>train_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span> </code></span>舉例:
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 </code></span>多GPU訓(xùn)練
格式為:
<span style="color:#000000"><code class="language-shell">./darknet detector train <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>model_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span> -gpus <span style="color:#6272a4"><</span>gpu_list<span style="color:#6272a4">></span> </code></span>舉例
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3 </code></span>測試圖片
測試單張圖片
<span style="color:#000000"><code class="language-shell">./darknet detector <span style="color:#8be9fd">test</span> <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>test_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>image_file<span style="color:#6272a4">></span> </code></span><test_cfg>文件中batch和subdivisions兩項(xiàng)必須為1。
測試時還可以用-thresh和-hier選項(xiàng)指定對應(yīng)參數(shù)。
生成預(yù)測結(jié)果
<test_cfg>文件中batch和subdivisions兩項(xiàng)必須為1。
結(jié)果生成在<data_cfg>的results指定的目錄下以<out_file>開頭的若干文件中,若<data_cfg>沒有指定results,那么默認(rèn)為<darknet_root>/results。
計(jì)算recall(執(zhí)行這個命令需要修改detector.c文件,修改信息請參考“detector.c修改”)
- ?
<test_cfg>文件中batch和subdivisions兩項(xiàng)必須為1。
輸出在stderr里,重定向時請注意。
RPs/Img、IOU、Recall都是到當(dāng)前測試圖片的均值。
detector.c中對目錄處理有錯誤,可以參照validate_detector對validate_detector_recall最開始幾行的處理進(jìn)行修改。
Error
/bin/sh: 1: nvcc: not found
當(dāng)安裝在CUDA10.1的情況下會報(bào)下邊的錯誤,這時候需要將Makefile文件中的NVCC
- ?
修改為下邊的格式:
<span style="color:#000000"><code class="language-txt">NVCC=/usr/local/cuda-10.1/bin/nvcc </code></span>- ?
./darknet: error while loading shared libraries: libcurand.so.10.0: cannot open shared object file: No such file or directory
使用下邊的命令進(jìn)行修正
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">sudo</span> <span style="color:#8be9fd">cp</span> /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/local/lib/libcudart.so.10.0 <span style="color:#6272a4">&&</span> <span style="color:#8be9fd">sudo</span> ldconfig <span style="color:#8be9fd">sudo</span> <span style="color:#8be9fd">cp</span> /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/libcublas.so.10.0 <span style="color:#6272a4">&&</span> <span style="color:#8be9fd">sudo</span> ldconfig <span style="color:#8be9fd">sudo</span> <span style="color:#8be9fd">cp</span> /usr/local/cuda-10.0/lib64/libcurand.so.10.0 /usr/local/lib/libcurand.so.10.0 <span style="color:#6272a4">&&</span> <span style="color:#8be9fd">sudo</span> ldconfig</code></span>參考
YOLOv3: 訓(xùn)練自己的數(shù)據(jù) - CSDN博客
總結(jié)
以上是生活随笔為你收集整理的YOLO v3 安装并训练自己数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python设置网卡自己封装的Inter
- 下一篇: 1-3.Win10系统利用Pycharm