附录
img_to_xml_table.m
function img_to_xml_table(raw_data)
% 功能:把trainingImageLabeler导出的APP数据格式(struct类型)转为VOC格式的xml
% 输入: raw_data为导出到工作空间的标注文件
% 输出: 自动生成xmlSaveFolder文件存储,每张图对应一个
%
% 说明:raw_data标注变量,请在command window输入 trainingImageLabeler 打开APP进行文件标注
% 标注完后导出到raw_data变量,然后使用该函数
% Example:
% img_to_xml_table(raw_data)
%%
clc;
if nargin<1 || ~istable(raw_data)
error('输入参数太少或者类型错误!请用trainingImageLabeler中导出的APP数据格式!')
end
%%
tableLabel = raw_data; %这里是自己的标注好的table类型数据
variableNames = tableLabel.Properties.VariableNames; %cell类型 获取所有字段名
numSamples = size(raw_data,1); % 获取图片数量
numVariables = size(variableNames,2); % 获取字段的数量
%%
for i = 1:numSamples
rowTable = tableLabel(i,:);
imageFullPathName = rowTable.(variableNames{1}); % variableNames{j} 获取的是指定的字段
path = char(imageFullPathName); % 将元胞数组转化为字符串
[pathstr, name, ext] = fileparts(path); % 文件夹路径 文件名 文件后缀名
index =strfind(pathstr,'\'); % 分隔符的位置
annotation.folder = pathstr(index(end)+1:end); % 文件夹
annotation.filename = name; % 文件名
% annotation.filename = [name,ext]; % 文件名及后缀名
% annotation.path = path;
annotation.source.database = 'ImageNet database';
image = imread(path);
annotation.size.width = size(image,2);
annotation.size.height = size(image,1);
annotation.size.depth = size(image,3);
annotation.segmented = 0;
objectnum = 0;
Pref.StructItem = false
for j = 2:numVariables %除去第一个字段的文件路径的每个字段
% ROI_matrix = num2cell(rowTable.(variableNames{j})); %数值数组转化为元胞数组 ROI(region of interest)
ROI_matrix = rowTable.(variableNames{j});
if isa(ROI_matrix, 'double')
%disp('!!!!');
elseif isa(ROI_matrix, 'cell')
ROI_matrix = ROI_matrix{:};
%disp('####');
end
numROIS = size(ROI_matrix,1);
for ii = 1: numROIS % 对于每个ROI
objectnum= objectnum + 1;
annotation.object(objectnum).name = pathstr(index(end)+1:end);
annotation.object(objectnum).pose = 'Unspecified';
annotation.object(objectnum).truncated = 0;
annotation.object(objectnum).difficult= 0;
annotation.object(objectnum).bndbox.xmin = ROI_matrix(ii,1);
annotation.object(objectnum).bndbox.ymin = ROI_matrix(ii,2);
annotation.object(objectnum).bndbox.xmax = ROI_matrix(ii,1)+ROI_matrix(ii,3);
annotation.object(objectnum).bndbox.ymax = ROI_matrix(ii,2)+ROI_matrix(ii,4);
end
end
xml_path = ['/data/', annotation.folder, '/Annotations/']; % xml文件保存路径
xml_write([xml_path, name, '.xml'],annotation);
clear annotation;
end
generate_label.m
%%
%该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt
%trainval占总数据集的70%,test占总数据集的30%;train占trainval的70%,val占trainval的30%;
%50%,25%, 25%
%上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些
%%
%注意修改下面四个值
xmlfilepath='E:\Program Files\MATLAB\churchill\data\vehicle_3\Annotations';
txtsavepath='E:\Program Files\MATLAB\churchill\data\vehicle_3\';
trainval_percent=0.7;%trainval占整个数据集的百分比,剩下部分就是test所占百分比
train_percent=0.7;%train占trainval的百分比,剩下部分就是val所占百分比
%%
xmlfile=dir(xmlfilepath);
numOfxml=length(xmlfile)-2;%减去.和.. 总的数据集大小
trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));
test=sort(setdiff(1:numOfxml,trainval));
trainvalsize=length(trainval);%trainval的大小
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));
val=sort(setdiff(trainval,train));
ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
ftest=fopen([txtsavepath 'test.txt'],'w');
ftrain=fopen([txtsavepath 'train.txt'],'w');
fval=fopen([txtsavepath 'val.txt'],'w');
for i=1:numOfxml
if ismember(i,trainval)
fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));
if ismember(i,train)
fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
else
fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
end
else
fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);