1. 程式人生 > >人群密度圖的生成(MATLAB+malldataset)

人群密度圖的生成(MATLAB+malldataset)

south 縮小 box -c href create ext all ive

首先malldataset數據集下載

參見人群密度估計之MCNN寫的關於密度圖的生成,在MATLAB跑了程序,代碼如下:

clear;  
load(‘perspective_roi.mat‘);  
load(‘mall_gt.mat‘);  

m=480;n=640;  
m=m/4;  
n=n/4;  
mask = imresize(roi.mask,0.25);  %圖像縮小4倍
for i=1:2000  %2000幅圖像
   gt = frame{i}.loc; %第一個frame結構體的loc字段 
   gt = gt/4;  
   d_map = zeros(m,n);  
   for j=1:size(gt,1)  
       ksize = ceil(25/sqrt(pMapN(floor(gt(j,2)),1))); 
       ksize = max(ksize,7);  
       ksize = min(ksize,25);  
       radius = ceil(ksize/2);  
       sigma = ksize/2.5;  
       h = fspecial(‘gaussian‘,ksize,sigma);  
       x_ = max(1,floor(gt(j,1)));  
       y_ = max(1,floor(gt(j,2)));  

       if (x_-radius+1<1)  
              for ra = 0:radius-x_-1  
                   h(:,end-ra) = h(:,end-ra)+h(:,1);  
                   h(:,1)=[];  
              end  
       end  
       if (y_-radius+1<1)  
           for ra = 0:radius-y_-1  
               h(end-ra,:) = h(end-ra,:)+h(1,:);  
               h(1,:)=[];  
           end  
       end  
      if (y_-radius+1<1)  
           for ra = 0:radius-y_-1  
               h(end-ra,:) = h(end-ra,:)+h(1,:);  
               h(1,:)=[];  
           end  
       end  
       if (x_+ksize-radius>n)  
           for ra = 0:x_+ksize-radius-n-1  
               h (:,1+ra) = h(:,1+ra)+h(:,end);  
               h(:,end) = [];  
           end  
       end  
       if(y_+ksize-radius>m)  
            for ra = 0:y_+ksize-radius-m-1  
                h (1+ra,:) = h(1+ra,:)+h(end,:);  
                h(end,:) = [];  
            end  
       end  
          d_map(max(y_-radius+1,1):min(y_+ksize-radius,m),max(x_-radius+1,1):min(x_+ksize-radius,n))...  
             = d_map(max(y_-radius+1,1):min(y_+ksize-radius,m),max(x_-radius+1,1):min(x_+ksize-radius,n))...  
              + h;  
   end  
 map0_255 = Normalize(d_map) 
% %方法1,保存為圖片,再轉為LMDB  
% %把數組A中的數轉換成字符串表示形式
str=num2str(i,‘./density/seq_%06d.jpg‘);  
%imwrite(d_map,str);  
 imshow( map0_255);  
%方法2,直接轉為HDF5  
%  trainLabels=permute(d_map,[2 1]);  
%  str=num2str(i,‘./density_map/seq_%06d.h5‘);  
%   h5create(str,‘/label‘,size(trainLabels),‘Datatype‘,‘double‘);  
%   h5write(str,‘/label‘,trainLabels);  

end  

最後得到的圖像規到0-255後輸出為:

技術分享
而d_map中的數據大致是,d_map是0-1之間的數值
技術分享
對d_map中的數值分析可以得知,就算歸到0-255,數值依然很小,所以,成黑白狀態。

說明:在pMapN中存的是透視變化的加權值,Roi表示在圖像中定義的ROI區域,mask掩碼可以實現只對ROI區域操作。

這裏為了加速模型的收斂,我進行了減均值和歸一化操作。由於數據集只有2000,並不像imagenet那樣的大數據,為了提高泛化能力,適應不同的數據集,我這裏的均值沒有取2000個圖片的均值,而是直接設置為127.5,歸一化則除以128。

測試程序如下:

[plain] view plain copy
  1. clear;clc;
  2. addpath(‘/home/caffe/matlab‘);
  3. caffe.reset_all();
  4. caffe.set_device(0);
  5. caffe.set_mode_gpu();
  6. model = ‘deploy.prototxt‘;
  7. weights = ‘network.caffemodel‘;
  8. net = caffe.Net(model, weights, ‘test‘);
  9. cropImg=imread(‘IMG_12.jpg‘); //cropImg是圖像裁剪
  10. cropImg = cropImg(:, :, [3, 2, 1]);
  11. cropImg = permute(cropImg, [2, 1, 3]); //permute(多維數組,[維數的組合])
  12. cropImg = single(cropImg);
  13. cropImg=imresize(cropImg,[480 640]);
  14. cropImg=cropImg-127.5/128;
  15. res = net.forward({cropImg});
  16. figure,imshow(cropImg,[]);
  17. figure,imagesc(res{1,1});
  18. count = sum(sum(res{1,1}))
  19. caffe.reset_all();

貼幾個效果圖:

技術分享

人群密度圖的生成(MATLAB+malldataset)