Selaa lähdekoodia

add background training in docs

FlyingQianMM 5 vuotta sitten
vanhempi
commit
a6479370bd
3 muutettua tiedostoa jossa 138 lisäystä ja 2 poistoa
  1. 33 2
      docs/apis/datasets/detection.md
  2. 1 0
      docs/index.rst
  3. 104 0
      docs/tuning_strategy.md

+ 33 - 2
docs/apis/datasets/detection.md

@@ -8,7 +8,7 @@ paddlex.datasets.VOCDetection(data_dir, file_list, label_list, transforms=None,
 
 > 仅用于**目标检测**。读取PascalVOC格式的检测数据集,并对样本进行相应的处理。PascalVOC数据集格式的介绍可查看文档:[数据集格式说明](../datasets.md)  
 
-> 示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/detection/yolov3_mobilenetv1.py#L29)
+> 示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/detection/yolov3_darknet53.py#L29)
 
 > **参数**
 
@@ -21,6 +21,16 @@ paddlex.datasets.VOCDetection(data_dir, file_list, label_list, transforms=None,
 > > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。  
 > > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。  
 
+> 【可选】支持在训练过程中加入无目标真值的背景图片来减少背景误检,定义VOCDetection类后调用其成员函数`append_backgrounds`添加背景图片即可:
+> ```
+> append_backgrounds(image_dir)
+> ```
+> > 示例:[代码](../../tuning_strategy.html#id2)
+
+> > **参数**
+
+> > > * **image_dir** (str): 背景图片所在的目录路径。 
+
 ## CocoDetection类
 
 ```
@@ -41,6 +51,16 @@ paddlex.datasets.CocoDetection(data_dir, ann_file, transforms=None, num_workers=
 > > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。  
 > > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。  
 
+> 【可选】支持在训练过程中加入无目标真值的背景图片来减少背景误检,定义CocoDetection类后调用其成员函数`append_backgrounds`添加背景图片即可:
+> ```
+> append_backgrounds(image_dir)
+> ```
+> > 示例:[代码](../../tuning_strategy.html#id2)
+
+> > **参数**
+
+> > > * **image_dir** (str): 背景图片所在的目录路径。 
+
 ## EasyDataDet类
 
 ```
@@ -59,5 +79,16 @@ paddlex.datasets.EasyDataDet(data_dir, file_list, label_list, transforms=None, n
 > > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。
 > > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。  
 > > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。  
-> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。  
+> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。
+
+
+> 【可选】支持在训练过程中加入无目标真值的背景图片来减少背景误检,定义EasyDataDet类后调用其成员函数`append_backgrounds`添加背景图片即可:
+> ```
+> append_backgrounds(image_dir)
+> ```
+> > 示例:[代码](../../tuning_strategy.html#id2)
+
+> > **参数**
+
+> > > * **image_dir** (str): 背景图片所在的目录路径。 
 

+ 1 - 0
docs/index.rst

@@ -26,6 +26,7 @@ PaddleX是基于飞桨核心框架、开发套件和工具组件的深度学习
    cv_solutions.md
    apis/index.rst
    paddlex_gui/index.rst
+   tuning_strategy.md
    update.md
    FAQ.md
    appendix/index.rst

+ 104 - 0
docs/tuning_strategy.md

@@ -0,0 +1,104 @@
+# PaddleX调优策略介绍
+
+## 目标检测
+
+### 空背景训练
+
+在背景和目标相似的场景下,模型容易把背景误检成目标,此时可以采用空背景训练策略降低误检率,即在训练过程中把无目标真值的图片加入训练。接下来以X光违禁品检测为例,说明空背景训练策略对减少误检的有效性。
+
+X光违禁品数据集介绍:
+
+> * 检测铁壳打火机、黑钉打火机 、刀具、电源和电池、剪刀5种违禁品。
+
+> * 训练集有883张违禁品图片,验证集有98张违禁品图片。
+
+> * 无违禁品的X光图片有2540张。
+
+
+**(1) 基准模型**
+
+使用FasterRCNN-ResNet50作为检测模型,除了水平翻转外没有使用其他的数据增强方式,只使用违禁品训练集进行训练。模型在违禁品验证集上的精度见表1,mmAP有45.8%,mAP达到83%。
+
+表1 基准模型和空背景训练后的模型在违禁品验证集上**框级别精度**对比
+
+||mmAP(AP@IoU=0.5:0.95)| mAP (AP@IoU=0.5)|
+|:---|:---|:---|
+|基准模型 | 45.8% | 83% |
+|空背景训练后的模型 | 49.4% | 83.1% |
+
+
+**(2) 空背景训练后的模型**
+
+把无违禁品的X光图片按1:1分成无违禁品训练集和无违禁品验证集。我们将基准模型在无违禁品验证集进行测试,发现图片级别的误检率高达55.27%。为了降低该误检率,将基准模型在无违禁品训练集进行测试,挑选出被误检图片共663张,将这663张图片加入训练,训练参数配置与基准模型训练时一致。
+
+空背景训练后的模型在违禁品验证集上的精度见表1,mmAP有49.4%,mAP达到83.1%。与基准模型相比,**mmAP有3.6%的提升,mAP有0.1%的提升**。空背景训练后的模型在无违禁品验证集的误检率仅有5.58%,与基准模型相比,**误检率降低了49.68%**。
+
+此外,还测试了两个模型在有违禁品验证集上图片级别的召回率,见表2,与基准模型相比,空背景训练后的模型仅漏检了1张图片,召回率几乎是无损的。
+
+表2 基准模型和空背景训练后的模型在违禁品验证集上**图片级别的召回率**、无违禁品上**图片级别的误检率**对比
+
+||违禁品图片级别的召回率| 无违禁品图片级别的误检率|
+|:---|:--------------------|:------------------------|
+|基准模型 | 98.97% | 55.27% |
+|空背景训练后的模型 | 97.75% | 5.59% |
+
+
+【解释】图片级别的召回率:只要在有目标的图片上检测出目标(不论框的个数),该图片被认为召回。批量有目标图片中被召回图片所占的比例,即为图片级别的召回率。
+
+【解释】图片级别的误检率:只要在无目标的图片上检测出目标(不论框的个数),该图片被认为误检。批量无目标图片中被误检图片所占的比例,即为图片级别的误检率。
+
+
+空背景训练代码示例:
+
+```
+import os
+os.environ['CUDA_VISIBLE_DEVICES'] = '0'
+from paddlex.det import transforms
+import paddlex as pdx
+
+# 定义训练和验证时的transforms
+train_transforms = transforms.Compose([
+    transforms.RandomHorizontalFlip(),
+    transforms.Normalize(),
+    transforms.ResizeByShort(short_size=600, max_size=1000),
+    transforms.Padding(coarsest_stride=32)
+])
+eval_transforms = transforms.Compose([
+    transforms.Normalize(),
+    transforms.ResizeByShort(short_size=600, max_size=1000),
+    transforms.Padding(coarsest_stride=32),
+])
+
+# 定义训练所用的数据集
+train_dataset = pdx.datasets.CocoDetection(
+    data_dir='jinnan2_round1_train_20190305/restricted/',
+    ann_file='jinnan2_round1_train_20190305/train.json',
+    transforms=train_transforms,
+    shuffle=True,
+    num_workers=2)
+# 训练集中加入无目标背景图片
+train_dataset.append_backgrounds('jinnan2_round1_train_20190305/normal_train_back/')
+
+# 定义验证所用的数据集
+eval_dataset = pdx.datasets.CocoDetection(
+    data_dir='jinnan2_round1_train_20190305/restricted/',
+    ann_file='jinnan2_round1_train_20190305/val.json',
+    transforms=eval_transforms,
+    num_workers=2)
+
+# 初始化模型,并进行训练
+model = pdx.det.FasterRCNN(num_classes=len(train_dataset.labels) + 1)
+model.train(
+    num_epochs=17,
+    train_dataset=train_dataset,
+    eval_dataset=eval_dataset,
+    train_batch_size=8,
+    learning_rate=0.01,
+    lr_decay_epochs=[13, 16])
+```
+
+## 实例分割
+
+### 空背景训练
+
+实例分割中空背景训练使用方式与目标检测一致,请参考目标检测空背景训练代码示例。