天天看點

KITTI提取gtbox并存為圖檔

做人車分類,需要資料集,是以把KITTI中标定好的gtbox提取出來做成自己的資料集,代碼實作參考了faster rcnn的源碼。

第一步,資料準備

之前因為使用faster rcnn 訓練了kitti的資料,是以對原始資料集已經做過修改,目前的label格式如下:

KITTI提取gtbox并存為圖檔

其中,第一位為圖檔索引,接着為整張圖中的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

繼續閱讀