RCNN開創了物件偵測的先鋒,接續又出現了Fast RCNN與Faster RCNN,但以上的演算法具有以下缺點:使用選擇性搜索(Selective Search)、不屬於端到端的演算法、使用多種模型等。而在2016年,YOLO(You Only Look Once)的問世解決了上述提到的問題。
原本的物件偵測任務皆是透過分類器進行分類,但在YOLO中則是將其視為回歸任務。YOLO將輸入影像切割成SxS
的grid cell,並從這些grid cell中找出邊界框(Bounding Box)並計算出類別的機率。整個過程只使用了一個神經網路,因此可視為一個End-to-End的演算法。
這樣的架構使整個偵測過程十分快速,可達到即時每秒45幀。而另外一個較小型的Fast YOLO不僅可達到每秒155幀的執行速度,mAP ( Mean Average Precision ) 也是其他即時物件偵測系統的兩倍。之後作者也發表了一系列的YOLO模型(v2, v3,…)。本篇文章不會深入介紹其背後架構與技術,而是專注於介紹如何將YOLO應用於實際技術中。如對YOLO有興趣的人可以參考:YOLO演進、一文弄懂YOLO算法、圖解一階段物件偵測算法。
本篇文章的目的:
How it works
第一步要先安裝YOLO,我們使用的是ultralytics所釋出的YOLO v5。但為了避免干擾到原本的環境,建議可以先建立一個虛擬環境,有以下兩種方法:
安裝虛擬環境後,就可以安裝YOLO囉
安裝YOLO v5所需的環境與套件
接著就可以import
套件了
第二步就是要載入YOLO模型
可以將模型的架構印出來,如下圖所示
YOLO模型架構
載入模型後,就可以載入影像來做測試,確認模型能夠正常運作
output結果如下圖所示
接著我們可以透過render()
把結果畫出來
偵測結果如下圖所示
NOTE:
如果直接執行上述程式,只是一個base class,如下圖所示
若輸入上述的程式,並按tab
,可看到很多function
,如下圖所示
而result.render()
是會回傳將detection畫上影像的結果,如下圖所示
由於result.render()
是list,所以無法直接透過matplotlib
畫出,所以要先轉成array
。但直接透過np.array()
轉,其shape會多出一個batch size的參數。為了得到(720, 1280, 3)
的影像,就須透過np.squeeze()
。
確認YOLO能夠執行之後,我們可以先玩看看real time的偵測。透過cv2.VideioCapture()
來打開攝影機,並擷取到影像。
接著我們就可以建立打瞌睡偵測模型了。但再建模型之前,先需要有打瞌睡和醒著兩種狀態的影像來建立資料集,所以需要先建立影像,再透過LabelImg標記。
接著我們需要安裝LabelImg,建議也可以專門使用LabelImg的虛擬環境。
在安裝的過程中遇到很多問題,照著LabelImg的Github也無法安裝成功,後來看了網路上的方法可以透過pip install labelImg
的方式安裝,不需要像Github上的複雜步驟。
而虛擬環境一開始使用Python的方式安裝,但同樣也無法安裝完成,最後使用anaconda的方式,而我是使用max os,其他os並沒有試過,以下是我的安裝方式:
如果安裝成功會出現以下的畫面
進入標記之前,先給大家看一下整個資料夾的結構
data資料夾下包含:
接著就可以標記了,我使用兩張影像做示範
快捷鍵:
開啟影像資料夾
設定存放目錄
設定為YOLO格式
按w開始標記,此影像為drowsy,標記完記得儲存
接著就會在labels資料夾下看到新增的檔案
按w開始標記,此影像為awake
接著按照這些步驟,把所有的影像都標記完就可以了!
接著就可以透過剛標記好的影像進行訓練了,終於來到這一步了!!!!
上述的程式有一個yaml file
需要建立,可以透過Visual Studio Code開啟檔案,並輸入以下資訊。建立完後,請將yaml file
放入yolo v5資料夾下。
訓練完後,在yolov5/runs/train/exp
會看到所有剛訓練的資料,包含訓練完的權重、learning curve與相關結果等。
接著就可以把剛訓練完的模型拿來做測試了
偵測結果如下
YOLO v5
LabelImg
Deep Drowsiness Detection using YOLO, Pytorch and Python