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中的XML文件
%
% 提示:请在Command Window中输入 trainingImageLabeler以打开APP,并按照提示进行标注操作。
% 示例:
img_to_xml_table(raw_data)
%%
clc;
if nargin小于1或~istable(raw_data)
error('请使用trainingImageLabeler导出的APP数据格式!')
end
%%
将tableLabel赋值为raw_data; %此处指代的是经过自己标注处理后的表格类型数据
通过获取tableLabel对象的属性变量名称来确定各个字段; %cell类型的处理以获取所有字段名称
计算raw_data中的样本数量; %使用size函数计算图片的数量
计算变量名称的数量; %通过size函数获取字段的数量
对于每个i从1到numSamples:
rowTable赋值为tableLabel的第i行;
imagePath变量存储rowTable中第一个字段的值;
将imagePath变量转换为字符形式存储于path变量中;
使用fileparts函数分解path路径信息,并分别提取文件夹路径、文件名和文件后缀名;
在pathstr路径中查找分隔符的位置并存储于index变量中。
设置标注目录为从索引末尾加一到末尾的路径字符串。
设置文件名为指定的变量。
注释:设置文件名为指定的变量及其扩展后缀。
%
注释行保持不变
设置数据集来源数据库为ImageNet数据库。
读取图像至工作区变量。
该字段指定图像宽度的大小。
该字段指定图像高度的大小。
该字段指定图像深度的大小。
该字段设置为零以表示未分割。
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);
循环从ii=1开始至numROIS。
对于每个区域感兴趣(Region of Interest, ROI),执行以下操作:
初始化对象编号为objectnum并递增;
将当前标注的目标名称设置为基于索引路径的提取结果;
未指定目标类别;
标记目标为非截断;
标记目标为非困难;
设置目标边界框坐标:
xmin值等于ROI矩阵中第ii行第一列的值,
ymin值等于ROI矩阵中第ii行第二列的值,
xmax值等于xmin加上第三列的值,
ymax值等于ymin加上第四列的值。
循环结束。
指定XML文件的存储路径为'"/data/", annotation.folder, "/Annotations/"'; % XML文件保存路径
将生成的XML文件写入[xml_path, name, ".xml"]; % 调用xml_write函数
清除annotation变量; % 清空annotation变量
end
``generate_label.m
%%
此代码基于已生成的XML文件制作VOC2017数据集中对应的训练验证及测试文件(包括trainval.txt、test.txt、train.txt和 val.txt)。其中, 训练验证文件(train_val)占用整个数据集的比例为X%, 剩余部分用于创建测试文件(test)。在训练验证文件中进一步划分训练文件(Xx%) 和验证文件(xx%)。注:以上比例可根据具体需求进行调整
以下是需要修改的关键参数设置:
参数说明
注意
%%
xmlfile等于dir函数作用于xmlfilepath的结果;
numOfxml等于length函数作用于XML文件数量的结果减去2;%去除文件扩展名后缀后的数量
创建训练集索引的变量 trainval 通过调用 sort 函数对 randperm 的结果进行排序。
测试集的索引集合 test 被赋值为 1 到 numOfXML 的集合与 trainval 的差值。
计算 trainval 的长度并赋值给 trainvalsize
open([txtsavepath, "trainval.txt"], "w");
open([txtsavepath, "test.txt"], "w");
open([txtsavepath, "train.txt"], "w");
open([txtsavepath, "val.txt"], "w");
for i=1:numofxml
if trainval包含i
打开ftrainval并写入xmlfile(i+2).name(1:end-4)
end
if train包含i
打开ftrain并写入xmlfile(i+2).name(1:end-4)
end
else
打开fval并写入xmlfile(i+2).name(1:end-4)
end
else
打开ftest并写入xmlfile(i+2).name(1:end-4)
end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);
