top of page

​簡介

       根據數據顯示,在台灣的交通事故死亡者當中機車族的比例超過6成,大部分的原因都是因為頭部遭到撞擊而導致死亡事件的發生,而根據交通部資料的統計,騎乘機車未戴安全帽致死率為配戴安全帽致死率的8.8倍,因為未配戴安全帽的致死率太高,國家也有規定機車騎士強制配安全帽的法律,但是每年還是會取締到平均20萬件未戴安全帽的違規事項,而且透過著人眼的檢測、之後進行拍照的動作,在上傳至當地政府警察檢舉網站,其時間成本實在過高,且非常沒有效率,而依靠著警察親自開單的話也會因為許多地點較少有警察的出現導致違規人士容易蒙混過關。

        因為上述原因,藉由著科技進行對於未戴安全帽的違規騎士進行懲處是勢在必行的,而在近幾年在國外對於機車騎士安全帽的即時檢測已有了多種的做法,在最初是透過背景減法以及梯度直方圖HOG(Histogram of oriented gradient)提取特徵的方式,然後藉由SVM(Support Vector Machine)對於安全帽及未戴安全帽進行分類,在之後一段時間因為物件檢測的技術變得逐漸成熟,故也有其他研究是使用CNN或是更快速的Faster R-CNN,Faster R-CNN是基於雙階段的目標檢測演算法,其對於候選框(物件可能的位置)的生成和候選框的判斷是兩個過程,所以檢測的精準度會很高,但速度也會較慢,而之後對於安全帽的檢測有了更快速地方法-單階段目標檢測,在單階段目標檢測終,候選框的生成及判斷是在同時進行的,有著非常快的速度,精準度雖說比不上雙階段目標檢測,但是也是很不錯的,其例子有SSD、YOLO等,而在這次的實驗中,我提出的是YOLO的第三代模型架構YOLOv3,因為對於檢測路上的機車騎士而言,需要非常快的速度,而且Rendmon等人於2018年也對上述不同的神經網路進行了實驗,最終分析發現YOLOv3的精準度相比 R-CNN、Faster R-CNN也沒有遜色多少。

開發環境

Python 3.6.19
tensorflow 1.6.0
keras 2.1.5

​使用技術

YOLOv3模型架構

1222.jpg

        YOLOv3是基於YOLOv2由J.Redmon開發出來的神經網路,YOLOv2中的一個改良版本YOLO9000可以識別超過9000個類別,而YOLOv3其基底網路為Darknet-53,原本YOLOv2為Darknet-19,可知YOLOv3加深了網路層數,目的為增加精準度,雖說其速度因為加深了多個網路層後沒有Darknet-19快,但是在單階段檢測上還是保持著很高的性能。YOLOv3的基本概念如同前兩代的YOLO和YOLOv2一樣,首先都是通過特徵即取網路對輸入進來的圖片進行特徵提取,但YOLOv3最主要特點為在輸出層時會輸出三個特徵圖,分為三種不同尺寸,13*13、26*26和52*52,大尺寸的特徵圖可以檢測小物體,而小尺寸的則是用來檢測大物體,其中每一張特徵圖都會切割成13*13格、26*26格、52*52格Grid Cell,而YOLOv3的三個特徵圖中的每一格Grid Cell輸出的結果會有檢驗框位置(x,y,w,h)以及那個檢測框的置信度(1)加上共有幾個類別,以YOLOv3在COCO資料集上的結果就是4+1+(80個類別),總共85個維度。而YOLOv3也有沿用YOLOv2的其中一個很重要的技巧-Anchor Box(先驗框),先驗框為在訓練模型時,對於訓練資料的標註進行聚類,得到類別中心的9個框,目的為避免模型在訓練的時候盲目地尋找,有助於模型快速地收斂。每一個Grid Cell有3個先驗框,作為先驗框,先驗框只與檢驗框的w、h,即矩形的長與寬有關,在有了先驗框和輸出的特徵圖之後,就可以求出預測檢驗框(Bounding Box),以下為Bounding Box的計算方式,bx、by、bw、bh為預測得到的Bounding Box的中心坐標和長寬,tx、ty、tw、th為模型的預測輸出,而cx和cy則為Grid Cell的坐標,pw及ph為先驗框的坐標,其運算過程如以下公式。

 

bx = σ(tx)+cx

by = σ(ty)+cy

  bw = pw*e^tw 

bh = ph*e^th

 

    要確定Bounding Box的好壞,會需要一個關鍵性的指標-IOU(Intersection Over Union),YOLOv3藉由羅吉斯回歸來預測每個Bounding Box裡面物體的分數(Confidence Score),這個分數是以預測的Bounding Box以及我們在標註時的Ground Truth的IOU值作為評斷標準,通常IOU值是以0.5作為基準,因為一張圖片總共會產出13*13*3+26*26*3+52*52*3總共10647個Bounding Box,故當其中一個Bounding Box與Ground Truth的IOU大於0.5時,則會賦予Target值=1,若大於0.5但不是最好的Bounding Box則忽略這次的預測,YOLOv3只為每一個我們實際標註的類別分配一個Bounding Box,那一個Bounding Box就是Target為1的Bounding Box。

iou1.png

檢測流程

        我們的檢測流程分為三個階段,第一階段為檢測圖中的機車騎士,若檢測到的機車騎士沒有配戴安全帽,則會進入第二階段-安全帽檢測,當第一階段的機車騎士被檢測到沒戴安全帽,則會進入第三階段,將自動化的進行車牌檢測及識別那些未戴安全帽的騎士,最後會將圖片以及檢測到的車牌號碼進行存檔,詳細流程如下圖所示。

Input Video

Frames Extraction

Motorcyclists detection using YOLOv3

Helmet detection of the motorcyclists using YOLOv3

Automatic license plate detection and recognition of the motorcyclists without helmet using YOLOv3

Save image and license plate number of the motorcyclists without helmet

對於安全帽的兩種檢測方法

方法一

WAY1.JPG

方法二

WAY2.JPG

建模前的準備

        因為我們總共需要三個模型,一個用於檢測機車騎士,一個檢測有無佩戴安全帽,最後一個檢測車牌,所以我們會需要準備蠻大量的資料集。首先是機車騎士的影像,我們的資料來源為Kaggle以及路邊自行拍攝,而安全帽的影像主要是從Github一些別人的專案中蒐集,但也有自行拍攝一些,以避免資料量不平衡,最後車牌的部分我是拿AOLP資料庫中的資料,AOLP資料庫為台科大學生拍攝台灣類型的車牌影像資料庫,其影像格式非常符合我這個專題,下方的表格為我們對於三個模型所準備的資料數,機車騎士為880張,安全帽為920張,車牌為780張,準備完成後在分割成訓練集和資料集,分割比例為80%/20%。

未命名.png

模型訓練結果

        下面這張表格為我們透過混淆矩陣對三個模型進行後的結果,計算出來後我們可以得知在安全帽的結果相比另外兩個模型其結果相對不佳,其原因有:資料集中有戴安全帽的標籤數量和沒戴安全帽的標籤數量差了三倍左右,造成模型訓練十時對於未戴安全帽的特徵學習的不夠完全,且從後方視角來看黑色安全帽與人的頭髮顏色相近,也容易造成模型的判別有誤。

未命名.png

        而下面這張表格為我們對上方提及的兩種不同的安全帽檢測方法進行分析所得屋出的結果,這個檢測率的計算我們是透過67張自行拍攝的影像對全部應該有的Ground Truth與檢測框去計算,最後再取平均,經過計算後我們得知方法二是以犧牲速度來提升檢測率。

未命名.png

實驗結果

        接下來的部分為我們實際的檢測流程,如下面四張圖所示,圖一為原始影像,為我們在路邊拍攝的影片其中一個幀,圖二為經過機車檢測以及安全帽檢測後的圖像,圖三為擷取未戴安全帽的機車騎士圖像,最後圖四是對那一個機車騎士進行車牌的檢測及辨識。

圖片1.jpg

​圖一

圖片2.png

​圖二

圖片3.jpg

​圖三

圖片4.jpg

​圖四

​結論

        因為台灣的機車族數量非常的多,且每年平均還是有至少20萬的人被抓到沒戴安全帽,這還不包括沒有被警察看到或被人檢舉的,因此我們在基於深度學習的方法上也做了對於這方面相對應配套的系統,目的是透過我們的系統,讓違規騎士不敢違規,就像測速照相機的,沒有人敢在測速照相機前還超速一樣,而在這次的實驗中我們得到了一份還不錯的成果,在一般靜止或慢速的車流下都可以正確檢測到機車騎士有無配戴安全帽,並對其車牌進行紀錄的動作,但是對於環境及配備會有較高的需求,像是在機車快速通過該檢測器時,如果當時處於下雨或車速過快的環境,亦或是監控設備解析度太低時,很容易發生車牌模糊的情況,在這個現象發生的同時,就算檢測到了機車未配戴安全帽,也於事無補,且現階段對於夜間檢測成效還有要改善的地方,像是因為燈光的影響而造成檢測效率不佳。故這個檢測系統我們認為放置於車流多且車速相對慢的地點且配上一個高等級的相機較為適合,例如橋上或是紅綠燈旁邊等地方。

bottom of page