darknet 如何训练自己的数据集

darknet 官网:https://pjreddie.com/

1、使用matlab2017的 trainingImageLabeler命令对图像进行标记,并产生table数据类型;
2、将table中数据转化为指定的xml文件(img_to_xml_table.m);
3、将Annotations中的数据生成trainval.txt、train.txt、val.txt、test.txt文件(generate_label.m);
4、在darknet/scripts/下新建VOCdeckit文件夹,接着在VOCdeckit文件夹下新建VOC2007子文件夹。然后在VOC2007下新建Annotations、ImageSets、JPEGImages文件夹;
5、将xml文件放入Annotations文件夹下,在图片放入JPEGImages文件夹下,在ImageSets下新建Main文件,将trainval.txt、train.txt、val.txt、test.txt放入其中;
6、编辑voc_label.py,将sets修改为[('2007', 'train'), ('2007', 'val'), ('2007', 'test')],将classes修改为类别种类信息。另外,将os.system()中的2012_train.txt 2012_val.txt删除,并运行python voc_label.py命令;
7、编辑darknet/cfg/voc.data,将classes修改为类别数目,train和valid分别为2007_train.txt和2007_val.txt的路径;
8、编辑darknet/data/voc.names,填入类别的名称;
9、编辑darknet/data/yolov3-voc.cfg,修改类别信息;
10、运行./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74命令,即可训练自己的数据集。


附录

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); 

你可能感兴趣的:(目标识别,darknet,object,detection)