1 概述
對象檢測(Object Detection)是指在圖片蝙场、視頻中找出不同類型的目標物體及它們的位置柿祈。對象檢測在計算機視覺(Computer Vision)領(lǐng)域有廣泛的應(yīng)用場景金麸,例如自動駕駛汽車(self-driving cars)悲幅、內(nèi)容監(jiān)管(content moderation)、安防行業(yè)(security industry)等瘾杭。
本文講解最流行的算法之一 -- YOLOv3(You Only Look Once version 3), YOLO的發(fā)展過程三篇論文如下:
- 2015 - 《You Only Look Once: Unified, real-time object detection》, 作者: Joseph Redmon诅病、Santosh Divvala、Ross Girshick粥烁、Ali Farhadi
- 2016 - 《YOLO9000: Better, Faster, Stronger》,作者: Joseph Redmon贤笆、Ali Farhadi
- 2018 - 《YOLOv3: An Incremental Imprvoment》, 作者: Joseph、Ali Farhadi
本文算是一篇入門文章讨阻,在此不詳盡介紹模型的每個實現(xiàn)細節(jié)芥永,也沒有代碼,只關(guān)注YOLOv3核心原理和整體的結(jié)構(gòu)钝吮。
2 如何衡量對象檢測的結(jié)果
算法的優(yōu)劣通常由準確率(precision)和召回率(recall)來衡量埋涧,有以下3個指標:
- 位置的準確率(bounding box precision):對象的位置由一個包含對象的最小矩形框(bounding box, bbox)標記,不能太大奇瘦,也不能太小
- 類別的準確率(precision): 把對象的類型正確分類飞袋,不能把人標記成樹
- 召回率(recall): 把全部對象都找出來,沒有遺漏
還有檢測速度也是重要的指標之一链患。
2.1 準確性(precision)和召回率(recall)
2.2 準確率-召回率曲線(precision-recall curve)、平均準確率(Average Precision, AP, Mean Average Precision, mAP)和重合率(IoU, Intersection over Union, Jaccard index)
只有完美的模型才能得到準確率和召回率都是1的結(jié)果瓶您,通常準確率和召回率是一對此消彼長的競爭對手麻捻。提高準確率可能會漏掉一些不太確信的對象,把更多的疑似對象召回又會降低準確率呀袱。如果是在檢測行人的場景贸毕,我們希望把所有行人都檢測出來 -- 高的召回率,包括疑似為行人的物體夜赵,畢竟安全第一明棍;但在投資理財?shù)膱鼍翱苌覀兛赡芟M馐軗p失次數(shù)盡可能少摊腋,雖然會錯過一些投資機會 -- 意味著準確率要高沸版。
以準確率和召回率為坐標,把模型不同指標值下的輸出結(jié)果表示出來 - 就是準確率-召回率曲線兴蒸。曲線下的面積(area under curve)稱為平均準確率(AP)视粮。如果是對多種對象進行檢測,各種對象的平均準確率的均值稱為mAP橙凳。
對于包含矩形(bounding box)蕾殴,怎么判斷模型的預測指和真實值是不是相符呢?通常我們看它們的重合率(IoU, Intersection over Union)的大小岛啸。定義如下:
通常重合率要大于0.5才算預測正確钓觉。
3 對象檢測公開數(shù)據(jù)集 - Pascal VOC和COCO
3.1 Pascal VOC, PASCAL Visual Object Classes
http://host.robots.ox.ac.uk/pascal/VOC/
2005 ~ 2012年期間舉辦的競賽〖岵龋可以訓練和測試分類(classification)荡灾、檢測(detection)和分割(segmentation)三類任務(wù)。
共有17125張圖片堕虹,20個分類的對象:
3.2 COCO, Common Objects in Context
http://cocodataset.org/#download
比Pascal VOC新和大的競賽數(shù)據(jù)集卧晓。有150萬個對象實例和80個分類。
4 YOLO介紹
YOLO模型由兩部分組成:一個CNN骨干(backbone)和YOLO頭(head)赴捞。
骨干是特征抽取器(feature extractor)逼裆,通常是由大規(guī)模圖片分類任務(wù)中得到的,如在ImageNet上訓練的分類器赦政。理論上很多CNN結(jié)構(gòu)都能用作backbone胜宇,如Inception, ResNet等。YOLO的作者是采用自定義的CNN結(jié)構(gòu)作為backbone恢着,叫Darknet桐愉,采用了Inception和ResNet的結(jié)構(gòu),并且速度較快掰派。
YOLO頭也是由CNN層組成从诲,它把圖片特征轉(zhuǎn)換成對象檢測的輸出。
關(guān)于整個模型的具體的細節(jié)靡羡,感興趣的讀者可以查看論文或者其他文章系洛。
為了易于理解,下面先介紹模型是如何推理(inference)的略步,再介紹其損失函數(shù)(loss function)和如何訓練描扯。
4.1 柵格(grid)和錨定框(anchor box)
為了定位對象所在的位置,輸入的圖片會被平均劃分為個格子(grid)趟薄,每個格子里有
個錨定框(anchor box)绽诚。對象的位置(bbox)會輸出為相對于錨定框(anchor box)的位置
。
為什么要使用相對位置來定位對象,而不直接預測bounding box的位置和大小呢恩够?實際上在YOLOv1確實是直接預測的卒落。但是作者發(fā)現(xiàn)由于對象的大小不一,這樣做的話誤差會很大玫鸟,特別是對于小對象的預測导绷,所以在YOLOv2引入了錨定框(anchor box)。
錨定框也稱作先驗(prior)框屎飘,因為是在訓練前事先根據(jù)檢測對象的形狀確定的一組不同寬高比和大小的矩形框妥曲。例如要檢測行人,那么會使用高的窄的矩形框钦购;要檢測桔子檐盟,會使用正方形框等。
YOLO使用的是3組小中大共9個錨定框押桃,從YOLOv2開始作者根據(jù)數(shù)據(jù)集的對象來聚類產(chǎn)生錨定框葵萎。如在COCO數(shù)據(jù)集上使用的錨定框有如下9個(YOLOv3 tiny使用6個錨定框):
柵格里的錨定框并不能精準匹配對象的位置,所以模型的訓練目標是找到最匹配的錨定框并修正對象的位置(corrections to the anchor box)唱凯。如果定義以下參數(shù):
-
: 對象所在柵格的位置羡忘,比如對象在圖片的左上角那么
,在右下角則
-
: 錨定框的寬和高
-
: 模型最后一層的輸出
那么最后預測的bounding box的位置和大小可由以下公式得出:
柵格的大小實際上是特征抽取后feature map的大小磕昼,因而由2個因素決定:1. 骨干做特征抽取的步長(strides)卷雕,2. 輸入圖片的大小。
4.2 模型的輸出
上面只是描述了對象的位置和大小票从,但模型還需要輸出對象的類別漫雕。
對象的類別預測類似于圖像分類任務(wù),輸出的是各個分類的可能性(probability)大小峰鄙。
實際上浸间,模型的最后輸出是一個矩陣:
是柵格的大小(feature map的大小
),
是每個柵格里的anchor box的數(shù)量吟榴,
是對象的類別數(shù)魁蒜。對于每個bounding box,模型需要輸出
個數(shù)字:
-
: 是每個分類的概率吩翻,
-
: 這4個數(shù)字代表bounding box的中心點
和寬高
- c: 代表此bounding box包含一個對象實例的置信度(confidence)
4.3 排序與去重
對于模型預測輸出的數(shù)量眾多的bounding box兜看,我們需要按置信度排序并過濾掉可能性不大的bounding box。
排序的概率由bounding_box的置信度乘以分類的概率仿野。
選出可能的bounding box后,仍有很多是有重疊得比較厲害的她君,需要去掉脚作。對于去重,我們要使用一個叫NMS(non-maximum suppression)的技術(shù),即過濾掉跟排在前面的bbox重疊厲害的bbox球涛。這需要用到前面提到的重疊率(IoU)劣针,對每個bbox計算出跟后面每個bbox的IoU,如果超過某閾值(如0.5)就去掉該后面的bbox亿扁。
4.4 損失函數(shù)(loss function)
以上介紹了預測的過程捺典,接下來介紹模型的損失函數(shù)。損失函數(shù)代表模型優(yōu)化的方向从祝,設(shè)計好損失函數(shù)就能夠用樣本訓練網(wǎng)絡(luò)了襟己。
我們知道,模型輸出了3項信息:1. bounding box的位置和大须鼓啊擎浴;2. bounding box包含一個對象的置信度;3. 對象屬于的各分類概率毒涧;對應(yīng)的贮预,損失函數(shù)包含這3部分的誤差。
4.4.1 bounding box誤差
- G是柵格的大小(grid_size)契讲,通常
仿吞,B是每個柵格里anchor box的數(shù)量
-
是bounding box包含某對象的指示函數(shù),包含某對象則為1捡偏,否則為0
-
是bounding box的位置和大小(真實值按照4.1部分的公式逆向求出)唤冈。戴帽子(^)的是預測值
4.4.2 bounding box包含對象的誤差
由于一個bounding box要么包含對象,要么不包含任何對象霹琼,類似于一個二分類問題务傲,最自然的損失函數(shù)就是binary_crossentropy。
但是有一種情況枣申,如果預測的bounding box跟真實的bounding box的重合率IoU不大售葡,這也是當作true negative來對待;因為它還可能是其它真實的bounding box的候選忠藤,這種情況我們不希望計入其誤差挟伙。
4.4.3 對象分類的誤差
4.4.4 模型總的誤差(loss)
由上面三部分誤差加總即可。
5 參考實現(xiàn)
在github上已有牛人寫了tensorflow 2的實現(xiàn)模孩,該實現(xiàn)包含圖片檢測尖阔、視頻檢測和用個性化數(shù)據(jù)訓練的實現(xiàn),個人覺得很有參考價值榨咐。地址是:https://github.com/zzh8829/yolov3-tf2
最后再附上一張用該實現(xiàn)做對象檢測的結(jié)果圖片介却,可以看到對很大的對象的檢測不太完美,歡迎讀者朋友討論如何改進它:)