深度学习项目-人群密度估计
Multi-scale Convolution Neural Networks for Crowd Counting
項(xiàng)目簡介
復(fù)現(xiàn)論文Multi-scale Convolution Neural Networks for Crowd Counting。考慮到目前還沒有具體寫的比較完善的基于Keras的復(fù)現(xiàn),這對于迅速成型的頂層系統(tǒng)的構(gòu)建不太方便。本項(xiàng)目使用的是TensorFlow2中Keras的API,不建議使用單獨(dú)的Keras,本項(xiàng)目設(shè)計(jì)在多個(gè)數(shù)據(jù)集上進(jìn)行訓(xùn)練測試,模型泛化能力強(qiáng),實(shí)際主要ShanghaiTech數(shù)據(jù)集上訓(xùn)練獲得模型。
數(shù)據(jù)集下載
- ShanghaiTech Dataset
- 下載地址
- Mall Dataset
- 下載地址
- The_UCF_CC_50 Dataset
- 下載地址
- 地址說明
- 不提供數(shù)據(jù)集官方地址,數(shù)據(jù)集均放置在我的谷歌云盤,開啟共享,無法訪問的可以郵箱聯(lián)系我,我將提供百度網(wǎng)盤地址。
論文說明
針對深度神經(jīng)網(wǎng)絡(luò)近幾年的發(fā)展以及現(xiàn)有的網(wǎng)絡(luò)模型難以優(yōu)化以及計(jì)算耗時(shí),主要提出了multi-scale blob模塊(類Inception結(jié)構(gòu))進(jìn)行相關(guān)特征的提取。
作者主要提出了MSCNN的網(wǎng)絡(luò)結(jié)構(gòu),該結(jié)構(gòu)比起MCNN具有更好的處理能力及效果且參數(shù)量大幅度縮減,并且縱向?qū)Ρ攘薒BP+RR、MCNN+CCR等模型。
具體論文文件可以直接訪問。
環(huán)境配置
- 基于Python3.6
- 需要第三方包已在requirements列出
- 切換到requirements文件所在目錄,執(zhí)行命令pip install -r requirements.txt即可配置環(huán)境
- 腳本運(yùn)行說明
- 訓(xùn)練
- 命令行執(zhí)行
- python train.py -b 16
- 更詳細(xì)的選項(xiàng)可以執(zhí)行python train.py -h查看幫助
- 命令行執(zhí)行
- 測試
- 命令行執(zhí)行
- python test.py -s yes
- 更詳細(xì)的選項(xiàng)可以執(zhí)行python test.py -h查看幫助
- 命令行執(zhí)行
- 訓(xùn)練
模型構(gòu)建
針對之前出現(xiàn)的損失大幅降低但密度圖預(yù)測全0的情況,主要是由于回歸器層激活函數(shù)不當(dāng),為了獲得更好的收斂結(jié)果,最后一層的激活函數(shù)調(diào)整如下。
output=Relu(Sigmoid(x))output = Relu(Sigmoid(x))output=Relu(Sigmoid(x))
使用Keras的Function API構(gòu)建模型的代碼如下,更具體的可以查看文末的Github地址。
def MSCNN(input_shape=(224, 224, 3)):"""模型構(gòu)建本論文模型簡單:param input_shape 輸入圖片尺寸:return:"""input_tensor = Input(shape=input_shape)# block1x = Conv2D(filters=64, kernel_size=(9, 9), strides=1, padding='same', activation='relu')(input_tensor)# block2x = MSB(4*16)(x)x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(x)# block3x = MSB(4*32)(x)x = MSB(4*32)(x)x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(x)x = MSB_mini(3*64)(x)x = MSB_mini(3*64)(x)x = Conv2D(1000, (1, 1), activation='relu', kernel_regularizer=l2(5e-4))(x)x = Conv2D(1, (1, 1))(x)x = Activation('sigmoid')(x)x = Activation('relu')(x)model = Model(inputs=input_tensor, outputs=x)return model注意,輸出層不能使用傳統(tǒng)的Relu,會(huì)輸出陷入“死區(qū)”,導(dǎo)致預(yù)測均為0值且loss確實(shí)在不斷降低。
結(jié)構(gòu)概念圖
結(jié)構(gòu)配置圖
模型訓(xùn)練
訓(xùn)練數(shù)據(jù)集
主要在ShanghaiTech上訓(xùn)練,其余數(shù)據(jù)集類似封裝data loader即可完成訓(xùn)練或者測試。
訓(xùn)練效果展示(模型簡單訓(xùn)練5輪)
對ShanghaiTech驗(yàn)證集隨機(jī)5張圖片進(jìn)行人群密度估計(jì),結(jié)果如下,可以看到,收斂的效果還是不錯(cuò)的,想要獲得更好的效果則需要更為細(xì)致的訓(xùn)練調(diào)整。
補(bǔ)充說明
訓(xùn)練相關(guān)完整代碼已經(jīng)上傳到我的Github,歡迎Star或者Fork。如有錯(cuò)誤,歡迎指正。
總結(jié)
以上是生活随笔為你收集整理的深度学习项目-人群密度估计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AlexNet详述
- 下一篇: 数据科学竞赛-人脸表情识别