一瞥(You Only Look Once, YOLO)招刨,是檢測Pascal VOC?2012數(shù)據(jù)集內(nèi)對象/目標(biāo)的系統(tǒng)挡鞍,能夠檢測出20種Pascal對象:
人person
鳥bird夯膀、貓cat出爹、牛cow祷膳、狗dog丘喻、馬horse、羊sheep
飛機(jī)aeroplane话告、自行車bicycle兼搏、船boat、巴士bus沙郭、汽車car佛呻、摩托車motorbike、火車train
瓶子bottle病线、椅子chair吓著、餐桌dining table、盆景potted plant送挑、沙發(fā)sofa绑莺、顯示器tv/monitor
補(bǔ)充 :有的同學(xué)報告說數(shù)據(jù)集無法下載,如果遇到這樣的問題惕耕,可以用下面的方式在terminal中下載纺裁,也可以提取鏈接在瀏覽器或迅雷等軟件中下載。
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
YOLO由以下參與者共同完成:Santosh司澎、Ross和Ali欺缘,詳細(xì)內(nèi)容參見其paper
以下教程分為9部分(不要害怕,easy)挤安,運(yùn)行系統(tǒng)Ubuntu 14.04谚殊。OpenCV、cuda蛤铜、GPU這些依賴是可選項嫩絮,如果沒有也可以,就是慢點(diǎn)(其實(shí)是慢很多)啦昂羡。最后會添加一下官網(wǎng)教程中沒有的安裝錯誤和修改信息絮记。
本篇教程內(nèi)容全部翻譯自官網(wǎng)
1.How It Works
先前的檢測系統(tǒng)多使用分類器(classifier)或者定位器(localizer)進(jìn)行檢測任務(wù),把圖片的不同局部位置和多種尺度輸入到模型中去虐先,圖片得分較高的區(qū)域(region)作為檢測目標(biāo)怨愤。
YOLO是一個全新的方法,把一整張圖片一下子應(yīng)用到一個神經(jīng)網(wǎng)絡(luò)中去蛹批。網(wǎng)絡(luò)把圖片分成不同的區(qū)域撰洗,然后給出每個區(qū)域的邊框預(yù)測和概率篮愉,并依據(jù)概率大小對所有邊框分配權(quán)重。最后差导,設(shè)置閾值试躏,只輸出得分(概率值)超過閾值的檢測結(jié)果。
我們的模型相比于基于分類器的模型有一些優(yōu)勢设褐,在測試階段颠蕴,整張圖片一次輸入到模型中,所以預(yù)測結(jié)果結(jié)合了圖片的全局信息助析。同時犀被,模型只是用一次網(wǎng)絡(luò)計算來做預(yù)測,而在R-CNN中一張圖片就需要進(jìn)行上千次的網(wǎng)絡(luò)計算外冀!所以YOLO非彻鸭快,比R-CNN快1000倍雪隧,比Fast R-CNN快100倍西轩。整個系統(tǒng)的細(xì)節(jié)見paper
2.Detection Using A Pre-Trained Model
本節(jié)內(nèi)容會知道你如何使用YOLO預(yù)訓(xùn)練好的模型進(jìn)行目標(biāo)檢測。在這之前脑沿,你應(yīng)該安裝好DarkNet藕畔,安裝方法戳這里。
安裝好DarkNet之后捅伤,在darknet的子目錄cfg/下已經(jīng)有了一些網(wǎng)絡(luò)模型的配置文件劫流,在使用之前巫玻,需要下載好預(yù)訓(xùn)練好的權(quán)重文件yolo.weights(1.0 GB).
現(xiàn)在丛忆,使用DarkNet的yolo命令進(jìn)行一下測試吧(假設(shè)你在darknet/目錄下,自己修改好yolo.weights和image的路徑)
?./darknet yolo test cfg/yolo.cfg <path>/yolo.weights <image> ? ? ? ?
如果你沒有現(xiàn)成的圖片仍秤,不妨直接使用darknet/data/下面的某張圖片熄诡。
進(jìn)行上面的測試,Darknet會打印出檢測到的目標(biāo)對象和可信度诗力,以及耗時凰浮。使用CPU時,每張圖片耗時為6-12秒苇本,GPU版本會快袜茧,快很多。
如果安裝DarkNet的時候瓣窄,沒有使用OpenCV笛厦,上面的測試不會直接顯示出圖片結(jié)果,你需要自己手動打開predictions.png. 打開你會看到類似于下圖的預(yù)測結(jié)果
如果想運(yùn)行一次DarkNet檢測多張圖片的話俺夕,你應(yīng)該先運(yùn)行以下命令載入預(yù)訓(xùn)練模型
./darknet yolo test cfg/yolo.cfg yolo.weights ? ? ? ? ? ? ? ? ?
模型載入成功后裳凸,會提示輸入圖片路徑Enter Image Path:
鍵入類似于data/eagle.jpg的路徑贱鄙,檢測這張圖片,給出結(jié)果之后姨谷,會繼續(xù)提示Enter Image Path逗宁。注意如果你連續(xù)輸入了多張圖片,之前的結(jié)果會被下一次的檢測結(jié)果覆蓋掉梦湘,因?yàn)轭A(yù)測結(jié)果都叫predictions.jpg瞎颗。。捌议。要退出/中斷程序的話言缤,直接鍵入Ctrl-C(自己記住這個命令,后面會再用)即可禁灼。
3.A Smaller Model
上面的YOLO模型會占用很多GPU內(nèi)存管挟,方法類似,只需要調(diào)用不同的配置文件弄捕,載入相應(yīng)的權(quán)重文件即可僻孝。在這里,提供一個更小版本的模型守谓,使用yolo-small.cfg配置文件穿铆,調(diào)用yolo-small.weights(359MB),命令如下
?./darknet yolo test cfg/yolo-small.cfg yolo-small.weights ? ? ? ? ? ? ? ? ??
這個小版本的YOLO大概占用1.1GB的GPU內(nèi)存~
4.A Tiny Model,?yolo-tiny.weights(172 MB)
?./darknet yolo test cfg/yolo-tiny.cfg yolo-tiny.weights ? ? ? ? ? ? ? ? ??
占用611MB的GPU內(nèi)存斋荞,在Titan X上的速度是150 fps
5.YOLO Model Comparison
yolo.cfg荞雏,基于extraction網(wǎng)絡(luò),處理一張圖片的速度為45fps平酿,訓(xùn)練數(shù)據(jù)來源2007 train/val + 2012 train/val + 2007凤优、2012所有數(shù)據(jù)
yolo-small.cfg,全連接層變小蜈彼,占用內(nèi)存變小筑辨,50fps,訓(xùn)練數(shù)據(jù)來源2007 train/val + 2012 train/val
yolo-tiny.cfg幸逆,更加小型的網(wǎng)絡(luò)棍辕,基于DarkNet reference network,155fps还绘,數(shù)據(jù)來源2007 train/val + 2012 train/val
6.Changing The Detection Threshold
YOLO默認(rèn)返回可信度至少為0.2的檢測結(jié)果楚昭,可以通過-thres <val>參數(shù)改變可信度閾值,例如設(shè)置為0:
./darknet yolo test cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0
這將可能返回所有的檢測結(jié)果拍顷。
7.Real-Time Detection On VOC 2012
如果編譯時使用了CUDA抚太,那么預(yù)測的速度回遠(yuǎn)遠(yuǎn)超過你(手動)輸入圖片的速度。為了更快速地檢測多張圖片的內(nèi)容菇怀,應(yīng)該使用yolo的valid子程序凭舶。
首先預(yù)備好數(shù)據(jù)并生成元數(shù)據(jù)給DarkNet晌块。這里我們使用VOC2012的數(shù)據(jù)(需要注冊一個賬號才能下載),下載2012test.rar文件之后帅霜,運(yùn)行以下命令
tar xf 2012test.tar
cp VOCdevkit/VOC2012/ImageSets/Main/test.txt .
sed 's?^?'`pwd`'/VOCdevkit/VOC2012/JPEGImages/?; s?$?.jpg?'?test.txt > voc.2012.test
這些命令首先解壓數(shù)據(jù)包匆背,然后生成全路徑的測試圖像,然后把voc.2012.test移動到darknet/data子目錄下
mv voc.2012.test <path-to>/darknet/data
OKAY身冀,現(xiàn)在使用這些圖片做檢測钝尸,我們使用CUDA版本的,超級快搂根!運(yùn)行下面命令
./darknet yolo valid cfg/yolo.cfg yolo.weights
運(yùn)行上面命令后珍促,你會看到一串?dāng)?shù)字在屏幕上飛,數(shù)字表示當(dāng)前處理了多少圖片剩愧。VOC 2012 test數(shù)據(jù)集共有10991張圖片猪叙,共耗時250秒,相當(dāng)于44fps仁卷。如果你用Selective Search方法的話穴翩,要耗時6小時!相比之下锦积,咱的方法整個pipeline才耗時4分鐘芒帕,pretty cool!
預(yù)測結(jié)果在results/子目錄下,其格式為Pascal VOC要求提交的特殊格式丰介。
如果你想復(fù)現(xiàn)我們在Pascal挑戰(zhàn)賽中的結(jié)果背蟆,你得使用yolo-rescore.weights才行。
8.Real-Time Detection on a Webcam
只是簡單地跑一下測試數(shù)據(jù)集哮幢,而且看不到實(shí)時的結(jié)果带膀,真的挺無趣的。所以家浇,我們把輸入改成webcam
挖個坑本砰,后面填
9.Training YOLO
其實(shí)碴裙,你可以從頭開始訓(xùn)練YOLO钢悲,如果你想的話。你可以嘗試不同的訓(xùn)練方法舔株,設(shè)置不同的超參數(shù)莺琳,以及使用自己的數(shù)據(jù)集。咱們下面嘗試自己訓(xùn)練Pascal VOC數(shù)據(jù)集载慈。
9.1下載Pascal VOC Data
咱們先下載2007年到2012年的VOC數(shù)據(jù)惭等,下載之前,新建一個文件夾(比如VOC)存放這些數(shù)據(jù)办铡,進(jìn)入此文件夾辞做,按如下方式下載數(shù)據(jù)琳要,然后解壓。
curl -O http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
curl -O http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
curl -O http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
解壓完之后秤茅,所有數(shù)據(jù)都自動存放在VOCdevkit/子目錄下了稚补。
9.2生成VOC的標(biāo)注信息
接下來生成DarkNet訓(xùn)練所需的標(biāo)簽文件,該文件擴(kuò)展名為.txt框喳,文件內(nèi)每一行對應(yīng)一張圖片的標(biāo)注信息课幕,具體格式如下
# x y 是bbox的中心坐標(biāo),width height是bbox的寬度和高度五垮,歸一化值形式
<object-class-id> <x> <y> <width> <height>
其中的x, y, width和height是對應(yīng)圖片上的坐標(biāo)和寬乍惊、高。只要運(yùn)行一下DarkNet項目中scripts/子目錄下面的voc_label.py腳本放仗,就會自動生成VOC的標(biāo)注文件润绎。如果你沒找到這個文件,可以再重新下載一下诞挨。下載和腳本運(yùn)行方式如下
curl -O http://pjreddie.com/media/files/voc_label.py
python voc_label.py
這個腳本大概要運(yùn)行幾分鐘凡橱,運(yùn)行結(jié)束之后,你會看到多了兩個文件夾亭姥,VOCdevkit/VOC2007/labels/和VOCdevkit/VOC2012/labels/稼钩。
現(xiàn)在,你的VOC目錄下應(yīng)該是這個樣子的
ls2007_test.txt VOCdevkit2007_train.txt voc_label.py2007_val.txt VOCtest_06-Nov-2007.tar2012_train.txt VOCtrainval_06-Nov-2007.tar2012_val.txt VOCtrainval_11-May-2012.tar
其中的文本文件达罗,比如2007_test.txt坝撑,包含的內(nèi)容是VOC 2007年的test數(shù)據(jù)集標(biāo)注信息。DarkNet需要一個txt文件提供所有標(biāo)注信息粮揉,所以我們還需要把這些信息導(dǎo)入到一個txt文件中巡李。本例中,我們使用2007年的train和validation數(shù)據(jù)和2012年的train數(shù)據(jù)作為訓(xùn)練集扶认,2012年的validation數(shù)據(jù)作驗(yàn)證數(shù)據(jù)侨拦。具體使用如下命令
cat 2007_* 2012_train.txt > train.txt
OKAY,現(xiàn)在2007年的所有圖片和2012年的train數(shù)據(jù)集的圖片路徑都在train.txt文件里面了辐宾。標(biāo)注信息在下面兩個路徑中
/darknet/VOC/VOCdevkit/VOC2007/labels/?
?/darknet/VOC/VOCdevkit/VOC2012/labels/?
上面所做的就是訓(xùn)練自己的數(shù)據(jù)集之前所要準(zhǔn)備的數(shù)據(jù)信息了狱从。
9.3重定向DarkNet到Pascal數(shù)據(jù)
進(jìn)入DarkNet目錄中,src/子目錄里面有一個yolo.c文件叠纹,打開并編輯一下其中的18季研、19行(54、55行誉察?不重要与涡,自己確定)
18 char *train_images = "/your_path/VOC_train/train.txt";19 char *backup_directory = "/your_path/backup/";
其中,train_images指向的是訓(xùn)練文件,backup_directory指向的是訓(xùn)練過程中權(quán)重的備份路徑驼卖。編輯好yolo.c之后氨肌,保存,重新編譯一下DarkNet酌畜。
9.4下載預(yù)訓(xùn)練之后的卷積權(quán)重
訓(xùn)練的時候使用來自Extraction模型的卷積層權(quán)重儒飒,這個模型訓(xùn)練時用的是Imagenet數(shù)據(jù)。從這(54MB)下載這些權(quán)重檩奠。如果你想直接用Extraction模型生成這些預(yù)訓(xùn)練好的權(quán)重桩了,你得先下載預(yù)訓(xùn)練好的Extraction模型,運(yùn)行下面的命令
./darknet partial cfg/extraction.cfg extraction.weights extraction.conv.weights 25
勸告大家直接下載權(quán)重會更簡單埠戳。井誉。。
9.5訓(xùn)練
運(yùn)行下面命令開始訓(xùn)練
./darknet yolo train cfg/yolo.cfg extraction.conv.weights
運(yùn)行時整胃,屏幕會提示一下數(shù)字和任務(wù)信息颗圣。
如果你想訓(xùn)練更快些,同時降低提示信息頻率屁使,首先終止訓(xùn)練在岂,然后在cfg/yolo.cfg中修改一下第三行的信息
3 subdivisions = 2
或修改成4,或更大蛮寂,比如64蔽午。然后重新開始訓(xùn)練
9.6訓(xùn)練Checkpoints
每訓(xùn)練128000張圖片之后,DarkNet自動保存checkpoint信息到你在src/yolo.c中指定的備份路徑下酬蹋。checkpoint的文件名類似于yolo_12000.weights及老。你可以使用這些checkpoint信息重新開始訓(xùn)練,避免從頭開始范抓。
40,000次迭代之后骄恶,DarkNet會保存模型的權(quán)重,然后結(jié)束訓(xùn)練匕垫,最后的權(quán)重會以yolo.weights命名僧鲁。
恭喜,這就訓(xùn)練結(jié)束了~
Good Luck!!
上兩張訓(xùn)練時的截圖
下面是你安裝過程中可能遇到的問題和解決辦法
Q1.使用GPU=1象泵,運(yùn)行測試命令寞秃,例如
./darknet imtest data/eagle.jpg
或者
./darknet yolo demo cfg/yolo.cfg yolo.weights并鍵入圖片地址
報以下錯誤
L2 Norm: 372.007568
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)
看了看./src/cuda.c的代碼也沒發(fā)現(xiàn)啥。单芜。蜕该。
出現(xiàn)這個問題是因?yàn)镈arkNet的配置信息Makefile文件里面的GPU架構(gòu)和實(shí)際安裝的GPU不對應(yīng)。
ARCH= --gpu-architecture=compute_xx ?--gpu-code=compute_xx
經(jīng)測試洲鸠,k40m和k40顯卡應(yīng)該設(shè)置為
ARCH= --gpu-architecture=compute_35 ?--gpu-code=compute_35
tk1顯卡的設(shè)置應(yīng)該為
ARCH=--gpu-architecture=compute_20 --gpu-code=compute_20
或許這些信息對你有所幫助