[YoLoV3目標檢測實戰] keras+yolov3訓練自身的數據集
本文用keras版本的yolov3來訓練人臉口罩數據集,從而完成一個簡單的目標檢測。
首先先上目標檢測效果,準備好了嗎? go!go!go!
看到 目標檢測的效果之後,你心動了嗎?心動不如行動,讓我們放手去幹!擼起袖子加油幹!
一、環境要求
- Python: 3.7.4
- Tensorflow-GPU 1.14.0
- Keras: 2.2.4
古人云:“工慾善其事必先利其器”。
我們首先要搭建好GPU的環境。有了GPU的環境,才能跑得快!!!
這裏爲了方便,就用anaconda的conda命令來搭建環境,執行以下幾條命令
conda creat -n tensorflow python=3.7
activate tensorflow
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==1.14.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple keras==2.2.4
驗證一下是否可以正常使用gpu加速:
python
import tensorflow as tf
sess = tf.Session()
看到下面的畫面,即正常加載gpu了,環境搭建就差不多完成了!
二、數據集
我們既然要做目標檢測,怎麼能沒有數據集呢?數據集是驅動模型的動力,就像這樣!
這裏利用labelImg
工具來標註圖片,生成對應的xml文件,具體詳情看圖。
標記好的xml會保存你的矩形框位置,以及類別。
接下來,你就是工具人,請瘋狂標註你的數據吧。
三、YoLoV3講解
在正式開始源碼之前,還是稍微講解一下YoLov3。雖然可能一遍看不懂,兩遍看不懂,三遍看不懂,只要你不放棄,總會有看懂的一天的。
其實,你要讀懂YoLov3,你就要去了解目標檢測的發展史,去看one-stage,two-stage算法。去看YoLov3的前輩們。這裏我相信你們都看過,沒看過也不怕,光腳的不怕穿鞋的!
直接放YoLoV3的網絡結構圖,讓我們稍微看一下YoLov3的網絡結構。
YoLoV3網絡主要分成兩大部分:
-
1.主幹網絡 DarkNet53
-
2.多尺度預測
1.主幹網絡DarkNet53
首先是主幹網絡DarkNet53,結合網絡圖我們看到它主要是使用了殘差塊Residual block
,這裏殘差塊
就是進行一次3X3、步長爲2的卷積,然後保存該卷積layer,再進行一次1X1的卷積和一次3X3的卷積,並把這個結果加上layer作爲最後的結果.
此外,主幹網絡DarkNet53每一個卷積使用了特有的DarkNetConv2D結構
,這裏的DarkNetConv2D
是指每一次卷積的時候進行l2正則化,完成卷積後進行BatchNormalization標準化與LeakyReLU。
2.多尺度預測
在多尺度預測部分,可以從網絡結構圖中看到yolov3提取了3個特徵層
,這3個特徵層分別位於中間層、中下層和底層。
這3個特徵層會進行5次卷積,處理完一部分用於輸出該特徵層對應的預測結果
,一部分用於進行反捲積UmSampling2d後與其它特徵層進行結合。
輸出層的shape分別爲(13,13,75),(26,26,75),(52,52,75),最後一個維度爲75是因爲該圖是基於voc數據集的,它的類爲20種,即25=(四個座標+1個置信度+20個類別)。
yolo3針對每一個特徵層存在3個先驗框,所以最後維度爲3x25=75;
至於別的分析,這裏就不多說了,直接實戰部分了,我知道你們已經迫不及待了!
四、YoLoV3口罩檢測實戰
寫代碼,是不可能寫代碼的!先去github把代碼給clone下來,原版的話就是qqwwee
的代碼,當然這裏也給出我的github,歡迎各位看官光顧!github
接下來,就看我的表演了。
1.快速使用篇
首先,我們需要下載yolov3事先已經訓練好的權重,yolov3.weights
。然而由於我們用的keras框架,所以我們需要把它給轉換一下,執行如下命令將darknet下的yolov3配置文件轉換成keras適用的h5文件
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/yolov3-tiny.h5
但是權重文件這玩意,因爲這個牆的問題,時快時慢,我知道你們肯定是這樣的:
給你們,都給你們,網盤下載去,權重鏈接 提取碼0imy
有了權重之後,我們直接運行一下,看一下效果,
python yolo_video.py --image
在命令行輸入圖片地址img/street.jpg
,即可預測
怎麼樣,效果還是不錯的。我知道你要說,可是我要訓練我自己的數據集呀,我不要官方的。我知道,我知道,不要急。
2.訓練自身數據集
首先在第二部分的時候我們已經準備好了數據集,那讓我們繼續吧。
將標籤文件放在VOCdevkit文件夾下的VOC2007文件夾下的Annotation中。
將圖片文件放在VOCdevkit文件夾下的VOC2007文件夾下的JPEGImages中。
之後利用voc2yolo3.py
文件生成對應的txt。
VOCdevkit
-VOC2007
├─ImageSets # 存放數據集列表文件,由voc2yolo3.py文件生成
├─Annotations # 存放數據集中圖片文件
├─JPEGImages # 存放圖片標籤,xml 格式
└─voc2yolo3.py # 用來生成數據集列表文件
運行voc2yolo3.py
之後會在ImageSets/Main生成如下txt文件
在txt裏面存放了圖片的名稱,這裏就不放代碼了,我知道放了代碼你們也不看,直接去我github裏面白嫖就行
但是YoLov3處理的並不是這樣的文件,所以我們還需要生成YOLOV3所需數據
再運行根目錄voc_annotation.py
,運行前需要將voc_annotation
文件中classes改成你自己的classes。
我們就會生成這樣的一個文件,2007_train.txt
,這裏面 每一行對應其圖片位置及其真實框的位置
好了,讓我們中場休息一下!!!
接下來,我準備採取yolov3_tiny架構,當然你也可以用yolov3架構。主要是yolov3-tiny收斂快,而我用的筆記本GPU,跑的速度太慢了~~~
在訓練前我們可根據自身需要修改model_data裏面的yolo_anchors.txt
和tiny_yolo_anchors.txt
,中的先驗框的值,這裏我們利用kmeans.py
來生成。
k=9,生成yolo_anchors;k=6,生成tiny_yolo_anchors。
接着我們來到model_data裏面的voc_classes.txt
文件中需要將classes改成你自己的classes
。
然後來到train.py
中,通過修改anchor_path
,從而選擇使用yolov3
訓練還是yolov3-tiny
訓練
運行train.py
即可開始訓練,訓練好的模型會存放在logs下。
你以爲大功告成了麼,不不不,接下來就是煉丹了,慢慢調參!
四、測試
測試一下,就可以開溜了~~~
修改根目錄下yolo.py
文件,修改model_path
,anchors_path
,classes_path
替換成·自己的路徑`
- 1.單張圖片測試
python yolo_video.py --image
,輸入圖片名稱即可
- 2.電腦攝像頭實時檢測
python yolo_video.py --input
此外對應的yolo.py文件174行改爲vid = cv2.VideoCapture(0)
;
- 3.測試本地視頻
python yolo_video.py --input
此外對應的yolo.py文件174行改爲vid = cv2.VideoCapture(“視頻路徑+視頻名+視頻後綴名”);
- 4.測試本地視頻並且保存視頻效果
python yolo_video.py --output
此外對應的yolo.py文件184行改爲out = cv2.VideoWriter(“視頻路徑+視頻名+視頻後綴名”, video_FourCC, video_fps, video_size);
好了,應該差不多快結束了,最後再測試一下,你看。
五、注意:
一張圖片最多隻能識別20個對象的問題:
-
1.訓練時,要在yolo3文件夾下面的utils.py裏,修改get_random_data()函數,有一個默認參數是max_boxes=20,改成很大的數值就行了。
-
2.檢測時,要在yolo3文件夾下面的model.py裏,修改yolo_eval()函數,有一個默認參數是max_boxes=20,改成很大的數值就行了。
好了,結束了,歡迎大家留言!!!