# Computer vision overview > 期中報告:Transformer-based detection 相關論文 > 找一篇相關論文(找有附code 和 dataset的)報告,並想一下要如何去變化應用 > https://github.com/IDEA-Research/awesome-detection-transformer?tab=readme-ov-file > 期末: 根據期中找的論文,改良他的程式碼,去達到預期目標 ## 影像檢測 > 判斷畫面中有那些物體、出現在哪裡,並指出物體的位置 > 可分為兩大類型: 1. 定界框檢測(Bounding box detection,BB) > 會計算出一個矩形,把檢測對象包在這個矩形內。決定一個矩形大小與位置需要四個數字,如矩形的左上角和右下角座標,或矩形長、寬、中心的座標 2. 關鍵點檢測(keypoint detection) > 先定義好目標物體的關鍵點,讓model學習去找出這些點的位置 > eg. 人的keypoint可能設為頭部和主要的關節,只要找出這些位置,就可推測人的姿勢是站著、蹲著或舉手等 3. Semantic Segmentation(語意分割) > 以pixel為單位,判斷每個pixel各自屬於甚麼分類 > eg. 把同一個物體塗上同一種顏色來做區分 4. Instance Segmentation (實例分割) > 目標是把每個個體都分開識別,即便屬於同一類別也一樣要分開 5. Panoramic Segmentation (全景分割) > 同時處理Semantic Segmentation與Instance Segmentation的技術 ### Image Segmentation > 包括 Semantic Segmentation (語義分割)、Instance Segmentation (實例分割)、Panoramic Segmentation (全景分割) ![螢幕擷取畫面 2024-09-19 190132 (1)](https://hackmd.io/_uploads/SJtEBttp0.png) ![image](https://hackmd.io/_uploads/H1fE7ttpC.png) ![image](https://hackmd.io/_uploads/ryu_7tYTR.png) > semantic segmentation 語意分割: 將圖像中的所有像素點進行分類 ![image](https://hackmd.io/_uploads/SJhYQtFTA.png) > 實例分割: 是物件偵測和語義分割的結合,任務相對較難。其方法是針對感興趣的像素點進行分類,並且將各個物件定位,即使是相同類別也會分割成不同物件。由上圖可以很清楚地看到 Semantic Segmentation 及 Instance Segmentation 的差異 ### U-Net > 是一種專門用來做影像分割的神經網路。它可以把影像分成不同區域,像是醫學影像中的器官或病灶,或者衛星影像中的地形和建築。 ![image](https://hackmd.io/_uploads/rk52EtsgJg.png) ### 特色: - **U 形結構**:U-Net 的結構就像字母 U,一邊是縮小影像來抓取重要特徵,另一邊是把影像放大來重建原本的細節。 - **跳躍連接**:它會把縮小影像過程中的細節和放大過程結合起來,這樣可以更準確地分出影像中的細微部分。 ### 優勢: - **精確**:可以精細地分出影像中各部分的邊界。 - **適合少量資料**:即使訓練數據少,U-Net 也能表現得很好,這對於醫學影像特別有用。 ### 用途: - **醫學影像**:像是切割出腫瘤或器官的範圍。 - **衛星影像**:辨認出建築、河流等。 - **自駕車**:分辨車道線和路面。 --- ### Real Worlds Applications ![image](https://hackmd.io/_uploads/ryf_BKFTC.png) > 光學影像辨識、機器檢測 ![image](https://hackmd.io/_uploads/ryT3BttpR.png) > 工廠搬運、醫療影像辨識 ![image](https://hackmd.io/_uploads/Byb3HKtT0.png) > 自駕車、3D重建技術 ![image](https://hackmd.io/_uploads/S1bzIYtTA.png) > 溺水偵測 ![image](https://hackmd.io/_uploads/HJN7LKYTC.png) > 環場影像、自動調節亮度(用HDR技術) ![image](https://hackmd.io/_uploads/S1UBItta0.png) > Deepfake、Diffusion model ![image](https://hackmd.io/_uploads/H1hPLtFa0.png) ![image](https://hackmd.io/_uploads/SyC6LKtaC.png) > 對類比照片做採樣,變成digital sampling,再對digital sampling做pixel quantization(像素量化) ### Conventional Image Processing(傳統的影像處理) 1. Transformation 2. Histogram equalization 3. Linear filter(convolution) 4. Edge detection(gradient) #### 1. Transformation ![image](https://hackmd.io/_uploads/B1P5d6Ne1x.png) > 透過轉換,去擴大一張圖片原有的資料數量,透過可種角度的轉換以幫助在DL中增加訓練的資料量 ![image](https://hackmd.io/_uploads/r1unu6VgJg.png) ![image](https://hackmd.io/_uploads/BkPmt6Nl1e.png) ![image](https://hackmd.io/_uploads/H11_FTNg1l.png) ![image](https://hackmd.io/_uploads/SyJFKTNlJg.png) ![image](https://hackmd.io/_uploads/BJsFKpEeJl.png) ### 2. Histogram equilization (直方圖均衡化) > 用於對比度增強的方法之一。概念就是將原始影像像素的強度分布均勻地mapping到整個色彩區域內,產生一個色彩強度均勻分布的圖像,也可以說是透過拉伸圖片pixel的強度分布範圍來提升對比度 缺: 但也無法應用於所有場景,可能會產生增強不足或過度增強(過度曝光) ![image](https://hackmd.io/_uploads/BkcV5aEe1x.png =80%x) ![image](https://hackmd.io/_uploads/rk8Cq6Ve1e.png) ### 3. Linear filter: Convolution ![image](https://hackmd.io/_uploads/HyjkfRNlyx.png) > 是個常用的線性過濾方法,對每個pixel: f(i,j)與filtering: h(k,l)的權重進行加權求和,生成出新的pixel: g(i,j) ![image](https://hackmd.io/_uploads/BJf9MREgJl.png) ![image](https://hackmd.io/_uploads/ByCqzANx1l.png) ### 3. Linear filter: Gaussian kernel ![image](https://hackmd.io/_uploads/BydUQREgJg.png) > 通過卷積運算來平滑圖像,而卷積本質上是一種線性運算。具體來說,卷積過程是對圖像中的每個像素及其鄰域內的像素進行加權求和,而這種操作符合線性系統的兩個重要性質——可加性和齊次性: ![image](https://hackmd.io/_uploads/HyOD7RVe1l.png) ![image](https://hackmd.io/_uploads/rJWtm0Nx1l.png) ### 4. Edge detection ![image](https://hackmd.io/_uploads/r1qTX0Ngkl.png) **Sobel 算子(Sobel operator)**被用來進行邊緣檢測,原因是它能有效地計算圖像中的**梯度(Gradient)**。邊緣檢測的基本原理是:圖像中的邊緣通常出現在灰度值變化劇烈的區域,也就是梯度最大的地方。Sobel 算子可以通過計算圖像的梯度來檢測這些變化劇烈的區域,從而定位圖像中的邊緣。 ![image](https://hackmd.io/_uploads/Bkm1r0NxJg.png) ### 為何 Sobel 算子適合用於邊緣檢測? 1. **梯度計算**: - Sobel 算子通過兩個方向的卷積核分別計算水平方向G(x)和垂直方向G(y)的梯度。 - 對於每個像素,Sobel 算子會分別計算其水平方向和垂直方向的梯度。這些梯度描述了像素周圍灰度值的變化程度。 - 在圖中公式中,梯度J(x)定義為:即圖像在x 和 y方向上的導數(梯度)。 2. **強調邊緣**: - 邊緣是圖像中灰度變化劇烈的區域,因此 Sobel 算子通過計算這些區域的梯度來檢測邊緣。 - 圖像中變化劇烈的區域會有較大的梯度值,而平滑的區域梯度值較小。Sobel 算子能夠通過強調這些較大的梯度值來定位邊緣。 3. **平滑效果**: - Sobel 算子的卷積核不僅計算梯度,還有內置的平滑效果。通過給周圍像素賦予不同的權重,Sobel 算子能夠減少噪聲對邊緣檢測的影響。 - 圖中的 \( G_x \) 和 \( G_y \) 卷積核就是這樣的例子,它們對中央像素的影響較大,對周圍像素的影響較小,從而減少了邊緣檢測中的噪聲。 4. **方向性邊緣檢測**: - Sobel 算子通過分別計算水平方向和垂直方向的梯度,可以檢測不同方向的邊緣。水平方向的卷積核G(x) 可以檢測垂直邊緣,垂直方向的卷積核 G(y)可以檢測水平邊緣。 - 圖中右下角的兩個示例顯示了應用 Sobel 算子後的結果:左邊的圖顯示了水平方向上的邊緣(梯度),右邊的圖顯示了垂直方向上的邊緣。 ### 小結: **Sobel 算子** 之所以適合用於邊緣檢測,是因為它能夠精確計算圖像的梯度,從而強調圖像中灰度變化劇烈的區域,也就是邊緣。其內置的平滑效果能有效減少噪聲干擾,並且能夠分別檢測不同方向的邊緣,這使得 Sobel 算子在邊緣檢測任務中非常實用。 ![image](https://hackmd.io/_uploads/BkitB0Vgkl.png) ![image](https://hackmd.io/_uploads/SyeoHREe1e.png) ![image](https://hackmd.io/_uploads/S1t3S0Veye.png) ![image](https://hackmd.io/_uploads/SkUpSC4gkg.png) ## Deep Learning 步驟: ![S__3948546](https://hackmd.io/_uploads/H1xvwC4xkl.jpg) 1. 準備好一個model 2. 將training data輸入給Model 3. 使用loss function 計算predict結果與ground true的差距 4. 將loss value給optimizer(優化器)計算gradient並更新神經元參數 ## Neuron Network 介紹 ![image](https://hackmd.io/_uploads/S1irCRNeJg.png) - Binary linear classification ![image](https://hackmd.io/_uploads/rJrPAAVeyg.png) ### MLP (Multi-layer Perception) ![image](https://hackmd.io/_uploads/SkrvTa4lkg.png) ![image](https://hackmd.io/_uploads/HJ1hCRNgJg.png) ### 一. Layer 1. Hidden layer: > 在網路中,通常會有多層的hidden layer彼此相連,每層可能又擁有不同的神經元(neuron)個數,而當中的neuron又會受到training而調整他們的weight(這個訊息傳遞的重要程度) ![image](https://hackmd.io/_uploads/Sy87ACVlJl.png) 2. Input layer: > 用於接收資料,而input layer的neuron數量是由input的特徵量(資訊量)所決定的 3. Output layer: > 將答案做輸出,output layer的neuron數量則會根據問題本身去做決定。 eg. N分類問題,可能就有N個神經元輸出,每個neuron又代表了該類別的機率 --- ### 二. 激活函數(Activate function) > 用來增加model的複雜度,會放在neuron的後方,並將neuron 的輸出結果進行轉換,再將轉換的結果傳遞到下一層神經元中。 > 激活函數的選擇也會影響到梯度(gradient) 1. Sigmoid ![image](https://hackmd.io/_uploads/HyJ2kyrxke.png =50%x) 2. Softmax 3. ReLU ![image](https://hackmd.io/_uploads/Syr9k1Seyl.png =50%x) > - 將 > 0,維持原樣進行輸出 > - 將 < 0,全部都以0作為輸出 > 優點: 在訓練過程中,收斂的速度很快 > 缺點: 但若很多負的值,則都輸出0會導致梯度很靠近0,最後變成梯度消失 4. Tahn 5. Leaky ReLU ![image](https://hackmd.io/_uploads/SJRRJ1BlJl.png) ### 三. Loss function ![image](https://hackmd.io/_uploads/Hk8pRC4gyl.png) > 又稱為目標函數,我們目標就是去最小化預測結果與標準答案之間的誤差 1. MAE 平均絕對誤差(又稱L1 loss) 2. MSE 均方誤差(又稱L2 loss) 3. Binary Cross Entropy loss ### 四. Learning rate > 反應調整模型參數時的程度大小,若設得太小則會收斂得很慢、太大,則可能錯過minimum(極小值)而導致無法收斂 1. Staircase(階梯式的更新方法) > 前期learning rate調大一點,先快速找到local minimum,之後後期再調慢一點,以找到最低點 ### 五. Batch size、Epoch 1. Batch size(批次大小) > 指的是一次的訓練所選擇的樣本數,batch size的設定會影響模型的訓練速度與最佳化的結果 > eg. > Training data有80筆資料,但電腦效能不夠,無法一次讀80筆資料,所以batch size設10,則代表一次選取10筆資料去進行運算 2. Epoch > 一個epoch代表演算法使用整個training set(所有資料)對模型進行一次完整的訓練。 > n 個epoch: 代表對整個資料訓練了n次 ### 六. Optimization(優化器) > 計算gradient並更新神經元參數 > 1. SGD > 2. Adagrad > 3. Adam ## Deep Learning 常用訓練方法 一. Normalization(標準化) > 訓練模型時常用的技巧,是一種縮放技術,將資料值縮放在固定的區間中。最常見的方法是將資料縮放後介於 0 和 1 之間,稱作 Min-Max scaling。可以加快模型收斂速度並增加Neuron Network的穩定性 - Min-Max scaling 公式: ![image](https://hackmd.io/_uploads/rkkki0Hekl.png) ![image](https://hackmd.io/_uploads/rJt5cCHeJg.png) ![image](https://hackmd.io/_uploads/SyZRK0rlyx.png) 1. Batch Normalization (BN) > 進行學習時以 mini-batch 為單位,依照各個 mini-batch 來進行正規化。為了增加神經網絡的穩定性,它透過減去 batch 的均值並除以 batch 的標準差(standard deviation)來正規化前面激活層(activation)的輸出 ![image](https://hackmd.io/_uploads/BJ5D5RHxyg.png) > 圖片來源:論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 2. Layer Normalization (LN) > 標準化對象為一整個layer,一個layer表示一個輸入樣本。而在影像中,會將單一輸入影像的各個channel抽出來計算它的平均值及標準差,並進行標準化 3. Instance Normalization (IN) > 標準化對象為一個instance,一個instance表示一個輸入中的局部特徵值。而在影像中,會將單一輸入影像的各個channel抽出來計算它的平均值及標準差,並進行標準化 4. Group Normalization (GN) > 標準化對象為一整個group,一個group表示一個輸入中的局部特徵值,但範圍會比Instance大一些。而在影像中,會將單一輸入影像的特定幾個channel抽出來計算它的平均值及標準差,並進行標準化 ![S__3964930](https://hackmd.io/_uploads/HJs0h0rg1g.jpg) ### 二. Regularization(正則化) > 為了解決模型出現overfitting 的結果,讓模型回到較為平滑的結果。 ![image](https://hackmd.io/_uploads/rJ2-JkBgJe.png) ![image](https://hackmd.io/_uploads/SJ3GJ1rxkg.png) 1. Dropout > 會丟棄部分的神經元,使每次的更新只會去針對部分的神經元進行更新,可避免在訓練時對神經元之間產生複雜的共適應關係,在每個epoch中,都會移除不同的neuron,並對剩餘的神經元來進行參數的更新 2. L1 正規化 (Lasso Regression): > 是Linear regression + L1,將L1 norm 作為懲罰項來調整目標函式的係數, 3. L2 正規化 (Ridge Regression) > 是Linear regression + L2,將L2 norm 作為懲罰項來調整目標函式的係數 ### Transfer Learning(遷移學習) > 把已訓練好的模型、參數,應用在另外的一個新模型上。而通常會稱已存在的知識或以學習到的領域為Source domain(來源領域),而想進行學習、訓練的領域為Target domain(目標領域) 步驟: > 在Transfer Learning時,通常會使用到另一個 pre-trained 完的Deep Learning model,但為了要讓它能夠適應target domain,所以通常會先將pre-trained 完的DL model後面幾層Layer拆掉,再補上target domain的輸出層,再去經過fine-tune(微調)來獲得適應於target domain的model。 Ex. 將 VGG 作為pretrained-model ![image](https://hackmd.io/_uploads/SyUD848xyg.png) > 使用訓練好的VGG網路其中的前幾層,去做特徵的抽取,第五行去載入pre-trained 好的VGG網路,並將原先VGG的分類器拆掉換成我們應用情境會用到的分類器(8~16行) 資料來源: https://github.com/NCCUAIMLab/ADLIP/blob/main/Ch5/ch5.ipynb --- ### 4. Cross Validation(交叉驗證) > 指我們在分割Training set、Testing set時,我們輪替使用部分的資料當作我們的Testing set ![image](https://hackmd.io/_uploads/BysfwELxyx.png) > 此圖將資料分成五等分,並在第一輪將其中一份作為Testing set,其餘做為Training set。在下一輪,選擇另一份作為Testing set,當每一份都當過Testing set,就可以把每個Testing set的準確度做平均,以求得整體的準確度。 > 若將資料分成k等分,就是在做k-fold Cross Validation ### 5. Ensemble Learning(集成式學習) > 使用多個學習方法來獲得比單獨一個演算法更好的預測性能 > eg. Random forest會建構不同的decision tree當作基礎預測模型(base prediction model),最後再整合這些不同的decision tree結果作為最後的預測結果。 ![image](https://hackmd.io/_uploads/H1mp_4Leye.png) ### 6. Forward Propagation ![image](https://hackmd.io/_uploads/ByWyyJrl1g.png) ![image](https://hackmd.io/_uploads/ryj71JSeyg.png) ### 7. Chain rule ![image](https://hackmd.io/_uploads/BkcEkyreJe.png) ### 8. Backpropagation ![image](https://hackmd.io/_uploads/HkIukJBlye.png) > 是一種與優化演算化(eg. Gradient Descent)結合的技術,主要用於訓練neuron nework。基於 Chain Rule,從output layer 開始逐層往回傳遞誤差,計算 loss function 對網路中每個參數(weight、bias)的偏導數(梯度),並利用gradient 通過優化演算法(eg. gradient descent) 來更新network 的 weight 以最小化loss function - 屬於 Supervised Learning(監督式學習),要知道每個 output - 要求neuron的 activation function 是可微分的 ![image](https://hackmd.io/_uploads/HyLuBca4Jg.png) #### 反向傳播的挑戰 1. 梯度消失(Gradient Vanishing) - 在深層網絡中,梯度可能隨著層數增多而逐漸減小,導致更新緩慢。 - 解決方法:使用ReLU激活函數或正則化技術。 2. 梯度爆炸(Gradient Explosion) - 梯度隨層數增多而指數增大,可能導致數值不穩定。 - 解決方法:梯度裁剪(Gradient Clipping)。 3. 局部最小值與鞍點(Local Minima and Saddle Points) - 隨機初始化權重和使用不同的優化算法(如Adam、RMSProp)來避免陷入局部最小值 梯度值並不是指「找到的解」,而是指**當前參數的更新方向與幅度**,即損失函數(Loss Function)對網絡參數(如權重和偏置)的偏導數。 --- ### **梯度的意義** 在機器學習中,梯度的物理意義是: 1. **方向:** 梯度表示損失函數在參數空間中變化最快的方向。 - 通常我們會沿著梯度的**相反方向**(即負梯度方向)來更新參數,因為這樣可以使損失函數的值減少。 2. **幅度:** 梯度的大小表示損失對參數的敏感程度: - 梯度較大時,表示該參數對損失的影響很大,應該進行較大的更新。 - 梯度接近 0 時,表示該參數對損失的影響很小,此時參數更新的幅度會非常小,甚至幾乎不更新。 --- ### **梯度與解的關係** 1. **梯度 ≠ 解** - 梯度是損失函數相對於參數的局部變化率,並非直接表示最優解(即參數的最小化配置)。 2. **梯度用來引導參數向解靠近** ![image](https://hackmd.io/_uploads/rkbePqTVkg.png) 3. **解是最優參數配置** - 在訓練結束時,最優解(理論上)是使損失函數達到局部最小值或全局最小值的參數配置,此時梯度值應該趨於 0(即損失函數對所有參數的偏導數為 0)。 --- ### **總結** 梯度值是用來指導參數更新的工具,它是損失函數對參數的偏導數,表示當前參數的改進方向和幅度。梯度消失並不表示已找到解,而是模型在訓練中出現了更新困難的問題,使得參數無法有效逼近最優解。 ### 9. Gradient vanishing ![9BA20B1A-CECF-43D5-931A-9CBD988B98F5](https://hackmd.io/_uploads/By2Ag1rgJe.jpg) ### **梯度消失與找到的解** 在 **梯度消失(Gradient Vanishing)** 問題中,梯度值接近於 0,這並不表示已找到最優解,而是因為: 1. 梯度值因激活函數導數過小或深層結構的累乘效應而消失。 2. 即使模型的參數仍然遠離最優解,但由於梯度極小,參數幾乎無法更新。 這意味著模型可能會卡在一個「無法有效更新」的狀態,而不是找到最佳解。 ### **梯度的直觀比喻** 可以將梯度看作是登山過程中的「指示箭頭」: - 梯度值表示「往哪個方向走能最快下坡」。 - 隨著你越靠近山谷(最小值),梯度的值會越來越小,因為下坡的速度變慢。 - 當梯度為 0 時,表示已到達山谷底部(可能是局部或全局最小值)。 在 **梯度消失** 問題中,箭頭變得幾乎「不存在」,即使還沒到達山谷,也無法有效指導方向。 --- ### 10. Pooling (池化) ![9CF8362D-42D7-4C2E-ACAA-B2CEF1551353](https://hackmd.io/_uploads/SJ3Rx1HlJl.jpg) > 是CNN中的一個關鍵操作,主要用於縮減Feature map的大小,以減少網路的計算量與參數數量,進而提高泛化能力 ### 11. Fully-connected layer ![D087C925-4EBA-45FB-9C41-ACF2EF613499](https://hackmd.io/_uploads/Hy2RxyBx1e.jpg) ![image](https://hackmd.io/_uploads/BJp-W1rxJl.png) ![F3386262-793F-47D2-9D93-3BD7400B9570](https://hackmd.io/_uploads/BJ30gyHlkx.jpg) 參考資料: https://medium.com/ching-i/%E5%BD%B1%E5%83%8F%E5%88%86%E5%89%B2-image-segmentation-%E8%AA%9E%E7%BE%A9%E5%88%86%E5%89%B2-semantic-segmentation-1-53a1dde9ed92 ## 常見 Dataset 介紹 ### COCO (https://cocodataset.org/#home) ![image](https://hackmd.io/_uploads/HkdF8Cu1Jg.png) > COCO is a large-scale object detection, segmentation, and captioning dataset. COCO has several features: ![image](https://hackmd.io/_uploads/rkAO8R_J1g.png =70%x) --- ### History of Deep Learning ![image](https://hackmd.io/_uploads/By0RhAVgJg.png) #### 影像分類的發展歷史: - CNN - AlexNet (2012年) - VGGNet (2013年) - Inception (2015年) - ResNet / 跳躍連接 / Batch Normalization (2015年) - SENet / 全域self-attention (2017年) - Transformer - ViT(Vision Transformer) (2020年) - MLP(Multilayer Perception,多層感知器) - MLP-Mixer (2021年) ### Representative Model in Computer Vision ![image](https://hackmd.io/_uploads/SypeT0Egye.png) ![image](https://hackmd.io/_uploads/B1f4aA4l1l.png) ![image](https://hackmd.io/_uploads/BkyIv9jl1g.png) > 輸入一張image後,先把它用3D Tensor矩陣表示,再把3維的tensor拉直,就可以丟到network中 ### CNN (Convolutional Neural Network, 卷積神經網路) > 在密集的神經網路的結構上多添加了很多 Convolutional block(卷積塊),使CNN可以從圖像中學習到更多資訊,提升影像識別的能力 ![image](https://hackmd.io/_uploads/SkzNQcogJx.png) ![image](https://hackmd.io/_uploads/SyBBQcsgyg.png) ![image](https://hackmd.io/_uploads/ryOMc9sgkl.png) ### 1. Convolutional block > 由 Convolutional Layer 與 Pooling Layer 組成。 > > Convolutional block 的功用是萃取特徵,可用來獲取影像中更多細部特徵以幫助識別影像 ### 2. Convolutional Layer > 位於Convolutional block之中,Convolutional Layer會將輸入的image,透過多個kernek(卷積核)做掃描,可定義多個kernel來進行不同任務(eg. 有的負責掃描形狀、邊緣特徵等..),最後將image轉換為表現其特徵的Feature maps(特徵圖) ![image](https://hackmd.io/_uploads/BJipU5seyl.png) - kernel size: 卷積核的大小 - stride: kernel掃描的步長 - padding: 補值,當kernel掃描到邊緣區域但不夠時,可填入數值來彌補空缺 ### 3. Pooling Layer 池化層 > 對 Convolutional Layer 輸出的 feature map 進行重點挑選,當 feature map 的特徵(pixel)還是太多時,可以把一些相對不重要的特徵丟棄或合併,目的就是要縮小feature map (雖然feature map 縮小,但仍可以保留相對重要的特徵) 作法類似kernel: 1. 設定stride與size進行滑動,當池化區域滑動與影像重疊時,就做挑選的運算,挑選的話有不同的挑法,常見的有兩種: 1. Max-Pooling: 挑選區域內的最大值 ![image](https://hackmd.io/_uploads/By2nccjx1e.png) 3. Average-Pooling:取區域內的平均值 ### 4. Flatten(展平層) > 將Convolutional block輸出的 Feature map 轉換成一維,以傳入密集層 - Code 練習: https://github.com/YIFUNLIN/computer_vision/blob/main/CNN.ipynb ### 1. ResNet (殘差網路,Residual Nets) > 使用超過百層的殘差網路而不會降低準確率的關鍵在於其特殊的Residual block(殘差塊) - 架構範例 ![S__4276234_0](https://hackmd.io/_uploads/B16QEQJ-yl.jpg) #### Residual block 殘差塊 > 就是在convolution block 中,新增了一條 short connections(捷徑連接)的路線 ![S__4276235_0](https://hackmd.io/_uploads/HkjMSmJbkg.jpg) - short connections(捷徑連接) > 白話說: 就是將運算前與運算後的結果相加。此作法就像是抄捷徑般地快速向前傳播,此學習方法也稱為Residual Learning,此設計能在不降低準確率的情形下,訓練超深層的neuron network > 將準備傳入 convolution layer 的input 跨層傳遞,再與經過convolution layer 運算後的output 相加。如下圖就是 X_B 與 X 直接相加後,再送入activate function ![S__4276236_0](https://hackmd.io/_uploads/B1X7IQJ-yg.jpg) #### Residual block ![image](https://hackmd.io/_uploads/BkuZdQJbJx.png) ![S__4276237_0](https://hackmd.io/_uploads/BJQgKQkWkl.jpg =60%x) > 此架構疊加3層convolution layer,前兩層裡面採用相同個數的kernel(各16個),kernel size 分別為 1*1、3*3、但第三層尺寸為1*1,kernel 數量變成64(提升4倍),根據論文提出的結構可以減少ResNet訓練時間 ![image](https://hackmd.io/_uploads/H1N6_XkZyx.png) > 1. ResNet 在不同層數下,Residual block 有不同的設計方式 > 2. 疊加 18-layer、34-layer 的ResNet 是同一種Residual block 結構 > 3. 疊加 50-layer、101-layer、152-layer 的ResNet 是同一種Residual block 結構 > 4. 在Residual block中,kernel size 皆一致的話,論文稱Plain architecture > 5. 若 kernel(卷積核) 大小交錯的Residual block稱為 bottleneck architecture #### Batch Normalization 批次正規化 > 讓訓練安定的方法之一,會添加在convolution layer 與 Activation function 之間,主要會針對每一層的輸出進行正規化的處理,使其成為「平均值為0、標準差為1」的分布,讓深層的neuron network更容易被訓練,也有防止overfitting的作用 --- 先前image 經過Convolution block 提取完特徵後,必須經過 flatten layer (展平層) 轉換後,再輸入到Dense layer做處理,但此做法會因為特徵值過多,讓模型可訓練的參數暴增,進而造成overfitting問題,於是就提出了以下這個方法: #### GlobalAveragePooling2D (全域平均池化) > 採用這種Pooling layer去取代flatten layer遇到的問題,目標是在餵給Dense layer時,可以盡可能地減少特徵數量又保留最重要的部分。 > > 作法: 將最後一層的每張feature map 都濃縮成一個平均後的特徵值,再將各特徵值 input 到 Dense layer - 原始論文: https://arxiv.org/pdf/1512.03385 - 範例code: # Object detection ## 代表性的電腦視覺模型 ![image](https://hackmd.io/_uploads/HJgZQDCE1x.png) 這一頁展示了深度學習在電腦視覺領域的多種模型和應用。主要包括: 1. MLP (多層感知器):最基本的神經網路架構 2. CNN (卷積神經網路): - 專門處理影像相關任務 - 代表性模型: - LeNet:早期的CNN模型 - ResNet:殘差網路,解決深層網路訓練困難問題 - DenseNet:每一層與其他所有層都有連接 3. GAN (生成對抗網路): - 用於影像生成 - 可解決域適應問題 4. Transformer: - 原先用於自然語言處理 - 現在也應用於電腦視覺 - 代表性模型:ViT (Vision Transformer) 5. 多模態模型: - 整合不同類型的輸入 - 代表性模型: - CLIP:跨模態特徵表示 - DALL-E:文字生成影像 各模型在不同任務的應用: - 影像分類 - 語意分割 - 物件偵測 - 影像生成 ![image](https://hackmd.io/_uploads/Hy9DQDRNJl.png) ![image](https://hackmd.io/_uploads/HyuFmDAN1g.png) 1. AlexNet:2012年 - 深度學習在電腦視覺的突破性論文 - 首次使用深度卷積神經網路 - 在ImageNet競賽中取得重大突破 2. R-CNN (Region-based Convolutional Neural Networks): - 將深度學習引入物件偵測 - 提出區域提案的概念 - 標誌著現代物件偵測方法的開始 ![image](https://hackmd.io/_uploads/Byu57PR41g.png) ### Traditional Detectors ![image](https://hackmd.io/_uploads/HkOnXD04kg.png) > 使用邊界框(Bounding Box)標記物件 - 邊界框包含: 1. (x,y)座標:左上角位置 2. w:寬度 3. h:高度 偵測特定類別,如人、動物、汽車 #### Traditional object detection methods 1. Template matching(模板匹配) and Sliding window 2. Viola-Jones detector 3. Histogram of Oriented Gradients (HOG) 模板匹配和滑動視窗方法: - 計算模板與圖像的相關性 ![image](https://hackmd.io/_uploads/ryvFVD0Eke.png) - 在整個圖像中移動模板 - 找出最匹配的區域 問題: ![image](https://hackmd.io/_uploads/rkIaEDR4kl.png) - 遮擋導致低相關性 ![image](https://hackmd.io/_uploads/SkQhEvCV1g.png) - 只能偵測特定物件實例 - 難以處理: - 不同位置 - 不同尺度 - 不同外觀比例 - 光線變化 Viola-Jones偵測器: ![image](https://hackmd.io/_uploads/HkKyHDRN1g.png) - 2001年由Viola和Jones提出 - 主要用於人臉偵測 - 特點: - 使用Haar-like特徵 - 快速分類器級聯 Viola-Jones問題: ![image](https://hackmd.io/_uploads/S1ulSDR4yx.png) - 對姿勢和光線變化敏感 - 在複雜場景表現有限 - 需要大量訓練資料 HOG (方向梯度直方圖): ![image](https://hackmd.io/_uploads/SyVbHPRVJg.png) 1. 特徵提取 - 主要用於人體偵測 - 通過梯度提供形狀資訊 ![image](https://hackmd.io/_uploads/H1hMHw0N1e.png) 2. 分類步驟: - 選擇正面訓練集:包含目標物的圖像 - 選擇負面訓練集:不包含目標物的圖像 - 計算HOG特徵 - 使用支持向量機(SVM)進行二元分類 ### Fundamental techniques of Object Detection ![image](https://hackmd.io/_uploads/r1cNSwAVJl.png) ![image](https://hackmd.io/_uploads/SyPBrvR4Jl.png) ![image](https://hackmd.io/_uploads/HJSIHD0V1x.png) Q: 那 bounding box 這麼多,How to choose the best bounding box? A: 利用NMS來解決 ![image](https://hackmd.io/_uploads/SkLqBwRVJx.png) ![image](https://hackmd.io/_uploads/SJcoHwA4Jx.png) Q: 那重疊 (overlap) 如何定義? ![image](https://hackmd.io/_uploads/rybTHvCVke.png) ### Common datasets ![螢幕擷取畫面 2024-12-17 104647 (1)](https://hackmd.io/_uploads/ryfPUvAVye.png) ![image](https://hackmd.io/_uploads/HyXdLwAEkg.png) ![image](https://hackmd.io/_uploads/BJnFUDR4kl.png) ![image](https://hackmd.io/_uploads/HkzsUP0Eyg.png) ![image](https://hackmd.io/_uploads/rkPTIvCE1x.png) 參考: https://towardsdatascience.com/what-is-average-precision-in-object-detection-localization-algorithms-and-how-to-calculate-it-3f330efe697b ### Evaluation ![image](https://hackmd.io/_uploads/BJdZDP0VJl.png) ![image](https://hackmd.io/_uploads/ryAMvPA4Je.png) ![image](https://hackmd.io/_uploads/rJnXPDR4Jx.png) ![image](https://hackmd.io/_uploads/B1CNvDCNyl.png) 接下來,先來討論two stage方法,one-stage會在稍後提到 ### Object Detection: Two stage object detector ![image](https://hackmd.io/_uploads/B18RB_ANyl.png) Object detector 技術又可分為兩種: ![image](https://hackmd.io/_uploads/SkNgL_RVye.png) - 傳統localization(定位技術)作法: 利用HoG ![image](https://hackmd.io/_uploads/H1-E8dRNJe.png) - 現在localization(定位技術)作法: 利用CNN ![image](https://hackmd.io/_uploads/HkqtLd04kg.png) #### Softmax介紹 > 是一種特殊的激活函數(Activation Function),主要用於**多分類任務**的輸出層。 **Softmax 的功能**: 將輸入的一組數值轉換為一組 **概率分佈**,並且所有輸出的值加總為 **1**。 - 輸出範圍:**(0, 1)**,即所有輸出值都介於 **0 到 1** 之間。 - 使用場景: - **分類問題**:例如將輸入圖像分為「貓」、「狗」、「鳥」等多個類別。 - Softmax 確保模型輸出的每一類的機率總和為1,便於解釋和使用。 --- ### **2. 激活函數的目的是什麼?** > 引入非線性,讓神經網路能夠學習和處理複雜的非線性特徵,從而解決非線性問題 - 如果不使用激活函數,神經網絡的所有層會退化成一個**線性變換**,無法解決複雜的非線性問題。 - **激活函數的主要目的**: 1. **引入非線性**:使模型能夠學習更複雜的特徵,解決非線性問題。 2. **限制輸出範圍**:例如 ReLU 限制輸出為【0,∞) ,Sigmoid 和 Softmax 輸出範圍在(0,1) 。 ![image](https://hackmd.io/_uploads/r19rdOC4kl.png) 3. **保持梯度流動**:在反向傳播中,激活函數幫助計算有效的梯度,確保模型能夠順利訓練。 #### 總結 - **Softmax 是一種激活函數**,但通常用於輸出層進行多分類任務。 - 激活函數的主要目的是 **引入非線性**,讓模型學習更複雜的特徵和映射。 - **Softmax 限制輸出範圍在 (0, 1)**,並將輸出轉換為概率分佈,使其具有明確的解釋性。 ![image](https://hackmd.io/_uploads/r1MP_dAEJl.png) ![image](https://hackmd.io/_uploads/Skp__uR4Jx.png) ![image](https://hackmd.io/_uploads/HJbqOOC4yl.png) 有了 Region Proposals的概念後, 接下來,就要開始介紹CNN的演進啦 ----------- #### CNN 演進 R-CNN可以說是CNN有效應用於物件辨識領域中的一個重要里程碑。它應用region proposal的方法來將這些提案的區域送入CNN抽取特徵,以及後頭的分類、檢測網路中 R-CNN 家族: 1. R-CNN (2014) 2. Fast R-CNN (2015) 3. Faster R-CNN (2015) ### 1. R-CNN(Regions with CNN features) ![螢幕擷取畫面 2024-12-17 120830 (1)](https://hackmd.io/_uploads/HkwPYOAV1e.png) R-CNN 是 Ross Girshick 在 2014 年提出的,開啟了使用卷積神經網絡(CNN)進行object detection 的新時代。其核心思想是將物件偵測任務分為兩個步驟:候選區域生成和物件分類。具體流程如下: ![image](https://hackmd.io/_uploads/S1I9KOCV1l.png) 1. **Region Proposals (候選區域)**: - 使用 **選擇性搜索(Selective Search)** 方法生成大約 2000 個候選區域(Region Proposals)。選擇性搜索通過對影像進行分割並合併相似區域來生成潛在的物件區域。 - 每個候選區域的大小和位置不同,涵蓋了整張影像中可能存在物件的地方。 2. **特徵提取**: - 對每個候選區域(Region Proposals)進行 CNN 特徵提取。通常使用一個pre-trained的模型(如 AlexNet)來處理這些Region Proposals。每個region 都被調整為固定大小(如 224x224),然後經過 CNN 輸出固定長度的特徵向量。 3. **分類**: - 使用支持向量機(SVM)來對每個 Region Proposals進行分類。這個過程可以判斷該區域是屬於哪一類object(如車、人、動物等),或是背景(不是任何目標)。 4. **邊界框回歸(Bounding Box Regression)**: - 使用額外訓練的回歸器來調整候選區域的邊界框,使其更加精確地匹配物件的實際邊界。這個步驟主要是為了細調區域提案的位置和大小。 #### 訓練流程: ![image](https://hackmd.io/_uploads/HJAitd0EJl.png) #### 優點: ![image](https://hackmd.io/_uploads/HkSycuR4kg.png) - R-CNN 將深度學習應用於 object detection,提升了準確性 **缺點**: ![image](https://hackmd.io/_uploads/Skt7cOAV1e.png) - **運算成本高**:由於每個候選區域都需要經過 CNN 特徵提取,這對於大型圖像集來說計算量非常大,速度很慢。 - **訓練複雜**:CNN、SVM 和classifier需要分別訓練,過程繁瑣且難以整合。 - 對一張影像進行detection需要47秒的時間(on GPU) ![image](https://hackmd.io/_uploads/S1RDc_CN1e.png) #### Region Proposal 跟 sliding-window 比較 - sliding-window > 假設在一張有貓的圖像中,我們要找出這隻貓在哪裡。有一個很直觀的方法,就是訂定一個固定的尺寸框,然後逐一像素的移動這個框(或可稱sliding-window,如圖中橘框),去看這個框框到的影像是貓的機率最高,作為「貓在哪裡」的評估依據。但是可想而知,在整張圖像上做sliding-window是非常費時費力的一件事情。 ![image](https://hackmd.io/_uploads/rk2m5Ijekx.png) - Region Proposal > 有個比較好的想法是,先在圖像上找到「比較有可能是貓的區域」(如圖中橘色框),再來將這些區域做評估。我們就稱這些被提出來的區域,叫做"Region Proposals" ![image](https://hackmd.io/_uploads/BJkS9Lixyl.png) | **特徵** | **Region Proposal(區域提案)** | **Sliding Window(滑動窗口)** | |-----------------------|------------------------------------------------------------|------------------------------------------------------------| | **主要方法** | 根據圖像特徵生成潛在包含物件的候選區域 | 在影像上使用固定大小的窗口進行滑動,逐一檢查每個位置的物件 | | **典型算法** | 選擇性搜索(Selective Search)、區域提案網絡(RPN) | 固定大小的卷積核或特徵提取器進行滑動 | | **計算效率** | 通常較高,因為只針對可能的區域進行處理 | 計算量大,因為要對每個窗口進行特徵提取 | | **候選區域數量** | 提供較少的候選區域(如 2000 個),只針對潛在物件 | 生成大量的候選區域,幾乎覆蓋整張影像 | | **適應性** | 可以根據物件的形狀和大小生成不同的區域 | 窗口大小固定,難以適應不同大小和形狀的物件 | | **計算成本** | 計算較低,因為選擇性搜索和 RPN 只針對感興趣區域進行處理 | 計算成本高,對所有窗口進行特徵計算 | | **生成方式** | 基於圖像分割、合併(選擇性搜索),或深度學習(如 RPN)生成 | 橫向和縱向地在整張圖像上滑動窗口,無選擇性地檢查每個區域 | | **靈活性** | 更靈活,可以生成大小和形狀不同的候選區域 | 靈活性較低,只能檢測到與窗口大小相近的物件 | | **精確度** | 更高的精確度,因為可以更針對性地選擇候選區域 | 低於區域提案,因為窗口大小和位置固定,難以匹配物件 | | **典型應用** | Faster R-CNN 使用 RPN、Fast R-CNN 使用選擇性搜索 | 早期的物件偵測算法和部分深度學習方法 | ### 總結 - **Region Proposal** 方法著重於選擇性地生成潛在物件區域,減少需要處理的候選區域數量,大幅提升了計算效率,是現代物件偵測模型(如 Faster R-CNN)中的關鍵部分。 - **Sliding Window** 方法則更適合早期的物件偵測場景,因為在卷積神經網絡普及之前,它是圖像處理中較直接的特徵提取方法,但缺點是計算成本極高且不夠靈活。 論文: https://openaccess.thecvf.com/content_cvpr_2014/html/Girshick_Rich_Feature_Hierarchies_2014_CVPR_paper.html 介紹: https://ivan-eng-murmur.medium.com/object-detection-s1-rcnn-%E7%B0%A1%E4%BB%8B-30091ca8ef36 --- ### SPP (Spatial pyramid pooling, 空間金字塔池化) ![image](https://hackmd.io/_uploads/rki25OCNke.png) - 是一種用於解決object detection 中 **不同物件尺寸(Varying Object Sizes)** 問題的技術。 - 目的是**生成固定長度的特徵向量**,以支援不同尺寸輸入的圖像或物件。 --- ### **SPP的核心概念** 在傳統的CNN中,輸入到全連接層(Fully Connected Layer)的特徵向量長度往往取決於輸入圖像的尺寸,因此: 1. 不同尺寸的圖像需要調整到相同大小,否則無法輸入到全連接層。 2. 這種調整(例如重塑圖像)可能會導致特徵扭曲或丟失細節。 ![image](https://hackmd.io/_uploads/Hyvcs_AV1e.png) **SPP** 透過引入 **空間金字塔池化層 (Spatial Pyramid Pooling Layer)**,克服了上述限制,允許CNN支援不同大小的輸入圖像,而無需對圖像進行強制調整。 --- ### **SPP的運作原理** ![image](https://hackmd.io/_uploads/SkAns_RV1e.png) 1. **輸出特徵圖** - 圖像經過卷積層(例如Conv5)處理後,產生不同尺寸的**特徵圖**。 2. **金字塔池化 (Pyramid Pooling)** - 在 Feature map 上進行池化操作(Pooling),並分別用 **不同尺度的網格** 來對特徵圖進行劃分和池化: - **4x4** 網格池化 - **2x2** 網格池化 - **1x1** 網格池化 - 每個池化區域輸出一個固定數量的特徵值,這樣無論原始特徵圖的大小如何,最終都能生成**固定維度的特徵向量**。 3. **合併特徵** - 將不同尺度(如4x4、2x2、1x1)的池化輸出拼接成一個固定長度的特徵向量,例如: Feature Vector= 16 + 4 + 1 - 這樣的固定長度特徵向量可以直接輸入到全連接層中。 --- #### **SPP的優點** ![image](https://hackmd.io/_uploads/ByX42O0E1l.png) 1. **支援不同尺寸的輸入** - 無需將輸入圖像調整到固定大小,保留了原始圖像的比例與細節。 2. **捕捉多尺度資訊** - 不同尺度的池化網格(例如4x4, 2x2, 1x1)允許模型捕捉不同粒度的空間資訊。 - 有助於檢測不同大小的物件。 3. **計算效率高** - 卷積操作可以對整個圖像進行一次計算,池化操作則針對特徵圖。 - 與傳統的R-CNN相比,SPP-Net避免了多次重複卷積操作。 #### SPP 缺點 ![image](https://hackmd.io/_uploads/BkVUhdA4yg.png) --- ### **SPP與R-CNN的比較** - **R-CNN**: - 每個候選區域(Region of Interest, RoI)都需要經過獨立的CNN卷積操作,計算成本高。 - **SPP-Net**: - 首先對整個圖像進行卷積,然後透過SPP層對**候選區域**進行池化,顯著降低了計算成本,並提高了效率。 --- ### **總結** **SPP (Spatial Pyramid Pooling)** 是一種池化技術,透過在特徵圖上使用不同尺度的網格進行池化,生成**固定長度的特徵向量**,從而支援**不同尺寸的輸入圖像**,同時保留多尺度資訊,並提升計算效率。 在 **SPP-Net** 架構中,SPP 使得物件檢測更高效且更具彈性,相較於R-CNN有顯著的改進。 --- 繼R-CNN之後,為了讓速度、精度表現更加出色,所以就將R-CNN 引入了SPP的概念,變成了 Fast R-CNN ### 2. Fast R-CNN ![image](https://hackmd.io/_uploads/B1BP38oxye.png) Fast R-CNN 是在 2015 年提出的,目的是解決 R-CNN 的計算效率問題,特別是卷積運算的重複性。其具體改進如下: 1. **整張影像的卷積特徵提取**: - Fast R-CNN 不再對每個Region Proposals分別進行 CNN 特徵提取,而是在整張影像上只進行一次卷積操作,生成特徵圖。這樣可以大大減少重複計算的次數。 - 卷積特徵圖保留了原始影像中每個像素的空間信息,可以用於後續Region Proposals的特徵提取。 2. **Region of Interest (RoI) Pooling**: ![image](https://hackmd.io/_uploads/SyxgpuREJg.png) ![image](https://hackmd.io/_uploads/rJGGau041l.png) - 在特徵圖上對每個Region Proposals進行 **RoI Pooling**。RoI Pooling 的作用是將不同大小的Region Proposals映射到固定大小的特徵圖區域(如 7x7),以便後續的全連接層處理。 - 這樣,Region Proposals可以在共享的卷積特徵圖上快速計算其特徵,並且不同大小的區域都能被轉換為統一的特徵表示。 3. **分類和邊界框回歸(多任務學習)**: - Fast R-CNN 同時進行分類和邊界框回歸。在最終的全連接層之後,網絡分為兩個分支:一個用於分類,另一個用於邊界框調整。 - 在這個架構中,不再需要使用 SVM 進行分類,改以softmax作為Classification的NN **主要優勢**: ![image](https://hackmd.io/_uploads/HkEV6OAVkg.png) - **加速特徵提取**:通過對整張影像只進行一次卷積運算,大大加快了運算速度。 - **端到端訓練**:分類和邊界框回歸在同一網絡中進行,簡化了訓練過程。 ![image](https://hackmd.io/_uploads/rJcBpORVke.png) 以下就自架構圖的下到上說明各部件的的細節 ![image](https://hackmd.io/_uploads/Sk1jC8sxke.png) - Region Proposals: > 這裡一樣是使用selective search的方式提出2000個region。不過,並不是將原始影像依據region來切割後送入backbone network中的。而是將region映射到CNN最後的feature map上才切出我們真正要拿來使用的ROI。 ![image](https://hackmd.io/_uploads/HJbe1vsgyl.png) - Feature map: Backbone Network - VGG16: 這次到了Fast R-CNN,backbone的部份換成了VGG16。而在最後一層convolution block的最後一個conv.所得到的feature map (shape=14*14*512),就是剛剛ROI要映射到的目標層,所以這裡的ROI才是我們真正要使用的。 但是,ROI的長寬不一樣要怎麼辦呢?所以作者將原本接的最後一個pooling layer取代掉,換成可以將size固定的ROI Pooling layer。 ![image](https://hackmd.io/_uploads/HyGHJDjlJg.png) > VGG16 Network Structure 論文: https://openaccess.thecvf.com/content_iccv_2015/html/Girshick_Fast_R-CNN_ICCV_2015_paper.html 參考: https://ivan-eng-murmur.medium.com/obeject-detection-s2-fast-rcnn-%E7%B0%A1%E4%BB%8B-40cfe7b5f605 **主要問題**: - **Region Proposals依賴選擇性搜索**:雖然卷積部分加快了,但 Fast R-CNN 還是依賴於選擇性搜索進行Region Proposals,這個步驟依然非常耗時。 前面我們提到了Fast R-CNN的改進,包括了減少冗贅的特徵提取動作,將ROI映射到feature maps上,並用ROI pooling 統一維度等等。但是為了迎來更快的偵測速度,在Proposals上的處理也需要納入整個模式的NN之中,一起用convolution來解決。 於是Faster R-CNN就此成型,它運用Region Proposals Network (RPN)搭配anchor box的設計,如同它論文的標題一樣 "Towards Real-Time Object Detection",偵測速度來到了0.2s/image(相當於fps=5)的速度,雖然還不足以稱為real time,但是確實往這條路邁進了一大步。 ### 3. Faster R-CNN > 是一個基於卷積神經網路(CNN)的兩階段(Two-Stage)物件檢測器,旨在達到更高效且準確的物件檢測結果。它相較於傳統的 R-CNN 和 Fast R-CNN,有顯著的性能提升,並提出了區域提議網路 (Region Proposal Network, RPN) 的概念 ![image](https://hackmd.io/_uploads/H1Map_RE1x.png) Faster R-CNN 是在 2015 年由 Ross Girshick 團隊進一步提出的,解決了前面模型在region proposal 生成上的速度瓶頸,實現了真正的end-to-end training。它的核心創新是引入了 **候選區域網絡(Region Proposal Network, RPN)**。 ![image](https://hackmd.io/_uploads/HJE4AOCV1g.png) --- ### **Faster R-CNN 的主要組成架構** Faster R-CNN 分為以下 4 個步驟: 1. **特徵提取 (Feature Extraction, CNN)** - 使用卷積神經網路(例如 VGG、ResNet)對輸入圖片進行特徵提取,輸出特徵圖(Feature Maps)。 - 這些特徵圖包含了圖像的各種空間與語意特徵,作為後續操作的基礎。 2. **區域提議網路 (Region Proposal Network, RPN)** ![image](https://hackmd.io/_uploads/S1BsGF0VJx.png) - **RPN 的功能**:取代傳統的 **Selective Search**,直接從feature map 中生成高質量的候選區域(Region Proposals)。 - **技術細節**: 1. **輸入**:從 CNN 輸出的feature map。 2. **Sliding Window 操作**:使用一個 3 * 3 的卷積核在feature map 上滑動 3. **錨點生成 (Anchors)**: - 每個特徵圖上的點會生成 **9 個 Anchors**,對應不同的尺度(8, 16, 32)和長寬比(0.5, 1, 2)。 - 公式:3 scales * 3 aspect ratios = 9 anchors 4. 利用兩個分支 - **分類 (Classification)**:判斷每個 Anchor 是前景(物件)還是背景。 - **回歸 (Regression)**:調整 Anchor 的邊界框(bbox refinement),使其更貼近真實物件。 5. **損失函數 (RPN Loss)**:包含**分類損失(Binary Cross-Entropy) **與**回歸損失(Smooth L1 Loss)**。 6. **非極大值抑制 (NMS)**:過濾重疊程度過高的候選區域,只保留最佳框,保留最佳的 2000 個(或更少)。 ![image](https://hackmd.io/_uploads/rJBq7KA41l.png) 3. **RoI 池化 (Region of Interest Pooling)** - 從 RPN 輸出的 Region Proposals,利用 RoI Pooling 在特徵圖上截取相應的區域。 - 透過 **固定大小的池化層**(例如 7x7),將不同大小的region proposal 統一成固定維度的特徵向量,輸入到後續的分類器與回歸器中。 4. **分類與回歸 (Classification & Regression)** - **分類器**:對 RoI pooling 後的特徵向量進行分類,輸出物件的類別(例如貓、狗、車)。 - **邊界框回歸器**:進一步調整region proposal 的bounding box,使其更準確地匹配真實物件位置。 --- ## Anchor #### 是什麼?** **Anchor**(錨點)是一個在物件檢測中常用的技術,用於預設一組**候選邊界框**,這些框可以作為預測物件位置的基礎。Anchor 的概念最早出現在 **Faster R-CNN** 中,解決了物件檢測中需要處理不同**尺度(Scale)**和**長寬比(Aspect Ratio)**的挑戰。 --- ### **Anchor 的核心概念** > 是一組預定義的候選邊界框,具有不同的尺度和長寬比,放置在特徵圖上的每個位置點。它們是物件檢測任務中預測邊界框的重要基礎,幫助模型高效處理不同大小和形狀的物件。 --- ### **Anchor 的示例** ![image](https://hackmd.io/_uploads/HyZDMF0Vkl.png) 根據右側圖示: - 每個黑色點(特徵圖上的一個位置)會生成 9 個 Anchors。 - 綠色、橘色、紅色的邊框代表不同尺度和長寬比的框: - **綠色**:大尺度(例如 \( 32 \))。 - **橘色**:中尺度(例如 \( 16 \))。 - **紅色**:小尺度(例如 \( 8 \))。 - 這些框會初步覆蓋不同大小和形狀的物件。 --- ### **Anchor 的優勢** 1. **高效處理不同尺度和形狀**: - 預定義多個尺度和長寬比的框,可以應對各種物件大小和形狀。 2. **計算高效**: - Anchors 是在特徵圖的固定位置上生成的,與輸入圖像大小無關,計算效率高。 3. **簡化物件提議**: - Faster R-CNN 中的 **Region Proposal Network (RPN)** 使用 Anchors,直接生成高質量的候選框,取代傳統耗時的 **Selective Search** 方法。 --- ![image](https://hackmd.io/_uploads/Sk1VQtC4ke.png) ### **RPN 的整體流程** 1. **輸入:Feature Map** - 由卷積神經網路 (CNN) 提取的特徵圖 (Feature Map),尺寸假設為 7 * 7 * 512 2. **滑動視窗與 3x3 卷積** - 在 Feature Map 上套用一個 3 * 3 的卷積核(如圖中 (3 * 3 * 512),生成一個較小的特徵圖。 - 這個步驟作用類似於 **滑動視窗**,用來掃描特徵圖的每個位置。 3. **兩個分支(並行運算)** 從 3 * 3 的卷積輸出,RPN 會分成**兩個分支**,分別負責: - **分類(Classification)**:判斷每個 Anchor 是「前景物件」還是「背景」。 - **回歸(Regression)**:調整 Anchor 的邊界框,使其更貼近真實物件的位置(即框的偏移量)。 #### **分支1:分類分支** - 進行 1 * 1 卷積,輸出維度為 1 * 1 * 18,(對應 9 * 2): - **9**:表示每個位置有 9 個 Anchors(3 種尺度 × 3 種長寬比)。 - **2**:對每個 Anchor 輸出 **分類分數**(是前景還是背景)。 - **Reshape 操作**:將輸出重塑為 7 * 7 * 9 * 2 - **Softmax 激活函數**:將輸出分數轉換為概率,判斷每個 Anchor 的類別(前景/背景)。 #### **分支2:回歸分支** - 進行 1 * 1 卷積,輸出維度為 1 * 1 * 36(對應 9 * 4): - **9**:每個位置的 9 個 Anchors。 - **4**:每個 Anchor 需要調整的 4 個參數(框的位置與大小偏移量)。 - **Reshape 操作**:將輸出重塑為 7 * 7 * 9 * 4 --- ### **分類分數與回歸調整的合併** 1. **分類結果(前景/背景概率)** 和 **回歸結果(框的偏移量)** 結合起來,生成候選區域(Proposals)。 2. **NMS(非極大值抑制)**: - 去除重疊過高的邊界框,只保留最有可能包含物件的候選框。 3. **輸出:Proposals** - 這些經過分類和回歸調整的邊界框,作為後續 RoI Pooling 和分類器的輸入。 --- ### **總結** 這張圖詳細展示了 **RPN (Region Proposal Network)** 的運作機制,包括: 1. **輸入**:CNN 輸出的特徵圖。 2. **3x3 卷積核**:滑動視窗操作,生成中間特徵。 3. **兩個分支**: - 分類分支:輸出前景/背景概率。 - 回歸分支:調整邊界框的偏移量。 4. **Reshape 與 Softmax**:對結果進行重塑和概率化處理。 5. **Proposals**:輸出調整後的候選邊界框,作為後續的輸入。 這樣的設計使 RPN 既能高效生成候選框,又能對候選框進行調整,為 Faster R-CNN 提供了精確且快速的物件提議機制。 --- ### **RoI 池化 (RoI Pooling)** > 將region proposal 統一成固定維度的特徵向量 ![image](https://hackmd.io/_uploads/SJDiWYREyg.png) - 將 RPN 提議的候選區域,從特徵圖上截取出固定大小的特徵表示(例如 7x7)。 - 這樣可以將不同大小的輸入候選框,轉換為統一維度的輸出,便於輸入全連接層進行分類與回歸。 --- ![image](https://hackmd.io/_uploads/HybAmYCVyx.png) ![image](https://hackmd.io/_uploads/HJ2PVFR4Jg.png) ![image](https://hackmd.io/_uploads/H1Jy4YA4ke.png) ![image](https://hackmd.io/_uploads/SJ_q4KANJx.png) ![image](https://hackmd.io/_uploads/B1BjEYR4Jg.png) ![image](https://hackmd.io/_uploads/BJyxNYA4yl.png) ![image](https://hackmd.io/_uploads/BJP89qC4yx.png) ### **損失函數 (Loss Function)** ![image](https://hackmd.io/_uploads/SySBWFAV1x.png) ![image](https://hackmd.io/_uploads/ry1s9qC4kx.png) Faster R-CNN 的總損失函數包含兩部分: 1. **RPN 損失**: - **分類損失**:物件 vs. 非物件(背景)。 - **回歸損失**:Anchor 框到 Proposal 框的偏移量。 2. **RoI 損失**: - **分類損失**:物件的類別(例如貓、狗)。 - **回歸損失**:Proposal 框到最終邊界框的偏移量。 總損失可以表示為: ![image](https://hackmd.io/_uploads/HytMZYAE1l.png) --- ### **Faster R-CNN 的優點** ![image](https://hackmd.io/_uploads/H1ivbYR4Je.png) 1. **速度快**: - RPN 取代了傳統的 Region Proposal 方法(如 Selective Search),計算效率更高。 - 相較於 R-CNN 和 Fast R-CNN,Faster R-CNN 在測試時速度更快(例如測試一張圖片只需 0.2 秒)。 2. **準確度高**: - RPN 透過學習生成更高質量的候選區域,提高檢測結果的準確性。 3. **端到端訓練**: - Faster R-CNN 將特徵提取、候選區域生成、分類與回歸統一整合,實現端到端訓練。 --- ### **總結** **Faster R-CNN** 是一種高效的兩階段物件檢測器,它的核心技術包括: 1. **CNN 特徵提取** 2. **區域提議網路 (RPN)**:生成高質量的候選區域。 3. **RoI 池化**:將候選區域統一成固定維度的特徵向量。 4. **分類與回歸**:分類物件類別並調整邊界框。 透過 RPN 和端到端訓練,Faster R-CNN 使物件檢測速度更快,準確度更高,達到更高的實用性。 ![image](https://hackmd.io/_uploads/rkS3gvseJl.png) > 這張圖雖然簡單,但是點出了一個大重點就是在"Region Proposal Network",後續我們會簡稱為RPN。RPN等於是在原本的Fast R-CNN的中間,多了一個分支來處理region proposals的小網路。所以今天這篇的重點就是來介紹Faster R-CNN加了anchor和RPN之後是如何運作的 1. **候選區域網絡(RPN)**: - RPN 是一個小型的神經網絡,專門用於生成候選區域。RPN 是在卷積特徵圖上滑動的,每次滑動會在特徵圖上生成一個固定尺寸的窗口,稱為 "anchor"。 - 對於每個 anchor,RPN 輸出兩個值:物件存在的可能性(objectness score)和相應的邊界框位置調整參數。 - RPN 不再依賴選擇性搜索,能夠在卷積特徵圖上高效生成大量高質量的候選區域。 2. **共享卷積特徵**: - Faster R-CNN 中,RPN 和 Fast R-CNN 共享同一個卷積特徵圖。這意味著 RPN 提供的候選區域可以直接在共享的特徵圖上進行分類和回歸。 - 這樣的設計大幅提高了運算效率,因為整個流程只需要在影像上進行一次卷積操作。 3. **RoI Pooling**: - RPN 生成的候選區域經過 RoI Pooling 後,被轉換為固定大小的特徵圖塊,並送入後續的分類和邊界框回歸層。 4. **分類與邊界框回歸**: - 與 Fast R-CNN 類似,這部分仍然進行物件分類和邊界框調整。兩者的結果一起決定最終的物件類別和精確位置。 **主要優勢**: - **高效候選區域生成**:引入 RPN 後,消除了選擇性搜索的計算瓶頸,顯著加快了候選區域的生成速度。 - **端到端的特徵學習**:Faster R-CNN 從影像輸入到物件偵測的結果,都可以在一個網絡中完成訓練,簡化了整體的工作流程。 **主要問題**: - **相對較慢的推理速度**:儘管 Faster R-CNN 相比之前的版本速度更快,但與後來的 YOLO、SSD 等單階段(one-stage)方法相比,推理速度仍然偏慢。 論文: https://arxiv.org/abs/1506.01497 參考: https://ivan-eng-murmur.medium.com/object-detection-s3-faster-rcnn-%E7%B0%A1%E4%BB%8B-5f37b13ccdd2 ### 總結對比 - **R-CNN** 將物件偵測拆解成了候選區域生成、特徵提取、分類和邊界框回歸多個步驟,但計算量大且訓練過程複雜。 - **Fast R-CNN** 改進了卷積特徵提取和訓練過程的效率,將多任務學習(分類與邊界回歸)整合在同一網絡中,但仍依賴選擇性搜索進行候選區域生成。 - **Faster R-CNN** 通過引入 RPN 提高了候選區域生成的效率,實現了真正的端到端訓練,成為當時精度和效率的最佳平衡。 以上這些R-CNN種類的two-stage方法在object detection的發展歷史中扮演了非常重要的角色,但隨著技術的進步,它們在一些應用中逐漸被速度更快、結構更簡單的單階段(one-stage)物件偵測方法取代,如 YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector) 等。 ### 為什麼 R-CNN 系列的方法逐漸被取代? 1. **計算效率**: - R-CNN 系列(特別是 R-CNN 和 Fast R-CNN)雖然精度高,但因為需要生成候選區域(如選擇性搜索或 RPN),且候選區域數量多,導致其運算速度較慢,尤其是在即時應用(如視頻分析)中難以滿足實時性要求。 - Faster R-CNN 通過引入區域提案網絡(RPN)提高了效率,但整體架構依然較為複雜,訓練和推理所需的時間較長。 2. **架構複雜度**: - R-CNN 系列方法通常是雙階段(two-stage)方法:第一階段是生成候選區域,第二階段是對候選區域進行分類和回歸。這種架構導致訓練流程較為複雜,且需要更多的調參工作。 - 雖然雙階段方法通常會有更好的偵測精度,但在很多應用場景中,特別是即時偵測需求中(如自駕車、監控系統),更注重速度而非極致的精度。 ### one-stage 方法(如 YOLO 和 SSD) YOLO 是一種單階段(Single-Stage)物件檢測模型,與傳統的 R-CNN 系列(例如 Faster R-CNN)相比,YOLO 的主要特點是: - 速度極快,實現real-time檢測。 - 將 object detection 任務看作是一個回歸問題,直接預測邊界框和類別。 - 只需對圖像進行一次前向傳播,即可完成檢測,故稱 You Only Look Once。 # YOLO 與 one-stage model 演進 ![01608334-A701-47A4-A533-C6DD86E3FFB4](https://hackmd.io/_uploads/rksussAE1x.jpg) ![9A46FE5F-36A1-476F-A0A0-BF08AA2E1B8A](https://hackmd.io/_uploads/Hks_ji0Nkl.jpg) 1. **YOLOv1(You Only Look Once)**: ![image](https://hackmd.io/_uploads/rkxG4woxyx.png) - **YOLO 系列**是一類單階段(one-stage)的物件偵測方法,主要特點是將object detection 問題轉化為一個回歸問題,直接預測整張影像上的 bounding boxes 和其對應的分類結果。這使得 YOLO 在速度上比 R-CNN 系列快很多。 ![image](https://hackmd.io/_uploads/r1b8Do0V1l.png) ![image](https://hackmd.io/_uploads/Hy9dwoRE1x.png) - 例如,YOLO 將整張影像劃分為網格,每個網格負責預測物件的類別和位置。這種方法不需要生成region proposal的過程,就可以一次性完成物件定位和分類。 - **核心思想**: - 將圖像劃分為 **S × S 的網格**(例如 7×7)。 - 每個網格預測: 1. **邊界框 (Bounding Boxes)** 的位置與大小(x, y, w, h)。 2. **置信度 (Confidence Score)**:判斷是否包含物件。 3. **類別概率 (Class Probabilities)**。 - 每個網格最多預測 **2 個邊界框** 和其對應的物件類別。 - **優點**: 1. **速度快**:因為只需對圖像進行一次前向傳播。 2. 模型結構簡單,適合實時應用。 - **缺點**: ![image](https://hackmd.io/_uploads/BymlOoAVyl.png) 1. **小物件檢測效果不佳**:由於網格劃分過於粗糙,小物件可能被忽略。 2. **定位不精確**:每個網格只負責預測中心點落在該網格內的物件,限制了框的位置準確性。 ### 2. YOLOv2 ![image](https://hackmd.io/_uploads/B1fwusR4ke.png) ![image](https://hackmd.io/_uploads/HkNFujCV1l.png) - **改進點**: 1. **Batch Normalization**:對每一層進行標準化,加速收斂並提升性能。 2. **錨點機制 (Anchor Boxes)**: - 引入 **Anchor Boxes**,類似於 Faster R-CNN 的設計,預測邊界框的相對偏移量。 - 解決 YOLOv1 框大小不靈活的問題。 3. **多尺度訓練**:隨機調整輸入圖像大小,讓模型適應不同尺度的物件。 4. **類別預測**:加入 **YOLO9000**,同時完成物件檢測和分類。 - **性能提升**: - **mAP**(Mean Average Precision)顯著提升,且保持實時速度。 - 提供物件檢測和分類的「多任務學習」能力。 ## SSD(Single Shot MultiBox Detector)(2016) > SSD 不需要獨立生成region proposal,而是直接在不同尺度的特徵圖上進行物件預測。這使得 SSD 在處理不同大小的物件時有較好的性能。 > - SSD 可以同時考慮大物件和小物件的偵測,並且保持了較高的運算速度和準確性。 ![image](https://hackmd.io/_uploads/BkqeYi0Vyl.png) **提出者**:2016 年,由 Google 提出。 **核心概念**: - 與 YOLO 類似,**SSD** 是一個單階段的檢測器,可以同時預測邊界框和類別標籤。 - **多尺度特徵圖**:在不同解析度的特徵圖上同時預測物件,以解決小物件檢測效果差的問題。 ### **SSD 的技術細節** 1. **Backbone**:使用 VGG16 作為特徵提取網路。 2. **多尺度特徵圖**: ![image](https://hackmd.io/_uploads/SkS8KiAEJl.png) - 透過不同層的特徵圖(例如 38×38, 19×19, 10×10, 等)來檢測不同尺寸的物件。 - **高解析度特徵圖**:用於檢測小物件。 - **低解析度特徵圖**:用於檢測大物件。 3. **Anchor Boxes(預設框)**: - 每個網格位置使用多個預設框(不同的尺度與長寬比)。 - 與 Faster R-CNN 的錨點機制類似。 4. **損失函數**: - 包括 **分類損失(Cross Entropy Loss)** 和 **邊界框回歸損失(Smooth L1 Loss)**。 **優點**: - 計算效率高,速度快,能夠實現即時檢測。 - 支援多尺度特徵圖,有效提升小物件檢測效果。 **缺點**: - 對於小物件的精度仍然不如兩階段模型(例如 Faster R-CNN)。 ![image](https://hackmd.io/_uploads/SkrFKo0Eyl.png) 缺點: ![image](https://hackmd.io/_uploads/BJcoKsC4Jl.png) ------ ## **RetinaNet** (2017) > 是 one-stage detector 中首次提出 **Focal Loss**(焦點損失),解決了one-stage detector 中前景與背景樣本比例嚴重不平衡的問題。 - 它的目標是**結合速度與準確率**,縮小與兩階段檢測器(如 Faster R-CNN)的精度差距。 ![image](https://hackmd.io/_uploads/rkNyaoCVJg.png) **提出者**:2017 年,由 Facebook AI 提出。 ### **RetinaNet 的技術細節** 1. **Backbone**:使用 **ResNet** 和 **Feature Pyramid Network (FPN)**。 ![image](https://hackmd.io/_uploads/SJcP-nCVyl.png) ![image](https://hackmd.io/_uploads/H1FjZ2041e.png) - **ResNet**:進行特徵提取。 - **FPN**:融合不同尺度的特徵圖,增強多尺度檢測能力。 2. **Anchor Boxes**: - 與 SSD 類似,RetinaNet 也使用預設框(Anchors)來預測邊界框。 - 每個特徵圖位置生成多個 Anchor Boxes。 3. **Focal Loss**: ![image](https://hackmd.io/_uploads/SkUS-2CE1x.png) - 解決 **前景與背景樣本不平衡** 的問題。 - 傳統的 **Cross Entropy Loss** 容易被大量的背景樣本主導,導致模型忽略少數的前景樣本。 - Focal Loss 引入一個調節因子,降低背景樣本的權重,提高難檢測物件的權重。 ![image](https://hackmd.io/_uploads/Bk7bM2ANyg.png) ![image](https://hackmd.io/_uploads/S1UT-h0V1e.png) ![image](https://hackmd.io/_uploads/S1V0W3C4Je.png) **優點**: - Focal Loss 有效解決樣本不平衡問題,提升了單階段檢測器的精度。 - 結合 FPN 和 Anchor Boxes,實現了高準確率的多尺度檢測。 **缺點**: - 訓練過程相對複雜。 - 計算成本比 SSD 高。 ### **YOLOv3 的差異** **YOLOv3** 與 SSD 和 RetinaNet 相比,主要差異在於設計上的細節: | 特點 | SSD | RetinaNet | YOLOv3 | | --- | --- | --- | --- | | **Backbone** | VGG16 | ResNet + FPN | DarkNet-53 | | **損失函數** | Cross Entropy + Smooth L1 | **Focal Loss** | Cross Entropy + 回歸損失 | | **多尺度特徵** | 多尺度特徵圖 | FPN(特徵金字塔) | 三個尺度輸出特徵圖 | | **速度** | 快 | 中等 | 非常快 | | **小物件檢測** | 中 | 高 | 高 | - **SSD** 注重速度與多尺度檢測,適合即時應用。 - **RetinaNet** 提出 **Focal Loss**,提升單階段檢測器的精度,尤其在小物件檢測上效果優異。 - **YOLOv3** 則保持一貫的高速度,同時透過多尺度輸出來提升小物件的檢測效果。 ## YOLOv3 ![image](https://hackmd.io/_uploads/SJtpMh04kg.png) **結構改進** - 採用 **DarkNet-53** 作為 backbone,包含 **ResNet** 的概念。 - 引入 **Spatial Pyramid Pooling (SPP)** 和 **Feature Pyramid Network (FPN)** 的技術: - **SPP**:支援不同大小的物件 。 - **FPN**:多尺度預測,利用不同的特徵圖進行物件偵測。出3個特徵圖(大、中、小)用於偵測不同大小的物件。 - **激活函數**:**Leaky ReLU** 搭配 Batch Normalization 。 ![image](https://hackmd.io/_uploads/ryr1Q2AEJg.png) ![image](https://hackmd.io/_uploads/HyYl7hANkx.png) - **分類方式**:使用 softmax 與 logistic regression: - 結構簡單、速度快、背景誤判率低 。 ![image](https://hackmd.io/_uploads/HkdnznAV1e.png) ![image](https://hackmd.io/_uploads/HJGzm2R4ke.png) ### Object detection structures ![image](https://hackmd.io/_uploads/H118X30NJg.png) ### **Object Detection Structures 詳細解釋** 這張圖將**物件偵測架構**分為四個主要部分:**Input**、**Backbone**、**Neck** 和 **Head**,並區分了 **One-Stage Detector** 和 **Two-Stage Detector**。 --- ## **1. Input(輸入)** - **作用**:提供輸入資料給物件偵測模型。 - **內容**: - **Image**:原始圖像。 - **Patches**:圖像被分割成小塊。 - **Image Pyramid**:多尺度圖像,用於檢測不同大小的物件。 --- ## **2. Backbone(特徵提取網路)** - **作用**:用來提取圖像的 **特徵**,輸出不同尺度的特徵圖(Feature Maps)。 - **常見的 Backbone**: - **VGG16**:早期常用的卷積網路架構。 - **ResNet-50 / ResNet-101**:引入殘差連接,解決梯度消失問題。 - **ResNeXt-101**:改進 ResNet,增加了模型的寬度與表現力。 - **Darknet-53**:YOLOv3 的骨幹網路,計算效率高。 - **功能**:對圖像進行卷積操作,提取不同層級的特徵,作為後續檢測的基礎。 --- ## **3. Neck(特徵融合與強化)** - **作用**:對 Backbone 提取的特徵圖進行**進一步處理**,融合多尺度特徵,提升檢測性能。 - **常見的 Neck 結構**: - **FPN(Feature Pyramid Network)**:融合高層語義特徵與低層細節特徵,增強小物件的檢測能力。 - **PANet(Path Aggregation Network)**:進一步優化 FPN,增強特徵融合能力。 - **Bi-FPN(Bidirectional Feature Pyramid Network)**:雙向特徵融合,提升計算效率。 --- ## **4. Head(物件預測)** Head 是模型的輸出部分,分為兩種預測類型: ### **4.1 Dense Prediction(密集預測)** - **特徵**:在所有位置(每個網格點)進行預測,適合 **One-Stage Detector**。 - **代表模型**: - **YOLO**:將輸入圖像劃分為網格,對每個網格進行物件檢測與分類。 - **SSD**:在多尺度特徵圖上進行檢測,適合小物件檢測。 - **RetinaNet**:引入 Focal Loss 解決類別不平衡問題。 - **FCOS**:基於中心點的檢測,避免使用錨點框(Anchor-Free)。 ### **4.2 Sparse Prediction(稀疏預測)** - **特徵**:僅對少數的候選區域進行預測,適合 **Two-Stage Detector**。 - **代表模型**: - **Faster R-CNN**:先生成候選框(Region Proposal)再進行分類與回歸。 - **R-FCN(Region-based Fully Convolutional Networks)**:加速 Faster R-CNN 的 RoI Pooling 過程。 --- ## **整體結構流程** 1. **Input**:將圖像輸入到模型中。 2. **Backbone**:提取圖像的多層次特徵。 3. **Neck**:融合和強化不同尺度的特徵圖。 4. **Head**: - **Dense Prediction**:對所有網格進行檢測(YOLO, SSD, RetinaNet)。 - **Sparse Prediction**:生成候選區域後再精細分類與回歸(Faster R-CNN, R-FCN)。 這樣的結構設計使得物件偵測器能夠平衡速度與準確率,根據不同的應用場景選擇合適的架構。 ![a (1)](https://hackmd.io/_uploads/B1EqNnAEkg.png) ### **Dense Prediction v.s. Sparse Prediction 的解釋** 關於Head 是模型的輸出部分,分為兩種預測類型: 這張圖對比了 **Dense Prediction(密集預測)** 和 **Sparse Prediction(稀疏預測)** 在物件檢測中的差異。 --- ### **1. Dense Prediction(左圖)** - **定義**: - 在輸入圖像的**每個像素或固定區域**上進行預測。 - 例如,透過滑動視窗 (Sliding Window) 或 Anchor Box 概念,針對圖像的每個網格單位進行檢測。 - **特徵**: - **網格覆蓋整個圖像**,每個位置都生成大量候選框(Anchors)。 - 適合用於密集場景,但計算量大,會產生大量冗餘框(重疊框)。 - **優點**: - **高覆蓋率**:不容易錯過物件。 - **缺點**: - **計算成本高**:需要針對每個網格或像素進行檢測和預測。 - **冗餘預測多**:產生過多候選框,需要進行過濾(例如 NMS)。 --- ### **2. Sparse Prediction(右圖)** - **定義**: - 僅在一些選定的位置進行預測,而不是對整個圖像進行密集檢測。 - 例如,透過 RPN(Region Proposal Network)生成少量的候選框,或依據重要性進行篩選。 - **特徵**: - **框的位置較少**,只針對最有潛力的區域進行預測。 - 節省計算資源,減少冗餘框。 - **優點**: - **計算效率高**:減少無效的計算。 - **結果更精確**:直接聚焦於潛在物件所在區域。 - **缺點**: - **低覆蓋率**:如果物件未被篩選出來,可能會錯過檢測。 --- ## **YOLOv4** ![image](https://hackmd.io/_uploads/BkxfShCN1l.png) ![image](https://hackmd.io/_uploads/ry47H3ANyx.png) - - **Backbone**:CSPDarknet53(Crortial Network),減少重複梯度計算,加速訓練 。 - **Neck**: 對 Backbone 提取的特徵圖進行進一步處理,融合多尺度特徵,提升檢測性能。 ![image](https://hackmd.io/_uploads/B1GBr2CE1g.png) - **Spatial Pyramid Pooling (SPP)**:擴展感受野。 - *PANet*。 ![image](https://hackmd.io/_uploads/r1LLS3AV1l.png) - **Head**: ![image](https://hackmd.io/_uploads/BJPDB3CVJx.png) - 消除網格敏感度(Grid Sensitivity)問題 。 ![image](https://hackmd.io/_uploads/S1jdr2A4kl.png) ![image](https://hackmd.io/_uploads/H1bcS20Vkx.png) - 使用 **CIoU Loss** 進行邊框回歸優化。 - 引入 **Focal Loss** 概念,處理前景與背景樣本不平衡問題。 ![image](https://hackmd.io/_uploads/SJUjB2AVye.png) ![b](https://hackmd.io/_uploads/ByEHLhCEJx.png) > YOLOv4 可偵測到後面被遮蔽的物體 ![c](https://hackmd.io/_uploads/r1NHU304kg.png) ### **總結:One-Stage 與 Two-Stage Detector** 1. **One-Stage Detector**(例如 YOLO、SSD、RetinaNet): - 在單次前向傳播中同時預測物件位置與類別。 - **優勢**:速度快,適合即時應用。 - **缺點**:準確率稍低,尤其是小物件檢測。 2. **Two-Stage Detector**(例如 Faster R-CNN、R-FCN): - 第一步生成候選區域(Region Proposal),第二步對候選區域進行分類與回歸。 - **優勢**:準確率高,檢測效果優秀。 - **缺點**:速度較慢,計算量較大。 ![image](https://hackmd.io/_uploads/SJcPLnCEyx.png) 以下是 **YOLOv5 到 YOLOv9** 的詳細架構與演進介紹: --- ## **YOLOv5(2020)** - **開發者**:由 Ultralytics 團隊開發。 - **特點**:沒有正式論文發表,但因為易於使用和優化,廣受歡迎。 - **技術細節**: 1. **Backbone**: - 採用 **CSPNet(Cross Stage Partial Network)** 架構,減少冗餘計算,提升效率。 - 輕量化設計,支援更快速的推理速度。 2. **Neck**: - 使用 **PANet(Path Aggregation Network)** 進行特徵融合,提升多尺度檢測能力。 3. **Anchor Boxes**: - 與 SSD 類似,每個網格位置使用預設框來預測邊界框。 4. **激活函數**: - 使用 **Leaky ReLU** 和 **SiLU(Sigmoid Weighted Linear Unit)**。 5. **數據增強**: - 引入 **Mosaic Augmentation** 和 **MixUp** 等數據增強方法,提升模型泛化能力。 6. **損失函數**: - 使用 **CIoU Loss**(Complete IoU)來改善邊界框回歸。 - **模型變體**: - 提供 **S/M/L/XL** 四個不同規模的模型,根據速度與準確度需求進行選擇。 --- ## **YOLOv6(2022)** - **開發者**:由 **Meituan** 團隊推出,針對工業應用進一步優化。 - **技術細節**: 1. **Backbone**: - 採用優化過的 CSPNet 結構,並進一步輕量化設計。 2. **Neck**: - 使用 **EfficientRep** 進行特徵融合,減少計算量。 3. **Anchor-Free 機制**: - YOLOv6 支援無錨點(Anchor-Free)的物件偵測,提高訓練效率。 4. **損失函數**: - 使用 **IoU Loss** 和 **Distill Loss**,進一步提升模型表現。 5. **訓練技巧**: - 使用 **Knowledge Distillation(知識蒸餾)** 技術,加速小模型的訓練。 - **優點**: - 提供高效能與高準確率,適合工業部署和邊緣設備。 --- ## **YOLOv7(2022)** - **開發者**:由 YOLOv4 團隊提出。 - **特點**:在速度和準確率之間達到了新平衡。 - **技術細節**: 1. **Backbone**: - 採用 **E-ELAN(Efficient Layer Aggregation Network)**,提升特徵融合效果。 2. **Head**: - 提出 **Dynamic Label Assignment**,根據物件的特徵動態分配標籤。 3. **訓練技巧**: - 使用模塊化設計和高效的訓練策略,如梯度加速。 4. **性能**: - 相較於 YOLOv4 和 YOLOv5,YOLOv7 在 **COCO Dataset** 上達到更高的 mAP。 - **優點**: - 提供更高的準確率,並同時保持極高的速度。 --- ## **YOLOv8(2023)** - **開發者**:由 Ultralytics 團隊推出。 - **特點**:靈活支援多任務,包括 **分類**、**物件偵測** 和 **語意分割**。 - **技術細節**: 1. **Backbone**: - 改進 CSPNet 結構,進一步優化計算效率。 2. **Neck**: - 使用 **BiFPN**(Bidirectional Feature Pyramid Network),進一步強化多尺度特徵融合。 3. **Anchor-Free**: - 支援 Anchor-Free 檢測,減少錨點的計算開銷。 4. **損失函數**: - 引入 **Alpha IoU Loss**,更精確地進行邊界框回歸。 5. **訓練技巧**: - 支援自動優化超參數,提高訓練效率。 6. **可擴展性**: - 適配多個任務(例如語意分割),讓模型應用範圍更廣。 ## YOLOv9架構 ![image](https://hackmd.io/_uploads/BJwSchRV1x.png) ### 核心技術 1. **可程式化梯度資訊 (PGI)**: - PGI是一種新技術,旨在解決深度學習中的信息瓶頸問題。它能夠在深層網絡中保留重要數據,生成可靠的梯度,以促進模型的準確更新,從而提高整體檢測性能[1][3]。 2. **廣義高效層聚合網路 (GELAN)**: - GELAN通過優化網絡結構和計算效率,提升了參數利用率。這使得YOLOv9能夠在保持輕量級的同時,實現卓越的準確性和速度[2][3]。 ### 設計理念 - **信息瓶頸原理**: - YOLOv9採用了信息瓶頸原理,這一原理指出隨著數據通過多層網絡,信息可能會逐漸流失。YOLOv9透過PGI來保留關鍵數據,確保模型在訓練過程中不會丟失重要信息[3][4]。 - **可逆函數**: - 可逆函數的使用使得YOLOv9能夠在不丟失信息的情況下進行反向傳播,這對於深度學習模型至關重要,因為它減少了信息退化的風險[3][4]。 ## 性能優勢 - YOLOv9在計算成本和記憶體流量上顯著降低,同時保持卓越性能。例如,相較於YOLOv7 AF,YOLOv9-C減少了42%的參數和21%的計算需求,但達到了相同的平均準確率(AP)[1][2]。 - 在MS COCO數據集上,YOLOv9設立了新的性能標杆,其運行速度比最先進的方法提高了135倍,而模型尺寸減少了17倍[1][3]。 ## 應用場景 YOLOv9被廣泛應用於多個領域,包括: - **交通分析** - **自駕車** - **邊緣設備** - **即時監測和複雜場景理解**[1][2][3]。 ## 結論 YOLOv9透過引入PGI和GELAN等創新技術,在物件偵測領域樹立了新的標杆。其設計不僅解決了深度神經網絡中的信息丟失問題,還顯著提升了模型的效率與準確性,使其成為智慧城市、自動駕駛及監控系統等領域的重要AI演算法。 --- ### **YOLOv5 - YOLOv9 比較總結** | 版本 | 發布年份 | Backbone | Neck 結構 | 特點 | 任務範圍 | |-----------|----------|------------------------|-----------------|----------------------------|----------------------| | YOLOv5 | 2020 | CSPNet | PANet | 輕量化、高速推理 | 物件檢測 | | YOLOv6 | 2022 | CSPNet(優化) | EfficientRep | Anchor-Free 支援,工業應用 | 物件檢測 | | YOLOv7 | 2022 | E-ELAN | FPN | 準確率更高,動態標籤分配 | 物件檢測 | | YOLOv8 | 2023 | CSPNet(改進) | BiFPN | 支援多任務學習,Anchor-Free | 檢測、分類、分割 | | YOLOv9 | 預測 | 結合 Transformer | BiFPN(優化) | 完全 Anchor-Free,適配邊緣 | 檢測、分割、追蹤等 | --- ### **結論** 1. **YOLOv5 到 YOLOv8**:每一代模型都在速度、準確率和計算效率之間達到新的平衡。 2. **YOLOv8**:支援多任務學習(分類、物件檢測、語意分割),具備廣泛的應用場景。 3. **YOLOv9**(預測):未來可能結合 Transformer 架構,進一步提升全局特徵提取和小物件檢測能力,並實現完全 Anchor-Free 檢測。 YOLO 系列持續推動物件檢測領域的發展,滿足即時應用和邊緣計算的需求。 ### YOLO 和 SSD 的對比 | **特徵** | **YOLO(You Only Look Once)** | **SSD(Single Shot MultiBox Detector)** | |-----------------------|-----------------------------------------------------------|-----------------------------------------------------------| | **主要方法** | 將影像劃分為網格,對每個網格直接進行分類和定位 | 使用多尺度特徵圖,對預設框進行分類和回歸 | | **速度** | 非常快,適合即時應用 | 快,但稍慢於 YOLO | | **多尺度特徵** | 原始版本沒有多尺度特徵,後續版本(如 YOLOv3)加入多尺度 | 天然支持多尺度特徵,適合偵測大小不一的物件 | | **對小物件的偵測** | 早期版本對小物件敏感度較低,後續版本有改善 | 對小物件的偵測性能較好 | | **框預測方法** | 每個網格預測固定數量的邊界框 | 預設多個比例和尺寸的預設框,覆蓋更多的物件變化 | | **模型架構** | 單一的 CNN 結構,用於同時進行物件定位和分類 | 在不同的卷積層進行物件偵測,適應不同大小的物件 | | **訓練難度** | 相對簡單,容易實現和訓練 | 訓練過程中需要調整預設框的設計和損失函數 | ### 總結 - **YOLO** 和 **SSD** 都是高效的單階段物件偵測方法,特別適合即時性要求高的場景。 - **YOLO** 通過網格劃分的方式直接預測物件框,適合需要極速推理的場景。後續版本(如 YOLOv3 和 YOLOv4)進一步提升了對小物件的偵測能力。 - **SSD** 通過多尺度特徵圖進行預測,對不同大小的物件都有不錯的偵測能力,並且能夠更精細地調整框的位置和尺寸。 論文: 1. YOLO(You Only Look Once): https://pjreddie.com/media/files/papers/yolo.pdf 3. SSD(Single Shot MultiBox Detector): https://link.springer.com/chapter/10.1007/978-3-319-46448-0_2 參考資料: 1. YOLO: https://ivan-eng-murmur.medium.com/object-detection-s4-yolo-v1%E7%B0%A1%E4%BB%8B-f3b1c7c91ed 2. SSD: https://ivan-eng-murmur.medium.com/object-detection-s6-ssd-%E7%B0%A1%E4%BB%8B-e844e537583a ### 單階段方法的優勢 1. **速度快**: - 單階段方法(如 YOLO、SSD)能夠一次性處理整張影像上的所有物件,不需要像雙階段方法那樣先生成候選區域,再對候選區域進行精細處理。這使得它們在推理速度上遠遠快於 R-CNN 系列,適合需要高頻率更新的場景(如即時視頻流)。 2. **架構簡單、易於部署**: - 單階段方法的結構通常更簡單,因此更易於在移動設備、邊緣設備等算力有限的硬體上部署。而 R-CNN 系列方法通常需要更高的計算資源來支持其運行。 3. **性能進步**: - 隨著深度學習模型和訓練技術的進步,單階段方法在精度上也逐漸逼近甚至超越了傳統的 R-CNN 系列。這使得在需要精度與速度平衡的應用中,單階段方法成為主流選擇。 ### 現代應用中的角色 - 雖然 R-CNN 系列方法逐漸在一些即時應用中被單階段方法取代,但在高精度要求的任務(如醫學影像分析、遙感影像分析等)中,Faster R-CNN 及其變體仍然是重要的選擇。這些場景中,更關注模型的偵測精度而非速度。 - 此外,Faster R-CNN 也常被作為基礎模型進行改進和研究,如 Mask R-CNN(用於物件分割)等變體仍然在學術界和一些工業應用中有很高的使用率。 ### 總結 - **R-CNN 系列模型**曾經是物件偵測領域的主流,但由於速度和架構複雜度上的劣勢,現今在實時應用中逐漸被 **YOLO**、**SSD** 等單階段方法取代。 - **one-stage 方法** 更適合需要即時性和計算資源受限的場景,如自駕車、監控和手機端的物件偵測。 - **R-CNN 系列的改進版本**(如 Mask R-CNN)在特定的高精度應用中仍然具有重要的價值。 --- ## Object tracking ![image](https://hackmd.io/_uploads/ryHx76JrJe.png) #### 應用: 1. Video surveillance 視評監控 ![image](https://hackmd.io/_uploads/rJBdQp1Hyg.png) 3. Autonomous driving 自駕車 ![image](https://hackmd.io/_uploads/SysK7p1rJe.png) 5. Robotics 機器人 ![image](https://hackmd.io/_uploads/SJ3cXTJrkl.png) 7. Trajectory analysis 軌跡分析 ![t (1)](https://hackmd.io/_uploads/r1VlEayS1l.png) ![image](https://hackmd.io/_uploads/SJdZVTkS1e.png) ![image](https://hackmd.io/_uploads/S1zQ4a1r1g.png) ### Types of Object Tracking - Single object tracking - Multiple object tracking (MOT) ![image](https://hackmd.io/_uploads/ryXvEayBJg.png) ### 1. Single Object Tracking ![image](https://hackmd.io/_uploads/r1x5V6ySJg.png) ### GOTURN - To treat tracking as a regression problem - Predict the coordinates of the bbox in current frame - Assume the object moves slowly - Crop the object to be tracked ![image](https://hackmd.io/_uploads/HkTeB6JS1l.png) ![image](https://hackmd.io/_uploads/BkMzS6JS1x.png) ![image](https://hackmd.io/_uploads/BkfQB61Hye.png) ### MDNet (Multiple Domain Network) - Motivation: • Significant appearance variations of objects need to be learned. • The same object might be the foreground in one sequence and the background in another. • A large CNN for detection or segmentation is not required 1. 物件外觀有顯著變化 - 同一物件在不同場景可能有極大差異 - 在一個序列中可能是前景,在另一個序列中可能是背景 2. 傳統偵測方法的局限性 - 大型CNN用於偵測或分割並不總是必要 - 需要更靈活的追蹤方法 ![image](https://hackmd.io/_uploads/HkhsBa1rJe.png) ![image](https://hackmd.io/_uploads/rkmaSTkBJl.png) 1. 線上外觀模型學習 - 在測試時即時訓練卷積神經網絡 (CNN) - 由於即時訓練會降低速度,因此只訓練少量網絡層 - 通常只更新全連接層(fc4或fc6) ![image](https://hackmd.io/_uploads/BJ0aS6yryg.png) 2. 訓練策略 - 反向傳播針對每個序列獨立操作 - 測試階段需要訓練特定層 - 採用R-CNN類型的回歸方法 ![image](https://hackmd.io/_uploads/BJsAS6kB1l.png) 3. 追蹤流程 - 初始化:給定第一幀中目標物件 - 提取特徵:使用預訓練網絡 - 線上微調:根據當前序列調整網絡 - 追蹤:預測目標位置 ![image](https://hackmd.io/_uploads/SyI18a1H1e.png) ## 技術優勢 1. 靈活性 - 不依賴於先前位置的假設 - 允許物件在圖像中自由移動 2. 計算效率 - 微調步驟計算開銷相對較低 - 不需要大規模網絡重訓練 3. 競賽成就 - 2015 VOT (Visual Object Tracking) Challenge冠軍 ## 潛在局限性 1. 追蹤速度 - 由於需要線上微調,比GOTURN等方法慢 - 實時性能可能受影響 2. 依賴初始框 - 初始目標框的質量直接影響追蹤效果 - 對初始化非常敏感 ### ROLO (Recurrent YOLO) ![image](https://hackmd.io/_uploads/Hy4VvpkS1x.png) ![image](https://hackmd.io/_uploads/rJ_BvaySJg.png) # Multiple object tracking (MOT) ![m (1)](https://hackmd.io/_uploads/HkgD9vakHkl.png) ### Online v.s. offline tracking ![image](https://hackmd.io/_uploads/SyasvT1Syg.png) ### Motion model ![image](https://hackmd.io/_uploads/BJ2TvayBye.png) **功能**: - 預測物體的「未來位置」,基於物體過去的運動軌跡,確保追蹤過程中的平滑性與準確性。 - 特別適用於 **連續幀** 的影片追蹤,縮小物體搜尋範圍。 **經典方法**: 1. **卡爾曼濾波器(Kalman Filter)**: - 假設物體沿著 **線性運動**,並具有 **高斯噪聲**,用來預測物體下一幀的位置。 - 應用:如 SORT 方法中主要依賴 Kalman Filter 進行運動預測。 2. **粒子濾波器(Particle Filter)**: - 使用粒子分佈來模擬物體的非線性運動軌跡,特別適合複雜動態。 3. **常速模型(Constant Velocity Model)**: - 假設物體速度恆定,較適用於簡單場景。 **現代方法**: 1. **RNN(循環神經網路)**: - 使用時間序列數據學習物體的運動軌跡,適合複雜或非線性運動。 2. **Transformer**: - 透過「自注意力機制(Self-Attention)」捕捉長期時間依賴性,處理更大範圍的動態變化。 3. **GNN(圖神經網路)**: - 將物體軌跡建模為「圖結構」,學習物體間的空間與時間關係。 ### Appearance model ![image](https://hackmd.io/_uploads/Sypy_pySyl.png) **功能**: - 比對「預測位置」與「真實檢測結果」,透過外觀特徵來識別目標物體,特別是在多物體追蹤中防止「ID Switch」(目標身份切換)。 **方法概述**: 1. **二分圖匹配(Bipartite Matching)**: - 計算預測與檢測框之間的「距離」,包括: - **IoU(Intersection over Union)**:重疊程度的衡量。 - **像素距離(Pixel Distance)**:框內像素的相似度。 - **3D 距離**:在 3D 空間中計算物體位置的差異。 - 透過 **Hungarian Algorithm(匈牙利算法)**,解決唯一匹配問題,將預測與檢測框進行最佳分配【19:31-33†source】。 2. **Appearance Descriptor(外觀描述符)**: - 使用 **預訓練 CNN** 提取物體的外觀特徵,如顏色、紋理和形狀。 - 應用場景: - 在 DeepSORT 方法中,Appearance Model 與 Motion Model 結合,進一步提升追蹤精度,特別是應對遮擋問題。 3. **解決問題**: - 如果預測或檢測結果缺失,透過「虛擬節點」補全匹配。 - 處理「長距離匹配」或「相似外觀物體」的挑戰。 ![image](https://hackmd.io/_uploads/HkQZdaySyx.png) ![image](https://hackmd.io/_uploads/B1gfdTJHJe.png) ### **Motion Model 與 Appearance Model 的協同工作** 1. **Motion Model** 提供「下一個可能位置」的預測,縮小搜尋範圍。 2. **Appearance Model** 根據外觀特徵驗證預測位置,解決 ID Switch 和遮擋問題。 例如在 **DeepSORT** 方法中: - **Kalman Filter**(運動模型)進行運動預測。 - **Appearance Model** 計算預測與檢測框的外觀距離,透過 Hungarian Algorithm 進行匹配,進一步提升多物體追蹤的穩定性和準確度。 --- ### SORT (Simple Online and Realtime Tracking) 是一種輕量、高效的 多物體追蹤方法,主要依賴於「運動模型(Motion Model)」來進行目標位置的預測,並透過數據關聯(Data Association)來完成軌跡更新。 SORT 的設計理念在於 即時處理(Realtime Processing),適合於高效能需求場景 。 ![image](https://hackmd.io/_uploads/HkCZ5TkBJx.png) ## **1. SORT 的核心組件** SORT 的運作流程可分為三大步驟: 1. **目標檢測(Detection)** 2. **運動預測(Motion Prediction)** 3. **數據關聯(Data Association)** ![image](https://hackmd.io/_uploads/Hk_N9ayryx.png) ### **步驟一:目標檢測** - 採用目標檢測器(如 **Faster R-CNN**)來獲得每一幀的 **目標檢測框(bounding boxes)** 和置信度。 - 檢測框作為「候選物體」,為下一步的追蹤提供基礎。 --- ### **步驟二:運動預測(Motion Model)** - 使用 **卡爾曼濾波器(Kalman Filter)** 預測目標在下一幀中的位置: - **輸入**:物體在當前幀的狀態(位置和速度)。 - **輸出**:預測的物體位置和速度。 - 假設物體沿著「**線性運動**」並且運動帶有「高斯噪聲」。 - **Kalman Filter 工作流程**: 1. **預測階段(Prediction Step)**:根據當前狀態,預測下一個狀態。 2. **更新階段(Update Step)**:使用觀測值(檢測框)修正預測值。 --- ### **步驟三:數據關聯(Data Association)** - 使用「**匈牙利算法(Hungarian Algorithm)**」將預測的軌跡與檢測框進行匹配。 - **匹配成本**:主要透過 **IoU(Intersection over Union)** 計算預測框與檢測框的重疊程度。 ### **結果分類**: 1. **匹配軌跡(Matched Tracks)**:預測與檢測結果成功匹配,更新軌跡。 2. **未匹配軌跡(Unmatched Tracks)**:無法匹配的軌跡,如果超過「最大年齡」限制,將被刪除。 3. **新軌跡(New Tracks)**:新的檢測框初始化為新的軌跡。 --- ## **2. SORT 的優點** 1. **高效能**: - SORT 基於卡爾曼濾波器進行運動預測,計算簡單且高效,適合即時處理場景。 2. **簡單易用**: - 架構簡單,只需結合「目標檢測器」與「運動預測」,便可完成追蹤任務。 3. **即時性**: - SORT 適合 **實時追蹤**,如即時監控、交通分析等應用場景。 --- ## **3. SORT 的挑戰與缺點** ![image](https://hackmd.io/_uploads/r1Qw96krke.png) 1. **依賴運動模型**: - SORT 完全依賴 **運動預測**(Kalman Filter),無法處理遮擋或物體運動不規則的情況。 - 例如:當多個物體具有相似的運動軌跡時,SORT 易發生 **ID Switch(身份切換)** 問題。 2. **無外觀模型(Appearance Model)**: - SORT 缺少對目標外觀特徵的學習,無法區分視覺上相似的物體,特別是在擁擠場景中。 3. **遮擋問題**: - 當物體被短暫遮擋時,SORT 可能無法正確地恢復軌跡,導致追蹤中斷。 4. **依賴檢測器準確度**: - SORT 嚴重依賴目標檢測器的性能,如果檢測出現「誤檢(false positive)」或「漏檢(false negative)」的情況,將直接影響追蹤結果。 --- ## **4. SORT 的應用場景** - **交通監控**:如車輛追蹤。 - **視訊監控**:即時監測人群或物體運動。 - **體育分析**:例如運動員追蹤。 --- ## **5. 結論** **SORT** 是一種基於 **卡爾曼濾波器** 和 **匈牙利算法** 的簡單追蹤方法,具有即時性與高效能的特點。然而,由於缺乏 **外觀模型(Appearance Model)**,SORT 在處理遮擋、視覺相似物體以及複雜動態場景時存在較大局限性。 這也是後續 **DeepSORT** 引入外觀模型進行改進的原因,進一步解決了 SORT 的弱點,特別是在 ID Switch 和遮擋恢復方面【19:41-47†source】。 ### DeepSORT (Deep Simple Online and Real-time Tracking) # **DeepSORT 詳細介紹** **DeepSORT** 是一種結合 **Motion Model(運動模型)** 和 **Appearance Model(外觀模型)** 的MOT(多物體追蹤)方法,目的是提高追蹤的準確性,特別是解決 ID Switch(身份切換)、遮擋問題等挑戰。 --- ## **1. DeepSORT 的核心概念** ### **目標**: - 在視覺追蹤中,實現高效、準確的多物體追蹤,特別是應對遮擋、物體運動不規則以及外觀相似的挑戰。 ![image](https://hackmd.io/_uploads/BJr99pkHkl.png) ### **改進點**: - DeepSORT 是對 **SORT(Simple Online and Realtime Tracking)** 的改進版,主要引入了「**Appearance Model**」來克服 SORT 的缺點: - SORT 只依賴 **Motion Model**(如 Kalman Filter),容易導致 ID Switch 和遮擋問題。 - DeepSORT 加入了 **外觀特徵比對**,大幅提升追蹤的準確度。 --- ## **2. DeepSORT 的運作流程** ![image](https://hackmd.io/_uploads/S1Bhcp1S1l.png) ### **步驟一:檢測(Detection)** - 使用目標檢測器(如 **Faster R-CNN**)來初始化物體的位置(bounding boxes)。 - 輸出 bounding boxes 和檢測置信度。 ### **步驟二:運動預測(Motion Model)** - 使用 **Kalman Filter** 預測物體的下一幀位置。 - **Kalman Filter** 假設物體速度恆定,透過位置和速度進行預測。 - 更新物體的軌跡,並標記軌跡的狀態: - **Confirmed(確認)** - **Unconfirmed(未確認)** - **Deleted(刪除)**。 --- ### **步驟三:數據關聯(Matching)** 透過 **運動距離** 和 **外觀特徵距離**,將預測結果與檢測結果進行匹配。 1. **計算匹配成本**: - **IoU(Intersection over Union)**:計算預測框與檢測框的重疊程度。 - **Appearance Distance(外觀距離)**:使用預訓練 CNN 提取外觀特徵向量,並計算兩者間的距離。 2. **匈牙利算法(Hungarian Algorithm)**: - 解決二分圖匹配問題,將預測與檢測結果進行最佳匹配,並最小化匹配成本。 3. **匹配結果分類**: - **Matched Tracks**(已匹配軌跡):確認軌跡並更新 Kalman Filter。 - **Unmatched Tracks**(未匹配軌跡):如果超過最大年齡 \( A_{max} \),則標記為刪除。 - **New Tracks**:對新的檢測結果初始化新的軌跡。 --- ### **步驟四:外觀模型(Appearance Model)** - 使用預訓練的 **CNN**(例如 ResNet 或其他特徵提取器)提取外觀特徵向量,進行匹配。 - **特徵描述符**:對每個物體提取外觀描述符,作為物體的視覺身份特徵。 --- ![image](https://hackmd.io/_uploads/rJqAq61rJg.png) ![image](https://hackmd.io/_uploads/r1ees6yS1x.png) ![image](https://hackmd.io/_uploads/ryIboTyHkg.png) ## **3. DeepSORT 的優勢** 1. **高追蹤準確度**: - 將 **運動模型** 和 **外觀模型** 結合,減少 ID Switch,提升追蹤精度。 2. **短期遮擋處理**: - 即使物體短暫遮擋,外觀模型能夠重新識別物體,繼續追蹤。 3. **適用於擁擠場景**: - 在多物體外觀相似、運動軌跡接近的場景中,外觀模型能有效區分目標。 --- ## **4. DeepSORT 的挑戰** 1. **高度依賴檢測器準確度**: - 如果檢測器出錯(如誤檢、漏檢),追蹤效果會下降。 2. **計算成本較高**: - 外觀模型的特徵提取需要額外的計算資源,較 SORT 更耗時。 3. **極端外觀變化**: - 在光照變化、遮擋或物體形變劇烈時,外觀模型可能無法正確匹配。 --- ![image](https://hackmd.io/_uploads/HyDGsakSyg.png) ## **5. 總結** **DeepSORT** 是一種改進的多物體追蹤方法,將 **Kalman Filter**(運動模型)和 **CNN 提取的外觀特徵**(外觀模型)結合,透過 **匈牙利算法** 進行最佳匹配,顯著提升追蹤的準確性與穩定性。 ### **適用場景**: - 擁擠場景:例如人群分析、行人追蹤。 - 遮擋問題:短期遮擋的多物體追蹤。 - 高動態場景:如交通監控和即時運動分析。 透過這種多模態結合,**DeepSORT** 有效解決了傳統 SORT 的局限性,成為當前多物體追蹤中的重要技術之一。 ### Graph-based tracking ### **Graph-based Tracking 詳細介紹** **Graph-based Tracking**(基於圖的追蹤)是一種針對多物體追蹤(Multiple Object Tracking, MOT)問題的解決方法。它透過將物體的「檢測結果」表示為圖結構中的「節點」,並利用圖論方法解決「數據關聯(Data Association)」問題,以此建立並維持物體的軌跡。 以下是詳細解釋: --- ## **1. 核心概念** 在基於圖的追蹤中: - **圖結構** 由「節點(Nodes)」和「邊(Edges)」組成。 - **節點**:代表目標檢測結果(Bounding Boxes),通常來自目標檢測器。 - **邊**:代表節點之間的關聯性或相似度,例如時間相鄰幀之間的距離或外觀相似度。 - **目標**:通過在圖中尋找最佳匹配(如最短路徑、最大流等),確定檢測結果之間的對應關係,建立物體軌跡。 --- ## **2. 流程架構** Graph-based Tracking 的工作流程可以分為以下幾個步驟: ### **步驟一:構建圖結構** 1. **節點表示**: - 每一幀的檢測結果(Bounding Boxes)會被表示為一個節點 \( v_i \)。 - 節點的特徵包括: - 空間資訊(位置和大小)。 - 時間索引(檢測所屬幀)。 - 外觀特徵(如 CNN 提取的特徵向量)。 2. **邊構建**: - 在相鄰幀之間的檢測結果建立邊 \( e_{ij} \),邊的權重 \( w_{ij} \) 代表節點間的相似度或關聯性。 - **常用的相似度度量**: - **IoU(Intersection over Union)**:重疊度。 - **歐幾里得距離**:Bounding Box 的中心點之間的距離。 - **外觀相似度**:基於外觀模型提取的特徵向量之間的餘弦相似度。 --- ### **步驟二:數據關聯(Data Association)** 數據關聯是 Graph-based Tracking 的核心,目的是在多幀間建立準確的物體匹配。主要方法包括: 1. **最小代價流(Minimum Cost Flow)**: - 將追蹤問題建模為「流網絡問題」,在圖中尋找最小代價的流,連接起目標軌跡。 - **應用**:如 **MHT(Multiple Hypothesis Tracking)**。 2. **最短路徑(Shortest Path)**: - 將圖中每個節點看作起點或終點,找到連接這些節點的最短路徑,確定物體的軌跡。 3. **最大流(Max-Flow)**: - 在多物體追蹤中,尋找最大流量,確保每個物體都能找到最佳匹配。 4. **匈牙利算法(Hungarian Algorithm)**: - 解決二分圖匹配問題,將檢測結果與軌跡進行最佳匹配。 --- ### **步驟三:軌跡生成與管理** 1. **確定軌跡**: - 根據數據關聯結果,將節點連接成完整的軌跡。 2. **處理未匹配的節點**: - 未匹配的節點會被標記為新的軌跡或暫時保留,以便後續匹配。 3. **處理遮擋問題**: - 透過圖中的時間約束和全局優化,恢復因遮擋導致的軌跡中斷。 --- ## **3. 優勢與特點** - **全局最佳化**: - Graph-based Tracking 能夠考慮多幀之間的關聯性,進行全局最優匹配,而非只依賴於相鄰幀的局部信息。 - **靈活度高**: - 可以結合不同的相似度度量,如運動信息(Motion)和外觀信息(Appearance)。 - **適用於複雜場景**: - 在多物體運動軌跡交錯、長時間遮擋或外觀變化明顯的場景中,Graph-based Tracking 表現出色。 --- ## **4. 挑戰與限制** 1. **計算成本高**: - 由於需要在圖中進行全局優化,Graph-based Tracking 的計算複雜度較高,難以實現即時性。 2. **依賴檢測器性能**: - 物體檢測結果(Bounding Boxes)是圖的基礎,檢測器的誤檢或漏檢會影響最終的追蹤效果。 3. **圖結構過大**: - 在長時間追蹤中,圖的節點數量會迅速增長,導致計算資源消耗過大。 --- ## **5. 典型應用場景** - **交通監控**:追蹤道路上的車輛運動軌跡。 - **行人追蹤**:在擁擠場景下追蹤人群中的多個目標。 - **體育賽事分析**:如籃球或足球比賽中多運動員追蹤。 --- ## **6. Graph-based Tracking 代表方法** 1. **MHT(Multiple Hypothesis Tracking)**: - 將多物體追蹤建模為圖優化問題,通過最小代價流解決數據關聯。 2. **Network Flow Models**: - 使用流網絡來建模目標之間的匹配關係,解決長時間的軌跡關聯問題。 3. **Tracking by Detection**: - 先檢測再追蹤的框架中,基於圖論方法來構建軌跡。 --- ## **7. 總結** **Graph-based Tracking** 是一種基於圖論的多物體追蹤方法,通過將檢測結果建模為「圖結構」,並利用圖優化方法(如最小代價流、最短路徑等)進行數據關聯。這種方法能夠考慮時間與空間上的全局信息,特別適用於複雜動態場景中的多物體追蹤。 **優點**:全局最優化、靈活度高,適合處理遮擋與外觀變化問題。 **挑戰**:計算成本較高,依賴目標檢測器性能。 ## DETR、Mask2Former、Vision Transformer (ViT) 和 Swin Transformer 介紹 --- ## **1. 演進背景** 隨著 **Transformer** 在自然語言處理(NLP)上的成功(例如 BERT 和 GPT),研究者開始將 **Transformer** 引入到電腦視覺任務中。這一過程促成了**視覺Transformer** 系列模型的發展。 - **傳統方法**:基於卷積神經網絡(CNN),如 Faster R-CNN、Mask R-CNN 和 YOLO,這些模型在局部特徵提取上表現出色,但對全局信息的建模能力有限。 - **Transformer 的引入**:Transformer 能有效捕捉全局依賴關係,克服了 CNN 的局限性,逐步成為物件偵測、語義分割、影像分類等任務的主流架構。 隨著研究的深入,Transformer-based 模型逐步演進,主要里程碑包括: 1. **DETR(2020)**:將 Transformer 應用於物件偵測任務。 2. **Mask2Former(2022)**:進一步解決語義分割、實例分割和全景分割的統一問題。 3. **Vision Transformer (ViT, 2021)**:將 Transformer 引入影像分類,替代 CNN。 4. **Swin Transformer(2021)**:改進標準 Transformer,提出層級化特徵和滑動窗口機制,提升計算效率與局部特徵建模能力。 以下將逐一詳細介紹這些模型: --- # **2. DETR(DEtection TRansformer)** ### **背景** - **發布時間**:2020 年,由 Facebook AI 提出。 - **目標**:將 Transformer 應用於 **物件偵測** 任務,簡化傳統的「Region Proposal(候選區域)」+「分類」的雙階段結構,實現端到端的物件偵測。 --- ### **架構細節** DETR 的主要架構由 **CNN Backbone**、**Transformer Encoder-Decoder** 和 **Prediction Heads** 三個部分組成: 1. **CNN Backbone**: - 使用 **ResNet** 等 CNN 提取影像的局部特徵,輸出特徵圖。 2. **Transformer Encoder-Decoder**: - **Encoder**: - 將 CNN 提取的特徵圖轉換為一系列固定長度的序列,並利用自注意力機制(Self-Attention)建模序列中所有像素間的全局關係。 - **Decoder**: - 使用「**物件查詢(Object Queries)**」作為輸入,每個 Query 學習到一個物件的位置信息和類別。 - **Cross-Attention** 機制將這些查詢與 Encoder 的輸出特徵進行交互,提取物件資訊。 3. **Prediction Heads**: - 預測物件的 **邊界框(Bounding Box)** 和 **類別**。 --- ### **優勢與挑戰** - **優勢**: - **端到端學習**:不依賴於 Anchor 和 NMS(非極大值抑制)。 - **全局建模**:利用 Transformer 自注意力捕捉全局上下文。 - **挑戰**: - **訓練慢**:物件查詢學習過程需要大量的迭代。 - **小物件偵測較差**:全局建模容易忽略小尺度物件的細節。 --- # **3. Mask2Former** ### **背景** - **發布時間**:2022 年,由 Facebook AI 提出。 - **目標**:解決 **語義分割(Semantic Segmentation)**、**實例分割(Instance Segmentation)** 和 **全景分割(Panoptic Segmentation)** 的統一架構。 --- ### **架構細節** Mask2Former 基於 **DETR** 和 **MaskFormer**,但在細節上進行了改進,核心包括以下幾部分: 1. **Feature Extractor(特徵提取器)**: - 使用 **CNN** 或 **Swin Transformer** 作為 Backbone,提取影像特徵。 2. **Transformer Encoder-Decoder**: - **Masked Attention**:提出 Masked Cross-Attention 機制,讓每個物件查詢僅聚焦於其對應的區域,提升分割精度。 - **物件查詢(Object Queries)**:學習每個物件或區域的分割特徵。 3. **Prediction Heads**: - 輸出 **Mask(分割掩碼)** 和 **類別標籤**。 --- ### **特點** - **統一框架**:同時處理語義、實例和全景分割任務。 - **高效 Mask 預測**:Masked Attention 減少了注意力計算的範圍。 --- # **4. Vision Transformer(ViT)** ### **背景** - **發布時間**:2021 年,由 Google 提出。 - **目標**:將標準 Transformer 用於 **影像分類** 任務,完全替代 CNN。 --- ### **架構細節** 1. **影像分割為 Patch(切塊)**: - 將輸入影像劃分為固定大小的 **Patch**(例如 16x16 像素)。 - 每個 Patch 會被線性投影為向量,作為 Transformer 的輸入。 2. **Positional Encoding(位置編碼)**: - 因 Transformer 不具備空間感知能力,加入位置編碼補充位置信息。 3. **Transformer Encoder**: - 使用標準 **Self-Attention** 和 **Feed Forward Network(FFN)** 進行全局建模。 4. **分類頭(Classification Head)**: - 使用 CLS Token 作為分類標識符,將其最終輸出用於影像分類。 --- ### **優點與缺點** - **優點**: - 簡潔高效,適合大規模資料集(如 ImageNet)。 - 更強的全局建模能力。 - **缺點**: - 計算成本高,難以在小數據集上訓練。 - 對局部特徵敏感度較低。 --- # **5. Swin Transformer** ### **背景** - **發布時間**:2021 年,由 Microsoft 提出。 - **目標**:解決 Vision Transformer 在計算效率和局部建模能力上的不足。 --- ### **架構細節** Swin Transformer 的核心創新包括 **滑動窗口注意力機制** 和 **層級化設計**: 1. **Sliding Window Attention(滑動窗口注意力)**: - 將特徵圖分割成多個 **局部窗口**,在每個窗口內計算注意力,降低計算量。 2. **Shifted Window(滑動窗口偏移)**: - 在相鄰層中使用滑動窗口機制,實現窗口間的信息交互。 3. **層級化特徵(Hierarchical Features)**: - 模仿 CNN 的金字塔結構,逐步降低特徵圖分辨率,提取多尺度特徵。 4. **Transformer Blocks**: - 每層由標準的 **Self-Attention** 和 **MLP** 組成,但計算局部注意力。 --- ### **優點** - **計算效率高**:透過局部窗口降低計算量。 - **強大的多尺度特徵提取能力**:適合各類視覺任務(例如影像分割、物件偵測)。 - **靈活適應下游任務**:如 Swin Transformer V2 進一步提升了表現。 --- ## **總結** - **DETR**:首個將 Transformer 引入物件偵測,實現端到端檢測。 - **Mask2Former**:統一處理分割任務,改進了 Mask 預測的效率與精度。 - **ViT**:將 Transformer 用於影像分類,具備強大的全局建模能力。 - **Swin Transformer**:引入滑動窗口和層級設計,提升計算效率與局部特徵表現,成為現代視覺任務的重要基石。