【目标检测算法实现系列】Keras实现Faster R-CNN算法(一)

本文详细介绍了如何在Keras中实现Faster R-CNN目标检测算法的数据准备工作,包括VOC数据集解析、数据增强和RPN网络训练数据的构造。通过VOC数据集的解析,对图像进行随机翻转和旋转等增强操作,为RPN网络生成训练数据,包括计算IOU、构造 anchors 和预处理标签。同时,文章指出在训练时,只有一部分anchor参与,且回归层的Y值通道数因正样本筛选而增加。
摘要由CSDN通过智能技术生成

之前,我们介绍了Fatser R-CNN模型,在接下来的几篇文章,将通过Keras框架来完整实现Fatser R-CNN模型。数据集我们采用经典的VOC数据集。

这篇文章我们主要看下相关数据的准备工作,具体流程如下:

一、VOC数据集解析

VOC数据集的下载,,因为官网下载太慢,文章末尾处有提供百度网盘下载

下载解压后的文件目录如下:

对于目标检测任务,只需要用到Annotations,ImageSets,JPEGImages这三个目录。

1. Annotations:存放相关标注信息,每一张图片对应一个xml文件,具体xml内容如下:

<annotation>
  <folder>VOC2012</folder>
  <filename>2007_000033.jpg</filename>
  <source>
    <database>The VOC2007 Database</database>
    <annotation>PASCAL VOC2007</annotation>
    <image>flickr</image>
  </source>
  <size>
    <width>500</width>
    <height>366</height>
    <depth>3</depth>
  </size>
  <segmented>1</segmented>
  <object>
    <name>aeroplane</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>9</xmin>
      <ymin>107</ymin>
      <xmax>499</xmax>
      <ymax>263</ymax>
    </bndbox>
  </object>
  <object>
    <name>aeroplane</name>
    <pose>Left</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>421</xmin>
      <ymin>200</ymin>
      <xmax>482</xmax>
      <ymax>226</ymax>
    </bndbox>
  </object>
</annotation>

2. ImageSets:我们只会用到ImageSets\Main下train.txt , val.txt, test.txt这三个文件,里面存储对应训练集,验证集,测试集的图片名称,文件格式如下:

 

3. JPEGImages:存储所有的图片数据

我们需要将下载来的VOC数据集解析成如下格式

具体代码实现如下

import os
import xml.etree.ElementTree as ET
from tqdm import tqdm
import pprint


def get_data(input_path):
    '''

    :param input_path:  voc数据目录
    :return:
      image_data:解析后的数据集 list列表
      classes_count:一个字典数据结构,key为对应类别名称,value对应为类别所对应的样本(标注框)个数
      classes_mapping:一个字典数据结构,key为对应类别名称,value为对应类别的一个标识index
    '''
    image_data = []
    classes_count = {}  #一个字典,key为对应类别名称,value对应为类别所对应的样本(标注框)个数
    classes_mapping = {} #一个字典数据结构,key为对应类别名称,value为对应类别的一个标识index

    data_paths = os.path.join(input_path, "VOC2012")
    print(data_paths)

    annota_path = os.path.join(data_paths, "Annotations")  # 数据标注目录
    imgs_path = os.path.join(data_paths, "JPEGImages")  # 图片目录

    imgsets_path_train = os.path.join(data_paths, 'ImageSets', 'Main', 'train.txt')
    imgsets_path_val = os.path.join(data_paths, 'ImageSets', 'Main', 'val.txt')
    imgsets_path_test = os.path.join(data_paths, 'ImageSets', 'Main', 'test.txt')
    train_files = []  # 训练集图片名称集合
    val_files = []  # 验证集图片名称集合
    test_files = []  # 测试集图片名称集合

    with open(imgsets_path_train) as f:
        for line in f:
            # strip() 默认去掉字符串头尾的空格和换行符
            train_files.append(line.strip() + '.jpg')

    with open(imgsets_path_val) as f:
        for line in f:
            val_files.append(line.strip() + '.jpg')

    # test-set not included in pascal VOC 2012
    if os.path.isfile(imgsets_path_test):
        with open(imgsets_path_test) as f:
            for line in f:
                test_files.append(line.strip() + '.jpg')

    # 获得所有的标注文件路径,保存到annota_path_list列表中
    annota_path_list = [os.path.join(annota_path, s) for s in os.listdir(annota_path)]
    index = 0

    # Tqdm 是一个快速,可扩展的Python进度条,
    # 可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator)
    annota_path_list = tqdm(annota_path_list)

    for annota_path in annota_path_list:
        exist_flag = False
        index += 1
        annota_path_list.set_description("Processing %s" % annota_path.split(os.sep)[-1])

        # 开始解析对应xml数据标注文件
        et = ET.parse(annota_path)
        element = et.getroot()
        element_objs = element.findall("object")  # 获取所有的object子元素
        element_filename = element.find("filename").text  # 对应图片名称
        element_width = int(element.find("size").find("width").text)  # 对应图片尺寸
        element_height = int(element.find("size").find("height").text)  # 对应图片尺寸

        if (len(element_objs) > 0):
            annotation_data = {"filepath": os.path.join(imgs_path, element_filename),
                               "width": element_width,
                               "height": element_height,
                               "image_id": index,
                               "bboxes": []}  # bboxes 用来存放对应标注框的相关位置
        if element_filename in train_files:
            annotation_data["imageset"] = "train"
            exist_flag = True
        if element_filename in val_files:
            annotation_data["imageset"] = "val"
            exist_flag = True
        if len(test_files) > 0:
            if element_filename in test_files:
                annotation_data["imageset"] = "test"
                exist_flag = True

        if not exist_flag:
            continue

        for element_obj in element_objs:  # 遍历一个xml标注文件中的所有标注框
  
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
# 工程内容 这个程序是基于tensorflow的tflearn库实现部分RCNN功能。 # 开发环境 windows10 + python3.5 + tensorflow1.2 + tflearn + cv2 + scikit-learn # 数据集 采用17flowers据集, 官网下载:http://www.robots.ox.ac.uk/~vgg/data/flowers/17/ # 程序说明 1、setup.py---初始化路径 2、config.py---配置 3、tools.py---进度条和显示带框图像工具 4、train_alexnet.py---大数据集预训练Alexnet网络,140个epoch左右,bitch_size为64 5、preprocessing_RCNN.py---图像的处理(选择性搜索、数据存取等) 6、selectivesearch.py---选择性搜索源码 7、fine_tune_RCNN.py---小数据集微调Alexnet 8、RCNN_output.py---训练SVM并测试RCNN(测试的时候测试图片选择第7、16类中没有参与训练的,单朵的花效果好,因为训练用的都是单朵的) # 文件说明 1、train_list.txt---预训练数据,数据在17flowers文件夹中 2、fine_tune_list.txt---微调数据2flowers文件夹中 3、1.png---直接用选择性搜索的区域划分 4、2.png---通过RCNN后的区域划分 # 程序问题 1、由于数据集小的原因,在微调时候并没有像论文一样按一个bitch32个正样本,128个负样本输入,感觉正样本过少; 2、还没有懂最后是怎么给区域打分的,所有非极大值抑制集合canny算子没有进行,待续; 3、对选择的区域是直接进行缩放的; 4、由于数据集合论文采用不一样,但是微调和训练SVM时采用的IOU阈值一样,有待调参。
Keras实现Faster R-CNN旋转目标检测算法可以按以下步骤进行: 1. 数据预处理:将训练数据转换为网络需要的格式,包括图片大小的调整、数据增强等等。 2. 构建模型:搭建Faster R-CNN网络模型,包括特征提取层、RPN层、ROI Pooling层、分类和回归层等。 3. 编译模型:设置模型的优化器、损失函数等参数。 4. 训练模型:对构建好的模型进行训练,并保存训练好的权重。 5. 模型评估:使用测试数据对训练好的模型进行评估,计算模型的精度、召回率等指标。 以下是一个基于Keras实现Faster R-CNN旋转目标检测算法的示例代码: ``` # 数据预处理 # TODO: 数据预处理代码 # 构建模型 input_shape = (None, None, 3) img_input = Input(shape=input_shape) shared_layers = nn.nn_base(img_input, trainable=True) # RPN网络 num_anchors = len(config.RPN_ANCHOR_RATIOS) * len(config.ANGLE_BINS) rpn = nn.rpn(shared_layers, num_anchors) # ROI Pooling层 roi_input = Input(shape=(config.TRAIN_ROIS_PER_IMAGE, 5)) roi_pooling = PyramidROIAlign([config.POOL_SIZE, config.POOL_SIZE], name="roi_align")([shared_layers, roi_input]) # 分类和回归层 x = TimeDistributed(Flatten(name='flatten'))(roi_pooling) x = TimeDistributed(Dense(4096, activation='relu', name='fc1'))(x) x = TimeDistributed(Dropout(0.5))(x) x = TimeDistributed(Dense(4096, activation='relu', name='fc2'))(x) x = TimeDistributed(Dropout(0.5))(x) # 分类和回归输出 cls_output = TimeDistributed(Dense(config.NUM_CLASSES, activation='softmax', kernel_initializer='zero'), name='dense_class_{}'.format(config.NUM_CLASSES))(x) angle_output = TimeDistributed(Dense(num_anchors * config.NUM_ANGLES, activation='linear', kernel_initializer='zero'), name='dense_angle_{}'.format(num_anchors * config.NUM_ANGLES))(x) bbox_output = TimeDistributed(Dense(num_anchors * 4, activation='linear', kernel_initializer='zero'), name='dense_regress_{}'.format(4))(x) # 编译模型 model = Model([img_input, roi_input], [cls_output, angle_output, bbox_output]) model.compile(optimizer=Adam(lr=config.LEARNING_RATE), loss=[losses.class_loss(), losses.angle_loss(), losses.rpn_regress_loss(config.NUM_ANCHORS)]) # 训练模型 # TODO: 训练模型代码 # 模型评估 # TODO: 模型评估代码 ``` 需要注意的是,在实现旋转目标检测时,需要对RoI Pooling和NMS等部分进行修改,以支持旋转矩形的处理。具体实现可以参考上述项目中的代码和论文《R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detection》。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值