热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mmdetection(1):FCOS代码解析

原文我就不贴了,说一下感受吧!从检测方法出来,自我感觉一直不协调,现有的方法如fast系列一直比较复杂,强大的

原文我就不贴了,说一下感受吧!

从检测方法出来,自我感觉一直不协调,现有的方法如fast系列一直比较复杂,强大的神经网络应该是简单高效的,one-stage从yolo出来后感觉好了很多,但是在最后的map上做roi anchor一直感觉特别冗余,还好corner出来了,但其也存在的问题,不同的pool结构,还有总感觉这种方式怪怪的。然后FCOS出来了,完全感受到了高效和简单,在此膜拜一下大神,感觉神经网络就应该这样,以最简单的方式,取得很好的效果。

FCOS: Fully Convolutional One-Stage Object Detection

简单介绍一下,方法很简单,好文。
在这里插入图片描述

看到上图了吗,没错,就是这么粗暴,像素级的预测t,l,r,b,当然,上面存在着一个问题,就是一个点包含两个框,怎么搞,当然选小的了,不不不,FPN啊:

在这里插入图片描述

稍微解释一下最后的框框,x4是4层卷积,class分类,距离中心的loss,回归,
在这里插入图片描述
然后是中心度的定义,二进制交叉熵做loss。
在这里插入图片描述

ok,讲完了, 简单吧,粗暴吧,开始实现吧!


更新:
非常好用个点FCOS得配点代码不是,近期研究mmdetection,感觉很好用,特来吧源码解释一下

def loss(self,cls_scores,bbox_preds,centernesses,gt_bboxes,gt_labels,img_metas,cfg,gt_bboxes_ignore=None):labels, bbox_targets = self.fcos_target(all_level_points, gt_bboxes,gt_labels) #生成labelflatten_cls_scores = [cls_score.permute(0, 2, 3, 1).reshape(-1, self.cls_out_channels)for cls_score in cls_scores]flatten_bbox_preds = [bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4)for bbox_pred in bbox_preds]flatten_centerness = [centerness.permute(0, 2, 3, 1).reshape(-1)for centerness in centernesses]flatten_cls_scores = torch.cat(flatten_cls_scores)flatten_bbox_preds = torch.cat(flatten_bbox_preds)flatten_centerness = torch.cat(flatten_centerness)flatten_labels = torch.cat(labels)flatten_bbox_targets = torch.cat(bbox_targets)loss_cls = self.loss_cls(flatten_cls_scores, flatten_labels,avg_factor=num_pos + num_imgs) # cls losspos_bbox_preds = flatten_bbox_preds[pos_inds]pos_bbox_targets = flatten_bbox_targets[pos_inds]pos_centerness = flatten_centerness[pos_inds]pos_centerness_targets = self.centerness_target(pos_bbox_targets)pos_points = flatten_points[pos_inds]pos_decoded_bbox_preds = distance2bbox(pos_points, pos_bbox_preds)pos_decoded_target_preds = distance2bbox(pos_points,pos_bbox_targets)# centerness weighted iou lossloss_bbox = self.loss_bbox(pos_decoded_bbox_preds,pos_decoded_target_preds,weight=pos_centerness_targets,avg_factor=pos_centerness_targets.sum()) #llox lossloss_centerness = self.loss_centerness(pos_centerness,pos_centerness_targets) #center loss 交叉熵lossreturn dict(loss_cls=loss_cls,loss_bbox=loss_bbox,loss_centerness=loss_centerness)

其中生成中心点啊方法,和原文一样:

def centerness_target(self, pos_bbox_targets):# only calculate pos centerness targets, otherwise there may be nanleft_right = pos_bbox_targets[:, [0, 2]]top_bottom = pos_bbox_targets[:, [1, 3]]centerness_targets = (left_right.min(dim=-1)[0] / left_right.max(dim=-1)[0]) * (top_bottom.min(dim=-1)[0] / top_bottom.max(dim=-1)[0])return torch.sqrt(centerness_targets)

具体loss参考mmdet
focalloss+IOUloss+ CEloss

bbox_head=dict(type='FCOSHead',num_classes=81,in_channels=256,stacked_convs=4,feat_channels=256,strides=[8, 16, 32, 64, 128],loss_cls=dict(type='FocalLoss',use_sigmoid=True,gamma=2.0,alpha=0.25,loss_weight=1.0),loss_bbox=dict(type='IoULoss', loss_weight=1.0),loss_centerness=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)))


推荐阅读
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
小白菜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有