对于每一个网络,相当于一个桶,总有样本效果比较好,有的样本比较差,多用效果差的样本进行训练,那提高了整个网络的短板,总体的效果也会有提升。

一、
难例挖掘是指,针对模型训练过程中导致损失值很大的一些样本(使模型很大概率分类错误的样本),重新训练它们。
维护一个错误分类样本池, 把每个batch训练数据中的出错率很大的样本放入该样本池中,当积累到一个batch以后,将这些样本放回网络重新训练。

二、

有2种难例挖掘技术,一种是用于优化SVM的。通过一个working-set,训练一个收敛于该working-set的SVM,然后使用该SVM,将一些easy的sample剔除(这些sample通常是远离SVM分类边界的),增加hard
example到working-set中(这些hard-example是超出模型边界的错误分类样本)。注意,working-set只是整个训练集的一个子集。

另一种是用于优化non-SVM的。如被应用于浅层神经网络,boosted decision
tree等,这种方法首先开始训练模型,训练的数据集开始是由所有的positive example和随机的negative
samples组成的,训练出来一个模型后,将该模型应用于一个更大的数据集,将model检测错误的样本(false
positives)添加到训练集中再继续训练。不断迭代训练。但是论文中提到这个过程通常只迭代一次,且没有收敛的迹象。

总结:
CNN目标检测类的文章中,hard negative
mining一般是,有正负样本,然后分类器分出来一些分错的负样本(容易将负样本看成正样本的那些样本),即假阳性(false
positive),也就是说在对负样本分类时候,loss比较大(label与prediction相差较大)的那些样本,这些就是hard
negative/困难样本。
hard negative mining就是多找一些hard negative加入负样本集,重新进行训练,这样会比easy
negative(例如roi里没有物体,全是背景,这时候分类器很容易正确分类成背景,这个就叫easy
negative;如果roi里有二分之一个物体,标签仍是负样本,这时候分类器就容易把他看成正样本,这时候就是hard
negative)组成的负样本集效果更好。主要体现在虚警率更低一些(也就是false positive少)。

如何判断困难负样本呢?先用初始样本集(即第一帧随机选择的正负样本)去训练网络,再用训练好的网络去预测负样本集中剩余的负样本,选择其中得分最高,即最容易被判断为正样本的负样本为困难样本,加入负样本集中,重新训练网络,循环往复。


已有的方法大多是基于loss来确定是否是hard的,参考https://blog.csdn.net/u013608402/article/details/51275486文中的方法是,用两个网络,一个只用来前向传播,另一个则根据选择的ROI进行反向传播。

类似的实现在https://blog.csdn.net/jiyangsb/article/details/77802941这篇文章中有implementation
details也是一样的。

同时解决正负样本不平衡以及区分简单与复杂样本的问题的focal
loss参考https://blog.csdn.net/LeeWanzhi/article/details/80069592
伪代码参考:https://blog.csdn.net/lanchunhui/article/details/71194703
<https://blog.csdn.net/lanchunhui/article/details/71194703>

下一步进一步搞清楚focal loss和这个在线难例挖掘的联系和差别,然后开始实现。