1. 程式人生 > >ubuntu yolov2 訓練自己的數據集

ubuntu yolov2 訓練自己的數據集

list lib backup 工程 可能 sin define region stream

項目需求+鍛煉自己,嘗試用yolov2跑自己的數據集,中間遇到了很多問題,記下來防止忘記

一、數據集

首先發現由於物體特殊沒有合適的現成的數據集使用,所以只好自己標註,為了減少工作量,先用opencv標記連通域

(環境 ubuntu qt opencv)

在qt中創建console類型工程,需要對test.pro進行如下配置

QT -= gui
QT += core
CONFIG += c++11
CONFIG += console
CONFIG -= app_bundle
TARGET = test
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS


SOURCES += main.cpp

INCLUDEPATH+=/home/opencv-3.4.4/include            /home/opencv-3.4.4/include\opencv            /home/opencv-3.4.4/include\opencv2
LIBS+=-L/home/opencv-3.4.4/build/lib        -lopencv_core        -lopencv_imgcodecs        -lopencv_highgui        -lopencv_imgproc

路徑按照自己電腦中的路徑

頭文件也需要註意

1 #include <opencv2/core/core.hpp>
2 #include <opencv2/highgui/highgui.hpp>
3 #include <opencv2/opencv.hpp>
4 #include <iostream>
5 #include <string>
6 #include <stdio.h>
7 using namespace std;
8 using namespace cv;

頭文件包含不足夠會出現 returned 1 status問題

###接下來對圖片處理

首先轉為灰度圖,接著用floodfill函數,OTSU算法,利用OTSU算法得到的閾值進行二值化處理(具體不再展開)

【用函數threshold,其中type選擇THRESH_OTSU】

之後像素反轉,因為一般習慣物體(前景)黑色,背景白色

標記連通域可以用函數findcontours 和 drawcontours,並且可以輸出代碼數量作為參考

 1 vector <vector<Point>> contours;
 2    findContours(reverseImage,
 3                 contours,
4 CV_RETR_CCOMP,//外輪廓 5 CV_CHAIN_APPROX_NONE);//存儲所有輪廓點 6 7 Mat result(reverseImage.size(),CV_8U,Scalar(255)); 8 drawContours(result, 9 contours, 10 -1,//畫所有輪廓 11 Scalar(0),//黑色 12 2); 13 namedWindow("contours"); 14 imshow("contours",result); 15 cout<<"contours:"<<contours.size()<<endl;

為了避免沒用的連通域,需要對其進行篩選,其過濾過大過小連通域

 1 unsigned int cmin=100;
 2    unsigned int cmax=5000;
 3    vector<vector<Point>>::const_iterator itc=contours.begin();
 4    while(itc!=contours.end())
 5    {
 6        cout<<itc->size()<<endl;
 7         if (itc->size() < cmin || itc->size() > cmax)
 8             itc=contours.erase(itc);
 9         else
10             ++itc;
11    }
12    Mat result_erase(result.size(),CV_8U,Scalar(255));
13    drawContours(result_erase,
14                 contours,
15                 -1,
16                 Scalar(0),
17                 2);
18 
19    namedWindow("contours_erase");
20    imshow("contours_erase",result_erase);
21    cout<<"contours:"<<contours.size()<<endl;

結果如下:

技術分享圖片

技術分享圖片

技術分享圖片

二、數據集準備

復雜的環境下識別連通域並不準確,所以最後還是決定手動標註,用的labelimg,方法非常簡單

唯一的技巧可能就是選擇自動保存,以及單一標註,標註前後的格式分別是jpg和xml

這是為了和VOC數據集格式相同,便於yolov2識別

需要註意的是如果沒有bounding box,那麽也沒有相應圖片的xml,一定要刪除照片,否則之後訓練時會出現問題

命名格式也可以按照VOC數據集的命名格式

VOC數據集包括三個文件夾,Annotations,ImageSets,JPEGImages,分別放xml,(layout,main,segmentation),jpg

其中main包括train.txt 用來存放照片的名稱(無路徑,無後綴)

【照片名稱寫入txt的步驟建議Python】

 1 import sys
 2 import os
 3 import random
 4 file_path="/home/yjq/test_image"
 5 path_list=os.listdir(file_path)
 6 path_name=[]
 7 for i in path_list:
 8     path_name.append(i.split(".")[0])
 9 
10 path_name.sort()
11 
12 for file_name in path_name:
13     with open("/home/yjq/image_name.txt","a") as f:
14         f.write(file_name+"\n")
15     f.close()

三、配置yolov2

在darknet/scripts下建立文件夾,名字自取(如:VOCdevkit)

裏面放入準備好的數據集

對voc_label.py進行修改

【進入pycharm的bin中,用終端打開,輸入 sh ./pycharm.sh 打開py文件】

修改sets 和 classes 其他幾乎不用修改,報錯再相應修改

(事實上這裏錯了很多次,比如

修改時如果把sets中的year去掉,下面也要相應修改

路徑不要出錯)

修改後 cd ./darknet/scripts 進入文件夾後再 python voc_label.py

這時會生成labels文件夾,裏面存有xml內容的txt文件,同時還有train.txt,存有圖片的絕對路徑

四、準備訓練

這時距離訓練只有幾步之遙,仍需要修改幾個文件

  • data/下修改voc.names 輸入classes名稱,或新建detection.names 只要對應修改就好
  • cfg/voc.data 修改classes,輸入train.txt的路徑和names路徑,以及backup 放weights的路徑,一定註意不可以有中文!
classes= 2
train  = /home/yjq/darknet/scripts/VOCdevkit/train.txt 
//valid  = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = /home/yjq/darknet/results/
  • cfg/yolov2-voc.cfg 在region層下修改classes,以及上一層convolutional的filters 其中 filters=(classes+coords+1)*5

五、開始訓練

在terminal輸入

cd darknet  
./darknet detector train cfg/voc.data cfg/yolov2-voc.cfg

就可以開始了

如果出現 cannot load image 問題可能出在train.txt,用notepad打開,確保最後一行只有換行符即可

或者一不小心路徑輸錯也不是沒有可能

默認每100 images 會存入results中,可以查看

【在此之前先從github上下載darknet,訓練weights,再測試examples】

【希望一切順利】

【參考:https://blog.csdn.net/hysteric314/article/details/54097845】

ubuntu yolov2 訓練自己的數據集