前序
1、环境配置
- 请自行参考其他博客
- 本机环境
- ubuntu16.04
- python3
- 英伟达显卡驱动:nvidia-396
- OpenCV3.4.5
- CUDNN7.0.5
- CUDA9.0
2、ubuntu16.04下安装OpenCV
参考:ubuntu16.04安装C++版本的OpenCV3.4.5
一、数据集图片的标注
1、使用labelImg标注软件进行数据集中图像的标注
2、具体改动的标注步骤
注:不同的是,我们在标注的时候就让每张图片生成的是txt文件,而不是xml文件,这样就省去了xml转txt这个步骤
(1)红色方框处选择yolo,而非默认的PascalVOC
(2)每标注一张图片点击保存,就会生成对应的图片名的txt文件,在保存txt文件夹中也会存在一个所有类别的文件
- 每个图片标注后的文件
- 类别txt文件
(3)对于每个标注后生成的txt文件,其格式是如下所示
二、VOC2019数据集的制作
1、建立层次文件夹
- 在下载的YOLOV3代码目录下,即darnet-master下建立voc/VOCdevkit/VOC2019层次目录,自己的建立的数据集为 VOC2019
- 然后在VOC2019目录下建立三个文件夹:Annotations、ImageSets、JPEGImages
一级:darknet-master
二级:——backup (存储训练好的模型)
二级:——cfg (用于存放.cfg和.data文件)
二级:——data (存放标签文件、图片、名字文件(.name))
三级:————data下的目录 :images(存放图片和yolo的txt文件,图片名和txt文本名要对应,但是后面我们在 JPEGImages中这样做了,因此此步就做了)
三级:————data下的目录:labels (存放用于opencv回执图片框的图片文件)
二级:——voc (voc数据集目录)
三级:————VOCdevkit
四级: ——————VOC2019(这个年号可以自行更换,根据自己的需求吧)
五级: ————————Annotations (存放使用labelImg软件标注所有数据集图片时生成的txt标注文件)
五级: ————————ImageSets(用来存放训练和测试数据的名称,其里面存放的是Main文件夹)
五级: ———————— labels(存放Annotations中相同的内容)
六级: ——————————Main(Main文件夹中存放的是4个txt文件,分别是存训练集图片名的train.txt、存验证集图片 名的val.txt、存测试集图片名的test.txt、存测试和验证集图片名的trainval.txt,但是 自己只建了两个,接下来会说明如何生成的)
五级: ————————JPEGImages (用于存放数据集中的图片,后期还要将labels中的txt全部放到其中)
- 具体目录层次如下:
2、一些txt文件的生成
#####
前提说明:因为我们在标注时就已经生成了每个图片对应的txt文档,因此我们就不使用darknet-master/scripts下的voc_label.py文件了,而是自己写脚本生成我们需要的文件。
######
(1)根据JPEGImages中的数据集图片生成我们需要的ImageSets/Main目录下的train.txt和val.txt,这两个文件存的是每个图片的名字,即.jpg之前的内容
- 生成如上txt文件的脚本文件make_train_val.py如下
import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':
source_folder='/*****(自己的路径)/darknet-master/voc/VOCdevkit/VOC2019/JPEGImages/'#地址是所有图片的保存地点
dest='/*****(自己的路径)/darknet-master/voc/VOCdevkit/VOC2019/ImageSets/Main/train.txt' #保存train.txt的地址,对于train.txt(在ImageSets/Main/下)和2019_train.txt(在VOCdevkit下)是不同的路径
dest2='/*****(自己的路径)/darknet-master/voc/VOCdevkit/VOC2019/ImageSets/Main/val.txt' #保存val.txt的地址,对于val.txt(在ImageSets/Main/下)和2019_val.txt(在VOCdevkit下)是不同的路径
file_list=os.listdir(source_folder) #赋值图片所在文件夹的文件列表
train_file=open(dest,'a') #打开文件
val_file=open(dest2,'a') #打开文件
for file_obj in file_list: #访问文件列表中的每一个文件
file_path=os.path.join(source_folder,file_obj)
#file_path保存每一个文件的完整路径
file_name,file_extend=os.path.splitext(file_obj)
#file_name 保存文件的名字,file_extend保存文件扩展名
file_num=int(file_name)
if(file_num<620): #保留620个文件用于训练
train_file.write(file_name+'\n') #用于训练前620个的图片路径保存在train.txt里面,结尾加回车换行/生成train.txt是file_name;生成2019_train.txt是file_path
else :
val_file.write(file_name+'\n') #其余的文件保存在val.txt里面/生成val.txt是file_name;生成2019_val.txt是file_path
train_file.close()#关闭文件
val_file.close()
- 终端运行
python3 make_train_val.py
- 生成的文件目录和文件内容如下
a)train.txt文件部分内容(保存的是图片名字)
b)val.txt文件中的内容(保存的是图片名字)