-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
yolov5數(shù)據(jù)集劃分比例(yolo數(shù)據(jù)集大?。?/h1>
發(fā)布時間:2023-04-22 06:31:14
稿源:
創(chuàng)意嶺 閱讀:
53
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于yolov5數(shù)據(jù)集劃分比例的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、淺談Yolo
學(xué)號:20021210654
姓名:潘文欣
原文鏈接: https://blog.csdn.net/xiaohu2022/article/details/79211732
https://blog.csdn.net/qq_30815237/article/details/91949543
【嵌牛導(dǎo)讀】
當(dāng)我們談起計(jì)算機(jī)視覺時,首先想到的就是圖像分類,沒錯,圖像分類是計(jì)算機(jī)視覺最基本的任務(wù)之一,但是在圖像分類的基礎(chǔ)上,還有更復(fù)雜和有意思的任務(wù),如目標(biāo)檢測,物體定位,圖像分割等。其中目標(biāo)檢測是一件比較實(shí)際的且具有挑戰(zhàn)性的計(jì)算機(jī)視覺任務(wù),其可以看成圖像分類與定位的結(jié)合,給定一張圖片,目標(biāo)檢測系統(tǒng)要能夠識別出圖片的目標(biāo)并給出其位置,由于圖片中目標(biāo)數(shù)是不定的,且要給出目標(biāo)的精確位置,目標(biāo)檢測相比分類任務(wù)更復(fù)雜。
近幾年來,目標(biāo)檢測算法取得了很大的突破。比較流行的算法可以分為兩類,一類是基于Region Proposal的R-CNN系算法(R-CNN,F(xiàn)ast R-CNN, Faster R-CNN),它們是two-stage的,需要先使用啟發(fā)式方法(selective search)或者CNN網(wǎng)絡(luò)(RPN)產(chǎn)生Region Proposal,然后再在Region Proposal上做分類與回歸。而另一類是Yolo,SSD這類one-stage算法,其僅僅使用一個CNN網(wǎng)絡(luò)直接預(yù)測不同目標(biāo)的類別與位置。第一類方法是準(zhǔn)確度高一些,但是速度慢,但是第二類算法是速度快,但是準(zhǔn)確性要低一些。
【嵌牛鼻子】 計(jì)算機(jī)視覺 目標(biāo)檢測 YOLO算法
【嵌牛正文】
目標(biāo)檢測算法有很多,本文介紹的是Yolo算法,其全稱是You Only Look Once: Unified, Real-Time Object Detection,其中,You Only Look Once說的是只需要一次CNN運(yùn)算,Unified指的是這是一個統(tǒng)一的框架,提供end-to-end的預(yù)測,而Real-Time體現(xiàn)是Yolo算法速度快。
如下圖是YOLO的檢測系統(tǒng),整體來看,首先將輸入圖片resize到448x448,然后送入CNN網(wǎng)絡(luò),最后處理網(wǎng)絡(luò)預(yù)測結(jié)果得到檢測的目標(biāo)。相比R-CNN算法,其是一個統(tǒng)一的框架,其速度更快,而且Yolo的訓(xùn)練過程也是end-to-end的。
具體來說,Yolo的CNN網(wǎng)絡(luò)將輸入的圖片分割成S S網(wǎng)格,,然后每個單元格負(fù)責(zé)去檢測那些中心點(diǎn)落在該格子內(nèi)的目標(biāo),如下圖,可以看到狗這個目標(biāo)的中心落在左下角一個單元格內(nèi),那么該單元格負(fù)責(zé)預(yù)測這個狗。每個單元格會預(yù)測B個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實(shí)包含兩個方面,一是這個邊界框含有目標(biāo)的可能性大小,二是這個邊界框的準(zhǔn)確度。前者記為Pr(object),當(dāng)該邊界框是背景時(即不包含目標(biāo)),此時Pr(object)=0。而當(dāng)該邊界框包含目標(biāo)時,Pr(object)=1。邊界框的準(zhǔn)確度可以用預(yù)測框與實(shí)際框(ground truth)的IOU(intersection over union,交并比)來表征,記為 。因此置信度可以定義為Pr(object)∗ 。很多人可能將Yolo的置信度看成邊界框是否含有目標(biāo)的概率,但是其實(shí)它是兩個因子的乘積,預(yù)測框的準(zhǔn)確度也反映在里面。邊界框的大小與位置可以用4個值來表征:(x,y,w,h),其中(x,y)是邊界框的中心坐標(biāo),而w和h是邊界框的寬與高。還有一點(diǎn)要注意,中心坐標(biāo)的預(yù)測值(x,y)是相對于每個單元格左上角坐標(biāo)點(diǎn)的偏移值,并且單位是相對于單元格大小的,單元格的坐標(biāo)定義如圖6所示。而邊界框的w和h預(yù)測值是相對于整個圖片的寬與高的比例,這樣理論上4個元素的大小應(yīng)該在[0,1]范圍。這樣,每個邊界框的預(yù)測值實(shí)際上包含5個元素:(x,y,w,h,c),其中前4個表征邊界框的大小與位置,而最后一個值是置信度。
還有分類問題,對于每一個單元格其還要給出預(yù)測出C個類別概率值,其表征的是由該單元格負(fù)責(zé)預(yù)測的邊界框其目標(biāo)屬于各個類別的概率。但是這些概率值其實(shí)是在各個邊界框置信度下的條件概率,即 。值得注意的是,不管一個單元格預(yù)測多少個邊界框,其只預(yù)測一組類別概率值,這是Yolo算法的一個缺點(diǎn),在后來的改進(jìn)版本中,Yolo9000是把類別概率預(yù)測值與邊界框是綁定在一起的。同時,我們可以計(jì)算出各個邊界框類別置信度(class-specific confidence scores): 。邊界框類別置信度表征的是該邊界框中目標(biāo)屬于各個類別的可能性大小以及邊界框匹配目標(biāo)的好壞。后面會說,一般會根據(jù)類別置信度來過濾網(wǎng)絡(luò)的預(yù)測框。
總結(jié)一下,每個單元格需要預(yù)測(B∗5+C)個值。如果將輸入圖片劃分為S×S網(wǎng)格,那么最終預(yù)測值為S×S×(B∗5+C)大小的張量。整個模型的預(yù)測值結(jié)構(gòu)如下圖所示。對于PASCAL VOC數(shù)據(jù),其共有20個類別,如果使用S=7,B=2,那么最終的預(yù)測結(jié)果就是7×7×30大小的張量。在下面的網(wǎng)絡(luò)結(jié)構(gòu)中我們會詳細(xì)講述每個單元格的預(yù)測值的分布位置。
Yolo采用卷積網(wǎng)絡(luò)來提取特征,然后使用全連接層來得到預(yù)測值。網(wǎng)絡(luò)結(jié)構(gòu)參考GooLeNet模型,包含24個卷積層和2個全連接層,如下圖所示。對于卷積層,主要使用1x1卷積來做channle reduction,然后緊跟3x3卷積。對于卷積層和全連接層,采用Leaky ReLU激活函數(shù)。但是最后一層卻采用線性激活函數(shù)。
可以看到網(wǎng)絡(luò)的最后輸出為7×7×30大小的張量。這和前面的討論是一致的。對于每一個單元格,前20個元素是類別概率值,然后2個元素是邊界框置信度,兩者相乘可以得到類別置信度,最后8個元素是邊界框的(x,y,w,h)。
在訓(xùn)練之前,先在ImageNet上進(jìn)行了預(yù)訓(xùn)練,其預(yù)訓(xùn)練的分類模型采用圖8中前20個卷積層,然后添加一個average-pool層和全連接層。預(yù)訓(xùn)練之后,在預(yù)訓(xùn)練得到的20層卷積層之上加上隨機(jī)初始化的4個卷積層和2個全連接層。由于檢測任務(wù)一般需要更高清的圖片,所以將網(wǎng)絡(luò)的輸入從224x224增加到了448x448。整個網(wǎng)絡(luò)的流程如下圖所示:
下面是訓(xùn)練損失函數(shù)的分析,Yolo算法將目標(biāo)檢測看成回歸問題,所以采用的是均方差損失函數(shù)。但是對不同的部分采用了不同的權(quán)重值。首先區(qū)分定位誤差和分類誤差。對于定位誤差,即邊界框坐標(biāo)預(yù)測誤差,采用較大的權(quán)重 。然后其區(qū)分不包含目標(biāo)的邊界框與含有目標(biāo)的邊界框的置信度,對于前者,采用較小的權(quán)重值 。其它權(quán)重值均設(shè)為1。然后采用均方誤差,其同等對待大小不同的邊界框,但是實(shí)際上較小的邊界框的坐標(biāo)誤差應(yīng)該要比較大的邊界框要更敏感。為了保證這一點(diǎn),將網(wǎng)絡(luò)的邊界框的寬與高預(yù)測改為對其平方根的預(yù)測,即預(yù)測值變?yōu)? 。
另外一點(diǎn)時,由于每個單元格預(yù)測多個邊界框。但是其對應(yīng)類別只有一個。那么在訓(xùn)練時,如果該單元格內(nèi)確實(shí)存在目標(biāo),那么只選擇與ground truth的IOU最大的那個邊界框來負(fù)責(zé)預(yù)測該目標(biāo),而其它邊界框認(rèn)為不存在目標(biāo)。這樣設(shè)置的一個結(jié)果將會使一個單元格對應(yīng)的邊界框更加專業(yè)化,其可以分別適用不同大小,不同高寬比的目標(biāo),從而提升模型性能。大家可能會想如果一個單元格內(nèi)存在多個目標(biāo)怎么辦,其實(shí)這時候Yolo算法就只能選擇其中一個來訓(xùn)練,這也是Yolo算法的缺點(diǎn)之一。要注意的一點(diǎn)時,對于不存在對應(yīng)目標(biāo)的邊界框,其誤差項(xiàng)就是只有置信度,左標(biāo)項(xiàng)誤差是沒法計(jì)算的。而只有當(dāng)一個單元格內(nèi)確實(shí)存在目標(biāo)時,才計(jì)算分類誤差項(xiàng),否則該項(xiàng)也是無法計(jì)算的。
綜上討論,最終的損失函數(shù)計(jì)算如下:
其中第一項(xiàng)是邊界框中心坐標(biāo)的誤差項(xiàng), 指的是第ii個單元格存在目標(biāo),且該單元格中的第j個邊界框負(fù)責(zé)預(yù)測該目標(biāo)。第二項(xiàng)是邊界框的高與寬的誤差項(xiàng)。第三項(xiàng)是包含目標(biāo)的邊界框的置信度誤差項(xiàng)。第四項(xiàng)是不包含目標(biāo)的邊界框的置信度誤差項(xiàng)。而最后一項(xiàng)是包含目標(biāo)的單元格的分類誤差項(xiàng), 指的是第i個單元格存在目標(biāo)。
NMS算法(非極大值抑制算法):選擇得分(Confidence Score)最高的作為輸出,與該輸出重疊的 去掉,不斷重復(fù)這一過程直到所有備選處理完。
YOLO的NMS算法中, Confidence Score的值如下: , 。 代表著某個對象 存在于第j個邊界框的可能性。每個網(wǎng)格有:20個對象的概率*2個邊界框的置信度,共40個得分。49個網(wǎng)格共1960個得分。對每種對象分別進(jìn)行NMS,那么每種對象有1960/20=98個得分。
YOLO算法的NMS步驟如下:
1)設(shè)置一個Score的閾值,低于該閾值的候選對象排除掉(將該Score設(shè)為0)
2)遍歷每一個對象類別
2.1)遍歷該對象的98個得分
2.1.1)找到Score最大的那個對象及其邊界框,添加到輸出列表
2.1.2)對每個Score不為0的候選對象,計(jì)算其與上面2.1.1輸出對象的邊界框的IOU
2.1.3)根據(jù)預(yù)先設(shè)置的IOU閾值,所有高于該閾值(重疊度較高)的候選對象排除掉(將Score設(shè)為0)
2.1.4)如果所有邊界框要么在輸出列表中,要么Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象
3)輸出列表即為預(yù)測的對象
這篇長文詳細(xì)介紹了Yolo算法的原理及實(shí)現(xiàn),當(dāng)然Yolo-v1還是有很多問題的,所以后續(xù)可以讀讀Yolo9000算法,看看其如何改進(jìn)的。
二、YOLOv5 detect 推理測試(沒有檢測框)
Nvidia RTX 3060
Ubuntu 16.04
CUDA 11.1
cuDNN 8.2.0
torch 1.10.1+cu111
torchvision 0.11.2+cu111
YOLOv5搭建及訓(xùn)練自己的數(shù)據(jù)集,請參考另一篇文章: https://www.jianshu.com/p/b3fa74f6c27b
訓(xùn)練完畢會得到 best.pt 和 last.pt 的權(quán)重文件,權(quán)重文件在 /run/train/exp/weights 下
以YOLOv5 v6.0版本為例,先使用原始權(quán)重文件及項(xiàng)目提供的原始圖片進(jìn)行detect推理一下,可以修改detect.py文件
可以先使用命令查看一下正確指令
然后,使用命令
運(yùn)行結(jié)果將被保存在 /run/detect文件夾下
detect結(jié)果如下:
detect結(jié)果除了有標(biāo)注的圖片外,還有一個文件夾記錄檢測框的信息:
可以根據(jù)上述自行修改,對自己的項(xiàng)目進(jìn)行detect。
我在detect的時候,一直沒有檢測框,找了一天bug,原來是命令寫錯了,兩行心酸淚==
一定按照 python detect.py -h 寫,不然對圖片不做任何修改
三、目標(biāo)檢測算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)
深度學(xué)習(xí)目前已經(jīng)應(yīng)用到了各個領(lǐng)域,應(yīng)用場景大體分為三類:物體識別,目標(biāo)檢測,自然語言處理。 目標(biāo)檢測可以理解為是物體識別和物體定位的綜合 ,不僅僅要識別出物體屬于哪個分類,更重要的是得到物體在圖片中的具體位置。
2014年R-CNN算法被提出,基本奠定了two-stage方式在目標(biāo)檢測領(lǐng)域的應(yīng)用。它的算法結(jié)構(gòu)如下圖
算法步驟如下:
R-CNN較傳統(tǒng)的目標(biāo)檢測算法獲得了50%的性能提升,在使用VGG-16模型作為物體識別模型情況下,在voc2007數(shù)據(jù)集上可以取得66%的準(zhǔn)確率,已經(jīng)算還不錯的一個成績了。其最大的問題是速度很慢,內(nèi)存占用量很大,主要原因有兩個
針對R-CNN的部分問題,2015年微軟提出了Fast R-CNN算法,它主要優(yōu)化了兩個問題。
R-CNN和fast R-CNN均存在一個問題,那就是 由選擇性搜索來生成候選框,這個算法很慢 。而且R-CNN中生成的2000個左右的候選框全部需要經(jīng)過一次卷積神經(jīng)網(wǎng)絡(luò),也就是需要經(jīng)過2000次左右的CNN網(wǎng)絡(luò),這個是十分耗時的(fast R-CNN已經(jīng)做了改進(jìn),只需要對整圖經(jīng)過一次CNN網(wǎng)絡(luò))。這也是導(dǎo)致這兩個算法檢測速度較慢的最主要原因。
faster R-CNN 針對這個問題, 提出了RPN網(wǎng)絡(luò)來進(jìn)行候選框的獲取,從而擺脫了選擇性搜索算法,也只需要一次卷積層操作,從而大大提高了識別速度 。這個算法十分復(fù)雜,我們會詳細(xì)分析。它的基本結(jié)構(gòu)如下圖
主要分為四個步驟:
使用VGG-16卷積模型的網(wǎng)絡(luò)結(jié)構(gòu):
卷積層采用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然后經(jīng)過13個conv-relu層,其中會穿插4個max-pooling層。所有的卷積的kernel都是3x3的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。
MxN的圖片,經(jīng)過卷積層后,變?yōu)榱?M/16) x (N/16)的feature map了。
faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經(jīng)過3x3的卷積運(yùn)算,然后分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然后softmax來判斷是前景還是背景,然后reshape恢復(fù)為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實(shí)現(xiàn),后面再詳細(xì)講。兩路計(jì)算結(jié)束后,挑選出前景候選框(因?yàn)槲矬w在前景中),并利用計(jì)算得到的候選框位置,得到我們感興趣的特征子圖proposal。
卷積層提取原始圖像信息,得到了256個feature map,經(jīng)過RPN層的3x3卷積后,仍然為256個feature map。但是每個點(diǎn)融合了周圍3x3的空間信息。對每個feature map上的一個點(diǎn),生成k個anchor(k默認(rèn)為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機(jī)還是汽車,只用區(qū)分它是前景還是背景即可)。anchor有[x,y,w,h]四個坐標(biāo)偏移量,x,y表示中心點(diǎn)坐標(biāo),w和h表示寬度和高度。這樣,對于feature map上的每個點(diǎn),就得到了k個大小形狀各不相同的選區(qū)region。
對于生成的anchors,我們首先要判斷它是前景還是背景。由于感興趣的物體位于前景中,故經(jīng)過這一步之后,我們就可以舍棄背景anchors了。大部分的anchors都是屬于背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計(jì)算量。
對于經(jīng)過了3x3的卷積后得到的256個feature map,先經(jīng)過1x1的卷積,變換為18個feature map。然后reshape為一維向量,經(jīng)過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數(shù)據(jù)可以進(jìn)行softmax計(jì)算。然后輸出識別得到的前景anchors。
另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標(biāo)值。如下圖所示,紅色代表我們當(dāng)前的選區(qū),綠色代表真實(shí)的選區(qū)。雖然我們當(dāng)前的選取能夠大概框選出飛機(jī),但離綠色的真實(shí)位置和形狀還是有很大差別,故需要對生成的anchors進(jìn)行調(diào)整。這個過程我們稱為bounding box regression。
假設(shè)紅色框的坐標(biāo)為[x,y,w,h], 綠色框,也就是目標(biāo)框的坐標(biāo)為[Gx, Gy,Gw,Gh], 我們要建立一個變換,使得[x,y,w,h]能夠變?yōu)閇Gx, Gy,Gw,Gh]。最簡單的思路是,先做平移,使得中心點(diǎn)接近,然后進(jìn)行縮放,使得w和h接近。如下:
我們要學(xué)習(xí)的就是dx dy dw dh這四個變換。由于是線性變換,我們可以用線性回歸來建模。設(shè)定loss和優(yōu)化方法后,就可以利用深度學(xué)習(xí)進(jìn)行訓(xùn)練,并得到模型了。對于空間位置loss,我們一般采用均方差算法,而不是交叉熵(交叉熵使用在分類預(yù)測中)。優(yōu)化方法可以采用自適應(yīng)梯度下降算法Adam。
得到了前景anchors,并確定了他們的位置和形狀后,我們就可以輸出前景的特征子圖proposal了。步驟如下:
1,得到前景anchors和他們的[x y w h]坐標(biāo)。
2,按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個anchors,比如前6000個
3,剔除非常小的anchors。
4,通過NMS非極大值抑制,從anchors中找出置信度較高的。這個主要是為了解決選取交疊問題。首先計(jì)算每一個選區(qū)面積,然后根據(jù)他們在softmax中的score(也就是是否為前景的概率)進(jìn)行排序,將score最大的選區(qū)放入隊(duì)列中。接下來,計(jì)算其余選區(qū)與當(dāng)前最大score選區(qū)的IOU(IOU為兩box交集面積除以兩box并集面積,它衡量了兩個box之間重疊程度)。去除IOU大于設(shè)定閾值的選區(qū)。這樣就解決了選區(qū)重疊問題。
5,選取前post_nms_topN個結(jié)果作為最終選區(qū)proposal進(jìn)行輸出,比如300個。
經(jīng)過這一步之后,物體定位應(yīng)該就基本結(jié)束了,剩下的就是物體識別了。
和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導(dǎo)致沒法做全連接。全連接計(jì)算只能對確定的shape進(jìn)行運(yùn)算,故必須使proposal大小形狀變?yōu)橄嗤?。通過裁剪和縮放的手段,可以解決這個問題,但會帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個問題。
ROI pooling中,如果目標(biāo)輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特征圖。
ROI Pooling層后的特征圖,通過全連接層與softmax,就可以計(jì)算屬于哪個具體類別,比如人,狗,飛機(jī),并可以得到cls_prob概率向量。同時再次利用bounding box regression精細(xì)調(diào)整proposal位置,得到bbox_pred,用于回歸更加精確的目標(biāo)檢測框。
這樣就完成了faster R-CNN的整個過程了。算法還是相當(dāng)復(fù)雜的,對于每個細(xì)節(jié)需要反復(fù)理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數(shù)據(jù)集上可以達(dá)到83.8%的準(zhǔn)確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達(dá)不到實(shí)時性要求。
針對于two-stage目標(biāo)檢測算法普遍存在的運(yùn)算速度慢的缺點(diǎn), yolo創(chuàng)造性的提出了one-stage。也就是將物體分類和物體定位在一個步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實(shí)現(xiàn)one-stage。通過這種方式, yolo可實(shí)現(xiàn)45幀每秒的運(yùn)算速度,完全能滿足實(shí)時性要求 (達(dá)到24幀每秒,人眼就認(rèn)為是連續(xù)的)。它的網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
主要分為三個部分:卷積層,目標(biāo)檢測層,NMS篩選層。
采用Google inceptionV1網(wǎng)絡(luò),對應(yīng)到上圖中的第一個階段,共20層。這一層主要是進(jìn)行特征提取,從而提高模型泛化能力。但作者對inceptionV1進(jìn)行了改造,他沒有使用inception module結(jié)構(gòu),而是用一個1x1的卷積,并聯(lián)一個3x3的卷積來替代。(可以認(rèn)為只使用了inception module中的一個分支,應(yīng)該是為了簡化網(wǎng)絡(luò)結(jié)構(gòu))
先經(jīng)過4個卷積層和2個全連接層,最后生成7x7x30的輸出。先經(jīng)過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個網(wǎng)格,每個網(wǎng)格要預(yù)測兩個bounding box的坐標(biāo)(x,y,w,h)和box內(nèi)包含物體的置信度confidence,以及物體屬于20類別中每一類的概率(yolo的訓(xùn)練數(shù)據(jù)為voc2012,它是一個20分類的數(shù)據(jù)集)。所以一個網(wǎng)格對應(yīng)的參數(shù)為(4x2+2+20) = 30。如下圖
其中前一項(xiàng)表示有無人工標(biāo)記的物體落入了網(wǎng)格內(nèi),如果有則為1,否則為0。第二項(xiàng)代表bounding box和真實(shí)標(biāo)記的box之間的重合度。它等于兩個box面積交集,除以面積并集。值越大則box越接近真實(shí)位置。
分類信息: yolo的目標(biāo)訓(xùn)練集為voc2012,它是一個20分類的目標(biāo)檢測數(shù)據(jù)集 。常用目標(biāo)檢測數(shù)據(jù)集如下表:
| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每個網(wǎng)格還需要預(yù)測它屬于20分類中每一個類別的概率。分類信息是針對每個網(wǎng)格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內(nèi)是否有物體,而不需要預(yù)測物體是20分類中的哪一個,故只需要2個參數(shù)。雖然分類信息和confidence都是概率,但表達(dá)含義完全不同。
篩選層是為了在多個結(jié)果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低于閾值的box,對剩下的box進(jìn)行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體算法可以回顧上面faster R-CNN小節(jié))。這樣就得到了最終的最合適的幾個box和他們的類別。
yolo的損失函數(shù)包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:
誤差均采用了均方差算法,其實(shí)我認(rèn)為,位置誤差應(yīng)該采用均方差算法,而分類誤差應(yīng)該采用交叉熵。由于物體位置只有4個參數(shù),而類別有20個參數(shù),他們的累加和不同。如果賦予相同的權(quán)重,顯然不合理。故yolo中位置誤差權(quán)重為5,類別誤差權(quán)重為1。由于我們不是特別關(guān)心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權(quán)重為0.5,包含物體的權(quán)重則為1。
Faster R-CNN準(zhǔn)確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但準(zhǔn)確率和漏檢率不盡人意。SSD綜合了他們的優(yōu)缺點(diǎn),對輸入300x300的圖像,在voc2007數(shù)據(jù)集上test,能夠達(dá)到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。
SSD網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
和yolo一樣,也分為三部分:卷積層,目標(biāo)檢測層和NMS篩選層
SSD論文采用了VGG16的基礎(chǔ)網(wǎng)絡(luò),其實(shí)這也是幾乎所有目標(biāo)檢測神經(jīng)網(wǎng)絡(luò)的慣用方法。先用一個CNN網(wǎng)絡(luò)來提取特征,然后再進(jìn)行后續(xù)的目標(biāo)定位和目標(biāo)分類識別。
這一層由5個卷積層和一個平均池化層組成。去掉了最后的全連接層。SSD認(rèn)為目標(biāo)檢測中的物體,只與周圍信息相關(guān),它的感受野不是全局的,故沒必要也不應(yīng)該做全連接。SSD的特點(diǎn)如下。
每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進(jìn)行目標(biāo)位置和類別的訓(xùn)練和預(yù)測,從而達(dá)到 多尺度檢測 的目的,可以克服yolo對于寬高比不常見的物體,識別準(zhǔn)確率較低的問題。而yolo中,只在最后一個卷積層上做目標(biāo)位置和類別的訓(xùn)練和預(yù)測。這是SSD相對于yolo能提高準(zhǔn)確率的一個關(guān)鍵所在。
如上所示,在每個卷積層上都會進(jìn)行目標(biāo)檢測和分類,最后由NMS進(jìn)行篩選,輸出最終的結(jié)果。多尺度feature map上做目標(biāo)檢測,就相當(dāng)于多了很多寬高比例的bounding box,可以大大提高泛化能力。
和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點(diǎn)對應(yīng)為原圖的一個區(qū)域的中心點(diǎn)。以這個點(diǎn)為中心,構(gòu)造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應(yīng)4個位置參數(shù)(x,y,w,h)和21個類別概率(voc訓(xùn)練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:
另外,在訓(xùn)練階段,SSD將正負(fù)樣本比例定位1:3。訓(xùn)練集給定了輸入圖像以及每個物體的真實(shí)區(qū)域(ground true box),將default box和真實(shí)box最接近的選為正樣本。然后在剩下的default box中選擇任意一個與真實(shí)box IOU大于0.5的,作為正樣本。而其他的則作為負(fù)樣本。由于絕大部分的box為負(fù)樣本,會導(dǎo)致正負(fù)失衡,故根據(jù)每個box類別概率排序,使正負(fù)比例保持在1:3。SSD認(rèn)為這個策略提高了4%的準(zhǔn)確率
另外,SSD采用了數(shù)據(jù)增強(qiáng)。生成與目標(biāo)物體真實(shí)box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機(jī)選取這些patch參與訓(xùn)練,并對他們進(jìn)行隨機(jī)水平翻轉(zhuǎn)等操作。SSD認(rèn)為這個策略提高了8.8%的準(zhǔn)確率。
和yolo的篩選層基本一致,同樣先過濾掉類別概率低于閾值的default box,再采用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標(biāo)檢測輸出的default box。
SSD基本已經(jīng)可以滿足我們手機(jī)端上實(shí)時物體檢測需求了,TensorFlow在Android上的目標(biāo)檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD算法實(shí)現(xiàn)的。它的基礎(chǔ)卷積網(wǎng)絡(luò)采用的是mobileNet,適合在終端上部署和運(yùn)行。
針對yolo準(zhǔn)確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結(jié)合SSD的特點(diǎn),提出了yoloV2。它主要還是采用了yolo的網(wǎng)絡(luò)結(jié)構(gòu),在其基礎(chǔ)上做了一些優(yōu)化和改進(jìn),如下
網(wǎng)絡(luò)采用DarkNet-19:19層,里面包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結(jié)構(gòu)如下
yolo和yoloV2只能識別20類物體,為了優(yōu)化這個問題,提出了yolo9000,可以識別9000類物體。它在yoloV2基礎(chǔ)上,進(jìn)行了imageNet和coco的聯(lián)合訓(xùn)練。這種方式充分利用imageNet可以識別1000類物體和coco可以進(jìn)行目標(biāo)位置檢測的優(yōu)點(diǎn)。當(dāng)使用imageNet訓(xùn)練時,只更新物體分類相關(guān)的參數(shù)。而使用coco時,則更新全部所有參數(shù)。
YOLOv3可以說出來直接吊打一切圖像檢測算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)準(zhǔn)確率更高或相仿,速度是其1/3.。
YOLOv3的改動主要有如下幾點(diǎn):
不過如果要求更精準(zhǔn)的預(yù)測邊框,采用COCO AP做評估標(biāo)準(zhǔn)的話,YOLO3在精確率上的表現(xiàn)就弱了一些。如下圖所示。
當(dāng)前目標(biāo)檢測模型算法也是層出不窮。在two-stage領(lǐng)域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,將對抗學(xué)習(xí)引入到目標(biāo)檢測領(lǐng)域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。
one-stage領(lǐng)域也是百花齊放,2017年首爾大學(xué)提出 R-SSD 算法,主要解決小尺寸物體檢測效果差的問題。清華大學(xué)提出了 RON 算法,結(jié)合 two stage 名的方法和 one stage 方法的優(yōu)勢,更加關(guān)注多尺度對象定位和負(fù)空間樣本挖掘問題。
目標(biāo)檢測領(lǐng)域的深度學(xué)習(xí)算法,需要進(jìn)行目標(biāo)定位和物體識別,算法相對來說還是很復(fù)雜的。當(dāng)前各種新算法也是層不出窮,但模型之間有很強(qiáng)的延續(xù)性,大部分模型算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經(jīng)典模型的特點(diǎn),這些tricks是為了解決什么問題,以及為什么解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標(biāo)檢測領(lǐng)域主要的難點(diǎn)如下:
一文讀懂目標(biāo)檢測AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2
從YOLOv1到v3的進(jìn)化之路
SSD-Tensorflow超詳細(xì)解析【一】:加載模型對圖片進(jìn)行測試 https://blog.csdn.net/k87974/article/details/80606407
YOLO https://pjreddie.com/darknet/yolo/ https://github.com/pjreddie/darknet
C#項(xiàng)目參考:https://github.com/AlturosDestinations/Alturos.Yolo
項(xiàng)目實(shí)踐貼個圖。
四、yolov5ds使用了什么神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)。
當(dāng)下YOLO最新的卷積神經(jīng)網(wǎng)絡(luò)YOLOv5是完全基于PyTorch實(shí)現(xiàn)的,現(xiàn)版本的YOLOv5每個圖像的推理時間最快0.007秒,即每秒140幀(FPS),但YOLOv5的權(quán)重文件大小只有YOLOv4的1/9。
以上就是關(guān)于yolov5數(shù)據(jù)集劃分比例相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
國內(nèi)如何打開youtube(國內(nèi)如何打開推特)
youtube注冊中國號碼無法驗(yàn)證(youtube中國號碼不能驗(yàn)證)
無錫住宅景觀設(shè)計(jì)公司(無錫住宅景觀設(shè)計(jì)公司有哪些)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于yolov5數(shù)據(jù)集劃分比例的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、淺談Yolo
學(xué)號:20021210654
姓名:潘文欣
原文鏈接: https://blog.csdn.net/xiaohu2022/article/details/79211732
https://blog.csdn.net/qq_30815237/article/details/91949543
【嵌牛導(dǎo)讀】
當(dāng)我們談起計(jì)算機(jī)視覺時,首先想到的就是圖像分類,沒錯,圖像分類是計(jì)算機(jī)視覺最基本的任務(wù)之一,但是在圖像分類的基礎(chǔ)上,還有更復(fù)雜和有意思的任務(wù),如目標(biāo)檢測,物體定位,圖像分割等。其中目標(biāo)檢測是一件比較實(shí)際的且具有挑戰(zhàn)性的計(jì)算機(jī)視覺任務(wù),其可以看成圖像分類與定位的結(jié)合,給定一張圖片,目標(biāo)檢測系統(tǒng)要能夠識別出圖片的目標(biāo)并給出其位置,由于圖片中目標(biāo)數(shù)是不定的,且要給出目標(biāo)的精確位置,目標(biāo)檢測相比分類任務(wù)更復(fù)雜。
近幾年來,目標(biāo)檢測算法取得了很大的突破。比較流行的算法可以分為兩類,一類是基于Region Proposal的R-CNN系算法(R-CNN,F(xiàn)ast R-CNN, Faster R-CNN),它們是two-stage的,需要先使用啟發(fā)式方法(selective search)或者CNN網(wǎng)絡(luò)(RPN)產(chǎn)生Region Proposal,然后再在Region Proposal上做分類與回歸。而另一類是Yolo,SSD這類one-stage算法,其僅僅使用一個CNN網(wǎng)絡(luò)直接預(yù)測不同目標(biāo)的類別與位置。第一類方法是準(zhǔn)確度高一些,但是速度慢,但是第二類算法是速度快,但是準(zhǔn)確性要低一些。
【嵌牛鼻子】 計(jì)算機(jī)視覺 目標(biāo)檢測 YOLO算法
【嵌牛正文】
目標(biāo)檢測算法有很多,本文介紹的是Yolo算法,其全稱是You Only Look Once: Unified, Real-Time Object Detection,其中,You Only Look Once說的是只需要一次CNN運(yùn)算,Unified指的是這是一個統(tǒng)一的框架,提供end-to-end的預(yù)測,而Real-Time體現(xiàn)是Yolo算法速度快。
如下圖是YOLO的檢測系統(tǒng),整體來看,首先將輸入圖片resize到448x448,然后送入CNN網(wǎng)絡(luò),最后處理網(wǎng)絡(luò)預(yù)測結(jié)果得到檢測的目標(biāo)。相比R-CNN算法,其是一個統(tǒng)一的框架,其速度更快,而且Yolo的訓(xùn)練過程也是end-to-end的。
具體來說,Yolo的CNN網(wǎng)絡(luò)將輸入的圖片分割成S S網(wǎng)格,,然后每個單元格負(fù)責(zé)去檢測那些中心點(diǎn)落在該格子內(nèi)的目標(biāo),如下圖,可以看到狗這個目標(biāo)的中心落在左下角一個單元格內(nèi),那么該單元格負(fù)責(zé)預(yù)測這個狗。每個單元格會預(yù)測B個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實(shí)包含兩個方面,一是這個邊界框含有目標(biāo)的可能性大小,二是這個邊界框的準(zhǔn)確度。前者記為Pr(object),當(dāng)該邊界框是背景時(即不包含目標(biāo)),此時Pr(object)=0。而當(dāng)該邊界框包含目標(biāo)時,Pr(object)=1。邊界框的準(zhǔn)確度可以用預(yù)測框與實(shí)際框(ground truth)的IOU(intersection over union,交并比)來表征,記為 。因此置信度可以定義為Pr(object)∗ 。很多人可能將Yolo的置信度看成邊界框是否含有目標(biāo)的概率,但是其實(shí)它是兩個因子的乘積,預(yù)測框的準(zhǔn)確度也反映在里面。邊界框的大小與位置可以用4個值來表征:(x,y,w,h),其中(x,y)是邊界框的中心坐標(biāo),而w和h是邊界框的寬與高。還有一點(diǎn)要注意,中心坐標(biāo)的預(yù)測值(x,y)是相對于每個單元格左上角坐標(biāo)點(diǎn)的偏移值,并且單位是相對于單元格大小的,單元格的坐標(biāo)定義如圖6所示。而邊界框的w和h預(yù)測值是相對于整個圖片的寬與高的比例,這樣理論上4個元素的大小應(yīng)該在[0,1]范圍。這樣,每個邊界框的預(yù)測值實(shí)際上包含5個元素:(x,y,w,h,c),其中前4個表征邊界框的大小與位置,而最后一個值是置信度。
還有分類問題,對于每一個單元格其還要給出預(yù)測出C個類別概率值,其表征的是由該單元格負(fù)責(zé)預(yù)測的邊界框其目標(biāo)屬于各個類別的概率。但是這些概率值其實(shí)是在各個邊界框置信度下的條件概率,即 。值得注意的是,不管一個單元格預(yù)測多少個邊界框,其只預(yù)測一組類別概率值,這是Yolo算法的一個缺點(diǎn),在后來的改進(jìn)版本中,Yolo9000是把類別概率預(yù)測值與邊界框是綁定在一起的。同時,我們可以計(jì)算出各個邊界框類別置信度(class-specific confidence scores): 。邊界框類別置信度表征的是該邊界框中目標(biāo)屬于各個類別的可能性大小以及邊界框匹配目標(biāo)的好壞。后面會說,一般會根據(jù)類別置信度來過濾網(wǎng)絡(luò)的預(yù)測框。
總結(jié)一下,每個單元格需要預(yù)測(B∗5+C)個值。如果將輸入圖片劃分為S×S網(wǎng)格,那么最終預(yù)測值為S×S×(B∗5+C)大小的張量。整個模型的預(yù)測值結(jié)構(gòu)如下圖所示。對于PASCAL VOC數(shù)據(jù),其共有20個類別,如果使用S=7,B=2,那么最終的預(yù)測結(jié)果就是7×7×30大小的張量。在下面的網(wǎng)絡(luò)結(jié)構(gòu)中我們會詳細(xì)講述每個單元格的預(yù)測值的分布位置。
Yolo采用卷積網(wǎng)絡(luò)來提取特征,然后使用全連接層來得到預(yù)測值。網(wǎng)絡(luò)結(jié)構(gòu)參考GooLeNet模型,包含24個卷積層和2個全連接層,如下圖所示。對于卷積層,主要使用1x1卷積來做channle reduction,然后緊跟3x3卷積。對于卷積層和全連接層,采用Leaky ReLU激活函數(shù)。但是最后一層卻采用線性激活函數(shù)。
可以看到網(wǎng)絡(luò)的最后輸出為7×7×30大小的張量。這和前面的討論是一致的。對于每一個單元格,前20個元素是類別概率值,然后2個元素是邊界框置信度,兩者相乘可以得到類別置信度,最后8個元素是邊界框的(x,y,w,h)。
在訓(xùn)練之前,先在ImageNet上進(jìn)行了預(yù)訓(xùn)練,其預(yù)訓(xùn)練的分類模型采用圖8中前20個卷積層,然后添加一個average-pool層和全連接層。預(yù)訓(xùn)練之后,在預(yù)訓(xùn)練得到的20層卷積層之上加上隨機(jī)初始化的4個卷積層和2個全連接層。由于檢測任務(wù)一般需要更高清的圖片,所以將網(wǎng)絡(luò)的輸入從224x224增加到了448x448。整個網(wǎng)絡(luò)的流程如下圖所示:
下面是訓(xùn)練損失函數(shù)的分析,Yolo算法將目標(biāo)檢測看成回歸問題,所以采用的是均方差損失函數(shù)。但是對不同的部分采用了不同的權(quán)重值。首先區(qū)分定位誤差和分類誤差。對于定位誤差,即邊界框坐標(biāo)預(yù)測誤差,采用較大的權(quán)重 。然后其區(qū)分不包含目標(biāo)的邊界框與含有目標(biāo)的邊界框的置信度,對于前者,采用較小的權(quán)重值 。其它權(quán)重值均設(shè)為1。然后采用均方誤差,其同等對待大小不同的邊界框,但是實(shí)際上較小的邊界框的坐標(biāo)誤差應(yīng)該要比較大的邊界框要更敏感。為了保證這一點(diǎn),將網(wǎng)絡(luò)的邊界框的寬與高預(yù)測改為對其平方根的預(yù)測,即預(yù)測值變?yōu)? 。
另外一點(diǎn)時,由于每個單元格預(yù)測多個邊界框。但是其對應(yīng)類別只有一個。那么在訓(xùn)練時,如果該單元格內(nèi)確實(shí)存在目標(biāo),那么只選擇與ground truth的IOU最大的那個邊界框來負(fù)責(zé)預(yù)測該目標(biāo),而其它邊界框認(rèn)為不存在目標(biāo)。這樣設(shè)置的一個結(jié)果將會使一個單元格對應(yīng)的邊界框更加專業(yè)化,其可以分別適用不同大小,不同高寬比的目標(biāo),從而提升模型性能。大家可能會想如果一個單元格內(nèi)存在多個目標(biāo)怎么辦,其實(shí)這時候Yolo算法就只能選擇其中一個來訓(xùn)練,這也是Yolo算法的缺點(diǎn)之一。要注意的一點(diǎn)時,對于不存在對應(yīng)目標(biāo)的邊界框,其誤差項(xiàng)就是只有置信度,左標(biāo)項(xiàng)誤差是沒法計(jì)算的。而只有當(dāng)一個單元格內(nèi)確實(shí)存在目標(biāo)時,才計(jì)算分類誤差項(xiàng),否則該項(xiàng)也是無法計(jì)算的。
綜上討論,最終的損失函數(shù)計(jì)算如下:
其中第一項(xiàng)是邊界框中心坐標(biāo)的誤差項(xiàng), 指的是第ii個單元格存在目標(biāo),且該單元格中的第j個邊界框負(fù)責(zé)預(yù)測該目標(biāo)。第二項(xiàng)是邊界框的高與寬的誤差項(xiàng)。第三項(xiàng)是包含目標(biāo)的邊界框的置信度誤差項(xiàng)。第四項(xiàng)是不包含目標(biāo)的邊界框的置信度誤差項(xiàng)。而最后一項(xiàng)是包含目標(biāo)的單元格的分類誤差項(xiàng), 指的是第i個單元格存在目標(biāo)。
NMS算法(非極大值抑制算法):選擇得分(Confidence Score)最高的作為輸出,與該輸出重疊的 去掉,不斷重復(fù)這一過程直到所有備選處理完。
YOLO的NMS算法中, Confidence Score的值如下: , 。 代表著某個對象 存在于第j個邊界框的可能性。每個網(wǎng)格有:20個對象的概率*2個邊界框的置信度,共40個得分。49個網(wǎng)格共1960個得分。對每種對象分別進(jìn)行NMS,那么每種對象有1960/20=98個得分。
YOLO算法的NMS步驟如下:
1)設(shè)置一個Score的閾值,低于該閾值的候選對象排除掉(將該Score設(shè)為0)
2)遍歷每一個對象類別
2.1)遍歷該對象的98個得分
2.1.1)找到Score最大的那個對象及其邊界框,添加到輸出列表
2.1.2)對每個Score不為0的候選對象,計(jì)算其與上面2.1.1輸出對象的邊界框的IOU
2.1.3)根據(jù)預(yù)先設(shè)置的IOU閾值,所有高于該閾值(重疊度較高)的候選對象排除掉(將Score設(shè)為0)
2.1.4)如果所有邊界框要么在輸出列表中,要么Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象
3)輸出列表即為預(yù)測的對象
這篇長文詳細(xì)介紹了Yolo算法的原理及實(shí)現(xiàn),當(dāng)然Yolo-v1還是有很多問題的,所以后續(xù)可以讀讀Yolo9000算法,看看其如何改進(jìn)的。
二、YOLOv5 detect 推理測試(沒有檢測框)
Nvidia RTX 3060
Ubuntu 16.04
CUDA 11.1
cuDNN 8.2.0
torch 1.10.1+cu111
torchvision 0.11.2+cu111
YOLOv5搭建及訓(xùn)練自己的數(shù)據(jù)集,請參考另一篇文章: https://www.jianshu.com/p/b3fa74f6c27b
訓(xùn)練完畢會得到 best.pt 和 last.pt 的權(quán)重文件,權(quán)重文件在 /run/train/exp/weights 下
以YOLOv5 v6.0版本為例,先使用原始權(quán)重文件及項(xiàng)目提供的原始圖片進(jìn)行detect推理一下,可以修改detect.py文件
可以先使用命令查看一下正確指令
然后,使用命令
運(yùn)行結(jié)果將被保存在 /run/detect文件夾下
detect結(jié)果如下:
detect結(jié)果除了有標(biāo)注的圖片外,還有一個文件夾記錄檢測框的信息:
可以根據(jù)上述自行修改,對自己的項(xiàng)目進(jìn)行detect。
我在detect的時候,一直沒有檢測框,找了一天bug,原來是命令寫錯了,兩行心酸淚==
一定按照 python detect.py -h 寫,不然對圖片不做任何修改
三、目標(biāo)檢測算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)
深度學(xué)習(xí)目前已經(jīng)應(yīng)用到了各個領(lǐng)域,應(yīng)用場景大體分為三類:物體識別,目標(biāo)檢測,自然語言處理。 目標(biāo)檢測可以理解為是物體識別和物體定位的綜合 ,不僅僅要識別出物體屬于哪個分類,更重要的是得到物體在圖片中的具體位置。
2014年R-CNN算法被提出,基本奠定了two-stage方式在目標(biāo)檢測領(lǐng)域的應(yīng)用。它的算法結(jié)構(gòu)如下圖
算法步驟如下:
R-CNN較傳統(tǒng)的目標(biāo)檢測算法獲得了50%的性能提升,在使用VGG-16模型作為物體識別模型情況下,在voc2007數(shù)據(jù)集上可以取得66%的準(zhǔn)確率,已經(jīng)算還不錯的一個成績了。其最大的問題是速度很慢,內(nèi)存占用量很大,主要原因有兩個
針對R-CNN的部分問題,2015年微軟提出了Fast R-CNN算法,它主要優(yōu)化了兩個問題。
R-CNN和fast R-CNN均存在一個問題,那就是 由選擇性搜索來生成候選框,這個算法很慢 。而且R-CNN中生成的2000個左右的候選框全部需要經(jīng)過一次卷積神經(jīng)網(wǎng)絡(luò),也就是需要經(jīng)過2000次左右的CNN網(wǎng)絡(luò),這個是十分耗時的(fast R-CNN已經(jīng)做了改進(jìn),只需要對整圖經(jīng)過一次CNN網(wǎng)絡(luò))。這也是導(dǎo)致這兩個算法檢測速度較慢的最主要原因。
faster R-CNN 針對這個問題, 提出了RPN網(wǎng)絡(luò)來進(jìn)行候選框的獲取,從而擺脫了選擇性搜索算法,也只需要一次卷積層操作,從而大大提高了識別速度 。這個算法十分復(fù)雜,我們會詳細(xì)分析。它的基本結(jié)構(gòu)如下圖
主要分為四個步驟:
使用VGG-16卷積模型的網(wǎng)絡(luò)結(jié)構(gòu):
卷積層采用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然后經(jīng)過13個conv-relu層,其中會穿插4個max-pooling層。所有的卷積的kernel都是3x3的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。
MxN的圖片,經(jīng)過卷積層后,變?yōu)榱?M/16) x (N/16)的feature map了。
faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經(jīng)過3x3的卷積運(yùn)算,然后分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然后softmax來判斷是前景還是背景,然后reshape恢復(fù)為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實(shí)現(xiàn),后面再詳細(xì)講。兩路計(jì)算結(jié)束后,挑選出前景候選框(因?yàn)槲矬w在前景中),并利用計(jì)算得到的候選框位置,得到我們感興趣的特征子圖proposal。
卷積層提取原始圖像信息,得到了256個feature map,經(jīng)過RPN層的3x3卷積后,仍然為256個feature map。但是每個點(diǎn)融合了周圍3x3的空間信息。對每個feature map上的一個點(diǎn),生成k個anchor(k默認(rèn)為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機(jī)還是汽車,只用區(qū)分它是前景還是背景即可)。anchor有[x,y,w,h]四個坐標(biāo)偏移量,x,y表示中心點(diǎn)坐標(biāo),w和h表示寬度和高度。這樣,對于feature map上的每個點(diǎn),就得到了k個大小形狀各不相同的選區(qū)region。
對于生成的anchors,我們首先要判斷它是前景還是背景。由于感興趣的物體位于前景中,故經(jīng)過這一步之后,我們就可以舍棄背景anchors了。大部分的anchors都是屬于背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計(jì)算量。
對于經(jīng)過了3x3的卷積后得到的256個feature map,先經(jīng)過1x1的卷積,變換為18個feature map。然后reshape為一維向量,經(jīng)過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數(shù)據(jù)可以進(jìn)行softmax計(jì)算。然后輸出識別得到的前景anchors。
另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標(biāo)值。如下圖所示,紅色代表我們當(dāng)前的選區(qū),綠色代表真實(shí)的選區(qū)。雖然我們當(dāng)前的選取能夠大概框選出飛機(jī),但離綠色的真實(shí)位置和形狀還是有很大差別,故需要對生成的anchors進(jìn)行調(diào)整。這個過程我們稱為bounding box regression。
假設(shè)紅色框的坐標(biāo)為[x,y,w,h], 綠色框,也就是目標(biāo)框的坐標(biāo)為[Gx, Gy,Gw,Gh], 我們要建立一個變換,使得[x,y,w,h]能夠變?yōu)閇Gx, Gy,Gw,Gh]。最簡單的思路是,先做平移,使得中心點(diǎn)接近,然后進(jìn)行縮放,使得w和h接近。如下:
我們要學(xué)習(xí)的就是dx dy dw dh這四個變換。由于是線性變換,我們可以用線性回歸來建模。設(shè)定loss和優(yōu)化方法后,就可以利用深度學(xué)習(xí)進(jìn)行訓(xùn)練,并得到模型了。對于空間位置loss,我們一般采用均方差算法,而不是交叉熵(交叉熵使用在分類預(yù)測中)。優(yōu)化方法可以采用自適應(yīng)梯度下降算法Adam。
得到了前景anchors,并確定了他們的位置和形狀后,我們就可以輸出前景的特征子圖proposal了。步驟如下:
1,得到前景anchors和他們的[x y w h]坐標(biāo)。
2,按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個anchors,比如前6000個
3,剔除非常小的anchors。
4,通過NMS非極大值抑制,從anchors中找出置信度較高的。這個主要是為了解決選取交疊問題。首先計(jì)算每一個選區(qū)面積,然后根據(jù)他們在softmax中的score(也就是是否為前景的概率)進(jìn)行排序,將score最大的選區(qū)放入隊(duì)列中。接下來,計(jì)算其余選區(qū)與當(dāng)前最大score選區(qū)的IOU(IOU為兩box交集面積除以兩box并集面積,它衡量了兩個box之間重疊程度)。去除IOU大于設(shè)定閾值的選區(qū)。這樣就解決了選區(qū)重疊問題。
5,選取前post_nms_topN個結(jié)果作為最終選區(qū)proposal進(jìn)行輸出,比如300個。
經(jīng)過這一步之后,物體定位應(yīng)該就基本結(jié)束了,剩下的就是物體識別了。
和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導(dǎo)致沒法做全連接。全連接計(jì)算只能對確定的shape進(jìn)行運(yùn)算,故必須使proposal大小形狀變?yōu)橄嗤?。通過裁剪和縮放的手段,可以解決這個問題,但會帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個問題。
ROI pooling中,如果目標(biāo)輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特征圖。
ROI Pooling層后的特征圖,通過全連接層與softmax,就可以計(jì)算屬于哪個具體類別,比如人,狗,飛機(jī),并可以得到cls_prob概率向量。同時再次利用bounding box regression精細(xì)調(diào)整proposal位置,得到bbox_pred,用于回歸更加精確的目標(biāo)檢測框。
這樣就完成了faster R-CNN的整個過程了。算法還是相當(dāng)復(fù)雜的,對于每個細(xì)節(jié)需要反復(fù)理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數(shù)據(jù)集上可以達(dá)到83.8%的準(zhǔn)確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達(dá)不到實(shí)時性要求。
針對于two-stage目標(biāo)檢測算法普遍存在的運(yùn)算速度慢的缺點(diǎn), yolo創(chuàng)造性的提出了one-stage。也就是將物體分類和物體定位在一個步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實(shí)現(xiàn)one-stage。通過這種方式, yolo可實(shí)現(xiàn)45幀每秒的運(yùn)算速度,完全能滿足實(shí)時性要求 (達(dá)到24幀每秒,人眼就認(rèn)為是連續(xù)的)。它的網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
主要分為三個部分:卷積層,目標(biāo)檢測層,NMS篩選層。
采用Google inceptionV1網(wǎng)絡(luò),對應(yīng)到上圖中的第一個階段,共20層。這一層主要是進(jìn)行特征提取,從而提高模型泛化能力。但作者對inceptionV1進(jìn)行了改造,他沒有使用inception module結(jié)構(gòu),而是用一個1x1的卷積,并聯(lián)一個3x3的卷積來替代。(可以認(rèn)為只使用了inception module中的一個分支,應(yīng)該是為了簡化網(wǎng)絡(luò)結(jié)構(gòu))
先經(jīng)過4個卷積層和2個全連接層,最后生成7x7x30的輸出。先經(jīng)過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個網(wǎng)格,每個網(wǎng)格要預(yù)測兩個bounding box的坐標(biāo)(x,y,w,h)和box內(nèi)包含物體的置信度confidence,以及物體屬于20類別中每一類的概率(yolo的訓(xùn)練數(shù)據(jù)為voc2012,它是一個20分類的數(shù)據(jù)集)。所以一個網(wǎng)格對應(yīng)的參數(shù)為(4x2+2+20) = 30。如下圖
其中前一項(xiàng)表示有無人工標(biāo)記的物體落入了網(wǎng)格內(nèi),如果有則為1,否則為0。第二項(xiàng)代表bounding box和真實(shí)標(biāo)記的box之間的重合度。它等于兩個box面積交集,除以面積并集。值越大則box越接近真實(shí)位置。
分類信息: yolo的目標(biāo)訓(xùn)練集為voc2012,它是一個20分類的目標(biāo)檢測數(shù)據(jù)集 。常用目標(biāo)檢測數(shù)據(jù)集如下表:
| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每個網(wǎng)格還需要預(yù)測它屬于20分類中每一個類別的概率。分類信息是針對每個網(wǎng)格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內(nèi)是否有物體,而不需要預(yù)測物體是20分類中的哪一個,故只需要2個參數(shù)。雖然分類信息和confidence都是概率,但表達(dá)含義完全不同。
篩選層是為了在多個結(jié)果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低于閾值的box,對剩下的box進(jìn)行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體算法可以回顧上面faster R-CNN小節(jié))。這樣就得到了最終的最合適的幾個box和他們的類別。
yolo的損失函數(shù)包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:
誤差均采用了均方差算法,其實(shí)我認(rèn)為,位置誤差應(yīng)該采用均方差算法,而分類誤差應(yīng)該采用交叉熵。由于物體位置只有4個參數(shù),而類別有20個參數(shù),他們的累加和不同。如果賦予相同的權(quán)重,顯然不合理。故yolo中位置誤差權(quán)重為5,類別誤差權(quán)重為1。由于我們不是特別關(guān)心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權(quán)重為0.5,包含物體的權(quán)重則為1。
Faster R-CNN準(zhǔn)確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但準(zhǔn)確率和漏檢率不盡人意。SSD綜合了他們的優(yōu)缺點(diǎn),對輸入300x300的圖像,在voc2007數(shù)據(jù)集上test,能夠達(dá)到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。
SSD網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
和yolo一樣,也分為三部分:卷積層,目標(biāo)檢測層和NMS篩選層
SSD論文采用了VGG16的基礎(chǔ)網(wǎng)絡(luò),其實(shí)這也是幾乎所有目標(biāo)檢測神經(jīng)網(wǎng)絡(luò)的慣用方法。先用一個CNN網(wǎng)絡(luò)來提取特征,然后再進(jìn)行后續(xù)的目標(biāo)定位和目標(biāo)分類識別。
這一層由5個卷積層和一個平均池化層組成。去掉了最后的全連接層。SSD認(rèn)為目標(biāo)檢測中的物體,只與周圍信息相關(guān),它的感受野不是全局的,故沒必要也不應(yīng)該做全連接。SSD的特點(diǎn)如下。
每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進(jìn)行目標(biāo)位置和類別的訓(xùn)練和預(yù)測,從而達(dá)到 多尺度檢測 的目的,可以克服yolo對于寬高比不常見的物體,識別準(zhǔn)確率較低的問題。而yolo中,只在最后一個卷積層上做目標(biāo)位置和類別的訓(xùn)練和預(yù)測。這是SSD相對于yolo能提高準(zhǔn)確率的一個關(guān)鍵所在。
如上所示,在每個卷積層上都會進(jìn)行目標(biāo)檢測和分類,最后由NMS進(jìn)行篩選,輸出最終的結(jié)果。多尺度feature map上做目標(biāo)檢測,就相當(dāng)于多了很多寬高比例的bounding box,可以大大提高泛化能力。
和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點(diǎn)對應(yīng)為原圖的一個區(qū)域的中心點(diǎn)。以這個點(diǎn)為中心,構(gòu)造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應(yīng)4個位置參數(shù)(x,y,w,h)和21個類別概率(voc訓(xùn)練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:
另外,在訓(xùn)練階段,SSD將正負(fù)樣本比例定位1:3。訓(xùn)練集給定了輸入圖像以及每個物體的真實(shí)區(qū)域(ground true box),將default box和真實(shí)box最接近的選為正樣本。然后在剩下的default box中選擇任意一個與真實(shí)box IOU大于0.5的,作為正樣本。而其他的則作為負(fù)樣本。由于絕大部分的box為負(fù)樣本,會導(dǎo)致正負(fù)失衡,故根據(jù)每個box類別概率排序,使正負(fù)比例保持在1:3。SSD認(rèn)為這個策略提高了4%的準(zhǔn)確率
另外,SSD采用了數(shù)據(jù)增強(qiáng)。生成與目標(biāo)物體真實(shí)box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機(jī)選取這些patch參與訓(xùn)練,并對他們進(jìn)行隨機(jī)水平翻轉(zhuǎn)等操作。SSD認(rèn)為這個策略提高了8.8%的準(zhǔn)確率。
和yolo的篩選層基本一致,同樣先過濾掉類別概率低于閾值的default box,再采用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標(biāo)檢測輸出的default box。
SSD基本已經(jīng)可以滿足我們手機(jī)端上實(shí)時物體檢測需求了,TensorFlow在Android上的目標(biāo)檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD算法實(shí)現(xiàn)的。它的基礎(chǔ)卷積網(wǎng)絡(luò)采用的是mobileNet,適合在終端上部署和運(yùn)行。
針對yolo準(zhǔn)確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結(jié)合SSD的特點(diǎn),提出了yoloV2。它主要還是采用了yolo的網(wǎng)絡(luò)結(jié)構(gòu),在其基礎(chǔ)上做了一些優(yōu)化和改進(jìn),如下
網(wǎng)絡(luò)采用DarkNet-19:19層,里面包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結(jié)構(gòu)如下
yolo和yoloV2只能識別20類物體,為了優(yōu)化這個問題,提出了yolo9000,可以識別9000類物體。它在yoloV2基礎(chǔ)上,進(jìn)行了imageNet和coco的聯(lián)合訓(xùn)練。這種方式充分利用imageNet可以識別1000類物體和coco可以進(jìn)行目標(biāo)位置檢測的優(yōu)點(diǎn)。當(dāng)使用imageNet訓(xùn)練時,只更新物體分類相關(guān)的參數(shù)。而使用coco時,則更新全部所有參數(shù)。
YOLOv3可以說出來直接吊打一切圖像檢測算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)準(zhǔn)確率更高或相仿,速度是其1/3.。
YOLOv3的改動主要有如下幾點(diǎn):
不過如果要求更精準(zhǔn)的預(yù)測邊框,采用COCO AP做評估標(biāo)準(zhǔn)的話,YOLO3在精確率上的表現(xiàn)就弱了一些。如下圖所示。
當(dāng)前目標(biāo)檢測模型算法也是層出不窮。在two-stage領(lǐng)域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,將對抗學(xué)習(xí)引入到目標(biāo)檢測領(lǐng)域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。
one-stage領(lǐng)域也是百花齊放,2017年首爾大學(xué)提出 R-SSD 算法,主要解決小尺寸物體檢測效果差的問題。清華大學(xué)提出了 RON 算法,結(jié)合 two stage 名的方法和 one stage 方法的優(yōu)勢,更加關(guān)注多尺度對象定位和負(fù)空間樣本挖掘問題。
目標(biāo)檢測領(lǐng)域的深度學(xué)習(xí)算法,需要進(jìn)行目標(biāo)定位和物體識別,算法相對來說還是很復(fù)雜的。當(dāng)前各種新算法也是層不出窮,但模型之間有很強(qiáng)的延續(xù)性,大部分模型算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經(jīng)典模型的特點(diǎn),這些tricks是為了解決什么問題,以及為什么解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標(biāo)檢測領(lǐng)域主要的難點(diǎn)如下:
一文讀懂目標(biāo)檢測AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2
從YOLOv1到v3的進(jìn)化之路
SSD-Tensorflow超詳細(xì)解析【一】:加載模型對圖片進(jìn)行測試 https://blog.csdn.net/k87974/article/details/80606407
YOLO https://pjreddie.com/darknet/yolo/ https://github.com/pjreddie/darknet
C#項(xiàng)目參考:https://github.com/AlturosDestinations/Alturos.Yolo
項(xiàng)目實(shí)踐貼個圖。
四、yolov5ds使用了什么神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)。
當(dāng)下YOLO最新的卷積神經(jīng)網(wǎng)絡(luò)YOLOv5是完全基于PyTorch實(shí)現(xiàn)的,現(xiàn)版本的YOLOv5每個圖像的推理時間最快0.007秒,即每秒140幀(FPS),但YOLOv5的權(quán)重文件大小只有YOLOv4的1/9。
以上就是關(guān)于yolov5數(shù)據(jù)集劃分比例相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
國內(nèi)如何打開youtube(國內(nèi)如何打開推特)
youtube注冊中國號碼無法驗(yàn)證(youtube中國號碼不能驗(yàn)證)
無錫住宅景觀設(shè)計(jì)公司(無錫住宅景觀設(shè)計(jì)公司有哪些)
猜你喜歡
廣告推廣費(fèi)用一般多少(廣告推廣費(fèi)用一般多少合適)
表格怎么設(shè)置男女自動選(從身份證號碼中提取性別公式)
淘寶運(yùn)營提成一般多少(淘寶運(yùn)營提成一般多少)
全國百度代辦開戶(全國百度代辦開戶有風(fēng)險(xiǎn)嗎)
谷歌GoogleChrome(谷歌googlechrome瀏覽器官方下載)
查詢優(yōu)化策略中正確的策略是(查詢優(yōu)化策略中正確的策略是什么)
百度官方認(rèn)證標(biāo)志(百度官方認(rèn)證標(biāo)志需要開通百度推廣嗎)