一. 关于VOC2007数据集我们需要知道的事
1.1 下载地址
(1)目前对于新手来说,先不要犹豫那么多,无脑下载下面的红框链接,很明显,根据名字分析得是训练数据集
(2)下载之后打开文件夹:注意红框标注出来的路径
注意,我们现在的目标是做目标检测,其他的分割啥的先不要理会,会耽误时间,这样我们看到有segmentation字眼的都排除掉。
(3)解析目标检测所需文件作用
Annotations:存放xml文件,内部有图片的标注信息
ImageSets:内部根据不同的图像任务,分成了不同的文件,文件内部存放图片名的txt文件。
在yolov3里面具体layout和main选哪个还不知道
你多任你多,反正yolov3都需要自己生成
JPEGImages:存放图片
1.2. yolov3肯定有自己的需要的txt文件格式,所以我们还需要转换成yolov3所需要的格式
yolov3 需要什么txt文件,参考1.2.2节,实际详细操作步骤参考1.2.3节
代码:https://github.com/PositiveTom/yolov3.git
1.2.1 网上一个人生成的数据集格式大致是以下形式:还不知道这样的合理性
(1)以原始数据集为基础,生成trainval和test,trainval占原始数据的0.9,test占0.1
(2)以trainval为基础,生成train和val,train占trainval的0.9,val占0.1
(3)打开train.txt,制作2007_train.txt
train.txt存放图片数据的名称,2007_train.txt存放图片的路径,以及ground truth以及类别
(4)打开val.txt,制作2007_val.txt
存放数据同上
note:ground truth的制作需要从xml文件里面提取。
1.2.2 上述只是非官方做法,还是以官方做法为准,如下所示
(1)需要一个.data文件,内部存放如下:类别数目,train.txt路径,val.txt路径,类别.names文件路径
(2)train.txt文件内部内容如下所示:简单说就是存放图片路径
(3)val.txt文件内部内容同上
(4).names文件内部内容
(5)内部直接获取.data文件,就可以依次获取其他的文件
(6)推荐看完1.2.3 生成所需要的文件后再来看这里,在1.2.3 之后,我们还需要创建(1)中提到的.data文件和.names文件
直接改名
再创建.data文件,注意各文件的路径
1.2.3. 更加详细的步骤:(抓输入和输出)主要就是如何由VOC2007的xml文件夹和图片数据文件夹,生成yolov3所需要的一些txt文件
你在官方文件的基础之上,新添了一个生成label集合的文件StatisCatogories.py
输入:xml文件夹路径
输出:包含类别名的txt文件
(1)运行data/makeTxt.py,生成ImageSets目录下的train.txt,val.txt,test.txt
内部存储图片名称:(xml和图片名相同,除了后缀不同)
输入:xml文件夹
输出:ImageSets目录下的train.txt,val.txt,test.txt
(2)运行voc_label.py,由(1)中的train.txt找到指定的图片,生成当前路径下的train.txt,val.txt,test.txt,内部存储格式如下:
输入:ImageSets目录下的train.txt,val.txt,test.txt
图像数据集的路径
输出:txt文件夹下的图片lable
当前路径下的train.txt,val.txt,test.txt
以及还要生成txt文件夹下面的label,图片名.txt,如下所示
关于label的含义,依次是类别 + x占比,y占比,宽占比,高占比
综上所述,我们只需要原数据集下的train,val,test即可,重点在于后面的label
1.3 在完成上述步骤后,源码需要更改的地方
(1)获取了train.txt文件的路径之后,创建一个继承自Dataset的类
(2)把这个类传给torch.utils.data.DataLoader实例化对象,即可
(1)、(2)步可以归结为以下步骤(将数据加载到模型)
(3)官方的dataset内部还需要指定图片的含label的.txt
修改dataset.py内部LoadImagesAndLabels类的self.label_files获取路径方式
(4)在加载测试数据集时,还要注意.shapes文件
这个.shapes文件是用来做什么的呢?
根据代码注释,存放的是图片的宽和高,为什么验证集需要使用,而训练集不需要呢?
所以在这里还得自己写一个文件,保存验证集数据图片的宽和高
已经上传github,data文件夹下的Getshape.py文件
输入:val.txt
输出:val.shapes
(5)我要大改,全部改成用绝对路径,相对路径真的恶心
其实也没改多少,在上面的基础之上只做了以下改动
根本目标:把train.txt,和val.txt改成绝对路径
为此要做的事:就做了两件事
1)voc_label.py改了一个地方
2)dataset.py改了一个地方,获取label的地方
忙活了一上午,才把数据获取搞清楚。。。。
三. 修改.cfg文件
修改里面的classes数量,你的数据集有多少类,这里就改成多少类
你在更改classes的时候,一定要更改紧接着上一层的卷积核个数,因为原来的80类组成了
255 = 3 x (80+4+1)
现在是 75 = 3 x (20+4+1)