機(jī)器學(xué)習(xí)摘要:基于深度學(xué)習(xí)的目標(biāo)檢測(cè)技術(shù)演進(jìn)

前言

本文主體內(nèi)容參考自 https://www.cnblogs.com/skyfsm/p/6806246.html,補(bǔ)充了一些算法細(xì)節(jié)。

圖像識(shí)別任務(wù)分類(lèi)

圖像任務(wù)

分類(lèi)任務(wù) Classification

輸入: 圖片
輸出: 物體的類(lèi)別
評(píng)估方法: 準(zhǔn)確率,F(xiàn)1

定位任務(wù) Localization

輸入: 圖片
輸出: 方框在圖片中的位置(x,y,w,h)
評(píng)估方法: 檢測(cè)評(píng)級(jí)函數(shù) intersection-over-union IOU 交并比

基本思路

思路1 看作回歸問(wèn)題

直接用網(wǎng)絡(luò)預(yù)測(cè)出(x,y,w,h)四個(gè)參數(shù)的值,從而得出方框的位置。


當(dāng)作回歸問(wèn)題

步驟1:搭建一個(gè)圖像識(shí)別神經(jīng)網(wǎng)絡(luò)


image.png

步驟2:在上述神經(jīng)網(wǎng)絡(luò)的尾部展開(kāi),分為分類(lèi)頭和回歸頭,即classification + regression模式
image.png

步驟3: SGD + 歐氏距離 訓(xùn)練Regression,前面的卷積層保持不變
步驟4:預(yù)測(cè)階段拼上兩個(gè)頭部完成不同功能
備注:regression太難做了,應(yīng)想方設(shè)法轉(zhuǎn)換為classification問(wèn)題。regression的訓(xùn)練參數(shù)收斂的時(shí)間要長(zhǎng)得多,所以上面的網(wǎng)絡(luò)采取了用classification的網(wǎng)絡(luò)來(lái)計(jì)算出網(wǎng)絡(luò)共同部分的連接權(quán)值。

思路2:取圖像窗口

取大小不同的框,讓框出現(xiàn)在不同的位置獲取判定得分,取得分最高的框
步驟:對(duì)一張圖片,用各種大小的框(遍歷整張圖片)將圖片截取出來(lái),輸入到CNN,然后CNN會(huì)輸出這個(gè)框的得分(classification)以及這個(gè)框圖片對(duì)應(yīng)的x,y,h,w(regression)


遍歷框

物體檢測(cè)

多物體識(shí)別+定位多個(gè)物體
思路: 找出可能含有物體的框(也就是候選框,比如選1000個(gè)候選框),這些框之間是可以互相重疊互相包含的,這樣我們就可以避免暴力枚舉的所有框了


候選框

不同候選框方法對(duì)比:


候選框的方法的性能對(duì)比
  • 滑窗法(Sliding Window)


    滑窗法

    方法: 首先對(duì)輸入圖像進(jìn)行不同窗口大小的滑窗進(jìn)行從左往右、從上到下的滑動(dòng)。每次滑動(dòng)時(shí)候?qū)Ξ?dāng)前窗口執(zhí)行分類(lèi)器(分類(lèi)器是事先訓(xùn)練好的)。如果當(dāng)前窗口得到較高的分類(lèi)概率,則認(rèn)為檢測(cè)到了物體。對(duì)每個(gè)不同窗口大小的滑窗都進(jìn)行檢測(cè)后,會(huì)得到不同窗口檢測(cè)到的物體標(biāo)記,這些窗口大小會(huì)存在重復(fù)較高的部分,最后采用非極大值抑制(Non-Maximum Suppression, NMS)的方法進(jìn)行篩選。最終,經(jīng)過(guò)NMS篩選后獲得檢測(cè)到的物
    評(píng)價(jià): 效率低下 不同窗口大小進(jìn)行圖像全局搜索導(dǎo)致效率低下,而且設(shè)計(jì)窗口大小時(shí)候還需要考慮物體的長(zhǎng)寬比。

  • EdgeBoxes
    主要的思想:
    一個(gè)候選框中完整包含的輪廓數(shù)量與該候選框的正確概率成正比。利用邊緣信息,確定候選框中輪廓個(gè)數(shù)與框邊緣重疊的輪廓個(gè)數(shù),基于此對(duì)框評(píng)分,根據(jù)得分高低確定proposal信息。


    EdgeBoxes算法

步驟:
首先利用結(jié)構(gòu)化的方法檢測(cè)出邊緣,并利用非極大值抑制對(duì)邊緣進(jìn)行篩選;然后基于某種策略將似乎在一條直線上的邊緣點(diǎn)集合成若干個(gè)edge group,并計(jì)算edge group之間的相似度,越是在同一直線上的edge group,其相似度越高。再通過(guò)edge group來(lái)確定輪廓數(shù),實(shí)現(xiàn)策略為給每個(gè)edge group計(jì)算一個(gè)權(quán)值,將權(quán)值為1的edge group歸為proposal內(nèi)輪廓上的一部分,將權(quán)值為 0 的edge group歸為proposal外或proposal框重疊的一部分,由此便提取得到proposal,并對(duì)proposal進(jìn)行評(píng)分,選取得分最高的proposal作為最后的檢測(cè)輸出。

缺陷:
當(dāng)一幅圖像中包含多個(gè)相同的檢測(cè)目標(biāo)時(shí),其得分最高的proposal幾乎包含整幅圖像,而不是單獨(dú)的目標(biāo)。原因在于,其不是基于“學(xué)習(xí)”的算法,沒(méi)有訓(xùn)練的過(guò)程,也就沒(méi)有具體的針對(duì)目標(biāo)的模型,故這使得其在進(jìn)行單一類(lèi)別多目標(biāo)檢測(cè)時(shí)效果不佳。

  • Selective Search


    選擇性搜索

    圖像中物體可能存在的區(qū)域應(yīng)該是有某些相似性或者連續(xù)性區(qū)域的。因此,選擇搜索基于上面這一想法采用子區(qū)域合并的方法進(jìn)行提取bounding boxes候選邊界框。

步驟

  1. 對(duì)輸入圖像進(jìn)行分割算法產(chǎn)生許多小的子區(qū)域( a graph-based segmentation method by Felzenszwalb and Huttenlocher)。
  2. 其次,根據(jù)這些子區(qū)域之間相似性(相似性標(biāo)準(zhǔn)主要有顏色、紋理、大小等等)進(jìn)行區(qū)域合并,不斷的進(jìn)行區(qū)域迭代合并。
  3. 每次迭代過(guò)程中對(duì)這些合并的子區(qū)域做bounding boxes(外切矩形),這些子區(qū)域外切矩形就是通常所說(shuō)的候選框

評(píng)價(jià)
  計(jì)算效率優(yōu)于滑窗法。
  由于采用子區(qū)域合并策略,所以可以包含各種大小的疑似物體框。
  合并區(qū)域相似的指標(biāo)多樣性,提高了檢測(cè)物體的概率。

參考
https://www.learnopencv.com/selective-search-for-object-detection-cpp-python/

RCNN (Region With CNN Feature)

rcnn

步驟

  1. 訓(xùn)練(或者下載)一個(gè)分類(lèi)模型(比如AlexNet)
  2. 對(duì)該模型做fine-tuning
  3. 特征提取
    3.1 提取圖像的所有候選框 selective search
    3.2 對(duì)于每一個(gè)區(qū)域:修正區(qū)域大小(剪裁和放縮) 以適合CNN的輸入,做一次前向運(yùn)算,將第五個(gè)池化層的輸出(就是對(duì)候選框提取到的特征)存到硬盤(pán)
  4. 使用二分類(lèi)判斷候選框內(nèi)物體的類(lèi)別
  5. 使用回歸器精細(xì)修正候選框位置:對(duì)于每一個(gè)類(lèi),訓(xùn)練一個(gè)線性回歸模型去判定這個(gè)框是否框得完美


    修正器

SPP Net - Spatial Pyramid Pooling 空間金字塔池化

  • ref: https://arxiv.org/pdf/1406.4729.pdf

  • 為什么需要SPP

    1. 卷積層對(duì)于輸入數(shù)據(jù)的大小并沒(méi)有要求,唯一對(duì)數(shù)據(jù)大小有要求的則是第一個(gè)全連接層
    2. 在R-CNN中,每個(gè)候選框先resize到統(tǒng)一大小,然后分別作為CNN的輸入,這樣是很低效的。
      所以SPP Net根據(jù)這個(gè)缺點(diǎn)做了優(yōu)化:只對(duì)原圖進(jìn)行一次卷積得到整張圖的feature map,然后找到每個(gè)候選框zaifeature map上的映射patch,將此patch作為每個(gè)候選框的卷積特征輸入到SPP layer和之后的層
  • SPP原理


    SPP原理

https://blog.csdn.net/yzf0011/article/details/75212513 詳解

  • SPP 效果
    1. 多窗口的pooling會(huì)提高實(shí)驗(yàn)的準(zhǔn)確率
    2. 輸入同一圖像的不同尺寸,會(huì)提高實(shí)驗(yàn)準(zhǔn)確率(從尺度空間來(lái)看,提高了尺度不變性(scale invariance))
    3. 用了多View(multi-view)來(lái)測(cè)試,也提高了測(cè)試結(jié)果
    4. 圖像輸入的尺寸對(duì)實(shí)驗(yàn)的結(jié)果是有影響的(因?yàn)槟繕?biāo)特征區(qū)域有大有有小)
    5. 因?yàn)槲覀兲娲氖蔷W(wǎng)絡(luò)的Poooling層,對(duì)整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)沒(méi)有影響,所以可以使得整個(gè)網(wǎng)絡(luò)可以正常訓(xùn)練。

Fast RCNN

Fast R-CNN就是在RCNN的基礎(chǔ)上采納了SPP Net方法,在inference過(guò)程中避免重復(fù)計(jì)算feature map。


Fast-RCNN

評(píng)價(jià)

  1. 共享卷積層,現(xiàn)在不是每一個(gè)候選框都當(dāng)做輸入進(jìn)入CNN了,而是輸入一張完整的圖片,在第五個(gè)卷積層再得到每個(gè)候選框的特征

Faster R-CNN

Fast RCNN的瓶頸在于選擇性搜索耗時(shí)。為此加入一個(gè)提取邊緣的神經(jīng)網(wǎng)絡(luò),也就說(shuō)找到候選框的工作也交給神經(jīng)網(wǎng)絡(luò)來(lái)做了。做這樣的任務(wù)的神經(jīng)網(wǎng)絡(luò)叫做Region Proposal Network(RPN)。


Region Proposal Network
  • 步驟

    1. 在feature map上滑動(dòng)窗口 (原文使用 33滑動(dòng)窗口,并使用11卷積網(wǎng)絡(luò)替代全連接層)
    2. 建一個(gè)神經(jīng)網(wǎng)絡(luò)用于物體分類(lèi)+框位置的回歸
      2.1 Anchors 每個(gè)位置最大的候選區(qū)域數(shù)量為k。
      2.2 回歸層有4k個(gè)輸出,(窗口一般使用四維向量(x,y,w,h)來(lái)表示)


      邊框回歸的參數(shù)

      image.png

      注意 只有當(dāng)Proposal和Ground Truth比較接近時(shí)(線性問(wèn)題),才能將其作為訓(xùn)練樣本訓(xùn)練我們的線性回歸模型,否則會(huì)導(dǎo)致訓(xùn)練的回歸模型不work(變成復(fù)雜的非線性問(wèn)題)
      2.3 分類(lèi)層有2k個(gè)輸出。 用于判定該proposal是前景還是背景。
      2.4 細(xì)節(jié):全部anchors拿去訓(xùn)練太多了,訓(xùn)練程序會(huì)在合適的anchors中隨機(jī)選取128個(gè)postive anchors+128個(gè)negative anchors進(jìn)行訓(xùn)練

    3. 滑動(dòng)窗口的位置提供了物體的大體位置信息
    4. 框的回歸提供更精確的位置
  • Proposal Layer

    1. 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]對(duì)所有的anchors做bbox regression回歸(這里的anchors生成和訓(xùn)練時(shí)完全一致)。
    2. 按照輸入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個(gè)anchors,即提取修正位置后的foreground anchors。
    3. 利用im_info將fg anchors從MxN尺度映射回PxQ原圖,判斷fg anchors是否大范圍超過(guò)邊界,剔除嚴(yán)重超出邊界fg anchors。
    4. 進(jìn)行nms(nonmaximum suppression,非極大值抑制)。
    5. 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結(jié)果作為proposal輸出。
  • ROI Pooling Layer

    1. 首先使用spatial_scale參數(shù)將proposal映射回(M/16)x(N/16)大小的feature maps尺度
    2. 將每個(gè)proposal水平和豎直都分為7份,對(duì)每一份都進(jìn)行max pooling處理
    3. 實(shí)現(xiàn)固定長(zhǎng)度輸出
Proposal
  • Faster RCNN訓(xùn)練
    步驟:

    1. 在已經(jīng)訓(xùn)練好的model上,訓(xùn)練RPN網(wǎng)絡(luò),對(duì)應(yīng)stage1_rpn_train.pt
    2. 利用步驟1中訓(xùn)練好的RPN網(wǎng)絡(luò),收集proposals,對(duì)應(yīng)rpn_test.pt
    3. 第一次訓(xùn)練Fast RCNN網(wǎng)絡(luò),對(duì)應(yīng)stage1_fast_rcnn_train.pt
    4. 第二訓(xùn)練RPN網(wǎng)絡(luò),對(duì)應(yīng)stage2_rpn_train.pt
    5. 再次利用步驟4中訓(xùn)練好的RPN網(wǎng)絡(luò),收集proposals,對(duì)應(yīng)rpn_test.pt
    6. 第二次訓(xùn)練Fast RCNN網(wǎng)絡(luò),對(duì)應(yīng)stage2_fast_rcnn_train.pt
    • 訓(xùn)練RPN網(wǎng)絡(luò)


      損失函數(shù)
      1. i表示anchors index,pi表示foreground softmax predict概率,pi代表對(duì)應(yīng)的GT predict概率(即當(dāng)?shù)趇個(gè)anchor與GT間 IoU>0.7,認(rèn)為是該 anchor是 foreground,pi=1;反之IoU<0.3時(shí),認(rèn)為是該anchor是background,pi*=0;至于那些0.3<IoU<0.7的anchor則不參與訓(xùn)練)
      2. bounding box regression網(wǎng)絡(luò)訓(xùn)練。注意在該loss中乘了pi*,相當(dāng)于只關(guān)心foreground anchors的回歸
      3. 早期實(shí)現(xiàn)中,cls項(xiàng)歸一化為mini-batch的大小,N_{cls}=256。reg項(xiàng)設(shè)為anchor位置的數(shù)量。這樣兩項(xiàng)差不多等權(quán)重。
      4. Smooth L1 loss 原因參見(jiàn):http://www.lxweimin.com/p/b37e454a986b
        S

        Smooth L1

Non-Maximum Suppression 非極大值抑制方法

  1. 非極大抑制算法應(yīng)用相當(dāng)廣泛,其主要目的是消除多余的框,找到最佳的物體檢測(cè)位置。
  2. 其實(shí)現(xiàn)的思想主要是將各個(gè)框的置信度進(jìn)行排序,然后選擇其中置信度最高的框A,將其作為標(biāo)準(zhǔn)選擇其他框,同時(shí)設(shè)置一個(gè)閾值,當(dāng)其他框B與A的重合程度超過(guò)閾值就將B舍棄掉,然后在剩余的框中選擇置信度最大的框,重復(fù)上述操作。
import numpy as np
def py_cpu_nms(dets, thresh):
    """Pure Python NMS baseline."""
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 計(jì)算出所有圖片的面積
    order = scores.argsort()[::-1] # 圖片評(píng)分按升序排序
 
    keep = [] # 用來(lái)存放最后保留的圖片的相應(yīng)評(píng)分
    while order.size > 0: 
        i = order[0] # i 是還未處理的圖片中的最大評(píng)分
        keep.append(i) # 保留改圖片的值
        # 矩陣操作,下面計(jì)算的是圖片i分別與其余圖片相交的矩形的坐標(biāo)
        xx1 = np.maximum(x1[i], x1[order[1:]]) 
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])
 
        # 計(jì)算出各個(gè)相交矩形的面積
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        # 計(jì)算重疊比例
        ovr = inter / (areas[i] + areas[order[1:]] - inter)
 
        #只保留比例小于闕值的圖片,然后繼續(xù)處理
        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1]
 
    return keep

Hard-Negative Mining 難分樣本挖掘

proposal中的正樣本的數(shù)量遠(yuǎn)遠(yuǎn)小于負(fù)樣本,這樣訓(xùn)練出來(lái)的分類(lèi)器的效果總是有限的,會(huì)出現(xiàn)許多 false negative, 即預(yù)測(cè)為負(fù)例的正樣本。
Fast RCNN中g(shù)round truth 的 IoU 在 [0.1, 0.5) 之間標(biāo)記為負(fù)例, 隨機(jī)選擇。而IOU為[0, 0.1) 的,理論上為easy example,容易分類(lèi)。如果分類(lèi)錯(cuò)誤即形成false positive example, 用于 hard negative mining。
實(shí)現(xiàn) 一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方式是在所有負(fù)例中隨機(jī)抽取N個(gè)樣本,然后根據(jù)樣本的預(yù)測(cè)概率排序,取其中P個(gè)樣本作為訓(xùn)練負(fù)樣本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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