天天看點

人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較

1 簡介

CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes 

CVPR 2018論文原文:https://arxiv.org/abs/1802.10062

CSRNet 網絡可以了解高度擁擠的場景并執行準确的計數估計以及呈現高品質密度圖。

該網絡主要包括兩個部分,前使用一個卷積網絡用于 2D 特征提取,後用一個空洞卷積網絡代替池化操作。

對label檔案進行高斯濾波處理,作為模型預測的GroundTruth。

CSRNet通過網絡将輸入圖像映射到其各自的密度圖。

該模型不使用任何全連接配接層,是以輸入圖像的大小是可變的。

模型從大量不同的資料中學習,并且考慮到圖像分辨率,沒有資訊丢失。

在預測時不需要重新、調整圖像大小。

模型體系結構使得輸入圖像為(x,y,3),輸出是尺寸(x / 8,y / 8,1)的desnity圖。 

在四個資料集(ShanghaiTech資料集,UCF_CC_50資料集,WorldEXPO_10資料集和UCSD資料集)上應用CSRNet,展現了最先進的性能。

作者代碼:https://github.com/leeyeehoo/CSRNet-pytorch (Pytorch版本)

本文講解代碼:https://github.com/luckyluckydadada/CSRnet (keras版本 配套本部落格文章講解 注釋完整)

2 提出問題

人群場景分析的潛在解決方案可以分為三類:基于檢測的方法,基于回歸的方法和基于密度估計的方法。

目前基于密度圖估計多數采用了 multi-column (MCNN) 的架構和密度級别分類器,在這些方法中觀察到四個缺點:

(1)很難訓練multi-column CNN。

這種膨脹的網絡結構需要更長時間訓練。

(2)multi-column CNN引入備援結構。

不同的列似乎表現相似而沒有明顯的差異。 

作者實驗驗證了采用 multi-column 表現的效果沒比沒采用 multi-column 的要好,該實驗設計了一個具有相似數量參數的更深入,更規則的網絡(表中A deeper CNN)。

人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較

設計 multi-column CNN (MCNN) 的本意是希望可以學習不同尺寸感受野的特征,

但是下圖顯示三個column 學習到的特征相似,沒有達到設計之初的目的。

人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較

(3)在MCNN中發送圖像之前,需要密度級别分類器。

然而,由于對象的數量在大範圍内變化,是以在實時擁塞的場景分析中難以定義密度水準的粒度。

此外,使用細粒度分類器意味着需要實作更多列,這使得設計更複雜并且導緻更多備援而且計算量比較大 。

(4)這些工作花費大部分參數進行密度等級分類,以标記輸入區域,而不是将參數配置設定給最終密度圖生成。

由于MCNN中的分支結構效率不高,是以缺少用于生成密度圖的參數會降低最終精度。

考慮到上述所有缺點,我們提出了一種新的方法,專注于編碼擁擠場景中的更深層特征并生成高品質密度圖。

3 解決辦法

擁擠場景解析的發展從簡單的人群數值估計到人群密度圖估計,生成準确的人群分布圖挑戰性比較大。

其中一個主要的困難就是離散化的問題,人在圖像中不是隻占用一個像素,密度圖需要保持局部鄰域的連續性。

其他的困難包括場景的多樣性,相機角度的多樣性。

3.1 Label資料預處理

在資料預進行中,主要目标是将資料集提供的圖像轉換為密度圖。

對于給定圖像,資料集提供了由該圖像中的頭部标注組成的稀疏矩陣。

通過高斯濾波器将該稀疏矩陣轉換為2D密度圖。

密度圖中所有單元格的總和為圖像中的實際人數。

具體請參閱Preprocess.ipynb注釋

過程:

  • 1 生成一張和原圖一樣大小的單通道圖檔,其中像素點全部取0。
  • 2 将label中有人頭的點标記為1。
  • 3 通過高斯濾波處理這張圖,形成的圖就是人群密度圖。

通俗解釋,假如這張圖隻有1個人頭點,那麼通過高斯濾波這個凸點就會壓在這張圖上,以高斯分布的方式壓入這張圖,圖上的所有點都被填充了值,圖像上點的值形成空間上的高斯分布,這些值的總和為1。同理,有兩個人頭時,就通過第二次高斯分布轉換,疊加在前一個高斯分布上,這樣所有的像素點的求和為2。有幾個人,像素點的值求和就是幾。

3.2 網絡

我們不采用多分支網絡結構。具體網絡架構如圖:

人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較
  • 1 網絡輸入為(x,y,3)。
  • 2 網絡的前端我們采用 VGG-16 卷積部分,三次pooling使寬高各為原來八分之一,并在其中加入了BatchNorm防止梯度消失。
  • 3 在後端我們采用空洞卷積來增加感受野。
人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較

作者實驗發現B方案最好,也就是Dilation rate(膨脹率) =2。

  • 4 最後用一個1*1卷積(沒有fc層),卷積核數為1,作為輸出。是以輸出為一張寬高各為原來1/8的單通道圖(x/8,y/8,1)。

具體請參閱Model.ipynb

3.3 loss

我們先将密度圖寬高轉為原來1/8,這樣網絡輸出的結果(pred)的shape 就和密度圖(truth)的shape一樣了,都為(x/8,y/8,1)。

是以我們采用歐式距離作為我們的損失函數。就是pred的各點和truth各點的均方差。

具體請參閱Model.ipynb注釋

3.4 訓練Trike

在keras中,難以訓練輸入圖像的大小可變的模型,Keras不允許在同一批次中訓練可變大小的輸入。

解決此問題的一種方法是組合具有相同圖像尺寸的所有圖像并将它們作為批次進行訓練。

另一種方法是獨立地訓練每個圖像并在所有圖像上運作循環(随機梯度下降,batch_size=1),這種方法在記憶體使用和計算時間方面效率不高。

是以,最好的一種方法是在keras中建構了自定義資料生成器,以有效地訓練可變大小的圖像,使用資料生成器,可以實作高效的記憶體使用,并且教育訓練時間大幅縮短。

論文還指定了圖像裁剪作為資料增強的一部分,但是,Pytorch的版本實作不會在訓練時使用圖像裁剪。

是以,我們提供了一個函數preprocess_input(),可以在image_generator()中使用它來添加裁剪功能。

具體請參閱Model.ipynb注釋

3.5 預測

将原圖輸入模型,得到單通道圖(x/8,y/8,1),也就是預測的密度圖,對密度圖上所有值求和,即為預測人數,密度圖上值大的表示該區域人流密集。

4 評估和比較

4.1 ShanghaiTech資料集

ShanghaiTech人群計數資料包含1198個帶注釋的圖像,總數為330,165人。

該資料集由兩部分組成,A部分包含482張圖像,這些圖像具有從網際網路上随機下載下傳的高度擁擠的場景,而B部分包含716張圖像,這些圖像具有從上海街道拍攝的相對稀疏的人群場景。

結果如圖,很好就對了。

人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較

4.2 其他資料集表現

其他資料集不多解釋了,直接上圖,表現依然很好。

人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較
人群密度估計 - CVPR2018最新論文CSRNet原理、配套代碼解析1 簡介2 提出問題3 解決辦法4 評估和比較

5.結論

在本文中,提出了一種名為CSRNet的新型架構,用于人群計數和高品質密度圖生成,并采用易于訓練的端到端方法。

我們使用擴張卷積層來聚集擁擠場景中的多尺度上下文資訊,通過利用擴張的卷積層,CSR-Net可以在不損失分辨率的情況下擴充感受野。

我們在四個人群計數資料集中示範了我們的模型,發現均具有最好性能的。

我們還将模型擴充到車輛計數任務,也達到了最佳精度。可以作為其他的擁擠場景計數。

繼續閱讀