参考链接:从零开始制作自己的Pascal VOC数据集. 上述参考链接中有标注工具labelimg的下载。
建立如下格式的文件结构(仿照标准VOC数据集,先构建框架如下图所示的数据集框架)
3.rename: 将图片重命名统一修改成0x6d.jpg格式,代码如下:
import cv2 as cv import os # ==================可能需要修改的地方=====================================# g_root_path = "E:/Pycharm/try_my_dataset_proj/datas" os.chdir(g_root_path) # 更改工作路径到图片根目录 org_path = "org/" # 原图片目录 dst_path = "rename/" # 目标图片目录 img_cnt = 5000 # 图片的起始名字,这里是‘005000.jpg’ # ==================================================================# file_list = os.listdir(org_path) if os.path.exists(dst_path) is False: os.makedirs(dst_path) for idx, file in enumerate(file_list): img = cv.imread(org_path + file) # img=cv.resize(img,(512,512)) img_name = os.path.join(dst_path, "d.jpg" % img_cnt) cv.imwrite(img_name, img) img_cnt += 1 最后将已经预处理并重新命名的图片全部存放到JPEGImages目录下。此文件夹放的是xml标注文件。 使用labelimg将JPEGImages的图片进行标注并生成xml,生成的xml要保存在Annotations目录下。 具体操作如下:
点击左侧第二个 Open Dir按钮,选择刚才生成好的图片目录JPEGImages。 选择好打开的图片路径后会自动显示图片
更改xml文件保存的路径
标注 在英文输入法模式下,按下W,就可以选择标注区域了,用鼠标拖动,把要检测的类别标注出来,然后选择类别。 点击ok后如下所示
保存 一张图片可以标注多个物体,所有物体都标注结束,Ctrl+S保存,然后D或者左边的Next Image框下张图片继续标注保存。
简单运行下面的脚本即可。
# -*- coding: utf-8 -*- # @Time : 2018/11/12 13:03 # @Author : lazerliu # @File : xml2voc.py import os import random # ==================可能需要修改的地方=====================================# g_root_path = "D:/VOCdevkit/VOC2007/" xmlfilepath = "Annotations" # 标注文件存放路径 saveBasePath = "ImageSets/Main/" # ImageSets信息生成路径 trainval_percent = 0.98 train_percent = 0.98 # ==================可能需要修改的地方=====================================# os.chdir(g_root_path) total_xml = os.listdir(xmlfilepath) num = len(total_xml) xml_list = range(num) tv = int(num * trainval_percent) tr = int(tv * train_percent) trainval = random.sample(xml_list, tv) train = random.sample(trainval, tr) print("train and val size", tv) print("train size", tr) ftrainval = open(saveBasePath + "trainval.txt", "w") ftest = open(saveBasePath + "test.txt", "w") ftrain = open(saveBasePath + "train.txt", "w") fval = open(saveBasePath + "val.txt", "w") for i in xml_list: name = total_xml[i][:-4] + "\n" if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close() ftest.close()会在ImageSets的目录下生成下面四个文件。 此时自己的数据集就算是建完了,下面就是使用此数据集进行训练了。
参考链接:Win10+Faster-RCNN-TensorFlow-Python3-master训练自己的数据 测试图像并输出mAP. 将上方自己建立的数据集VOCdevkit放到Faster-RCNN-TensorFlow-Python3-master\data目录下,此处要注意VOCdevkit的名称一定要改成VOCDevkit2007,如下
下载地址:http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz.
下载之后解压,文件重命名为vgg16.ckpt,新建文件夹imagenet_weights,把vgg16.ckpt放到imagenet_weights下,再将imagenet_weights文件夹拷贝到data文件夹下,
这样,VGG16网络模型的地址应该类似于这样:…/data/imagenet_weights/vgg16.ckpt
在Faster-RCNN-TensorFlow-Python3-master\lib\datasets\pascal_voc.py里面第36行修改自己的标注的类别,其中
'__background__'(背景)不能删除,其他的可以根据自己的类别添加或删除。此处我所训练的只有一类,故修改如下
具体可以修改的部分如下,为了演示我将最大训练批次,及每批训练量进行了更改,结果显示和保存的轮次进行了更改
在TensorFlow的虚拟环境中进入Faster-RCNN-TensorFlow-Python3-master目录下,运行train.py 下面fixed后的结果会在训练一段时间之后显示。 结果如下,训练结果被保存到了Faster-RCNN-TensorFlow-Python3-master\default\voc_2007_trainval\default
依然是参考链接:Win10+Faster-RCNN-TensorFlow-Python3-master训练自己的数据 测试图像并输出mAP.
在Faster-RCNN-TensorFlow-Python3-master目录下有个demo.py文件
修改类别,跟pascal_voc.py里的类别一致 CLASSES = ('__background__', 'gun')测试数据集改成自己的数据,并替换Faster-RCNN-TensorFlow-Python3-master\data\demo中的图像文件,图像文件的名字与修改后的文件名要一致
将
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',), 'res101': ('res101_faster_rcnn_iter_110000.ckpt',)} DATASETS = {'pascal_voc': ('voc_2007_trainval',), 'pascal_voc_0712': ('voc_2007_trainval+voc_2012_trainval',)}改为
NETS = {'vgg16': ('vgg16.ckpt',), 'res101': ('res101_faster_rcnn_iter_110000.ckpt',)} DATASETS = {'pascal_voc': ('voc_2007_trainval',), 'pascal_voc_0712': ('voc_2007_trainval',)} 新建Faster-RCNN-TensorFlow-Python3-master\output\vgg16\voc_2007_trainval\default目录,将Faster-RCNN-TensorFlow-Python3-master\default\voc_2007_trainval\default下的这四个文件复制到output\vgg16\voc_2007_trainval\default中,最下方的四个文件是最新生成的模型文件 并改名为 将104行代码中的default='res101’改为default=‘vgg16’运行demo.py 结果显示如下: 因为训练次数较少,故测试结果并不理想,不过到此就可以跑通了。