Faster R-CNN代码学习(一)——datasets模块

本文详细介绍了Faster R-CNN的datasets模块,包括imdb.py、pascal_voc.py和factory.py三个核心文件。内容涉及数据集的创建、加载,以及针对VOC数据集的特定实现。文章还提到了数据集的翻转扩增、recall指标评估和ROI处理等关键方法,并解释了如何根据配置文件生成数据集路径和加载标注信息。
摘要由CSDN通过智能技术生成

Faster R-CNN代码学习(一)——datasets模块

源代码:https://github.com/smallcorgi/Faster-RCNN_TF

datasets模块在lib文件夹下,负责的是对数据集的操作,包含数据集对象的创建、载入过程,这一部分在训练自己的数据集时需要重点修改。

datasets模块主要包含3个py文件,分别为所有数据集类的父类imdb.py;根据数据集特有创建的以VOC为例,pascal_voc.py;用于迅速创建数据集对象的factory.py


下面依次进行介绍。

imdb.py

  1. imdb为所有数据集的父类,因此包含了所有数据集共有的属性。
class imdb(object, name):
  def __init__(self, name)
	self._name = name
    self._classes = []
    self._num_classes = []
    self._image_index = []
    self._roidb = None
    self._roidb_handler = self.default_roidb # 是一个指针,指向不同的roi生成函数
    self.config = {
   }

对于每一个数据集,其共有的属性都包含数据集名称name、数据集里有的类classes、数据集的图片样本image_index、数据集中的roi集合以及相关的设置config。

  1. 由于这些是私有属性,那么需要通过装饰器property将其取出,因此下面代码的主要内容为get这些属性。
	@property
    def name(self):
        return self._name

    @property
    def classes(self):
        return self._classes

    @property
    def num_classes(self):
        return len(self._classes)

    @property
    def image_index(self):
        return self._image_index

    @property
    def num_images(self):
        return len(self.image_index)

    @property
    def roidb_handler(self):
        return self._roidb_handler

    @roidb_handler.setter
    def roidb_handler(self, val):
        self._roidb_handler = val

    @property
    def roidb(self):
        # 如果已经有了,那么直接返回,没有就通过指针指向的函数生成
        if self._roidb is not None:
            return self._roidb
        self._roidb = self.roidb_handler()
        return self._roidb
    
	# cache_path用来生成roidb缓存文件的文件夹,用来存储数据集的roi
    @property
    def cache_path(self):
        cache_path = osp.abspath(osp.join(cfg.DATA_DIR, 'cache'))
        if not osp.exists(cache_path):
            os.makedirs(cache_path)
        return cache_path
  1. 部分方法需要依靠具体的数据集及相应路径来制定,因此仅声明接口:
    def default_roidb(self):
        raise NotImplementedError
    def image_path_at(self):
        raise NotImplementedError
  1. 数据集的共有方法:数据翻转扩增、recall指标评估、通过提供的Box_list创建roidb
    # 在数据扩增前需要获取每张图片的width,这里引入了python通用的图片处理扩展包PIL
    def _get_width(self):
        return [PIL.Image.open(self.image_path_at(i)).size[0]
                for i in range(self.num_images)]
	# 这里对所有的图片进行数据扩增,这部分roidb的属性仅改变了相应x坐标及flipped
    def append_flipped_images(self):
        num_images = self.num_images
        widths = self._get_width()
        for i in range(num_images):
            boxes = self.roidb[i].boxes.copy()
            oldx1 = boxes[:, 0].copy()
            oldx2 = boxes[:, 2].copy()
            boxes[:, 0] = widths[i] - oldx2 - 1
            boxes[:, 2] = widths[i] - oldx1 - 1
            assert (boxes[:, 2] >= boxes[:, 0]).all()
            entry = {
   'boxes': boxes,
                     'gt_overlaps': self.roidb[i]['gt_overlaps'],
                     'gt_classes': self.roidb[i]['gt_classes'],
                     'flipped': True}
            self.roidb.append(entry)
        self._image_index = self._image_index * 2

recall指标评估是根据候选框来确定候选框的recall值

    def evaluate_racall(self, candidate_boxes=None, thresholds=None,
                        area='
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值