DPM檢測模型 訓練自己的數據集 讀取接口修改


(轉載請注明作者和出處 樓燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未經允許請勿用於商業用途)

本文主要是針對上一篇基於DPM的VOC-release5的版本,matlab的版本進行訓練。
訓練自己的數據集主要是修改pascal_data這個文件,這個是負責讀取參與訓練的正負樣本,以下是我的的讀取文件,其中我的正樣本的數據格式為

1.jpg 2 x1 y1 x2 y2 x2_1 y2_1 x2_2 y2_2 

圖片路徑之后的數字代表其中的正樣本個數,目前仍然以訓練車樣本為主:
如果是自己新建了個文件需要在pascal_train中修改相應的讀取函數接口
以下是經過修改的pascal_data:

function [pos, neg, impos] = pascal_data(cls, year)%這里為了保持一致沒有改變,讀者也可以自己修改
% Get training data from my own dataset
%   [pos, neg, impos] = pascal_data(cls, year)
%
% Return values
%   pos     Each positive example on its own
%   neg     Each negative image on its own
%   impos   Each positive image with a list of foreground boxes

%基地址路徑
%added by yihanglou  using my own img and txtinfo
PosImageFile = '/home/louyihang/Workspace/Dataset/DPM_TrainingData/ImageList_Version_S_GT.txt';
NegImageFile = '/home/louyihang/Workspace/Dataset/DPM_TrainingData/Neg_Imagelist.txt';
BasePath = '/home/louyihang/Workspace/Dataset/DPM_TrainingData';

pos      = [];
impos    = [];
numpos   = 0;
numimpos = 0;
dataid   = 0;

fin = fopen(PosImageFile,'r');%打開正樣本文件

now = 1;

while ~feof(fin)
    line = fgetl(fin);
    S = regexp(line,' ','split');
    count = str2num(S{2});
    fprintf('%s: parsing positives (%s): %d\n', ...
             cls, S{1}, now);
    now = now + 1;
    for i = 1:count;%挨個讀取正樣本
        numpos = numpos + 1;
        dataid = dataid + 1;
        bbox = [str2num(S{i*4-1}),str2num(S{i*4}),str2num(S{i*4+1}),str2num(S{i*4+2})];
        
        pos(numpos).im      = [BasePath '/' S{1}]; %拼接地址
        pos(numpos).x1      = bbox(1);
        pos(numpos).y1      = bbox(2);
        pos(numpos).x2      = bbox(3);
        pos(numpos).y2      = bbox(4);
        pos(numpos).boxes   = bbox;
        pos(numpos).flip    = false;
        pos(numpos).trunc   = 0;%1 represent incomplete objects, 0 is complete
        pos(numpos).dataids = dataid;
        pos(numpos).sizes   = (bbox(3)-bbox(1)+1)*(bbox(4)-bbox(2)+1);
        
        img = imread([BasePath '/' S{1}]);
        [height, width, depth] = size(img);%由於我的樣本里沒有標定大小所以我要讀取以下圖像尺寸才能翻轉
        
        % Create flipped example 創建翻轉的正樣本
        numpos  = numpos + 1;
        dataid  = dataid + 1;
        oldx1   = bbox(1);
        oldx2   = bbox(3);
        bbox(1) = width - oldx2 + 1;
        bbox(3) = width - oldx1 + 1;
        
        pos(numpos).im      = [BasePath '/' S{1}];
        pos(numpos).x1      = bbox(1);
        pos(numpos).y1      = bbox(2);
        pos(numpos).x2      = bbox(3);
        pos(numpos).y2      = bbox(4);
        pos(numpos).boxes   = bbox;
        pos(numpos).flip    = true;
        pos(numpos).trunc   = 0;% to make operation simple
        pos(numpos).dataids = dataid;
        pos(numpos).sizes   = (bbox(3)-bbox(1)+1)*(bbox(4)-bbox(2)+1);%獲得圖像面積大小   
        
    end
    
    % Create one entry per foreground image in the impos array,這里跟pos是一樣的,相當於副本
    numimpos                = numimpos + 1;
    impos(numimpos).im      = [BasePath '/' S{1}];
    impos(numimpos).boxes   = zeros(count, 4);
    impos(numimpos).dataids = zeros(count, 1);
    impos(numimpos).sizes   = zeros(count, 1);
    impos(numimpos).flip    = false;
    
    for j = 1:count
        dataid = dataid + 1;
        bbox   = [str2num(S{j*4-1}),str2num(S{j*4}),str2num(S{j*4+1}),str2num(S{j*4+2})];
        
        impos(numimpos).boxes(j,:) = bbox;
        impos(numimpos).dataids(j) = dataid;
        impos(numimpos).sizes(j)   = (bbox(3)-bbox(1)+1)*(bbox(4)-bbox(2)+1);
    end     
    
    img = imread([BasePath '/' S{1}]);
    [height, width, depth] = size(img);
    
     % Create flipped example
    numimpos                = numimpos + 1;
    impos(numimpos).im      = [BasePath '/' S{1}];
    impos(numimpos).boxes   = zeros(count, 4);
    impos(numimpos).dataids = zeros(count, 1);
    impos(numimpos).sizes   = zeros(count, 1);
    impos(numimpos).flip    = true;
    unflipped_boxes         = impos(numimpos-1).boxes;
    
    
    for j = 1:count
    dataid  = dataid + 1;
    bbox    = unflipped_boxes(j,:);
    oldx1   = bbox(1);
    oldx2   = bbox(3);
    bbox(1) = width - oldx2 + 1;
    bbox(3) = width - oldx1 + 1;

    impos(numimpos).boxes(j,:) = bbox;
    impos(numimpos).dataids(j) = dataid;
    impos(numimpos).sizes(j)   = (bbox(3)-bbox(1)+1)*(bbox(4)-bbox(2)+1);
    end
end

fclose(fin);
% Negative examples from the background dataset

fin2 = fopen(NegImageFile,'r');
neg    = [];
numneg = 0;
negnow = 0;
while ~feof(fin2)%這里是循環讀取副樣本
     line = fgetl(fin2);
     fprintf('%s: parsing Negtives (%s): %d\n', ...
                   cls, line, negnow);
     
     negnow             = negnow +1;
     dataid             = dataid + 1;
     numneg             = numneg+1;
     neg(numneg).im     = [BasePath '/' line];
     disp(neg(numneg).im);
     neg(numneg).flip   = false;
     neg(numneg).dataid = dataid;
 end
 
 fclose(fin2);%存儲為mat文件 包含訓練樣本的信息
 save([cachedir cls '_' dataset_fg '_' year], 'pos', 'neg', 'impos');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM