Faster-Rcnn训练自己数据集+计算MAP

本文详细介绍了如何使用Faster R-CNN在Windows环境下训练地铁安检违禁品的X光射线图片数据集,并计算平均精度(MAP)。首先,按照VOC数据集格式整理数据,接着配置训练所需文件并进行训练,训练完成后测试模型性能。最后,通过特定步骤计算MAP,结果显示相比YOLOv3,Faster R-CNN在本任务上的表现更优。
摘要由CSDN通过智能技术生成

本文记录在实现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
  • 2
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值