训练自己的数据集
1.建立VOC数据集
参考链接:从零开始制作自己的Pascal VOC数据集.
上述参考链接中有标注工具labelimg的下载。
(1)建立数据集文件结构
建立如下格式的文件结构(仿照标准VOC数据集,先构建框架如下图所示的数据集框架)
(2)JPEGImages
- 首先找图片,数据集中占比最大最优先的是图像。可以手动从网上另存为,也可以用爬虫去爬,或者其他手段。待准备好一堆图片之后
- resize:
在实际的应用中,这个数据集肯定是自己项目里面拍摄的。
首先,拍摄的图片可能分辨率太大,不利于训练,通过一顿操作把他们差不多缩小到跟voc数据集里的图片差不多大小。通过以下代码实现:
# coding=utf-8
import os # 打开文件时需要
from PIL import Image
import re
Start_path = 'D:/1Aqilei/photos/' # 你的图片目录
width_max = 375 # 图片最大宽度
depth_max = 500 # 图片最大高度
list = os.listdir(Start_path)
# print list
count = 0
for pic in list:
path = Start_path + pic
print(path)
im = Image.open(path)
w, h = im.size
print (w,h)
#如果图片分辨率超过这个值,进行图片的等比例压缩
if w > width_max:
print(pic)
print("图片名称为" + pic + "图片被修改")
h_new = width_max * h // w
w_new = width_max
count = count + 1
out = im.resize((w_new, h_new), Image.ANTIALIAS)
new_pic = re.sub(pic[:-4], pic[:-4] , pic)
# print new_pic
new_path = Start_path + new_pic
out.save(new_path)
if h > depth_max:
print(pic)
print("图片名称为" + pic + "图片被修改")
w_new = depth_max * w // h
h_new = depth_max
count = count + 1
out = im.resize((w_new, h_new), Image.ANTIALIAS)
new_pic = re.sub(pic[:-4], pic[:-4] , pic)
# print new_pic
new_path = Start_path + new_pic
out.save(new_path)
print('END')
count = str(count)
print("共有" + count + "张图片尺寸被修改")
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, "%06d.jpg" % img_cnt)
cv.imwrite(img_name, img)
img_cnt += 1
- 最后将已经预处理并重新命名的图片全部存放到JPEGImages目录下。
(3)Annotations
此文件夹放的是xml标注文件。
使用labelimg将JPEGImages的图片进行标注并生成xml,生成的xml要保存在Annotations目录下。
具体操作如下:
-
点击左侧第二个 Open Dir按钮,选择刚才生成好的图片目录JPEGImages。
选择好打开的图片路径后会自动显示图片 -
更改xml文件保存的路径
-
标注
在英文输入法模式下,按下W,就可以选择标注区域了,用鼠标拖动,把要检测的类别标注出来,然后选择类别。
点击ok后如下所示
-
保存
一张图片可以标注多个物体,所有物体都标注结束,Ctrl+S保存,然后D或者左边的Next Image框下张图片继续标注保存。
(4)ImageSets
简单运行下面的脚本即可。
# -*- 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的目录下生成下面四个文件。
此时自己的数据集就算是建完了,下面就是使用此数据集进行训练了。
2.训练数据集
参考链接:Win10+Faster-RCNN-TensorFlow-Python3-master训练自己的数据 测试图像并输出mAP.
将上方自己建立的数据集VOCdevkit放到Faster-RCNN-TensorFlow-Python3-master\data目录下,此处要注意VOCdevkit的名称一定要改成VOCDevkit2007,如下
(1)下载预训练的VGG16网络模型
下载地址: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
(2)修改pascal_voc.py
在Faster-RCNN-TensorFlow-Python3-master\lib\datasets\pascal_voc.py里面第36行修改自己的标注的类别,其中
'__background__'(背景)不能删除,其他的可以根据自己的类别添加或删除。
此处我所训练的只有一类,故修改如下
(3)修改config.py
具体可以修改的部分如下,为了演示我将最大训练批次,及每批训练量进行了更改,结果显示和保存的轮次进行了更改
(4)运行train.py
在TensorFlow的虚拟环境中进入Faster-RCNN-TensorFlow-Python3-master目录下,运行train.py
下面fixed后的结果会在训练一段时间之后显示。
结果如下,训练结果被保存到了Faster-RCNN-TensorFlow-Python3-master\default\voc_2007_trainval\default
3.测试数据集
依然是参考链接:Win10+Faster-RCNN-TensorFlow-Python3-master训练自己的数据 测试图像并输出mAP.
修改demo.py
在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
结果显示如下:
因为训练次数较少,故测试结果并不理想,不过到此就可以跑通了。