读取voc中的数据集路径修改_Fast RCNN 训练自己数据集 (2修改数据读取接口)

本文介绍了如何修改Fast RCNN训练数据集的读取接口,以适应自己的数据格式。主要修改了`datasets/pascal_voc.py`文件中的初始化、图像路径获取、图像列表加载等函数,简化了数据访问流程。同时,修改了`factory.py`以适应新的数据集。数据集格式包括背景和车辆两类,存储为txt文件,注意坐标格式的重要性。
摘要由CSDN通过智能技术生成

Fast RCNN训练自己的数据集 (2修改读写接口)

这里楼主讲解了如何修改Fast RCNN训练自己的数据集,首先请确保你已经安装好了Fast RCNN的环境,具体的编配编制操作请参考我的上一篇文章。首先可以看到fast rcnn的工程目录下有个Lib目录

这里下面存在3个目录分别是:

datasets

fast_rcnn

roi_data_layer

utils

在这里修改读写数据的接口主要是datasets目录下,fast_rcnn下面主要存放的是python的训练和测试脚本,以及训练的配置文件,roi_data_layer下面存放的主要是一些ROI处理操作,utils下面存放的是一些通用操作比如非极大值nms,以及计算bounding box的重叠率等常用功能

1.构建自己的IMDB子类

1.1文件概述

可有看到datasets目录下主要有三个文件,分别是

factory.py

imdb.py

pascal_voc.py

factory.py 学过设计模式的应该知道这是个工厂类,用类生成imdb类并且返回数据库共网络训练和测试使用

imdb.py 这里是数据库读写类的基类,分装了许多db的操作,但是具体的一些文件读写需要继承继续读写

pascal_voc.py Ross在这里用pascal_voc.py这个类来操作

1.2 读取文件函数分析

接下来我来介绍一下pasca_voc.py这个文件,我们主要是基于这个文件进行修改,里面有几个重要的函数需要修改

def init(self, image_set, year, devkit_path=None)

这个是初始化函数,它对应着的是pascal_voc的数据集访问格式,其实我们将其接口修改的更简单一点

def image_path_at(self, i)

根据第i个图像样本返回其对应的path,其调用了image_path_from_index(self, index)作为其具体实现

def image_path_from_index(self, index)

实现了 image_path的具体功能

def _load_image_set_index(self)

加载了样本的list文件

def _get_default_path(self)

获得数据集地址

def gt_roidb(self)

读取并返回ground_truth的db

def selective_search_roidb

读取并返回ROI的db

def _load_selective_search_roidb(self, gt_roidb)

加载预选框的文件

def selective_search_IJCV_roidb(self)

在这里调用读取Ground_truth和ROI db并将db合并

def _load_selective_search_IJCV_roidb(self, gt_roidb)

这里是专门读取作者在IJCV上用的dataset

def _load_pascal_annotation(self, index)

这个函数是读取gt的具体实现

def _write_voc_results_file(self, all_boxes)

voc的检测结果写入到文件

def _do_matlab_eval(self, comp_id, output_dir='output')

根据matlab的evluation接口来做结果的分析

def evaluate_detections

其调用了_do_matlab_eval

def competition_mode

设置competitoin_mode,加了一些噪点

1.3训练数据集格式

在我的检测任务里,我主要是从道路卡口数据中检测车,因此我这里只有background 和car两类物体,为了操作方便,我不像pascal_voc数据集里面一样每个图像用一个xml来标注多类,先说一下我的数据格式

这里是所有样本的图像列表

我的GroundTruth数据的格式,第一个为图像路径,之后1代表目标物的个数, 后面的坐标代表左上右下的坐标,坐标的位置从1开始

这里我要特别提醒一下大家,一定要注意坐标格式,一定要注意坐标格式,一定要注意坐标格式,重要的事情说三遍!!!,要不然你会范很多错误都会是因为坐标不一致引起的报错

1.4修改读取接口

这里是原始的pascal_voc的init函数,在这里,由于我们自己的数据集往往比voc的数据集要更简单的一些,在作者额代码里面用了很多的路径拼接,我们不用去迎合他的格式,将这些操作简单化即可,在这里我会一一列举每个我修改过的函数。这里按照文件中的顺序排列。

原始初始化函数:

def __init__(self, image_set, year, devkit_path=None):

datasets.imdb.__init__(self, 'voc_' + year + '_' + image_set)

self._year = year

self._image_set = image_set

self._devkit_path = self._get_default_path() if devkit_path is None \

else devkit_path

self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)

self._classes = ('__background__', # always index 0

'aeroplane', 'bicycle', 'bird', 'boat',

'bottle', 'bus', 'car', 'cat', 'chair',

'cow', 'diningtable', 'dog', 'horse',

'motorbike', 'person', 'pottedplant',

'sheep', 'sofa', 'train', 'tvmonitor')

self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes)))

self._image_ext = '.jpg'

self._image_index = self._load_image_set_index()

# Default to roidb handler

self._roidb_handler = self.selective_search_roidb

# PASCAL specific config options

self.config = {'cleanup' : True,

'use_salt' : True,

'top_k' : 2000}

assert os.path.exists(self._devkit_path), \

'VOCdevkit path does not exist: {}'.format(self._devkit_path)

assert os.path.exists(self._data_path), \

'Path does not exist: {}'.format(self._data_path)

修改后的初始化函数:

def __init__(self, image_set, devkit_path=None):

datasets.imdb.__init__(self, image_set)#imageset 为train test

self._image_set = image_set

self._devkit_path = devkit_path

self._data_path = os.path.join(self._devkit_path)

self._classes = ('__background__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值