Faster RCNN之数据准备

  • 数据介绍

Pascal Voc数据集是目前目标检测及分割中常用的数据集, 共包含20个类别。Voc数据集的目录结构如下。

Annotations: 存放了图片的标注信息,以xml文件形式保存。

ImageSets:
    a. 子文件夹Action存放了各种人的动作的数据集。
    b. 子文件夹Layout存放了人体不同部位的数据集。
    c. 子文件夹Main存放了物体分类的的数据集。
    d. 子文件夹Segmentation存放了物体分割的的数据集。
    
JPEGImages: 存放了jpg格式的图片文件。

SegmentationClass: 存放了按照类别分割的图片。

SegmentObject: 存放了按物体分割的图片。

在目标检测任务中,只需要ImageSets/Main、Annotations和JPEGImages即可。
Faster RCNN之数据准备_第1张图片

标注文件格式如下:

`
VOC2012
// 对应的图片文件名
2007_000063.jpg

    The VOC2007 Database
    PASCAL VOC2007
    flickr


// 图片宽度
    500
// 图片高度
    375
// 图片深度(通道数)
    3

1

// 物体类别
    dog
// 拍摄角度
    Unspecified
// 是否被截断,0表示未截断
    0
// 检测难度,0表示容易
    0
// 物体边框坐标(x_min, y_min, x_max, y_max)
    
        123
        115
        379
        275
    


    chair
    Frontal
    1
    0
    
        75
        1
        428
        375
    
`
  • 数据集创建

    构建数据集的代码如下

from torch.utils.data import Dataset
import torch as t
import os
import xml.etree.ElementTree as ET
import numpy as np
from config.config import VOC_BBOX_LABEL_NAMES


class VocDatasets(Dataset):
    def __init__(self, data_dir, labels_name=VOC_BBOX_LABEL_NAMES, split='trainval'):
        super(VocDatasets, self).__init__()
        id_list_file = os.path.join(
            data_dir, f'ImageSets/Main/{split}.txt')
        self.ids = [id_.strip() for id_ in open(id_list_file)]
        self.data_dir = data_dir
        self.label_names = labels_name
        
     def __len__(self):
        return len(self.ids)
        
        
     def __getitem__(self, idx):
        id_ = self.ids[idx]
        anno = ET.parse(
            os.path.join(self.data_dir, 'Annotations', id_ + '.xml'))
            
        bbox, label = [], []
        for obj in anno.findall('object'):

            bndbox_anno = obj.find('bndbox')
            bbox.append([
                int(bndbox_anno.find(tag).text) - 1
                for tag in ('ymin', 'xmin', 'ymax', 'xmax')])
            name = obj.find('name').text.lower().strip()
            
            label.append(VOC_BBOX_LABEL_NAMES.index(name))
        bbox = np.stack(bbox).astype(np.float32)
        label = np.stack(label).astype(np.int32)

        img_file = os.path.join(self.data_dir, 'JPEGImages', id_ + '.jpg')
        
        # 读取影像
        img = read_image(img_file, color=True)
        
        # 数据增强
        # 数据预处理, 缩放到统一尺寸
        img, bbox = preprocess(img, bbox, min_size=600, max_size=1000)

        #  随机水平翻转
        img, bbox = random_flip(img, bbox)

        return img, bbox, label
        

你可能感兴趣的:(神经网络,pytorch,目标检测)