DPM檢測模型 訓練自己的資料集 讀取介面修改
阿新 • • 發佈:2019-01-09
訓練自己的資料集主要是修改pascal_data這個檔案,這個是負責讀取參與訓練的正負樣本,以下是我的的讀取檔案,其中我的正樣本的資料格式為
1.jpg 2 x0 y0 x1 y1 x2 y2 x3 y3
圖片路徑之後的數字代表其中的正樣本個數,目前仍然以訓練車樣本為主:
如果是自己新建了個檔案需要在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/jack/Desktop/dataDPM5/pos.txt'; NegImageFile = '/home/jack/Desktop/dataDPM5/neg.txt'; BasePath = '/home/jack/Desktop/dataDPM5'; 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(['/home/jack/Desktop/voc-release5/voc-release5/voc-release5/2011' cls '_' year], 'pos', 'neg', 'impos');