YOLO 看一次就好

littlemilk
數據領航員
Published in
Sep 5, 2022

作者:https://medium.com/@07170601

YOLO簡介

YOLO(You Only Look Once)是一種基於深度神經網路的物件辨識、定位演算法。YOLO執行辨識任務的速度非常快,可實時運作。同時YOLO也在不斷發展,截至2022年2月,YOLO已經發展到YOLO v5。不過新版本是在舊版本的基礎上發展而來,所以本文的主題就關於YOLO v1。

物件辨識和定位是YOLO負責解決的問題:輸入一張圖片,輸出其中包含的物件,并且用矩形框標出並輸出物件的位置。

圖片引用自YOLO論文https://arxiv.org/pdf/1506.02640.pdf

對於物件的辨識,CNN已經給出了理想的解決方案。在YOLO被提出前,研究學者們面對的難題主要是物件的定位。

物件定位從概念上理解,無非是地毯式搜尋圖像中不同大小、不同寬高比、不同位置的區域,逐個檢測其中是否存在某個物件,挑選幾率最大的區域進行輸出。不過這個充滿傳統演算法風格的想法顯然缺乏效率。所以,在YOLO之前有人提出了RCNN、Fast RCNN、Faster RCNN這些方法。

RCNN的R代表Region。這個方法簡而言之就是先從圖片中找出一些可能存在物件的候選區域,然後對每個候選區域進行物件識別,可以大幅提升定位效率。然而這樣,速度仍然不理想(因爲候選區域還是有上千個)。後續的RCNN改進型將處理速度從RCNN的49秒一張圖片改進到Faster RCNN的0.2秒一張圖片(5FPS),但這樣仍然達不到實時處理的需求。

從流程上看,RCNN的處理分爲兩階段:先提出候選區域,再辨識候選區域中的物件。而YOLO將提出候選區域和物件辨識合二爲一。YOLO并沒有消除候選區域的概念,二十采用了預先定義的候選區域。其將圖片劃分爲7*7 = 49個grid(網格),每個grid中允許預測出2個bounding box(邊框)。這樣,我們可以理解爲YOLO有98個候選區域。

RCNN的候選區域比較密集,不過等到一些候選區域中識別出物件之後,仍然需要進行微調以接近真實的合理邊框。這個過程叫做邊框回歸。YOLO也有這個步驟。不過YOLO的設計邏輯體現出“既然要進行邊框回歸,那麽就有一個大概的範圍即可,一開始定義的候選區可以少一點。”

YOLO的設計

除去候選區域,YOLO的結構就是:卷積、池化和兩層全連接。這和普通的CNN非常相似,幾乎沒有本質區別。

圖片引用自YOLO論文https://arxiv.org/pdf/1506.02640.pdf

YOLO的輸入是原始圖像。要求是縮放到448*448的解析度。448*448*3的3代表RGB。解析度448*448的限制來自於全連接層,因爲全連接層要求有固定大小的向量輸入。YOLO的輸出則是7*7*30的Tensor。

因爲輸入圖像被劃分爲7*7的grid,所以輸出的Tensor中的7*7就對應輸入圖像中的grid。7*7*30的Tensor可以被視爲7*7個30維向量,也就是説輸入圖像中的每個grid都會輸出到一個30維向量。不過不僅僅是grid本身的信息會被映射到一個30維的向量,grid周邊的信息也會通過特定的規則編碼到向量中。

這個30維向量包含的信息則有:20個物件幾率(YOLO支援20中不同的物件)、2個bounding box的置信度、2個bounding box的位置(一個bounding box需要4個數字表示位置,2*4 = 8)。

物件的幾率視爲P(Ci|Obj),bounding box的位置記爲(Center_x,Center_y,width,height)。置信度是bounding box中存在物件的幾率*該物件實際存在的bounding box的IOU,intersection over union。

圖片引用自吳恩達的深度學習課程

當然我們的bounding box存在於預測中,但是IOU是在訓練階段計算得到的。總之,bounding box的置信度表示它是否包含物件且位置有多準確。

YOLO的訓練集構建

與圖像識別有關的深度學習項目的訓練集都比較複雜。訓練集的構建重點在於7*7*30維的Tensor。具體的構建規則如下:

1.20個物件幾率

對於輸入圖像中的每個物件,先找到其中心點。比如圖中有一條狗,狗在圖像上有中心點,中心點落在一個網格內。所以這個網格對應的30維向量中,狗的概率是1,其它物件的概率是0。所有其它48個網格的30維向量中,狗的概率都是0。這就是所謂的中心點所在的網格對預測該對象負責。狗和其它物件,比如汽車的分類幾率也是同樣的方法填寫。

2.2個bounding box的位置

訓練樣本的bounding box位置應該填寫物件實際的bounding box,但一個物件對應了2個bounding box,該填哪一個呢?根據之前的討論,這需要根據網路輸出的bounding box與物件實際bounding box的IOU來選擇,所以要在訓練過程中動態決定到底填哪一個bounding box,請參考後文。

3.bounding box的置信度

IOU可以直接計算出來,就是用網路輸出的2個bounding box與物件真實bounding box一起計算出IOU。然後看2個bounding box的IOU,哪個比較大(更接近物件實際的bounding box),就由哪個bounding box來負責預測該物件是否存在,即該bounding box的Pr(Object) = 1。,同時物件真實bounding box的位置也就填入該bounding box。另一個不負責預測的bounding box的Pr(Object) = 0。總的來說就是,與物件實際bounding box最接近的那個bounding box,其Confidence = IOU。 該網格的其它bounding box的Confidence = 0。

YOLO的損失函數(Loss Function)

總而言之,這個Loss Function就是用網路輸出與樣本標籤的各項內容的誤差平方和作為一個樣本的整體誤差。 損失函數中的幾個項是與輸出的30維向量中的內容相對應的。

在實現整體功能的過程中,最主要的步驟就是如何設計Loss Function。讓標簽、坐標、Confidence這三個方面得到很好的平衡。作者簡單粗暴的全部採用了sum-squared error loss來做這件事。這個方法存其實存在問題:1.8維的localization error和20維的classification error同等重要顯然是不合理的;2.如果一個網格中沒有物件(一幅圖中這種網格很多),那麼就會將這些網格中的box的Confidence歸零,相對於數量較少的有物件的網格,這種做法是overpowering的,這會導致網路不穩定甚至發散。

YOLO的訓練

YOLO先使用ImageNet資料集對前20層卷積網路進行預訓練,然後使用完整的網路,在PASCAL VOC資料集上進行物件識別和定位的訓練和預測。

YOLO的最後一層採用線性激勵函數(因爲需要預測bounding box的位置),其它層都是Leaky ReLU。訓練中採用了drop out和資料增強(data augmentation)來防止過擬合。

在下一篇中將會有關於YOLO程式碼的内容,敬請期待。

參考

You Only Look Once: Unified, Real-Time Object Detection-https%3A//arxiv.org/pdf/1506.02640.pdf

https://zhuanlan.zhihu.com/p/32525231

--

--

littlemilk
數據領航員

東吳大學資料科學系|Machine Learning & Full Stack|數據領航員🖊深度學習|喜歡學習所有對生活有幫助的科技知識,追求用科技感動人心的時刻| Github : littlemilkwu & ✉️ : leowu0819@gmail.com