本文记录在实现Faster-rcnn训练自己数据集的过程,以及计算map。数据集为kaggle地铁安检违禁品X光射线图片。运行环境:win10,1660Ti,keras2.1.5,tensorflow:1.13.1
1.训练
内容来自博客https://blog.csdn.net/weixin_44791964/article/details/104451667,使用代码为该博主原创,进行一定修改使用到自己数据集上并进行实现。
源码:https://github.com/bubbliiiing/faster-rcnn-keras
实现过程:原理部分上面博客已经讲得很清楚了,下面为训练过程
1.1制作VOC数据集
其中Annotations存放标定的xml文件,JPEGImages存放xml对应图片,Main文件夹开始为空,在VOC2007同级目录新建test.py生成四个txt文件。
下面为test.py,运行后会在Main生成四个txt文件。
import os
import random
trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = './VOC2007/Annotations'
txtsavepath = './VOC2007/ImageSets/Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('./VOC2007/ImageSets/Main/trainval.txt', 'w')
ftest = open('./VOC2007/ImageSets/Main/test.txt', 'w')
ftrain = open('./VOC2007/ImageSets/Main/train.txt', 'w')
fval = open('./VOC2007/ImageSets/Main/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
至此,VOC数据集准备完毕。
1.2准备工作
训练前需要生成训练需要的txt格式文件。运行voc_annotation.py。需要修改classes,改成自己数据集类别。
import xml.etree.ElementTree as ET
from os import getcwd
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
wd = getcwd()
classes = ["dahuoji", "daoju", "dian", "heidingzi", "jiandao"]
def convert_annotation(year, image_id, list_file):
in_file = open('VOC%s/Annotations/%s.xml'%(year, image_id))
tree=ET.parse(in_file)
root = tree.getroot()
if root.find('object')==None:
return
list_file.write('VOC%s/JPEGImages/%s.jpg'%(year, image_id))
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int