近兩年,有關(guān)人群計(jì)數(shù)的文章呈現(xiàn)出爆炸式增長(zhǎng)。然而,人群計(jì)數(shù)不像其他任務(wù)(目標(biāo)檢測(cè)、語(yǔ)義分割等)有著簡(jiǎn)潔/易開(kāi)發(fā)的開(kāi)源代碼框架,大大降低了我們對(duì)于idea的驗(yàn)證效率。
因此在2018年12月份,我萌生了自己搭一個(gè)人群計(jì)數(shù)框架的想法,盡可能兼顧當(dāng)前主流數(shù)據(jù)集和主流算法。并于2019年3月底基本完成了主體框架。代碼發(fā)布之后,由于缺少對(duì)于代碼細(xì)節(jié)的文檔介紹,issues和emails讓人應(yīng)接不暇。所以,在這里對(duì)該項(xiàng)目做一個(gè)代碼層面上的介紹,并輔之以一些實(shí)驗(yàn)分析來(lái)幫助大家有效提高網(wǎng)絡(luò)性能。更重要的,希望能夠拋磚引玉,讓大家利用C3F,更高效地研究出性能更好的人群計(jì)數(shù)網(wǎng)絡(luò),推動(dòng)該領(lǐng)域的發(fā)展。
本文主要內(nèi)容包括:
數(shù)據(jù)處理:不同數(shù)據(jù)集的處理過(guò)程。
模型:基于ImageNet分類(lèi)模型設(shè)計(jì)的人群計(jì)數(shù)器以及我們復(fù)現(xiàn)的一些主流網(wǎng)絡(luò)。
訓(xùn)練技巧:一些常見(jiàn)的網(wǎng)絡(luò)訓(xùn)練技巧。
實(shí)驗(yàn)結(jié)果:在Shanghai Tech Part B數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果及分析。
總結(jié)。
致謝。
Q&A:一些常見(jiàn)問(wèn)題的解答。
1. 數(shù)據(jù)處理
我們提供了常見(jiàn)的六個(gè)主流數(shù)據(jù)庫(kù)的預(yù)處理代碼,處理好的數(shù)據(jù)集以及PyTorch下的data loader,包括UCF_CC_50[1](UCF50),Shanghai Tech Part A/B[2](SHT A/B),WorldExpo'10[3](WE),UCF-QNRF[4](QNRF)以及GCC[5]。后期還會(huì)提供UCSD[11]和MALL[12]數(shù)據(jù)集的相關(guān)內(nèi)容。
1.1 生成密度圖-處理參數(shù)
注:
1. 為了能夠使得輸入圖像兼容更多的網(wǎng)絡(luò),預(yù)處理時(shí)對(duì)圖像的高和寬進(jìn)行了限制,使其能夠被16整除。確保網(wǎng)絡(luò)中一些含有降采樣操作的層(conv with stride2 或者池化)能夠正確輸出。在人群計(jì)數(shù)領(lǐng)域中,常見(jiàn)encoder中一般輸出為1/8原圖尺寸,因此被16整除完全滿(mǎn)足需求。
2. 為節(jié)約顯存,對(duì)QNRF和GCC的圖像進(jìn)行了保持長(zhǎng)寬比的降采樣操作。
1.2 多Batch-size訓(xùn)練
由于UCF50、SHT A、QNRF所包含的圖像尺寸不一,為了實(shí)現(xiàn)多batch size的訓(xùn)練,我們重寫(xiě)了collate_fn函數(shù)。該函數(shù)在隨機(jī)拿到N張圖像和GT后,選擇最小的高h(yuǎn)_min和最小的寬w_min對(duì)所有圖像進(jìn)行crop,拼成
的Tensor送入到網(wǎng)絡(luò)中進(jìn)行訓(xùn)練。
根據(jù)經(jīng)驗(yàn),如果是from scratch training,對(duì)于這幾個(gè)數(shù)據(jù)集建議采用多batch size訓(xùn)練或者采用GCC-SFCN中加padding的方案;對(duì)于有預(yù)訓(xùn)練參數(shù)的模型(AlexNet,VGG,ResNet等),建議采用單一batch size進(jìn)行訓(xùn)練。
1.3 Label Transform
代碼中我們提供了兩種對(duì)密度圖進(jìn)行transform的操作。一種參考了CSRNet源碼[6]中對(duì)密度圖進(jìn)行降采樣的操作(GTScaleDown),一種是對(duì)密度圖點(diǎn)乘一個(gè)放大因子(LabelNormalize)。
1.3.1 GTScaleDown
由于CSRNet中,網(wǎng)絡(luò)回歸的密度圖為原圖的1/8,因此作者對(duì)密度圖進(jìn)行了降采樣,并點(diǎn)乘64以保證密度圖之和依然約等于總?cè)藬?shù)。該操作會(huì)帶來(lái)一個(gè)問(wèn)題:會(huì)影響PSNR和SSIM的值。因此我們不建議使用該操作。在我們實(shí)現(xiàn)其他網(wǎng)絡(luò)過(guò)程中,也會(huì)出現(xiàn)網(wǎng)絡(luò)輸出為1/4,1/8等尺寸,為避免該問(wèn)題,在網(wǎng)絡(luò)內(nèi)部增加上采樣層實(shí)現(xiàn)與原圖大小的密度圖。
1.3.2 LabelNormalize
這算是一個(gè)訓(xùn)練的trick,我們通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),對(duì)于密度圖乘以一個(gè)較大的放大因子,可以使網(wǎng)絡(luò)更快的收斂,甚至取得更低的估計(jì)誤差。有關(guān)這一點(diǎn)的更進(jìn)一步分析、實(shí)驗(yàn)結(jié)果,移步實(shí)驗(yàn)部分。
2. 模型
這一部分,我們介紹幾種常見(jiàn)分類(lèi)網(wǎng)絡(luò)(AlexNet,VGG,ResNet等)“魔改”為人群計(jì)數(shù)的網(wǎng)絡(luò)。
2.1 Baseline模型
2.1.1 AlexNet
對(duì)于AlexNet網(wǎng)絡(luò)[7],我們小幅修改了conv1和conv2層的padding,以保證其對(duì)于feature map的大小能夠正常整除。同時(shí),截取conv5之前的網(wǎng)絡(luò),作為人群計(jì)數(shù)的encoder,其大小為原始輸入的1/16。decoder的設(shè)計(jì)依然遵循簡(jiǎn)約的原則,用“兩層卷積+上采樣”直接回歸到1-channel的密度圖。
2.1.2 VGG系列:VGG和VGG+decoder
對(duì)于VGG網(wǎng)絡(luò)[8]的兩個(gè)變體,我們完全采用了VGG-16模型的前10個(gè)卷積層。其中,VGG采用了最為簡(jiǎn)單的decoder,而VGG+decoder則是簡(jiǎn)單設(shè)計(jì)了一個(gè)含有三個(gè)反卷積的模塊。下表展示了二者在SHT上的實(shí)驗(yàn)結(jié)果。
通過(guò)在SHT B上實(shí)驗(yàn)結(jié)果來(lái)看,兩者的模型性能(MAE,MSE)差不多,但VGG+decoder有著更為精細(xì)的密度圖。二者的性能非常接近CSRNet(同樣的backbone)的結(jié)果。
2.1.3 ResNet系列:Res50和Res101
對(duì)于ResNet[9],為了保證密度圖的大小不至于過(guò)?。ú恍∮谠瓐D尺寸的1/8),我們修改了res.layer3中第一層stride的大?。▽⒃镜?改為1),以此當(dāng)做encoder。本著簡(jiǎn)單的原則,decoder由兩層卷積構(gòu)成。
從實(shí)驗(yàn)結(jié)果來(lái)看,ResNet展現(xiàn)除了強(qiáng)大的特征提取能力,在SHT B上直接達(dá)到了現(xiàn)有SOTA的水平。據(jù)我們所知,截止目前(2019.4),已發(fā)表/錄用文章中最好的是PACNN+[10],其MAE/MSE為:7.6/11.8。我們的模型在SHT B數(shù)據(jù)集上具體表現(xiàn)如下:
2.2 C3F框架下復(fù)現(xiàn)模型比較
除了上述基于ImageNet分類(lèi)模型設(shè)計(jì)的Baselines以外,我們也嘗試在C3F下復(fù)現(xiàn)了以下幾個(gè)主流算法的結(jié)果,包括MCNN[2],CMTL[13],CSRNet[6]以及SANet[14]。我們復(fù)現(xiàn)的模型在SHT B數(shù)據(jù)集上具體表現(xiàn)如下:
注:
1. 在MCNN復(fù)現(xiàn)過(guò)程中,與原網(wǎng)絡(luò)結(jié)構(gòu)唯一不同在于,我們的MCNN處理的是RGB圖像。
2. 原始的CMTL在訓(xùn)練前,通過(guò)隨機(jī)裁剪生成好了訓(xùn)練集。我們采用在線裁剪的方法可以使訓(xùn)練覆蓋更多的裁剪區(qū)域。此外,由于選擇了在線裁剪,CMTL中的分類(lèi)任務(wù)的標(biāo)簽頁(yè)適應(yīng)性地改成了在線計(jì)算與分配。
3. 據(jù)我們所知,SANet復(fù)現(xiàn)結(jié)果,是當(dāng)前所有復(fù)現(xiàn)中最接近論文結(jié)果的,雖然這一結(jié)果與論文結(jié)果依然相差甚遠(yuǎn)。
3. 訓(xùn)練技巧
3.1 LabelNormalize的調(diào)參
在C3F已公布的實(shí)驗(yàn)結(jié)果中,均對(duì)密度圖進(jìn)行了點(diǎn)乘100的操作。實(shí)驗(yàn)過(guò)程中,我們也發(fā)現(xiàn),設(shè)置一個(gè)合適的放大因子,對(duì)于網(wǎng)絡(luò)的有效訓(xùn)練非常有益。這一節(jié),我們簡(jiǎn)要說(shuō)一下為什么這樣一個(gè)簡(jiǎn)單的操作會(huì)有效的原因。一個(gè)初始化好的計(jì)數(shù)網(wǎng)絡(luò)來(lái)說(shuō),自身參數(shù)符合一定的分布,如果目標(biāo)分布和初始化分布相差過(guò)大的話,網(wǎng)絡(luò)會(huì)陷入一個(gè)比較差的局部解,難以訓(xùn)練出好的結(jié)果。該特性在使用預(yù)訓(xùn)練分類(lèi)模型的計(jì)數(shù)網(wǎng)絡(luò)時(shí),顯得更為重要。
這一節(jié),我們選擇Res50網(wǎng)絡(luò),分別測(cè)試在對(duì)密度圖分別乘以[1,10,100,1000,2000,4000]時(shí),網(wǎng)絡(luò)的計(jì)數(shù)性能差異。下表展示了不同放大因子下在SHT B上的實(shí)驗(yàn)結(jié)果。我們發(fā)現(xiàn),當(dāng)采用原始密度圖時(shí),網(wǎng)絡(luò)并不能正確收斂。觀察結(jié)果發(fā)現(xiàn),網(wǎng)絡(luò)一直輸出一張全0的密度圖。陷入到一個(gè)局部解無(wú)法進(jìn)一步優(yōu)化。當(dāng)放大因子為1000時(shí),網(wǎng)絡(luò)達(dá)到了最優(yōu)性能。之后,隨著放大因子的增加,網(wǎng)絡(luò)的計(jì)數(shù)性能又逐步降低。
(注:實(shí)驗(yàn)中,其他參數(shù)均與results_reports/Res50/SHHB中的設(shè)置保持一致。)
下圖展示了在六組不同的放大因子下,MAE和MSE在驗(yàn)證集上隨時(shí)間的變化曲線。橙色曲線表示對(duì)密度圖不進(jìn)行放大情況下,網(wǎng)絡(luò)性能的表現(xiàn)。我們發(fā)現(xiàn),網(wǎng)絡(luò)陷入到一個(gè)局部解難以跳出。
不同放大因子的實(shí)驗(yàn)對(duì)比
由于橙色曲線會(huì)干擾我們對(duì)其他參數(shù)曲線的對(duì)比,因此,下圖展示了移除掉橙色曲線后,即放大因子為[10,100,1000,2000,4000]的曲線對(duì)比。從圖中可以看出,除了放大因子取10時(shí),效果較差,其他幾種曲線重合度非常高。
不同放大因子的實(shí)驗(yàn)對(duì)比
綜上,我們?cè)O(shè)定一個(gè)較大的放大因子,不僅可以促使模型快速收斂,也可以幫助模型取得一個(gè)更優(yōu)的性能。
3.2 特征圖大小對(duì)比:1/8 size v.s 1/16 size
過(guò)小的特征圖尺寸會(huì)對(duì)計(jì)數(shù)的性能產(chǎn)生非常大的影響。這里,我們進(jìn)行兩組對(duì)比試驗(yàn):1) ResNet-50中res.layer3以前的層原封不動(dòng)當(dāng)做backbone,最終輸出密度圖作16x的上采樣;2) C3F最終采用的方案,輸出密度圖作8x的上采樣。
從實(shí)驗(yàn)結(jié)果可以看出,在將stride改為1后,模型輸出了分辨率更高的密度圖,同時(shí)在計(jì)數(shù)誤差上取得了更好的效果。同時(shí),我們也對(duì)比一下兩者在訓(xùn)練過(guò)程中,測(cè)試集上MAE和MSE的表現(xiàn),如下圖所示。其中藍(lán)色部分為stride=2的結(jié)果,橙色為stride=1的結(jié)果。能夠很直觀的看出,平滑后的曲線圖,橙色曲線整體要低于藍(lán)色曲線。(注:實(shí)驗(yàn)中,其他參數(shù)均與results_reports/Res50/SHHB中的設(shè)置保持一致。)
不同特征圖大小的實(shí)驗(yàn)對(duì)比
3.3 數(shù)據(jù)歸一化中,均值和標(biāo)準(zhǔn)差對(duì)實(shí)驗(yàn)結(jié)果的影響
C3F中,在misc中我們提供了cal_mean.py來(lái)計(jì)算數(shù)據(jù)集中的訓(xùn)練數(shù)據(jù)中均值和標(biāo)準(zhǔn)差。大多數(shù)人會(huì)使用ImageNet的均值和標(biāo)準(zhǔn)差(也就是mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),經(jīng)過(guò)實(shí)測(cè),該參數(shù)對(duì)最終的性能影響有限。我們繼續(xù)使用Res50和MCNN網(wǎng)絡(luò)進(jìn)行試驗(yàn),用兩種均值、標(biāo)準(zhǔn)差進(jìn)行歸一化,比較最終的計(jì)數(shù)誤差,結(jié)果見(jiàn)下表。(注:Res50實(shí)驗(yàn)中,其他參數(shù)均與results_reports/Res50/SHHB中的設(shè)置保持一致。MCNN實(shí)驗(yàn)則是與results_reports/MCNN/SHHB中的設(shè)置保持一致)
從表格中,我們可以看出,使用了自身數(shù)據(jù)集的均值和標(biāo)準(zhǔn)差,性能要略微優(yōu)于使用ImageNet上的均值和標(biāo)準(zhǔn)差所得到的的結(jié)果。下圖展示了訓(xùn)練過(guò)程中驗(yàn)證集上MAE和MSE的變化曲線,其中橙色代表采用了SHT B的均值和標(biāo)準(zhǔn)差的實(shí)驗(yàn),藍(lán)色則為采用了ImageNet的結(jié)果。從圖中可以看出,二者的重合度非常高。
Res50:不同均值標(biāo)準(zhǔn)差的實(shí)驗(yàn)對(duì)比
MCNN:不同均值標(biāo)準(zhǔn)差的實(shí)驗(yàn)對(duì)比
由于人群圖像和ImageNet數(shù)據(jù)均屬于自然圖像,計(jì)算出的均值和標(biāo)準(zhǔn)差也比較類(lèi)似。因此,改值對(duì)實(shí)驗(yàn)結(jié)果的影響并不是很大。當(dāng)然,影響程度也與數(shù)據(jù)集有關(guān),如果數(shù)據(jù)具有很強(qiáng)的偏置,最好還是采用數(shù)據(jù)對(duì)應(yīng)的均值和標(biāo)準(zhǔn)差??偟膩?lái)說(shuō),我們還是建議使用訓(xùn)練數(shù)據(jù)的均值和標(biāo)準(zhǔn)差,以取得更好的計(jì)數(shù)性能。
4. 實(shí)驗(yàn)結(jié)果
本節(jié),我們將復(fù)現(xiàn)的所有算法在SHT B上的性能展示出來(lái),方便大家做最終的對(duì)比。我們發(fā)現(xiàn),得益于ResNet-101強(qiáng)大的學(xué)習(xí)能力,以其為Backbone的人群計(jì)數(shù)器在MAE和MSE指標(biāo)上超越了其他所有算法。此外,我們還發(fā)現(xiàn),對(duì)于有預(yù)訓(xùn)練參數(shù)的網(wǎng)絡(luò),甚至可以不需要對(duì)網(wǎng)絡(luò)進(jìn)行過(guò)多的設(shè)計(jì),例如Dilated Conv、Multi-column Conv、Scale Aggregation等,就可以達(dá)到一個(gè)較好的結(jié)果。
5. 總結(jié)展望
本項(xiàng)目旨在提供一個(gè)簡(jiǎn)單、高效、易用、靈活的人群計(jì)數(shù)框架,方便新手快速上手入門(mén)、資深研究者高效實(shí)現(xiàn)idea以及最大化模型性能。本技術(shù)報(bào)告則是對(duì)該項(xiàng)目的一個(gè)簡(jiǎn)單介紹,使大家能夠?qū)ξ覀兊捻?xiàng)目有一個(gè)更深的理解,這樣用起來(lái)也會(huì)更加順手,最大化框架的使用度。
同時(shí),我們英文Technical Report(為本文的精簡(jiǎn)內(nèi)容)也將在arxiv上預(yù)印。如果大家有任何問(wèn)題、建議,歡迎大家在倉(cāng)庫(kù)中提issue和PR,讓C3F變得更好!
6. 致謝
在整個(gè)項(xiàng)目推進(jìn)的過(guò)程中,得到了很多人的大力支持。特別地,感謝@wwwzxoe303com對(duì)關(guān)鍵代碼的檢查和測(cè)試,感謝@PetitBai對(duì)項(xiàng)目Readme.md的校對(duì),感謝Google Colab提供免費(fèi)實(shí)驗(yàn)資源。此外,我們的部分代碼、設(shè)計(jì)邏輯參考或直接借用了以下作者的倉(cāng)庫(kù)/項(xiàng)目/代碼,在此一并表示感謝!正是有了以下幾個(gè)出色的開(kāi)源代碼,我們才得以完成C3F項(xiàng)目。
rbgirshick/py-faster-rcnn
zijundeng/pytorch-semantic-segmentation
leeyeehoo/CSRNet-pytorch
BIGKnight/SANet_implementation
gjy3035/enet.pytorch
gjy3035/GCC-SFCN
gjy3035/PCC-Net(論文尚未發(fā)表,因此暫未公開(kāi)源碼)
7. Q&A
Q1:能否提供Python3環(huán)境下的代碼?A:會(huì),但現(xiàn)在時(shí)機(jī)不成熟。原因是Tensorboard暫時(shí)還不支持Python3.7,加之人手不足,暫無(wú)開(kāi)發(fā)計(jì)劃。
Q2:為什么在SHT B上做實(shí)驗(yàn)?以后會(huì)不會(huì)對(duì)其他數(shù)據(jù)集進(jìn)行驗(yàn)證?A:因?yàn)閳D像尺寸相同,便于多batch-size的訓(xùn)練和測(cè)試,能夠最大化利用顯卡,節(jié)省顯卡資源和訓(xùn)練時(shí)間。對(duì)于其他數(shù)據(jù)集,由于自己的時(shí)間有限,也沒(méi)有足夠的顯卡資源,暫時(shí)不會(huì)做其他數(shù)據(jù)集實(shí)驗(yàn)。
Q3:語(yǔ)義分割和人群計(jì)數(shù)非常類(lèi)似,能不能直接用一些分割網(wǎng)絡(luò)呢?A:二者同屬于逐像素任務(wù),前者為逐像素分類(lèi),后者為逐像素回歸。根據(jù)我的實(shí)驗(yàn),某些分割網(wǎng)絡(luò)直接修改最后一層為回歸層后,其效果與backbone相比,提升非常有限。甚至性能會(huì)有所下降。深層問(wèn)題暫時(shí)還沒(méi)有仔細(xì)思考。不過(guò)據(jù)我所知,有人對(duì)此問(wèn)題已經(jīng)做了研究,大家耐心等待即可。
Q4:正確的訓(xùn)練、驗(yàn)證、測(cè)試流程應(yīng)該是怎樣的?A:嚴(yán)格意義上,所有數(shù)據(jù)集應(yīng)該都包含以上三種數(shù)據(jù)(如果沒(méi)有驗(yàn)證集,則應(yīng)該從訓(xùn)練集中隨機(jī)選擇一部分)。在本項(xiàng)目中,為了能夠確保所有實(shí)驗(yàn)結(jié)果可以復(fù)現(xiàn),我們直接將測(cè)試集當(dāng)做驗(yàn)證集來(lái)監(jiān)控訓(xùn)練過(guò)程。
Q5:部分模型會(huì)在PyTorch1.0下報(bào)上采樣函數(shù)F.upsample的警告信息。A:該警告不影響訓(xùn)練。為了兼容0.4版本,我們依然采用F.upsample方法來(lái)對(duì)Tensor進(jìn)行放大尺寸的操作。
-
圖像
+關(guān)注
關(guān)注
2文章
1094瀏覽量
41302 -
數(shù)據(jù)處理
+關(guān)注
關(guān)注
0文章
627瀏覽量
29205 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1224瀏覽量
25463
原文標(biāo)題:C3F—開(kāi)源人群計(jì)數(shù)工具箱:快速上手、模型驗(yàn)證、流程處理,你值得擁有
文章出處:【微信號(hào):thejiangmen,微信公眾號(hào):將門(mén)創(chuàng)投】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
讓代碼助你理解I2C總線

如何提高代碼理解能力?
基于stm32f4的看門(mén)狗配置和實(shí)驗(yàn)代碼
STM32F103C8虛擬串口移植的實(shí)驗(yàn)代碼該怎樣去實(shí)現(xiàn)呢
分相電路分析 實(shí)驗(yàn)3
S3C2410內(nèi)存管理單元MMU基礎(chǔ)實(shí)驗(yàn)
CodeViz--一款分析C/C++源代碼中函數(shù)調(diào)用關(guān)系的調(diào)用
KLOCWORK INSIGHT:C#源代碼分析
TMS320F28335開(kāi)發(fā)板全套實(shí)驗(yàn)代碼
一文助你全面理解機(jī)器學(xué)習(xí)
STM32F4 I2C-EEPROM實(shí)驗(yàn)例程

基于STM32F103C8 輸入捕獲實(shí)驗(yàn)

在GD32F103移植STM32F103代碼

評(píng)論