對象檢測(Object Detection)DNN-YOLOv3講解

對某新聞圖片的對象檢測

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ā)展過程三篇論文如下:

本文算是一篇入門文章讨阻,在此不詳盡介紹模型的每個實現(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)

precision = \frac {TP}{TP + FP}
recall=\frac {TP}{TP + FN}

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橙凳。

Precision-Recall Curve and Average Precision

對于包含矩形(bounding box)蕾殴,怎么判斷模型的預測指和真實值是不是相符呢?通常我們看它們的重合率(IoU, Intersection over Union)的大小岛啸。定義如下:
IoU(A, B) = \frac {| A \bigcap B |}{| A \bigcup B |} = \frac {| A \bigcap B |}{| A | + | B | - | A \bigcap B |}

通常重合率要大于0.5才算預測正確钓觉。


Union and Intersection

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個分類的對象:

20 classes of VOC

3.2 COCO, Common Objects in Context

http://cocodataset.org/#download
比Pascal VOC新和大的競賽數(shù)據(jù)集卧晓。有150萬個對象實例和80個分類。

4 YOLO介紹

YOLO模型由兩部分組成:一個CNN骨干(backbone)和YOLO頭(head)赴捞。

Overview of YOLO

骨干是特征抽取器(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)

為了定位對象所在的位置,輸入的圖片會被平均劃分為w \times h個格子(grid)趟薄,每個格子里有B個錨定框(anchor box)绽诚。對象的位置(bbox)會輸出為相對于錨定框(anchor box)的位置(t_x, t_y, t_w, t_h)

為什么要使用相對位置來定位對象,而不直接預測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個錨定框):

  • 10 \times 13, 16 \times 30, 33 \times 23
  • 30 \times 61, 62 \times 45, 59 \times 119
  • 116 \times 90, 156 \times 198, 373 \times 326
gird and anchor box and bounding box

柵格里的錨定框并不能精準匹配對象的位置,所以模型的訓練目標是找到最匹配的錨定框并修正對象的位置(corrections to the anchor box)唱凯。如果定義以下參數(shù):

  • c_x, c_y: 對象所在柵格的位置羡忘,比如對象在圖片的左上角那么(c_x, c_y) = (0, 0),在右下角則 (c_x, c_y) = (w-1, h-1)
  • p_w, p_h: 錨定框的寬和高
  • t_x, t_y, t_w, t_h: 模型最后一層的輸出

那么最后預測的bounding box的位置和大小b_x, b_y, b_w, b_h可由以下公式得出:

  • b_x = sigmoid(t_x) + c_x
  • b_y = sigmoid(t_y) + c_y
  • b_w = p_w exp(t_w)
  • b_h = p_h exp(t_h)

柵格的大小(w, h)實際上是特征抽取后feature map的大小磕昼,因而由2個因素決定:1. 骨干做特征抽取的步長(strides)卷雕,2. 輸入圖片的大小。

4.2 模型的輸出

上面只是描述了對象的位置和大小票从,但模型還需要輸出對象的類別漫雕。

對象的類別預測類似于圖像分類任務(wù),輸出的是各個分類的可能性(probability)大小峰鄙。

實際上浸间,模型的最后輸出是一個(w, h, B \times (C + 5))矩陣:w, h是柵格的大小(feature map的大小w \times h),B是每個柵格里的anchor box的數(shù)量吟榴,C是對象的類別數(shù)魁蒜。對于每個bounding box,模型需要輸出C + 5個數(shù)字:

  • C: 是每個分類的概率吩翻,p_1, p_2, \dots, p_C
  • t_x, t_y, t_w, t_h: 這4個數(shù)字代表bounding box的中心點(t_x, t_y)和寬高
  • c: 代表此bounding box包含一個對象實例的置信度(confidence)
output matrix

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誤差

\sum_{i=0}^{G^2} \sum_{j=0}^{B} 1_{ij}^{obj} ( (x_i - \hat{x_i})^2 + (y_i - \hat{y_i})^2 + (w_i - \hat{w_i})^2 + (h_i - \hat{h_i})^2 )

  • G是柵格的大小(grid_size)契讲,通常w = h = G 仿吞,B是每個柵格里anchor box的數(shù)量
  • 1^{obj}是bounding box包含某對象的指示函數(shù),包含某對象則為1捡偏,否則為0
  • x_i, y_i, w_i, h_i是bounding box的位置和大小(真實值按照4.1部分的公式逆向求出)唤冈。戴帽子(^)的是預測值

4.4.2 bounding box包含對象的誤差

由于一個bounding box要么包含對象,要么不包含任何對象霹琼,類似于一個二分類問題务傲,最自然的損失函數(shù)就是binary_crossentropy。

但是有一種情況枣申,如果預測的bounding box跟真實的bounding box的重合率IoU不大售葡,這也是當作true negative來對待;因為它還可能是其它真實的bounding box的候選忠藤,這種情況我們不希望計入其誤差挟伙。

\sum_{i=0}^{G^2}\sum_{j=0}^{B} 1_{ij}^{obj} binary\_crossentropy(y_{ij}, \hat{y_{ij}}) + \sum_{i=0}^{G^2}\sum_{j=0}^{B} (1 - 1_{ij}^{obj}) 1_{ij}^{low\_iou} binary\_crossentropy(y_{ij}, \hat{y_{ij}})

4.4.3 對象分類的誤差

\sum_{i=0}^{G^2}\sum_{j=0}^{B} 1_{ij}^{obj} binary\_crossentropy(y_{ij}, \hat{y_{ij}})

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é)果圖片介却,可以看到對很大的對象的檢測不太完美,歡迎讀者朋友討論如何改進它:)

Girl and Car
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末块茁,一起剝皮案震驚了整個濱河市齿坷,隨后出現(xiàn)的幾起案子桂肌,更是在濱河造成了極大的恐慌,老刑警劉巖永淌,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崎场,死亡現(xiàn)場離奇詭異,居然都是意外死亡遂蛀,警方通過查閱死者的電腦和手機谭跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來李滴,“玉大人口糕,你說我怎么就攤上這事祭衩「氡猓” “怎么了避咆?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長包竹。 經(jīng)常有香客問我燕酷,道長,這世上最難降的妖魔是什么周瞎? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任苗缩,我火速辦了婚禮,結(jié)果婚禮上声诸,老公的妹妹穿的比我還像新娘酱讶。我一直安慰自己,他們只是感情好彼乌,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布泻肯。 她就那樣靜靜地躺著,像睡著了一般慰照。 火紅的嫁衣襯著肌膚如雪灶挟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天毒租,我揣著相機與錄音稚铣,去河邊找鬼。 笑死墅垮,一個胖子當著我的面吹牛惕医,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播算色,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼抬伺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灾梦?” 一聲冷哼從身側(cè)響起峡钓,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤齐鲤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后椒楣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡牡肉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年捧灰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统锤。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡毛俏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饲窿,到底是詐尸還是另有隱情煌寇,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布逾雄,位于F島的核電站阀溶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸦泳。R本人自食惡果不足惜银锻,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望做鹰。 院中可真熱鬧击纬,春花似錦、人聲如沸钾麸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饭尝。三九已至肯腕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芋肠,已是汗流浹背乎芳。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帖池,地道東北人奈惑。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像睡汹,于是被迫代替她去往敵國和親肴甸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容