YOLO:實(shí)時目標(biāo)檢測

一瞥(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é)果

predictions.png

如果想運(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)練時的截圖

running_1
running_2



下面是你安裝過程中可能遇到的問題和解決辦法

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

或許這些信息對你有所幫助

gpu-architecture
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扒腕,更是在濱河造成了極大的恐慌绢淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘾腰,死亡現(xiàn)場離奇詭異皆的,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蹋盆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門费薄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栖雾,你說我怎么就攤上這事楞抡。” “怎么了析藕?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵召廷,是天一觀的道長。 經(jīng)常有香客問我账胧,道長竞慢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任治泥,我火速辦了婚禮筹煮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘居夹。我一直安慰自己寺谤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布吮播。 她就那樣靜靜地躺著变屁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪意狠。 梳的紋絲不亂的頭發(fā)上粟关,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音环戈,去河邊找鬼闷板。 笑死,一個胖子當(dāng)著我的面吹牛院塞,可吹牛的內(nèi)容都是我干的遮晚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拦止,長吁一口氣:“原來是場噩夢啊……” “哼县遣!你這毒婦竟也來了糜颠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萧求,失蹤者是張志新(化名)和其女友劉穎其兴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夸政,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡元旬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了守问。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匀归。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耗帕,靈堂內(nèi)的尸體忽然破棺而出穆端,到底是詐尸還是另有隱情,我是刑警寧澤兴垦,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布徙赢,位于F島的核電站,受9級特大地震影響探越,放射性物質(zhì)發(fā)生泄漏狡赐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一钦幔、第九天 我趴在偏房一處隱蔽的房頂上張望枕屉。 院中可真熱鬧,春花似錦鲤氢、人聲如沸搀擂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哨颂。三九已至,卻和暖如春相种,著一層夾襖步出監(jiān)牢的瞬間威恼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工寝并, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箫措,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓衬潦,卻偏偏與公主長得像斤蔓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镀岛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容