YOLO 的“數(shù)學”實現(xiàn)
共 2847字,需瀏覽 6分鐘
·
2024-07-28 10:05
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
YOLO(You Only Look Once)是一個標志性的目標檢測模型,可以快速分類并定位圖像中的多個對象。本文總結(jié)了YOLO模型中所有關(guān)鍵的數(shù)學操作。
第一步:定義輸入
要使用YOLO模型,首先必須將RGB圖像轉(zhuǎn)換為448 x 448 x 3的張量。
我們將使用簡化的5 x 5 x 1張量,這樣數(shù)學計算會更簡潔一些。
第二步:層歸一化
神經(jīng)網(wǎng)絡通常在歸一化數(shù)據(jù)上表現(xiàn)更好。我們可以通過首先計算矩陣中的平均值(μ)來歸一化輸入。
接下來,可以計算所有元素與平均值的絕對差值。
然后,可以通過對前一部分的結(jié)果中的所有值進行平方,將它們相加,除以值的數(shù)量,并計算平方根來計算標準差。
一旦計算出標準差,可以通過減去均值并除以標準差來對輸入進行層歸一化。
均值和標準差可用于歸一化輸入值。均值是輸入圖像的平均值,標準差是原始圖像中值的分布寬度。通過減去均值并除以標準差,我們“歸一化”了圖像。
注意:我們計算了層歸一化。原始的YOLO論文使用批歸一化,它在一個批次的不同圖像之間歸一化相同的值。這兩者之間的概念差異可以忽略不計。
第三步:卷積
現(xiàn)在我們的輸入已經(jīng)歸一化,我們將其通過卷積網(wǎng)絡。我們將YOLO理想化為具有兩個內(nèi)核的單卷積層。
為了確保輸出張量具有與輸入相同的空間維度,我們在歸一化輸入上應用0填充。
然后可以通過元素乘法(⊙)和累加求和(Σ)將兩個內(nèi)核卷積到圖像上。
在輸入上卷積兩個內(nèi)核后,我們得到兩個大小相等的數(shù)組。通常將其表示為3D張量,不同的內(nèi)核存在于稱為“過濾器”或“內(nèi)核”維度的維度中。
第四步:最大池化
現(xiàn)在我們對輸入進行了卷積,可以應用最大池化。在此示例中,我們用2 x 2的窗口和步幅為2對每個卷積矩陣進行最大池化。我們也最大池化部分區(qū)域。在這種情況下,我使用了一個實現(xiàn)最大池化的函數(shù),如果所有值都為負,則將值設置為零。實際上,我認為這幾乎沒有影響。
最大池化觀察輸入的一個子集,并只保留每個子集的最大值。
第五步:非線性激活
幾乎所有的機器學習模型,包括YOLO,都在模型中使用非線性“激活函數(shù)”。由于之前所有的數(shù)學運算都是線性的(乘法和加法),所以之前的步驟只能模擬線性關(guān)系。添加一個將模型中的值非線性映射的函數(shù),可以讓模型學習非線性關(guān)系。在此示例中,我們使用sigmoid激活函數(shù),但ReLU更為常見。
注意:在最大池化之后應用激活函數(shù)效率更高一些。
這個函數(shù)可以按元素應用于所有最大池化的矩陣。
第六步:展平
現(xiàn)在輸入圖像已經(jīng)被過濾成一個更適合最終建模任務的抽象表示(實際上是通過幾個卷積層,而不是本示例中的一個卷積層),可以通過展平將其轉(zhuǎn)換為一個向量。
第七步:輸出投影
可以使用一個密集網(wǎng)絡(即矩陣乘法)將展平的矩陣投影到最終輸出。YOLO的最終輸出包括SxSxC類預測和SxSxBx5個邊界框預測。因此,輸出的形狀必須為SxSx(C+Bx5)。假設在前一步展平的輸出長度為L,則密集網(wǎng)絡的權(quán)重矩陣形狀必須為Lx(SxSx(C+Bx5))。
在這個示例中,我們假設S為1,C為2,B為1。L是展平向量的長度,為18。因此,權(quán)重矩陣的形狀應為18 x 7。
注意:用`表示轉(zhuǎn)置矩陣。
每個網(wǎng)格單元的類概率之和應為1。因此,每個網(wǎng)格單元的預測類概率需要進行softmax。
每個兩個類概率中的一個作為e的指數(shù),這些值除以兩個值的總和作為e的指數(shù)。e是歐拉常數(shù),值為2.718,具有某些指數(shù)特性,因此在此上下文中很常用。
第八步:推理
YOLO的最終輸出(在此示例中為7元素長的向量)已經(jīng)計算完成?,F(xiàn)在我們可以使用這些值生成最終的推理。由于S=1,只有一個網(wǎng)格單元。由于B=1,只有一個邊界框。由于C=2,有兩個類預測。
YOLO預測網(wǎng)格單元(在這種情況下是整個圖像)包含一只狗。邊界框距離左墻和頂墻各50%。寬度是網(wǎng)格單元寬度的30%,高度是網(wǎng)格單元高度的70%。此外,YOLO有90%的置信度認為這是一個好的邊界框。
在一個不那么簡單的示例中,網(wǎng)格有四個單元(S=4),每個單元一個邊界框:
一個不那么簡單的輸出示例 左上和右上單元的置信度太低,因此不使用邊界框。使用了其他兩個。請注意,高度(和寬度)可以大于1,因為邊界框可以是網(wǎng)格單元高度的倍數(shù)。
結(jié)論
就這樣。在本文中,我們介紹了計算YOLO輸出的主要步驟:
定義輸入
歸一化輸入
應用卷積
應用最大池化
非線性激活
展平
投影到輸出形狀
組合我們的最終推理
下載1:OpenCV-Contrib擴展模塊中文版教程
在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺實戰(zhàn)項目52講
在「小白學視覺」公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。
下載3:OpenCV實戰(zhàn)項目20講
在「小白學視覺」公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
