1 Star 0 Fork 50

watcheras / PaddleX

forked from PaddlePaddle / PaddleX 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
detection.md 4.98 KB
一键复制 编辑 原始数据 按行查看 历史
FlyingQianMM 提交于 2022-05-17 04:41 . add add_negative_samples in docs

目标检测PascalVOC

目录

数据格式

在PaddleX中,目标检测支持PascalVOC数据集格式。

数据文件夹结构

数据集按照如下方式进行组织,原图均放在同一目录,如JPEGImages,标注的同名xml文件均放在同一目录,如Annotations,示例如下:

MyDataset/ # 目标检测数据集根目录
|--JPEGImages/ # 原图文件所在目录
|  |--1.jpg
|  |--2.jpg
|  |--...
|  |--...
|
|--Annotations/ # 标注文件所在目录
|  |--1.xml
|  |--2.xml
|  |--...
|  |--...

训练集、验证集列表和类别标签列表

为了用于训练,我们需要在MyDataset目录下准备train_list.txt, val_list.txtlabels.txt三个文件,分别用于表示训练集列表,验证集列表和类别标签列表。点击下载目标检测示例数据集查看具体的数据格式。

  • labels.txt

labels.txt用于列出所有类别,类别对应行号表示模型训练过程中类别的id(行号从0开始计数),例如labels.txt为以下内容

dog
cat
snake

表示该检测数据集中共有3个目标类别,分别为dogcatsnake,在模型训练中dog对应的类别id为0, cat对应1,以此类推

  • train_list.txt

train_list.txt列出用于训练时的图片集合,与其对应的标注文件,示例如下

JPEGImages/1.jpg Annotations/1.xml
JPEGImages/2.jpg Annotations/2.xml
... ...

其中第一列为原图相对MyDataset的相对路径,第二列为标注文件相对MyDataset的相对路径

  • val_list.txt

val_list列出用于验证时的图片集成,与其对应的标注文件,格式与val_list.txt一致

数据集加载

训练过程中,PaddleX加载数据集的示例代码如下:

import paddlex as pdx
from paddlex import transforms as T

train_transforms = T.Compose([
    T.RandomResizeByShort(
        short_sizes=[640, 672, 704, 736, 768, 800],
        max_size=1333,
        interp='CUBIC'),
    T.RandomHorizontalFlip(),
    T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

eval_transforms = T.Compose([
    T.ResizeByShort(
        short_size=800, max_size=1333, interp='CUBIC'),
    T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])


train_dataset = pdx.datasets.VOCDetection(
                        data_dir='./MyDataset',
                        file_list='./MyDataset/train_list.txt',
                        label_list='./MyDataset/labels.txt',
                        transforms=train_transforms)
eval_dataset = pdx.datasets.VOCDetection(
                        data_dir='./MyDataset',
                        file_list='./MyDataset/val_list.txt',
                        label_list='MyDataset/labels.txt',
                        transforms=eval_transforms)

添加负样本

检测任务支持添加负样本进行训练以降低误检率,代码示例如下:

import paddlex as pdx
from paddlex import transforms as T

train_transforms = T.Compose([
    T.RandomResizeByShort(
        short_sizes=[640, 672, 704, 736, 768, 800],
        max_size=1333,
        interp='CUBIC'),
    T.RandomHorizontalFlip(),
    T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 情况一:train_list中已经包含负样本
# 要求每个负样本都有对应的标注文件,标注文件里没有标注框数据
train_dataset = pdx.datasets.VOCDetection(
                        data_dir='./MyDataset',
                        file_list='./MyDataset/train_list.txt',
                        label_list='./MyDataset/labels.txt',
                        transforms=train_transforms,
                        allow_empty=True,   # 是否加载负样本
                        empty_ratio=1.)   # 用于指定负样本占总样本数的比例。如果小于0或大于等于1,则保留全部的负样本。默认为1。

# 情况二:train_list中仅包含正样本,负样本在单独的路径下
# 不要求负样本有标注文件
train_dataset = pdx.datasets.VOCDetection(
                        data_dir='./MyDataset',
                        file_list='./MyDataset/train_list.txt',
                        label_list='./MyDataset/labels.txt',
                        transforms=train_transforms)
train_dataset.add_negative_samples(
                        image_dir='path/to/negative/images',   # 背景图片所在的文件夹目录。
                        empty_ratio=1)   # 用于指定负样本占总样本数的比例。如果为None,保留数据集初始化是设置的`empty_ratio`值,
                                         # 否则更新原有`empty_ratio`值。如果小于0或大于等于1,则保留全部的负样本。默认为1。
Python
1
https://gitee.com/watcheras/PaddleX.git
git@gitee.com:watcheras/PaddleX.git
watcheras
PaddleX
PaddleX
develop

搜索帮助