[圖像算法]-一文看懂YOLO v3

論文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
論文:YOLOv3: An Incremental Improvement

YOLO系列的目標(biāo)檢測算法可以說是目標(biāo)檢測史上的宏篇巨作,接下來我們來詳細(xì)介紹一下YOLO v3算法內(nèi)容,v3的算法是在v1和v2的基礎(chǔ)上形成的,所以有必要先回憶: 一文看懂YOLO v1,一文看懂YOLO v2,目標(biāo)檢測map。

網(wǎng)絡(luò)結(jié)構(gòu)

這兒盜了張圖,這張圖很好的總結(jié)了YOLOV3的結(jié)構(gòu),讓我們對(duì)YOLO有更加直觀的理解。

在這里插入圖片描述

DBL:代碼中的Darknetconv2d_BN_Leaky,是yolo_v3的基本組件。就是卷積+BN+Leaky relu。
resn:n代表數(shù)字,有res1,res2, … ,res8等等,表示這個(gè)res_block里含有多少個(gè)res_unit。不懂resnet請(qǐng)戳這兒
concat:張量拼接。將darknet中間層和后面的某一層的上采樣進(jìn)行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會(huì)擴(kuò)充張量的維度,而add只是直接相加不會(huì)導(dǎo)致張量維度的改變。

后面我們一起分析網(wǎng)絡(luò)一些細(xì)節(jié)與難懂的地方

backbone:darknet-53

為了達(dá)到更好的分類效果,作者自己設(shè)計(jì)訓(xùn)練了darknet-53。作者在ImageNet上實(shí)驗(yàn)發(fā)現(xiàn)這個(gè)darknet-53,的確很強(qiáng),相對(duì)于ResNet-152和ResNet-101,darknet-53不僅在分類精度上差不多,計(jì)算速度還比ResNet-152和ResNet-101強(qiáng)多了,網(wǎng)絡(luò)層數(shù)也比他們少。


在這里插入圖片描述

Yolo_v3使用了darknet-53的前面的52層(沒有全連接層),yolo_v3這個(gè)網(wǎng)絡(luò)是一個(gè)全卷積網(wǎng)絡(luò),大量使用殘差的跳層連接,并且為了降低池化帶來的梯度負(fù)面效果,作者直接摒棄了POOLing,用conv的stride來實(shí)現(xiàn)降采樣。在這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)中,使用的是步長為2的卷積來進(jìn)行降采樣。

為了加強(qiáng)算法對(duì)小目標(biāo)檢測的精確度,YOLO v3中采用類似FPN的upsample和融合做法(最后融合了3個(gè)scale,其他兩個(gè)scale的大小分別是26×26和52×52),在多個(gè)scale的feature map上做檢測。

作者在3條預(yù)測支路采用的也是全卷積的結(jié)構(gòu),其中最后一個(gè)卷積層的卷積核個(gè)數(shù)是255,是針對(duì)COCO數(shù)據(jù)集的80類:3*(80+4+1)=255,3表示一個(gè)grid cell包含3個(gè)bounding box,4表示框的4個(gè)坐標(biāo)信息,1表示objectness score。

output

在這里插入圖片描述

所謂的多尺度就是來自這3條預(yù)測之路,y1,y2和y3的深度都是255,邊長的規(guī)律是13:26:52。yolo v3設(shè)定的是每個(gè)網(wǎng)格單元預(yù)測3個(gè)box,所以每個(gè)box需要有(x, y, w, h, confidence)五個(gè)基本參數(shù),然后還要有80個(gè)類別的概率。所以3×(5 + 80) = 255。這個(gè)255就是這么來的。

下面我們具體看看y1,y2,y3是如何而來的。
網(wǎng)絡(luò)中作者進(jìn)行了三次檢測,分別是在32倍降采樣,16倍降采樣,8倍降采樣時(shí)進(jìn)行檢測,這樣在多尺度的feature map上檢測跟SSD有點(diǎn)像。在網(wǎng)絡(luò)中使用up-sample(上采樣)的原因:網(wǎng)絡(luò)越深的特征表達(dá)效果越好,比如在進(jìn)行16倍降采樣檢測,如果直接使用第四次下采樣的特征來檢測,這樣就使用了淺層特征,這樣效果一般并不好。如果想使用32倍降采樣后的特征,但深層特征的大小太小,因此yolo_v3使用了步長為2的up-sample(上采樣),把32倍降采樣得到的feature map的大小提升一倍,也就成了16倍降采樣后的維度。同理8倍采樣也是對(duì)16倍降采樣的特征進(jìn)行步長為2的上采樣,這樣就可以使用深層特征進(jìn)行detection。

作者通過上采樣將深層特征提取,其維度是與將要融合的特征層維度相同的(channel不同)。如下圖所示,85層將13×13×256的特征上采樣得到26×26×256,再將其與61層的特征拼接起來得到26×26×768。為了得到channel255,還需要進(jìn)行一系列的3×3,1×1卷積操作,這樣既可以提高非線性程度增加泛化性能提高網(wǎng)絡(luò)精度,又能減少參數(shù)提高實(shí)時(shí)性。52×52×255的特征也是類似的過程。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

從圖中,我們可以看出y1,y2,y3的由來。

Bounding Box

YOLO v3的Bounding Box由YOLOV2又做出了更好的改進(jìn)。在yolo_v2和yolo_v3中,都采用了對(duì)圖像中的object采用k-means聚類。 feature map中的每一個(gè)cell都會(huì)預(yù)測3個(gè)邊界框(bounding box) ,每個(gè)bounding box都會(huì)預(yù)測三個(gè)東西:(1)每個(gè)框的位置(4個(gè)值,中心坐標(biāo)tx和ty,,框的高度bh和寬度bw),(2)一個(gè)objectness prediction ,(3)N個(gè)類別,coco數(shù)據(jù)集80類,voc20類。

三次檢測,每次對(duì)應(yīng)的感受野不同,32倍降采樣的感受野最大,適合檢測大的目標(biāo),所以在輸入為416×416時(shí),每個(gè)cell的三個(gè)anchor box為(116 ,90); (156 ,198); (373 ,326)。16倍適合一般大小的物體,anchor box為(30,61); (62,45); (59,119)。8倍的感受野最小,適合檢測小目標(biāo),因此anchor box為(10,13); (16,30); (33,23)。所以當(dāng)輸入為416×416時(shí),實(shí)際總共有(52×52+26×26+13×13)×3=10647個(gè)proposal box。


在這里插入圖片描述

感受一下9種先驗(yàn)框的尺寸,下圖中藍(lán)色框?yàn)榫垲惖玫降南闰?yàn)框。黃色框式ground truth,紅框是對(duì)象中心點(diǎn)所在的網(wǎng)格。


在這里插入圖片描述

這里注意bounding box 與anchor box的區(qū)別:
Bounding box它輸出的是框的位置(中心坐標(biāo)與寬高),confidence以及N個(gè)類別。
anchor box只是一個(gè)尺度即只有寬高。

LOSS Function

YOLOv3重要改變之一:No more softmaxing the classes。
YOLO v3現(xiàn)在對(duì)圖像中檢測到的對(duì)象執(zhí)行多標(biāo)簽分類。

logistic回歸用于對(duì)anchor包圍的部分進(jìn)行一個(gè)目標(biāo)性評(píng)分(objectness score),即這塊位置是目標(biāo)的可能性有多大。這一步是在predict之前進(jìn)行的,可以去掉不必要anchor,可以減少計(jì)算量。

如果模板框不是最佳的即使它超過我們?cè)O(shè)定的閾值,我們還是不會(huì)對(duì)它進(jìn)行predict。
不同于faster R-CNN的是,yolo_v3只會(huì)對(duì)1個(gè)prior進(jìn)行操作,也就是那個(gè)最佳prior。而logistic回歸就是用來從9個(gè)anchor priors中找到objectness score(目標(biāo)存在可能性得分)最高的那一個(gè)。logistic回歸就是用曲線對(duì)prior相對(duì)于 objectness score映射關(guān)系的線性建模。

    lxy, lwh, lcls, lconf = ft([0]), ft([0]), ft([0]), ft([0])
    txy, twh, tcls, indices = build_targets(model, targets)#在13 26 52維度中找到大于iou閾值最適合的anchor box 作為targets
    #txy[維度(0:2),(x,y)] twh[維度(0:2),(w,h)] indices=[0,anchor索引,gi,gj]

    # Define criteria
    MSE = nn.MSELoss()
    CE = nn.CrossEntropyLoss()
    BCE = nn.BCEWithLogitsLoss()

    # Compute losses
    h = model.hyp  # hyperparameters
    bs = p[0].shape[0]  # batch size
    k = h['k'] * bs  # loss gain
    for i, pi0 in enumerate(p):  # layer i predictions, i
        b, a, gj, gi = indices[i]  # image, anchor, gridx, gridy
        tconf = torch.zeros_like(pi0[..., 0])  # conf

        # Compute losses
        if len(b):  # number of targets
            pi = pi0[b, a, gj, gi]  # predictions closest to anchors 找到p中與targets對(duì)應(yīng)的數(shù)據(jù)lxy
            tconf[b, a, gj, gi] = 1  # conf
            # pi[..., 2:4] = torch.sigmoid(pi[..., 2:4])  # wh power loss (uncomment)

            lxy += (k * h['xy']) * MSE(torch.sigmoid(pi[..., 0:2]),txy[i])  # xy loss
            lwh += (k * h['wh']) * MSE(pi[..., 2:4], twh[i])  # wh yolo loss
            lcls += (k * h['cls']) * CE(pi[..., 5:], tcls[i])  # class_conf loss

        # pos_weight = ft([gp[i] / min(gp) * 4.])
        # BCE = nn.BCEWithLogitsLoss(pos_weight=pos_weight)
        lconf += (k * h['conf']) * BCE(pi0[..., 4], tconf)  # obj_conf loss
    loss = lxy + lwh + lconf + lcls

以上是一段pytorch框架描述的yolo v3 的loss_function代碼。忽略恒定系數(shù)不看,以下我想著重說幾點(diǎn):

  • 首先,yolov3要先build target,因?yàn)槲覀冎勒龢颖臼莑abel與anchor box iou大于0.5的組成,所以我們根據(jù)label找到對(duì)應(yīng)的anchor box。如何找?label中存放著[image,class,x(歸一化),y,w(歸一化),h],我們可以用這些坐標(biāo)在對(duì)應(yīng)13×13 Or 26×26 or 52×52的map中分別于9個(gè)anchor算出iou,找到符合要求的,把索引與位置記錄好。用記錄好的索引位置找到predict的anchor box。
  • xywh是由均方差來計(jì)算loss的,其中預(yù)測的xy進(jìn)行sigmoid來與lable xy求差,label xy是grid cell中心點(diǎn)坐標(biāo),其值在0-1之間,所以predict出的xy要sigmoid。
  • 分類用的多類別交叉熵,置信度用的二分類交叉熵。只有正樣本才參與class,xywh的loss計(jì)算,負(fù)樣本只參與置信度loss。

參考文章:
https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b
https://blog.csdn.net/yanzi6969/article/details/80505421
https://blog.csdn.net/chandanyan8568/article/details/81089083
https://blog.csdn.net/leviopku/article/details/82660381
https://blog.csdn.net/u014380165/article/details/80202337

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容