参考链接:从零开始制作自己的Pascal VOC数据集.
上述参考链接中有标注工具labelimg的下载。
建立如下格式的文件结构(仿照标准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
此文件夹放的是xml标注文件。
使用labelimg将JPEGImages的图片进行标注并生成xml,生成的xml要保存在Annotations目录下。
具体操作如下:
点击左侧第二个 Open Dir按钮,选择刚才生成好的图片目录JPEGImages。
选择好打开的图片路径后会自动显示图片
标注
在英文输入法模式下,按下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文件
CLASSES = ('__background__',
'gun')
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',)}