VOC2012数据集存在各个类别不均衡的问题,类别数量差异达到几十倍
采用交叉熵损失函数中我发现对于个别类别准确率很高(比如 人),但是对于个别类别几乎没有预测对
原因就在于类别不平衡
所以可以考虑采用Focal loss来训练(或者说带权交叉熵损失函数)
多分类问题的Focal loss 的权重设置为 (1-class_weight)^γ
class_weight为各个类别的占比,γ一般取值为2
我做了一个统计,得到如下结果
[0.7411024 , 0.0060736 , 0.00261201, 0.00764303, 0.00474575,
0.00584511, 0.01414542, 0.01146254, 0.02120255, 0.00761459,
0.00811121, 0.00983031, 0.01601857, 0.00837859, 0.00916765,
0.04059725, 0.00475492, 0.00702608, 0.01034372, 0.0126314 ,
0.00669593, 0.04399667]
可以看到除去背景外,各个类别差异是比较大的
γ取2,那么Focal loss中的权重设置就因该为
{0: 0.0670279711484909,
1: 0.9878897070884705,
2: 0.9947828054428101,
3: 0.9847723245620728,
4: 0.9905310869216919,
5: 0.9883438944816589,
6: 0.97190922498703,
7: 0.9772062301635742,
8: 0.9580444097518921,
9: 0.984828770160675,
10: 0.9838433265686035,
11: 0.9804360270500183,
12: 0.9682194590568542,
13: 0.9833130836486816,
14: 0.9817487001419067,
15: 0.9204536080360413,
16: 0.9905127882957458,
17: 0.985997200012207,
18: 0.9794195294380188,
19: 0.9748967289924622,
20: 0.9866529703140259,
21: 0.9139423370361328}
其中各个标号对应的标签分别为
{0: 'background',
1: 'aeroplane',
2: 'bicycle',
3: 'bird',
4: 'boat',
5: 'bottle',
6: 'bus',
7: 'car',
8: 'cat',
9: 'chair',
10: 'cow',
11: 'diningtable',
12: 'dog',
13: 'horse',
14: 'motorbike',
15: 'person',
16: 'pottedplant',
17: 'sheep',
18: 'sofa',
19: 'train',
20: 'tvmonitor',
21: 'edge'}
原类别中并不存在’edge’,但在数据集中确实存在(数值为255)
故当作一个单独的类别进行处理
但是VOC2012的扩展数据集SBD从并不总存在,使用SBD的时候应该删掉边缘部分