Darknet——一個(gè)源碼為C的神經(jīng)網(wǎng)絡(luò)框架
今天路同學(xué)介紹一個(gè)相對小眾的深度學(xué)習(xí)框架——Darknet。
與流行的Tensorflow以及Caffe框架相比,Darknet框架在某些方面有著自己獨(dú)特的優(yōu)勢。
關(guān)于Darknet深度學(xué)習(xí)框架
Darknet深度學(xué)習(xí)框架是由JosephRedmon提出的一個(gè)用C和CUDA編寫的開源神經(jīng)網(wǎng)絡(luò)框架。它安裝速度快,易于安裝,并支持CPU和GPU計(jì)算。
你可以在GitHub上找到源代碼:
https://github.com/pjreddie/darknet
你也可以在官網(wǎng)上閱讀完成更多事情:
https://pjreddie.com/darknet/
YOLO算法
YOLO(YouOnlyLookOnce)是JosephRedmon針對這一框架提出的核心目標(biāo)檢測算法。
作者在YOLO算法中把物體檢測問題處理成回歸問題,用一個(gè)卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)就可以從輸入圖像直接預(yù)測boundingbox和類別概率。
YOLO算法的優(yōu)點(diǎn):
1、YOLO的速度非常快。在TitanXGPU上的速度是45fps(framespersecond),加速版的YOLO差不多是150fps。
2、YOLO是基于圖像的全局信息進(jìn)行預(yù)測的。這一點(diǎn)和基于slidingwindow以及regionproposal等檢測算法不一樣。與FastR-CNN相比,YOLO在誤檢測(將背景檢測為物體)方面的錯(cuò)誤率能降低一半多。
3、可以學(xué)到物體的generalizable-representations。可以理解為泛化能力強(qiáng)。
4、準(zhǔn)確率高。有實(shí)驗(yàn)證明。
事實(shí)上,目標(biāo)檢測的本質(zhì)就是回歸,因此一個(gè)實(shí)現(xiàn)回歸功能的CNN并不需要復(fù)雜的設(shè)計(jì)過程。YOLO沒有選擇滑窗或提取proposal的方式訓(xùn)練網(wǎng)絡(luò),而是直接選用整圖訓(xùn)練模型。這樣做的好處在于可以更好的區(qū)分目標(biāo)和背景區(qū)域,相比之下,采用proposal訓(xùn)練方式的Fast-R-CNN常常把背景區(qū)域誤檢為特定目標(biāo)。當(dāng)然,YOLO在提升檢測速度的同時(shí)犧牲了一些精度。
YOLO的設(shè)計(jì)理念遵循端到端訓(xùn)練和實(shí)時(shí)檢測。YOLO將輸入圖像劃分為S*S個(gè)網(wǎng)格,如果一個(gè)物體的中心落在某網(wǎng)格(cell)內(nèi),則相應(yīng)網(wǎng)格負(fù)責(zé)檢測該物體。
在訓(xùn)練和測試時(shí),每個(gè)網(wǎng)絡(luò)預(yù)測B個(gè)boundingboxes,每個(gè)boundingbox對應(yīng)5個(gè)預(yù)測參數(shù),即boundingbox的中心點(diǎn)坐標(biāo)(x,y),寬高(w,h),和置信度評分。
這里的置信度評分(Pr(Object)*IOU(predtruth))綜合反映基于當(dāng)前模型boundingbox內(nèi)存在目標(biāo)的可能性Pr(Object)和boundingbox預(yù)測目標(biāo)位置的準(zhǔn)確性IOU(predtruth)。如果boudingbox內(nèi)不存在物體,則Pr(Object)=0。如果存在物體,則根據(jù)預(yù)測的boundingbox和真實(shí)的boundingbox計(jì)算IOU,同時(shí)會(huì)預(yù)測存在物體的情況下該物體屬于某一類的后驗(yàn)概率Pr(Class_iObject)。
假定一共有C類物體,那么每一個(gè)網(wǎng)格只預(yù)測一次C類物體的條件類概率Pr(Class_iObject),i=1,2,...,C;每一個(gè)網(wǎng)格預(yù)測B個(gè)boundingbox的位置。即這B個(gè)boundingbox共享一套條件類概率Pr(Class_iObject),i=1,2,...,C。基于計(jì)算得到的Pr(Class_iObject),在測試時(shí)可以計(jì)算某個(gè)boundingbox類相關(guān)置信度:Pr(Class_iObject)*Pr(Object)*IOU(predtruth)=Pr(Class_i)*IOU(predtruth)。
如果將輸入圖像劃分為7*7網(wǎng)格(S=7),每個(gè)網(wǎng)格預(yù)測2個(gè)boundingbox(B=2),有20類待檢測的目標(biāo)(C=20),則相當(dāng)于最終預(yù)測一個(gè)長度為S*S*(B*5+C)=7*7*30的向量,從而完成檢測+識別任務(wù),整個(gè)流程可以通過下圖理解。
YOLO網(wǎng)絡(luò)設(shè)計(jì)遵循了GoogleNet的思想,但與之有所區(qū)別。YOLO使用了24個(gè)級聯(lián)的卷積(conv)層和2個(gè)全連接(fc)層,其中conv層包括3*3和1*1兩種Kernel,最后一個(gè)fc層即YOLO網(wǎng)絡(luò)的輸出,長度為S*S*(B*5+C)=7*7*30.此外,作者還設(shè)計(jì)了一個(gè)簡化版的YOLO-small網(wǎng)絡(luò),包括9個(gè)級聯(lián)的conv層和2個(gè)fc層,由于conv層的數(shù)量少了很多,因此YOLO-small速度比YOLO快很多。如下圖所示給出了YOLO網(wǎng)絡(luò)的架構(gòu)。
YOLO算法的缺點(diǎn):
1、位置精確性差,對于小目標(biāo)物體以及物體比較密集的也檢測不好,比如一群小鳥。
2、YOLO雖然可以降低將背景檢測為物體的概率,但同時(shí)導(dǎo)致召回率較低。
路同學(xué)最近就在使用這一深度學(xué)習(xí)框架,親測好用!