人群密度估计之MCNN

该方法源自论文,Single-Image CrowdCounting via Multi-Column Convolutional Neural Network,是上海科技大学张营营的作品。论文在各个数据集上都取得了state-of-the-art的效果。

网络结构如下图所示,使用的是全卷积的网络,并且进行了融合。

人群密度估计之MCNN

使用融合可以获得比单一网络更好的性能,同时由于网络结构比较宽,作者借鉴了RBM的思想,分别预训练单一网络,最后用3个训练好的单一网络对融合网络进行权值初始化,再进行finetune,得到了更好的效果。

人群密度估计之MCNN

作者在论文中还对各种损失进行了对比分析,一般来说,训练这样的网络的损失,很自然是可以想到2种,一种是基于density map的L2 loss,另一种就是王小刚的一个论文Cross-scene Crowd Counting via Deep Convolutional NeuralNetworks中的global count loss。单纯使用一种Loss的话,L2也许是更好的选择,但是如果使用2种Loss进行互补训练的话,也许会更好。

 

作者自己收集整理的Shanghaitechdataset,包含1198个图共330165个人,分为A,B两个部分,A的人群密集,B的稀疏,A中trainset为300,testset为182,B中trainset为400,testset为316。

人群密度估计之MCNN

分享一下我自己的训练经验,我这里是使用的malldataset进行训练的。首先需要准备数据,data很简单,直接调用caffe的convert_imageset转化为LMDB就可以。label部分则需要自己提取density_map。这个可以做成jpg形式的map,同样转化为LMDB。也可以制作为HDF5,程序如下:

  1. clear;  
  2. load('perspective_roi.mat');  
  3. load('mall_gt.mat');  
  4.   
  5. m=480;n=640;  
  6. m=m/4;  
  7. n=n/4;  
  8. mask = imresize(roi.mask,0.25);  
  9. for i=1:2000  
  10.    i  
  11.    gt = frame{i}.loc;  
  12.    gt = gt/4;  
  13.    d_map = zeros(m,n);  
  14.    for j=1:size(gt,1)  
  15.        ksize = ceil(25/sqrt(pMapN(floor(gt(j,2)),1)));  
  16.        ksize = max(ksize,7);  
  17.        ksize = min(ksize,25);  
  18.        radius = ceil(ksize/2);  
  19.        sigma = ksize/2.5;  
  20.        h = fspecial('gaussian',ksize,sigma);  
  21.        x_ = max(1,floor(gt(j,1)));  
  22.        y_ = max(1,floor(gt(j,2)));  
  23.   
  24.        if (x_-radius+1<1)  
  25.               for ra = 0:radius-x_-1  
  26.                    h(:,end-ra) = h(:,end-ra)+h(:,1);  
  27.                    h(:,1)=[];  
  28.               end  
  29.        end  
  30.        if (y_-radius+1<1)  
  31.            for ra = 0:radius-y_-1  
  32.                h(end-ra,:) = h(end-ra,:)+h(1,:);  
  33.                h(1,:)=[];  
  34.            end  
  35.        end  
  36.       if (y_-radius+1<1)  
  37.            for ra = 0:radius-y_-1  
  38.                h(end-ra,:) = h(end-ra,:)+h(1,:);  
  39.                h(1,:)=[];  
  40.            end  
  41.        end  
  42.        if (x_+ksize-radius>n)  
  43.            for ra = 0:x_+ksize-radius-n-1  
  44.                h (:,1+ra) = h(:,1+ra)+h(:,end);  
  45.                h(:,end) = [];  
  46.            end  
  47.        end  
  48.        if(y_+ksize-radius>m)  
  49.             for ra = 0:y_+ksize-radius-m-1  
  50.                 h (1+ra,:) = h(1+ra,:)+h(end,:);  
  51.                 h(end,:) = [];  
  52.             end  
  53.        end  
  54.           d_map(max(y_-radius+1,1):min(y_+ksize-radius,m),max(x_-radius+1,1):min(x_+ksize-radius,n))...  
  55.              = d_map(max(y_-radius+1,1):min(y_+ksize-radius,m),max(x_-radius+1,1):min(x_+ksize-radius,n))...  
  56.               + h;  
  57.    end  
  58.   
  59. %方法1,保存为图片,再转为LMDB  
  60. % str=num2str(i,'./density/seq_%06d.jpg');  
  61. % imwrite(d_map,str);  
  62. %方法2,直接转为HDF5  
  63.  trainLabels=permute(d_map,[2 1]);  
  64.  str=num2str(i,'./density_map/seq_%06d.h5');  
  65.  h5create(str,'/label',size(trainLabels),'Datatype','double');  
  66.  h5write(str,'/label',trainLabels);  
  67.   
  68. end  

这里为了加速模型的收敛,我进行了减均值和归一化操作。由于数据集只有2000,并不像imagenet那样的大数据,为了提高泛化能力,适应不同的数据集,我这里的均值没有取2000个图片的均值,而是直接设置为127.5,归一化则除以128。

测试程序如下:
  1. clear;clc;  
  2. addpath('/home/caffe/matlab');  
  3. caffe.reset_all();  
  4.   
  5. caffe.set_device(0);  
  6. caffe.set_mode_gpu();  
  7.   
  8. model = 'deploy.prototxt';  
  9. weights = 'network.caffemodel';  
  10. net = caffe.Net(model, weights, 'test');  
  11.   
  12. cropImg=imread('IMG_12.jpg');  
  13.   
  14. cropImg = cropImg(:, :, [3, 2, 1]);  
  15. cropImg = permute(cropImg, [2, 1, 3]);   
  16. cropImg = single(cropImg);  
  17.   
  18. cropImg=imresize(cropImg,[480 640]);  
  19. cropImg=(cropImg-127.5)/128;  
  20.   
  21. res = net.forward({cropImg});  
  22. figure,imshow(cropImg,[]);  
  23. figure,imagesc(res{1,1});  
  24. count = sum(sum(res{1,1}))  
  25. caffe.reset_all();  

贴几个效果图:

人群密度估计之MCNN