• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 基于keras的Yolov3最全詳解

    標簽: 目標檢測

    參考Github源碼鏈接
    Yolov3論文原文鏈接一,0二
    Yolov3官網

    最近在做Yolov3相關項目,看了很多資料。所以寫一篇總結體會,以便以后回顧查詢。

    在這里插入圖片描述
    YOLO,即 You Only Look Once 的縮寫,是一個基于卷積神經網絡(CNN)的目標檢測算法 。

    yolo設計理念

    yolo算法整體來說是采用CNN對目標進行end-to-end的檢測。流程如圖所示
    在這里插入圖片描述
    具體來說(基于YOLOV3)

    1. 輸入一張任意大小圖片,保持長寬比不變的情況下,縮放至 w 或 h達到416,再覆蓋在416 * 416的新圖上,作為網絡的輸入。即網絡的輸入是一張416 * 416,3通道的RGB圖。
    2. 運行網絡。YOLO的CNN網絡把圖片分成 S * S 個網格(yolov3多尺度預測,輸出3層,每層 S * S個網格,分別為13 * 13 ,26 * 26 ,52 * 52),然后每個單元格負責去檢測那些中心點落在該格子內的目標,如圖二所示。 每個單元格需要預測3*(4+1+B)個值。如果將輸入圖片劃分為 SS 網格,那么每層最終預測值為 SS3(4+1+B) 大小的張量。類別數(coco集為80類),即B=80. 3 為每層anchorbox數量,4 為邊界框大小和位置(x , y , w ,h )1 為置信度。
    3. 通過NMS,非極大值抑制,篩選出框boxes,輸出框class_boxes和置信度class_box_scores,再生成類別信息classes,生成最終的檢測數據框,并返回

    Yolov3網絡結構圖

    在這里插入圖片描述

    下面講一下訓練樣本的設置和loss的計算。

    在這里插入圖片描述

    訓練樣本設置

    參考上面圖2,對于一個輸入圖像,比如4164163,相應的會輸出 13133 + 26263 + 52523 = 10647 個預測框。我們希望這些預測框的信息能夠盡量準確的反應出哪些位置存在對象,是哪種對象,其邊框位置在哪里。

    在設置標簽y(10647個預測框 * (4+1+類別數) 張量)的時候,YOLO的設計思路是,對于輸入圖像中的每個對象,該對象實際邊框(groud truth)的中心落在哪個網格,就由該網格負責預測該對象。不過,由于設計了3種不同大小的尺度,每個網格又有3個先驗框,所以對于一個對象中心點,可以對應9個先驗框。但最終只選擇與實際邊框IOU最大的那個先驗框負責預測該對象(該先驗框的置信度=1),所有其它先驗框都不負責預測該對象(置信度=0)。同時,該先驗框所在的輸出向量中,邊框位置設置為對象實際邊框,以及該對象類型設置為1。

    loss計算

    loss主要有3個部分,置信度、邊框位置、對象類型。

    首先需要注意的還是置信度的問題。上面說到對于一個實際對象,除了與它IOU最大的那個先驗框其置信度設為1,其它先驗框的置信度都是0。但是,還有一些先驗框與該對象實際邊框位置是比較接近的,它們依然有可能檢測到該對象,只不過并非最接近實際邊框。所以,這部分邊框的目標置信度不應該期望輸出0。但YOLO也不希望它們輸出1。所以,在計算loss的時候,就設置一個IOU閾值,超過閾值的(接近目標邊框但又不是IOU最大的)那些邊框不計入loss。低于閾值的那些邊框就要求置信度為0,也就是檢測到背景。

    同時,對于檢測到對象的邊框,要計算其邊框位置的loss,以及對象類型的loss。對于那些檢測到背景的邊框,就只計算其置信度loss了,它的邊框位置和對象類型都沒有意義。

    另外注意一下的是邊框位置計算要根據論文的設計做一些變換,參考下面圖。
    在這里插入圖片描述

    anchor box:

    yolov3 anchor box一共有9個,由k-means聚類得到。在COCO數據集上,9個聚類是:(10 * 13);(16 * 30);(33 * 23);(30 * 61);(62 * 45); (59 * 119); (116 * 90); (156 * 198); (373 * 326)。

    不同尺寸特征圖對應不同大小的先驗框。

    13 * 13feature map對應【(116 * 90),(156 * 198),(373 * 326)】
    26 * 26feature map對應【(30 * 61),(62 * 45),(59 * 119)】
    52 * 52feature map對應【(10 * 13),(16 * 30),(33 * 23)】

    原因:

    • 特征圖越大,感受野越小。對小目標越敏感,所以選用小的anchor box。
    • 特征圖越小,感受野越大。對大目標越敏感,所以選用大的anchor box。

    邊框預測:

    預測tx ty tw th

    對tx和ty進行sigmoid,并加上對應的offset(下圖Cx, Cy)
    對th和tw進行exp,并乘以對應的錨點值
    對tx,ty,th,tw乘以對應的步幅,即:416/13, 416 ? 26, 416 ? 52
    最后,使用sigmoid對Objectness和Classes confidence進行sigmoid得到0~1的概率,之所以用sigmoid取代之前版本的softmax,原因是softmax會擴大最大類別概率值而抑制其他類別概率值
    在這里插入圖片描述

    (tx,ty) :目標中心點相對于該點所在網格左上角的偏移量,經過sigmoid歸一化。即值屬于【0,1】。如圖約(0.3 , 0.4)

    (cx,cy):該點所在網格的左上角距離最左上角相差的格子數。如圖(1,1)

    (pw,ph):anchor box 的邊長

    (tw,th):預測邊框的寬和高

    PS:最終得到的邊框坐標值是bx,by,bw,bh.而網絡學習目標是tx,ty,tw,th

    Loss

    YOLOv3中有一個參數是ignore_thresh,在ultralytics版版的YOLOv3中對應的是train.py文件中的iou_t參數(默認為0.225)。
    正負樣本是按照以下規則決定的:

    • 如果一個預測框與所有的Ground Truth的最大IoU<ignore_thresh時,那這個預測框就是負樣本。
    • 如果Ground Truth的中心點落在一個區域中,該區域就負責檢測該物體。將與該物體有最大IoU的預測框作為正樣本(注意這里沒有用到ignore thresh,即使該最大IoU<ignore thresh也不會影響該預測框為正樣本)

    在YOLOv3中,Loss分為三個部分:

    • 一個是xywh部分帶來的誤差,也就是bbox帶來的loss ,在ultralytics版版的YOLOv3中,使用的是GIOU
    • 一個是置信度帶來的誤差,也就是obj帶來的loss。lobj代表置信度,即該bounding box中是否含有物體的概率。在yolov3代碼中obj loss可以通過arc來指定,有兩種模式:

    如果采用default模式,使用BCEWithLogitsLoss,將obj loss和cls loss分開計算:

    BCEobj = nn.BCEWithLogitsLoss(pos_weight=ft([h['obj_pw']]), reduction=red)
    if 'default' in arc:  # separate obj and cls
        lobj += BCEobj(pi[..., 4], tobj)  # obj loss
        # pi[...,4]對應的是該框中含有目標的置信度,和giou計算BCE
        # 相當于將obj loss和cls loss分開計算
    

    如果采用BCE模式,使用的也是BCEWithLogitsLoss, 計算對象是所有的cls loss:

    BCE = nn.BCEWithLogitsLoss(reduction=red)
    elif 'BCE' in arc:  # unified BCE (80 classes)
        t = torch.zeros_like(pi[..., 5:])  # targets
        if nb:
            t[b, a, gj, gi, tcls[i]] = 1.0 # 對應正樣本class置信度設置為1
            lobj += BCE(pi[..., 5:], t)#pi[...,5:]對應的是所有的class
    
    • 最后一個是類別帶來的誤差,也就是class帶來的loss。如果是單類的情況,cls loss=0,如果是多類的情況,也分兩個模式:

    如果采用default模式,使用的是BCEWithLogitsLoss計算class loss。

    BCEcls = nn.BCEWithLogitsLoss(pos_weight=ft([h['cls_pw']]), reduction=red)
    # cls loss 只計算多類之間的loss,單類不進行計算
    if 'default' in arc and model.nc > 1:
        t = torch.zeros_like(ps[:, 5:])  # targets
        t[range(nb), tcls[i]] = 1.0 # 設置對應class為1
        lcls += BCEcls(ps[:, 5:], t)  # 使用BCE計算分類loss
    

    如果采用CE模式,使用的是CrossEntropy同時計算obj loss和cls loss。

    CE = nn.CrossEntropyLoss(reduction=red)
    elif 'CE' in arc:  # unified CE (1 background + 80 classes)
        t = torch.zeros_like(pi[..., 0], dtype=torch.long)  # targets
        if nb:
        t[b, a, gj, gi] = tcls[i] + 1 # 由于cls是從零開始計數的,所以+1
        lcls += CE(pi[..., 4:].view(-1, model.nc + 1), t.view(-1))
        # 這里將obj loss和cls loss一起計算,使用CrossEntropy Loss
    

    三部分總結下來就是下圖:
    在這里插入圖片描述

    版權聲明:本文為qq_37099552原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_37099552/article/details/105745286

    智能推薦

    yolov3的yolo層源碼詳解

    概述 yolo系列由于使用了純c語言寫,又是開源代碼,所以自然成為了邊緣計算的公司首選的架構。 它的重要性和影響力就不再贅述,本文主要從源碼的角度,來帶你深入理解yolo解析的思路,同時,在閱讀源碼的過程中也由衷感慨yolo作者代碼的優美,整個代碼沒有依賴過多第三方庫,只需要opencv用作效果顯示,整個源碼的大小只有不到1M(901K),卻集成了CPU和GPU版本,可以說是非常強悍了。 準備知識...

    基于yolov3的紅綠燈識別

    知乎原文。 You only look once (YOLO) is a state-of-the-art, real-time object detection system. On a Pascal Titan X it processes images at 30 FPS and has a mAP of 57.9% on COCO test-dev. Yolo使用c和cuda實現,體積小,...

    YOLOv3的應用

    2.0 前言         本文是YOLOv3系列第2篇,記錄YOLOv3的幾種應用方法。         YOLOv3系列第1篇:win10下YOLOv3下載與編譯        &nb...

    YOLOV3(yolov3)訓練自己的數據

    前言:做目標檢測,選擇的算法是yolo v3,因為它既有速度又有精度,還非常靈活,簡直是工業界良心。做項目免不了需要用到自己的數據集,所以得從頭一個腳印的來,走通了之后決定寫一個帖子,讓需要用的人少走歪路,節約時間。 官網上已經教我們如何跑起來yolo v3,因此大部分時間其實花在制作數據集上。總體來說,分為四個步驟,分別是:標注數據,利用voc制作自己的數據集,下載并編譯源碼,局部修改和大功告成...

    yolov3系列(二)-keras-yolo3訓練自己的數據

    標注數據 1. 使用的標注工具是labelimg 鏈接:https://pan.baidu.com/s/1SO4NqNSfXyKMNCGQA-4LVQ 提取碼:ydqi 標注數據 open dir 選擇需要標注的數據目錄,change save dir 選擇要保存的目錄,use default label 勾選,填寫一個標簽名稱,create Rectbox 標注數據,保存即可,如下圖 數據標注完...

    猜你喜歡

    神奇的Batch Normalization 如果一個模型僅訓練BN層會是什么樣的

    您可能會感到驚訝,但這是有效的。 ? 最近,我閱讀了arXiv平臺上的Jonathan Frankle,David J. Schwab和Ari S. Morcos撰寫的論文“Training BatchNorm and Only BatchNorm: On the Expressive Power of Random Features in CNNs”。 這個主意立刻引起了...

    用Python實現校園通知更新提醒

    前言 這個項目實已經在一個月前已經完成了,一直都想寫一篇博客來總結這個過程中遇到的一些問題。但最近一個月來都比較忙,所以一直拖到了現在。 首先說說起因吧,我沒事的時候,總喜歡依次點開學校主頁、教務處、圖書館以及學院的網站,看看有沒有什么新通知,雖然大多與我無關。恰逢最近正在學Python,經常聽到別人說用Python寫爬蟲很簡單,但自己尚未接觸過爬蟲。于是抱著試一試的心態看了幾篇關于Python爬...

    spring_ioc相關_第一章

    1 spring是一站式框架,在javaee的三層結構中,每一層都提供不提并的解決技術 web層:springMVC service層:spring的ioc dao層:spring的jdbcTemplate 2 javaee為避免兩個類之間出現耦合,則把對象的創建交給spring進行管理,spring的ioc操作:(1)ioc的配置文件方式;(2)ioc注解方式 3 ioc的底層原理使用技術(1)...

    【Python+OpenCV】視頻流局部區域像素值處理-一種特征提取方法

    參考我之前寫的處理圖片的文章:Python+OpenCV實現【圖片】局部區域像素值處理(改進版) 開發環境:Python3.6.0 + OpenCV3.2.0 任務目標:攝像頭采集圖像(例如:480*640),并對視頻流每一幀(灰度圖)特定矩形區域(480*30)像素值進行行求和,得到一個480*1的數組,用這480個數據繪制條形圖,即在逐幀采集視頻流并處理后“實時”顯示采...

    JavaWeb——【前端】——注冊頁面

    頁面效果 實現代碼 注意事項 主要使用的bootstrap樣式 如果想引用,不要直接復制,沒用的。 先介紹下所引用的文件: boostrap的js、bootstrap的css、jquery的js、以及自己編寫的register.css。 因為博主用的thymeleaf語法,所以有th符號。 若要使用時,根據個人情況導入相應的依賴。...

    精品国产乱码久久久久久蜜桃不卡