目标检测“Focal Loss for Dense Object Detection”

基于RCNN的两步检测器精度高,但速度慢,单步检测器如YOLO,SSD速度快,但精度有所降低。作者认为正负样本不平衡是导致单步检测器精度降低的主要愿意,论文对交叉熵损失函数进行改进,降低易分类样本的权值,即Focal loss,使用RetinaNet验证Focal loss。RetinaNet可以超过两步检测器的精度,且速度跟单步检测器差不多。

Focal Loss是动态缩放的交叉熵损失函数,随着正确类的置信度上升缩放因子下降,如下图所示:

损失函数为:

当样本分错时,pt很小,调节因子接近1,损失函数不受影响。当样本很容易分时,pt很大,因子趋于0,这样易分样本的权值下降了。参数γ决定了权值下降的速率,文中选取γ=2

RetinaNet网络结构,特征提取部分采用FPN,Anchors的分配类似RPN,改进后用于多类检测,FPN后有分类子网络和box回归子网络:

实验结果

相关推荐:

如何使用Python中的Isolation Forest算法实现生产环境的异常检测?

IsolationForest在生产环境不适合直接用于高吞吐、低延迟的实时流式场景,因其为无监督批处理算法,需完整训练集且无法在线更新模型,实际应采用周期性离线打分或结合轻量代理模型实现近实时响应。 IsolationForest在生产环境是否适合实时异常检测? 不适合直接用于高吞吐、低延迟的实时流...

如何判断Python对象是否为可调用对象_使用callable函数检测

callable()检查对象是否实现__call__或属可调用类型,返回True仅表示语法上可加括号,不保证调用成功;类本身可调用,其实例需定义__call__才可调用,lambda、函数、内置函数等均返回True,但参数错误或运行时异常仍会导致调用失败。 callable函数的基本行为和常见误判 ...

Python中如何检测异步循环的卡顿情况_使用aiomonitor实时监控事件循环

aiomonitor能发现事件循环卡顿是因为它定期采样事件循环时间与任务栈快照,识别出“某任务运行超阈值(默认1s)”的异常状态,不依赖代码埋点,而是从运行时底层观测;普通日志仅记录主动写入的点,无法捕获静默发生的调度停滞。 为什么aiomonitor能发现事件循环卡顿,而普通日志不行 因为卡顿本质...

如何检测Python类是否定义了某个方法_使用hasattr判断callable

hasattr仅能判断属性是否存在,无法区分方法与普通属性;可靠检测可调用方法需三步:hasattr检查存在性、getattr获取值、callable核验可调用性。 hasattr能判断方法是否存在,但不能区分方法和普通属性 直接用hasattr(obj,"method_name")只能告诉你这个名...

怎么在Python TensorFlow中实现Focal Loss_通过继承Loss类解决

直接继承tf.keras.losses.Loss最稳妥,因其能完整控制前向计算图、确保梯度正确回传、支持sample_weight及分布式训练;需重写call方法,统一y_true为one-hot,动态计算pt,并将alpha、gamma作为可训练参数参与梯度计算。 为什么直接继承tf.keras....