做人車分類,需要資料集,是以把KITTI中标定好的gtbox提取出來做成自己的資料集,代碼實作參考了faster rcnn的源碼。
第一步,資料準備
之前因為使用faster rcnn 訓練了kitti的資料,是以對原始資料集已經做過修改,目前的label格式如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiN5ETMxYDMwEDMyETM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
其中,第一位為圖檔索引,接着為整張圖中的box的數量,然後是第一類的數量,接着便是第一類的box坐标。如果這一類沒有就寫0。
第二步,實作gtbox的提取
function res = get_gtbox(path,img_list,img_gt)
% 參數:path: 路徑; img_list:KITTI_val_list.txt; img_gt:KITTI_gt_val.txt
% clc;
% clear;
% path = '/home/fucm/Python/Car/data';
% img_list = 'KITTI_val_list.txt';
% img_gt = 'KITTI_gt_val.txt';
classes = {'car','pedestrian','cyclist'};
img_list_path= strcat(path,'/',img_list);
img_gt_path= strcat(path,'/',img_gt);
image_list=importdata(img_list_path);
% 得到gt參數
fidin=fopen(img_gt_path);
ind=;
while ~feof(fidin)
tline=fgetl(fidin);
image_list_gt_data{ind}=str2num(tline(:end)); % 得到gt标簽
ind=ind+;
end
NUMBER = ; %bbox總數
% 得到gt數值
for i=:length(image_list) % 一共的圖檔
image_gt{i}.ids=image_list{i};
% image_gt{i}.total=image_list_gt_data{i}(1);% 每個圖檔在中bbox的數量
ind=;
path=strcat('../data/',image_gt{i}.ids); % 這裡路徑需要修改
img=imread(path);
% fprintf('i=%d,ids=%d:\n',i,image_gt{i}.ids);
for j=:length(classes) % 分不同的種類讀出來
if ~exist(strcat('../data/dataset_test/train/',classes{j},'/gt'))
mkdir(strcat('../data/dataset_test/train/',classes{j},'/gt'))
end
image_gt{i}.classes{j}=image_list_gt_data{i}(ind);
if image_gt{i}.classes{j}>
bbox_num = image_gt{i}.classes{j};
image_gt{i}.bb{j}=reshape(image_list_gt_data{i}(ind+:ind+image_gt{i}.classes{j}*),,image_gt{i}.classes{j})'; % 得到bbox矩陣
for k=1:bbox_num
bb_target=image_gt{i}.bb{j}(k,:); % 這個是原始的bbox
write_path=strcat('../data/dataset_test/train/',classes{j},'/gt','/',num2str(NUMBER+k),'.jpg'); %NUMBER是基準數
fprintf('img-ids:%s:%d;%d;%d;%d\n',image_gt{i}.ids,fix(bb_target()),fix(bb_target()),fix(bb_target()),fix(bb_target()));
imwrite(img(fix(bb_target())+:fix(bb_target()),fix(bb_target())+:fix(bb_target()),:),write_path,'jpg');
end
else
image_gt{i}.bb{j}=[];
end
NUMBER = NUMBER + image_gt{i}.classes{j}; % 加上這個循環的class(j)數量
ind=ind+*image_gt{i}.classes{j}+; % 得到第二類索引
end
end
fprintf('total:%d:\n',NUMBER);
fprintf('\n~~~~~~~~~~~~~~~~~~~~\n');
這裡需要特别注意的是matlab的下标索引是1開始的,是以我才會在下面這句話中每個都加1,主要是在原始的資料中會有坐标為0的點,這樣就會報錯。
imwrite(img(fix(bb_target())+:fix(bb_target()),fix(bb_target())+:fix(bb_target()),:),write_path,'jpg');
原文位址:http://blog.csdn.net/u011956147/article/details/53239325