<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          保姆級教程:圖解目標檢測算法YOLOv1

          共 18789字,需瀏覽 38分鐘

           ·

          2021-07-14 09:44

          ↑ 點擊藍字 關注極市平臺

          作者丨Jack-Cui
          來源丨JackCui-AI
          編輯丨極市平臺

          極市導讀

           

          本文詳細的介紹了目標檢測算法YOLOv1的結(jié)構。 >>加入極市CV技術交流群,走在計算機視覺的最前沿

          大家好,我是 Jack。

          承諾的圖解 AI 算法系列教程,今天咱們繼續(xù)

          這個系列一直寫的比較隨性,想寫哪個算法就寫了哪個,毫無章法。

          保姆級教程:硬核圖解Transformer

          https://zhuanlan.zhihu.com/p/347904940

          嘿,來聚個類!

          https://zhuanlan.zhihu.com/p/367434418

          好在,文章質(zhì)量都還不錯,雖然硬核了點,但從各方面的反饋來看,還是有不少朋友喜歡看的。

          今天,聊一聊人工智能,計算機視覺方向的重頭戲

          我們都知道,CV 領域最常規(guī)的三大任務是:圖像分類、目標檢測、圖像分割。

          圖像的分類和分割算法實戰(zhàn)教程,我在2019年就出過了,想看可以往前翻一翻。

          目前,就差目標檢測還沒寫過,雖遲但到,今天它來了

          目標檢測

          目標檢測,應用非常廣,是非常重要的技術儲備。

          目標檢測落地場景豐富,可用度非常高,人臉識別、智能安防系統(tǒng)、無人駕駛、無人機等各個領域,目標檢測都是核心技術。

          舉個例子,無人機領域,畫面中的車輛、行人等目標的檢測。

          軍事上,目標的精準打擊,也都有目標檢測的身影。

          生活上,我們也可以利用檢測做很多事情,隨手一拍。

          目標檢測檢測出物體,車輛、樹木,可能有些人會問,這個檢測出來有啥用?

          那要是在此基礎上,再識別出這些是什么車、什么樹?

          寶馬,奧迪,還是比亞迪?

          楊樹,柳樹,還是白楊樹?

          再比如,什么品種的貓貓狗狗,什么品牌的衣帽鞋襪。

          萬物皆可識別,只需隨手一拍。這就是很多做視覺的公司,都在做的重點方向

          這也是,目標檢測+細分類的技術應用的場景之一。先檢測出畫面中的目標,再將檢測出的目標送入更細粒度的分類網(wǎng)絡,識別出堪比人,甚至遠超人的精細水平。

          目標檢測,專業(yè)一點的概念就是:解決“在哪里?是什么?”的問題,即定位出這個目標的位置并且知道目標物是什么。

          基于深度學習的目標檢測算法主要分為兩類:

          • Two Stage:兩階段目標檢測
          • One Stage:端到端目標檢測

          Two Stage

          Two Stage 是2013年到2015年的主流算法,后來逐漸發(fā)展為 One Stage 端到端的目標檢測算法。

          Two Stage 算法是先進行區(qū)域生成,該區(qū)域稱之為 region proposal(簡稱RP,一個有可能包含待檢物體的預選框),再通過卷積神經(jīng)網(wǎng)絡進行樣本分類。

          任務流程:特征提取 --> 生成RP --> 分類/定位回歸。

          常見 Two Stage 目標檢測算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN 和 R-FCN 等。

          One Stage

          不用 RP,直接在網(wǎng)絡中提取特征來預測物體分類和位置。

          任務流程:特征提取–> 分類/定位回歸。

          常見的 One Stage 目標檢測算法有:YOLO 系列、SSD 系列、Anchor Free 系列等。

          如今,比較常用、實用的目標檢測算法都是 One Stage 的。

          從前,一般講解目標檢測都是從兩階段的 R-CNN 系列開始,但說實話,有些老了,一階段的 YOLO 從 v1 都發(fā)展到 v5 了。

          但并不代表 Faster R-CNN 這些就沒有學的必要,目標檢測的基礎,還是很有必要學習一番的,并且不少公司其實還在用這些算法。

          現(xiàn)在,一般公司面試,都愛問 YOLO 系列的算法,YOLO v4、YOLO v5 這些。

          今天,先來個比較基礎的,我們從 YOLO v1 談起。

          YOLO v1

          YOLO 的名字還是很霸氣的:You Only Look Once

          YOLO 之父是 Joseph Redmon,v1 - v3 是他的作品,篇篇頂會,性能也是,開源口碑非常好。

          可惜,發(fā)布完 v3 就退圈了,后續(xù)的 v4 - v5 ,都是其他團隊接手了。

          在講解 YOLO v1 之前,重申一下我們的任務:在一張圖片中找出物體,并給出它的類別和位置。

          YOLO v1 的核心思想是:采用利用整張圖作為網(wǎng)絡的輸入,直接在輸出層回歸 bounding box 的位置和 bounding box 所屬的類別。

          為了照顧新人,這里解釋下 bounding box ,即檢測框,就是目標外圍帶顏色的框框,一般簡稱 bbox。

          YOLO v1 的實現(xiàn),是將一幅圖像分成 SxS 個網(wǎng)格(grid cell)。

          哪個目標物體的中心落在這個網(wǎng)格中,則這個網(wǎng)格負責預測這個目標。

          論文中,是將圖像分為 7x7 的網(wǎng)格,即上文中的 S=7。如上圖所示,紅色的點,就是負責檢測狗的。

          網(wǎng)絡結(jié)構

          YOLO v1目標檢測一共三個步驟:

          • resize圖片尺寸
          • 輸入網(wǎng)絡,出結(jié)果
          • NMS

          第一步,resize 很好理解,屬于深度學習的常規(guī)操作,就是為了將不同尺寸的圖片適配到統(tǒng)一的網(wǎng)絡結(jié)構中,需要 resize 到相同的尺寸。

          論文提出的這個網(wǎng)絡結(jié)構,輸入層的尺寸是 448x448,因此在將圖片送入網(wǎng)絡前,需要將圖片 resize 到 448x448。

          我們直接看下網(wǎng)絡結(jié)構,精髓都在這里:

          這里設計得很巧妙,可以看到網(wǎng)絡的最終輸出是 7×7×30。還是以這個狗為例,7x7 很好理解,圖像分為 7x7 個區(qū)域進行預測。

          最終輸出 tensor 的前五個數(shù)值,分別是 bbox 的 x,y,w,h,c,即 bbox 的中心坐標 x,y,bbox 的寬高 w,h,bbox 的置信度。

          置信度就是算法的自信心得分,越高表示越堅信這個檢測的目標沒錯。

          而一個中心點,會檢測 2 個 bbox ,這個操作可以減少漏檢,因為可以適應不同形狀的 bbox,進而提高bbox 的準確率。

          2 個 bbox 都會保留,最后通過 NMS 選擇出最佳的 bbox,這個操作最后再講。

          而后面的 20 個,就是類別的概率,YOLO v1 是在 VOC 數(shù)據(jù)集上訓練的,因此一共 20 個類。

          因此,tensor 總共加起來就是 7×7×(2×5+20),寫成公式就是:SxSx(Bx5+C)。

          這里的問題,可以當作回歸問題來解決的。所有的輸出包括坐標和寬高都定義在0到1之間。

          來看一下每個單元格預測的B個(x,y,w,h,confidence)的向量和C的條件概率中,每個參數(shù)的含義(假設圖片寬為 高為 ,將圖片分為

          (x,y)是bbox的中心相對于單元格的offset

          對于下圖中藍色框的那個單元格坐標為 ,假設它預測的輸出是紅色框的bbox,設bbox的中心坐標為 ,那么最終預測出來的 是經(jīng)過歸一化處理的,表示的是中心相對于單元格的offset,計算公式如下:

          (w,h)是bbox相對于整個圖片的比例

          預測的 bbox 的寬高為 表示的是 bbox 的是相對于整張圖片的占比,計算公式如下:

          confidence

          這個置信度是由兩部分組成,一是格子內(nèi)是否有目標,二是bbox的準確度。定義置信度為 Object

          這里,如果格子內(nèi)有物體,則 Object ,此時置信度等于IoU。如果格子內(nèi)沒有物體,則 Object ,此時置信度為0。

          C類的條件概率

          條件概率定義為 Class Object ,表示該單元格存在物體且屬于第 i 類的概率。

          在測試的時候每個單元格預測最終輸出的概率定義為:

          NMS

          經(jīng)過網(wǎng)絡處理后,將 的結(jié)果送入 NMS ,最后即可得到最終的輸出框結(jié)果。

          NMS,即非極大值抑制,就是將一些冗余框去掉,示意圖如下:

          NMS 別看簡單,面試常考題,比如動手實現(xiàn)一個 NMS 代碼之類的。

          這個概念千萬不要懵懵懂懂,細節(jié)決定成敗。省著被嘲諷:NMS都不會,做什么Detection

          學 NMS ,先要理解 IOU。

          IOU 即Intersection over Union,也就是兩個box區(qū)域的交集比上并集,下面的示意圖就很好理解,用于確定兩個框的位置像素距離。

          • 首先計算兩個box左上角點坐標的最大值和右下角坐標的最小值
          • 然后計算交集面積
          • 最后把交集面積除以對應的并集面積

          就這簡單,NMS 就是通過計算 IOU 來去除冗余框的,具體的實現(xiàn)思路如下。

          以下圖為例,進行說明:

          就像上面的圖片一樣,定位一個車輛,最后算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。

          非極大值抑制的方法是:先假設有6個矩形框,根據(jù)分類器的類別分類概率做排序,假設從小到大屬于車輛的概率 分別為A、B、C、D、E、F。

          (1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大于某個設定的閾值;

          (2)假設B、D與F的重疊度超過閾值,那么就扔掉B、D;并標記第一個矩形框F,是我們保留下來的。

          (3)從剩下的矩形框A、C、E中,選擇概率最大的E,然后判斷E與A、C的重疊度,重疊度大于一定的閾值,那么就扔掉;并標記E是我們保留下來的第二個矩形框。

          就這樣一直重復,找到所有被保留下來的矩形框。

          代碼實現(xiàn):

          # --------------------------------------------------------# Fast R-CNN# Copyright (c) 2015 Microsoft# Licensed under The MIT License [see LICENSE for details]# Written by Ross Girshick# --------------------------------------------------------
          import numpy as np
          def py_cpu_nms(dets, thresh): """Pure Python NMS baseline.""" #x1、y1、x2、y2、以及score賦值 x1 = dets[:, 0] # pred bbox top_x y1 = dets[:, 1] # pred bbox top_y x2 = dets[:, 2] # pred bbox bottom_x y2 = dets[:, 3] # pred bbox bottom_y scores = dets[:, 4] # pred bbox cls score #每一個檢測框的面積 areas = (x2 - x1 + 1) * (y2 - y1 + 1) # pred bbox areas order = scores.argsort()[::-1] # 對pred bbox按score做降序排序,對應step-2 #保留的結(jié)果框集合 keep = [] while order.size > 0: i = order[0] # top-1 score bbox keep.append(i) #保留該類剩余box中得分最高的一個 #得到相交區(qū)域,左上及右下 xx1 = np.maximum(x1[i], x1[order[1:]]) # top-1 bbox(score最大)與order中剩余bbox計算NMS yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) #計算相交的面積,不重疊時面積為0 w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h #計算IoU:重疊面積 /(面積1+面積2-重疊面積) ovr = inter / (areas[i] + areas[order[1:]] - inter) #保留IoU小于閾值的box inds = np.where(ovr <= thresh)[0] # 這個操作可以對代碼斷點調(diào)試理解下,結(jié)合step-3,我們希望剔除所有與當前top-1 bbox IoU > thresh的冗余bbox,那么保留下來的bbox,自然就是ovr <= thresh的非冗余bbox,其inds保留下來,作進一步篩選 #因為ovr數(shù)組的長度比order數(shù)組少一個,所以這里要將所有下標后移一位 order = order[inds + 1] # 保留有效bbox,就是這輪NMS未被抑制掉的幸運兒,為什么 + 1?因為ind = 0就是這輪NMS的top-1,剩余有效bbox在IoU計算中與top-1做的計算,inds對應回原數(shù)組,自然要做 +1 的映射,接下來就是step-4的循環(huán)
          return keep # 最終NMS結(jié)果返回
          if __name__ == '__main__': dets = np.array([[100,120,170,200,0.98], [20,40,80,90,0.99], [20,38,82,88,0.96], [200,380,282,488,0.9], [19,38,75,91, 0.8]])
          py_cpu_nms(dets, 0.5)

          LOSS

          從圖片 resize 到網(wǎng)絡結(jié)構,再到 NMS 都講完了,最后再說下算法的重中之重,損失函數(shù)。

          損失函數(shù)是一個復合損失函數(shù),一共是 5 項相加:

          更詳細的注釋,可以看這張圖:

          簡單解釋下:

          所有的損失都是使用平方和誤差公式,暫時先不看公式中的 ,輸出的預測數(shù)值以及所造成的損失有:

          1. 預測框的中心點 。造成的損失是圖五中的第一行。其中 為控制函數(shù),在標簽中包含物體的那些格點處,該值為 1 ;若格點不含有物體,該值為 0。也就是只對那些有真實物體所屬的格點進行損失計算,若該格點不包含物體,那么預測數(shù)值不對損失函數(shù)造成影響。 數(shù)值與標簽用簡單的平方和誤差。
          2. 預測框的寬高 。造成的損失是圖五的第二行。 的含義一樣,也是使得只有真實物體所屬的格點才會造成損失。這里對 在損失函數(shù)中的處理分別取了根號,原因在于,如果不取根號,損失函數(shù)往往更傾向于調(diào)整尺寸比較大的預測框。例如,20 個像素點的偏差,對于 800x600 的預測框幾乎沒有影響,此時的IOU數(shù)值還是很大,但是對于 30x40 的預測框影響就很大。取根號是為了盡可能的消除大尺寸框與小尺寸框之間的差異。
          3. 第三行與第四行,都是預測框的置信度C。當該格點不含有物體時,即 =1, 該置信度的標簽為0;若含有物體時,該置信度的標簽為預測框與真實物體框的IOU數(shù)值(IOU計算公式為:兩個框交集的面積除以并集的面積)。
          4. 第五行為物體類別概率P,對應的類別位置,該標簽數(shù)值為1,其余位置為0,與分類網(wǎng)絡相同。

          此時再來看 ,YOLO 面臨的物體檢測問題,是一個典型的類別數(shù)目不均衡的問題。其中 49 個格點,含有物體的格點往往只有 3、4 個,其余全是不含有物體的格點。此時如果不采取點措施,那么物體檢測的mAP不會太高,因為模型更傾向于不含有物體的格點。 的作用,就是讓含有物體的格點,在損失函數(shù)中的權重更大,讓模型更加“重視”含有物體的格點所造成的損失。在論文中, 的取值分別為 5 與 0.5 。

          最后

          YOLO v1 的代碼實現(xiàn),有很多,Pytorch 和 Tensorflow 等各種版本都有,因為畢竟屬于出名算法。

          Github 一搜,找個 Star 高的即可。


          本文亮點總結(jié)


          1.YOLO v1 的核心思想是:采用利用整張圖作為網(wǎng)絡的輸入,直接在輸出層回歸 bounding box 的位置和 bounding box 所屬的類別。

          2.YOLO v1目標檢測一共三個步驟:resize圖片尺寸;輸入網(wǎng)絡,出結(jié)果;NMS。

          如果覺得有用,就請分享到朋友圈吧!

          △點擊卡片關注極市平臺,獲取最新CV干貨

          公眾號后臺回復“調(diào)研報告”獲取《2020年度中國計算機視覺人才調(diào)研報告》


          極市干貨
          YOLO教程:一文讀懂YOLO V5 與 YOLO V4大盤點|YOLO 系目標檢測算法總覽全面解析YOLO V4網(wǎng)絡結(jié)構
          實操教程:PyTorch vs LibTorch:網(wǎng)絡推理速度誰更快?只用兩行代碼,我讓Transformer推理加速了50倍PyTorch AutoGrad C++層實現(xiàn)
          算法技巧(trick):深度學習訓練tricks總結(jié)(有實驗支撐)深度強化學習調(diào)參Tricks合集長尾識別中的Tricks匯總(AAAI2021
          最新CV競賽:2021 高通人工智能應用創(chuàng)新大賽CVPR 2021 | Short-video Face Parsing Challenge3D人體目標檢測與行為分析競賽開賽,獎池7萬+,數(shù)據(jù)集達16671張!

          CV技術社群邀請函 #

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart2)

          備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)


          即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群


          每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~



          覺得有用麻煩給個在看啦~  
          瀏覽 82
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产XXXX少 | 黄色免费啪啪 | 天堂在线 | www.欧美三级片 | 啪一啪操一操 |