Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleX
提交
58d93fa4
P
PaddleX
项目概览
PaddlePaddle
/
PaddleX
通知
138
Star
4
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
43
列表
看板
标记
里程碑
合并请求
5
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleX
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
43
Issue
43
列表
看板
标记
里程碑
合并请求
5
合并请求
5
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
58d93fa4
编写于
6月 04, 2020
作者:
F
FlyingQianMM
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rm tuning_strategy.md
上级
1a8bcad4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
112 addition
and
3 deletion
+112
-3
docs/tuning_strategy/detection/negatives_training.md
docs/tuning_strategy/detection/negatives_training.md
+108
-0
paddlex/cv/datasets/voc.py
paddlex/cv/datasets/voc.py
+4
-3
未找到文件。
docs/tuning_strategy.md
→
docs/tuning_strategy
/detection/negatives_training
.md
浏览文件 @
58d93fa4
#
PaddleX调优策略介绍
#
通过负样本学习降低误检率
##
目标检测
##
应用场景
### 空背景训练
在背景和目标相似的场景下,模型容易把背景误检成目标。为了降低误检率,可以通过负样本学习来降低误检率,即在训练过程中把无目标真值的图片加入训练。
在背景和目标相似的场景下,模型容易把背景误检成目标,此时可以采用空背景训练策略降低误检率,即在训练过程中把无目标真值的图片加入训练。接下来以X光违禁品检测为例,说明空背景训练策略对减少误检的有效性。
## 效果对比
X光违禁品数据集介绍:
*
与基准模型相比,通过负样本学习后的模型
**mmAP有3.6%的提升,mAP有0.1%的提升**
。
*
与基准模型相比,通过负样本学习后的模型在背景图片上的图片级别
**误检率降低了49.68%**
。
*
与基准模型相比,通过负样本学习后的模型在目标图片上的图片级别
**召回率仅降低了1.22%**
。
> * 检测铁壳打火机、黑钉打火机 、刀具、电源和电池、剪刀5种违禁品。
> * 训练集有883张违禁品图片,验证集有98张违禁品图片。
> * 无违禁品的X光图片有2540张。
**(1) 基准模型**
使用FasterRCNN-ResNet50作为检测模型,除了水平翻转外没有使用其他的数据增强方式,只使用违禁品训练集进行训练。模型在违禁品验证集上的精度见表1,mmAP有45.8%,mAP达到83%。
表1 基准模型和空背景训练后的模型在违禁品验证集上
**框级别精度**
对比
表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张图片,召回率几乎是无损的。
|通过负样本学习后的模型 | 49.4% | 83.1% |
表2
基准模型和空背景训练后的模型在违禁品验证集上
**图片级别的召回率**
、无违禁品
上
**图片级别的误检率**
对比
表2
违禁品验证集上
**图片级别的召回率**
、无违禁品验证集
上
**图片级别的误检率**
对比
||违禁品图片级别的召回率| 无违禁品图片级别的误检率|
|:---|:--------------------|:------------------------|
|基准模型 | 98.97% | 55.27% |
|
空背景训练
后的模型 | 97.75% | 5.59% |
|
通过负样本学习
后的模型 | 97.75% | 5.59% |
【名词解释】
【解释】
图片级别的召回率:只要在有目标的图片上检测出目标(不论框的个数),该图片被认为召回。批量有目标图片中被召回图片所占的比例,即为图片级别的召回率。
*
图片级别的召回率:只要在有目标的图片上检测出目标(不论框的个数),该图片被认为召回。批量有目标图片中被召回图片所占的比例,即为图片级别的召回率。
【解释】
图片级别的误检率:只要在无目标的图片上检测出目标(不论框的个数),该图片被认为误检。批量无目标图片中被误检图片所占的比例,即为图片级别的误检率。
*
图片级别的误检率:只要在无目标的图片上检测出目标(不论框的个数),该图片被认为误检。批量无目标图片中被误检图片所占的比例,即为图片级别的误检率。
空背景训练代码示例:
## 使用方法
在定义训练所用的数据集之后,使用数据集类的成员函数
`add_negative_samples`
将无目标真值的背景图片所在路径传入给训练集。代码示例如下:
```
import
os
...
...
@@ -77,7 +62,7 @@ train_dataset = pdx.datasets.CocoDetection(
shuffle
=
True
,
num_workers
=
2
)
#
训练集中加入无目标背景图片
train_dataset
.
a
ppend_background
s
(
'jinnan2_round1_train_20190305/normal_train_back/'
)
train_dataset
.
a
dd_negative_sample
s
(
'jinnan2_round1_train_20190305/normal_train_back/'
)
#
定义验证所用的数据集
eval_dataset
=
pdx
.
datasets
.
CocoDetection
(
...
...
@@ -94,11 +79,30 @@ model.train(
eval_dataset
=
eval_dataset
,
train_batch_size
=
8
,
learning_rate
=
0.01
,
lr_decay_epochs
=[
13
,
16
])
lr_decay_epochs
=[
13
,
16
],
save_dir
=
'./output'
)
```
## 实例分割
## 实验细则
(1) 数据集
我们使用X光违禁品数据集对通过负样本学习降低误检率的策略有效性进行了实验验证。该数据集中背景比较繁杂,很多背景物体与目标物体较为相似。
*
检测铁壳打火机、黑钉打火机 、刀具、电源和电池、剪刀5种违禁品。
*
训练集有883张违禁品图片,验证集有98张违禁品图片。
*
无违禁品的X光图片有2540张。
(2) 基准模型
使用FasterRCNN-ResNet50作为检测模型,除了水平翻转外没有使用其他的数据增强方式,只使用违禁品训练集进行训练。模型在违禁品验证集上的精度见表1,mmAP有45.8%,mAP达到83%。
(3) 通过负样本学习后的模型
把无违禁品的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张图片,召回率几乎是无损的
。
paddlex/cv/datasets/voc.py
浏览文件 @
58d93fa4
...
...
@@ -171,10 +171,11 @@ class VOCDetection(Dataset):
self
.
coco_gt
.
dataset
=
annotations
self
.
coco_gt
.
createIndex
()
def
a
ppend_background
s
(
self
,
image_dir
):
def
a
dd_negative_sample
s
(
self
,
image_dir
):
import
cv2
if
not
osp
.
exists
(
image_dir
):
raise
Exception
(
"{} background images directory does not exist."
.
format
(
image_dir
))
raise
Exception
(
"{} background images directory does not exist."
.
format
(
image_dir
))
image_list
=
os
.
listdir
(
image_dir
)
max_img_id
=
max
(
self
.
coco_gt
.
getImgIds
())
for
image
in
image_list
:
...
...
@@ -187,7 +188,7 @@ class VOCDetection(Dataset):
is_crowd
=
np
.
array
([[
0
]],
dtype
=
np
.
int32
)
difficult
=
np
.
zeros
((
1
,
1
),
dtype
=
np
.
int32
)
gt_poly
=
[[[
0
,
0
,
0
,
1e-05
,
1e-05
,
1e-05
,
1e-05
,
0
]]]
max_img_id
+=
1
im_fname
=
osp
.
join
(
image_dir
,
image
)
img_data
=
cv2
.
imread
(
im_fname
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录