使用 YOLO 進(jìn)行目標(biāo)檢測(cè)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
自從世界了解人工智能以來,有一個(gè)特別的用例已經(jīng)被討論了很多。它們是自動(dòng)駕駛汽車。我們經(jīng)常在科幻電影中聽到、讀到甚至看到這些。有人說,我們將在2010年擁有自動(dòng)駕駛汽車,有人說到2020年,但我們?cè)?021年就實(shí)現(xiàn)了,我們剛剛能夠解決自動(dòng)駕駛汽車給世界帶來的變化的一角。自動(dòng)駕駛汽車的一個(gè)基本特性,對(duì)象檢測(cè)。
物體檢測(cè)——顧名思義就是通過深度學(xué)習(xí)算法檢測(cè)圖像或視頻中的物體。目標(biāo)檢測(cè)的目的是識(shí)別和定位場(chǎng)景中所有已知的目標(biāo)。有了這種識(shí)別和定位,目標(biāo)檢測(cè)可以用來計(jì)數(shù)場(chǎng)景中的目標(biāo),確定和跟蹤它們的精確位置,同時(shí)精確地標(biāo)記它們。
目標(biāo)檢測(cè)通常與圖像識(shí)別相混淆,所以在我們繼續(xù)之前,澄清它們之間的區(qū)別是重要的。
圖像識(shí)別為圖像分配一個(gè)標(biāo)簽。狗的圖片會(huì)被貼上“狗”的標(biāo)簽。兩只狗的照片仍然會(huì)被貼上“狗”的標(biāo)簽。另一方面,對(duì)象檢測(cè)在每只狗周圍畫一個(gè)盒子,并給這個(gè)盒子貼上“狗”的標(biāo)簽。模型預(yù)測(cè)每個(gè)對(duì)象在哪里以及應(yīng)該應(yīng)用什么標(biāo)簽。通過這種方式,目標(biāo)檢測(cè)比識(shí)別提供了更多關(guān)于圖像的信息。

物體檢測(cè)與圖像識(shí)別和圖像分割等其他類似的計(jì)算機(jī)視覺技術(shù)密不可分,因?yàn)樗兄谖覀兝斫夂头治鰣D像或視頻中的場(chǎng)景。
鑒于這些關(guān)鍵的區(qū)別和物體檢測(cè)的獨(dú)特能力,我們可以看到為什么它可以在日常使用優(yōu)勢(shì)的多種方式中應(yīng)用,一些常見的例子是自動(dòng)駕駛汽車,人臉檢測(cè),交通調(diào)節(jié),視頻監(jiān)控,人群計(jì)數(shù),異常檢測(cè)等。
在這個(gè)項(xiàng)目中,我們使用了VOC2012數(shù)據(jù)集。VOC代表2012年視覺物體分類挑戰(zhàn)賽。這個(gè)數(shù)據(jù)集包含了來自PASCAL視覺對(duì)象分類挑戰(zhàn)的數(shù)據(jù),對(duì)應(yīng)于分類和檢測(cè)比賽。所提供的訓(xùn)練數(shù)據(jù)由一組圖像組成;每個(gè)圖像都有一個(gè)注釋文件,為圖像中20個(gè)類中的每個(gè)對(duì)象提供一個(gè)邊界框和對(duì)象類標(biāo)簽。有17125幅圖像可供訓(xùn)練。數(shù)據(jù)的大小大約為2GB。
我們使用YOLO(你只看一次)算法進(jìn)行對(duì)象檢測(cè)。YOLO是一個(gè)聰明的卷積神經(jīng)網(wǎng)絡(luò)(CNN),用于實(shí)時(shí)進(jìn)行目標(biāo)檢測(cè)。該算法將單個(gè)神經(jīng)網(wǎng)絡(luò)應(yīng)用于完整的圖像,然后將圖像劃分為多個(gè)區(qū)域,并預(yù)測(cè)每個(gè)區(qū)域的邊界框和概率。這些邊界框是由預(yù)測(cè)的概率加權(quán)的。要理解YOLO,我們首先要分別理解這兩個(gè)模型。
YOLO算法- YOLO算法是一種基于回歸的算法,它不是選擇圖像中有趣的部分,而是預(yù)測(cè)整個(gè)圖像中的類和包圍框運(yùn)行一次算法。要理解YOLO算法,我們首先需要了解實(shí)際預(yù)測(cè)的是什么。最終,我們的目標(biāo)是預(yù)測(cè)一類對(duì)象和指定對(duì)象位置的邊界框。每個(gè)包圍框可以用四個(gè)描述符來描述:
●矩形x中央(bx, by)
●寬度(bw)
●高度(bh)
●對(duì)象的類
YOLO不會(huì)在輸入圖像中搜索可能包含對(duì)象的感興趣區(qū)域,而是將圖像分割成單元格,通常是19×19網(wǎng)格。每個(gè)細(xì)胞負(fù)責(zé)預(yù)測(cè)K個(gè)包圍框。具有最大概率的類被選擇并分配給特定的網(wǎng)格單元。類似的過程發(fā)生在圖像中的所有網(wǎng)格單元格上。
在預(yù)測(cè)類概率后,下一步進(jìn)行非最大抑制,這有助于算法消除不必要的錨點(diǎn)。
一旦完成,算法就會(huì)找到具有下一個(gè)最高類別概率的包圍框,并進(jìn)行相同的過程,直到我們剩下所有不同的包圍框?yàn)橹埂?/p>
在此之后,我們幾乎完成了所有的工作,算法最終輸出所需的向量,顯示各個(gè)類的包圍框的細(xì)節(jié)。
微小Yolo算法——為了讓Yolo運(yùn)行得更快,Redmon等人(Yolo的創(chuàng)建者)定義了Yolo架構(gòu)的一個(gè)變體,稱為微小Yolo。
YOLOv3(和v3)根據(jù)一組預(yù)定的盒(具有特定的高寬比)預(yù)測(cè)偏移量——這些預(yù)定的包圍框就是錨盒。我們?cè)O(shè)置了一個(gè)條件如果這些包圍框的長(zhǎng)度是6而不是YOLO算法我們就會(huì)實(shí)現(xiàn)Tiny YOLO模型
1.它從文件的注釋開始,這基本上意味著在文本文件中有圖像的所有路徑并使用它讀取數(shù)據(jù)。
2.我們從網(wǎng)上下載Yolov3權(quán)重。然后我們將Darknet YOLO模型轉(zhuǎn)換為Keras模型。然后實(shí)現(xiàn)目標(biāo)檢測(cè)。
3.從頭開始實(shí)現(xiàn)它是一個(gè)具有挑戰(zhàn)性的模型,特別是對(duì)于初學(xué)者,因?yàn)樗枰_發(fā)許多定制的模型元素來進(jìn)行訓(xùn)練和預(yù)測(cè)。例如,即使直接使用預(yù)先訓(xùn)練好的模型,也需要復(fù)雜的代碼來提取和解釋模型輸出的預(yù)測(cè)邊界框。
4.我們訓(xùn)練這個(gè)模型并添加模型檢查點(diǎn)、降低學(xué)習(xí)率、提前停止和張量板。然后我們訓(xùn)練我們的模型與凍結(jié)層首先得到一個(gè)穩(wěn)定的損失和Adam Optimizer編譯,并節(jié)省權(quán)重。
5.凍結(jié)一層也是一種通過逐步凍結(jié)隱藏層來加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的技術(shù)。在神經(jīng)網(wǎng)絡(luò)的背景下凍結(jié)一層是關(guān)于控制權(quán)值更新的方式。當(dāng)一個(gè)層被凍結(jié)時(shí),這意味著權(quán)重不能被進(jìn)一步修改。
6.完成以上動(dòng)作后,繼續(xù)訓(xùn)練模型。這基本上是對(duì)模型進(jìn)行微調(diào)。為了應(yīng)用這個(gè)更改,我們使用Adam Optimizer重新編譯模型。然后再裝一次,然后節(jié)省重量。模型訓(xùn)練在這里完成。
7.要將這個(gè)模型應(yīng)用于視頻/圖像,我們將輸入和輸出視頻路徑的路徑作為參數(shù),然后加載模型并傳遞配置的路徑和權(quán)重。然后,我們使用Cv2視頻捕獲指向輸出視頻文件,并確定視頻中的幀數(shù)。從輸入幀構(gòu)造一個(gè)blob,然后執(zhí)行YOLO對(duì)象檢測(cè)器的前向傳遞,最后給出邊界框
8.執(zhí)行這一切我們最后遍歷輸出層和每個(gè)檢測(cè)在每個(gè)輸出后我們添加邊框,定義其動(dòng)態(tài)形狀,根據(jù)對(duì)象的大小,過濾掉弱概率,應(yīng)用non-maxima抑制抑制弱,重疊邊界框,并確保至少一個(gè)檢測(cè)存在。最后繪制一個(gè)邊界框矩形并在框架上進(jìn)行標(biāo)記,并將輸出框架寫入磁盤。
最后,是我們的測(cè)試,可以看出進(jìn)行了有效檢測(cè)。

輸入視頻截圖

輸出視頻截圖
我們?cè)谶@個(gè)項(xiàng)目中探索的下一步是將其作為一個(gè)web應(yīng)用程序部署。我們目前面臨的主要限制是沒有足夠的RAM和空間來在云上托管它。但是,也許使用更輕的模型,我們會(huì)嘗試,同時(shí)也有這個(gè)實(shí)時(shí)應(yīng)用。
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

