[YoLoV3目標檢測實戰] keras+yolov3訓練自身口罩檢測數據集

[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.txttiny_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,改成很大的數值就行了。

好了,結束了,歡迎大家留言!!!

github github

發佈了489 篇原創文章 · 獲贊 515 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章