ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

运行SOLOV2 心酸经历,实战帖

2021-10-06 11:06:28  阅读:462  来源: 互联网

标签:实战 num 代码 py precision 修改 心酸 classes SOLOV2


运行SOLOV2 心酸经历,实战帖

SOLO v2作为单阶段实例分割新秀,在COCO数据集上的表现要优于Mask Rcnn(单从作者论文结果来看)。但是,最近在用SOLO v2跑自己的ssdd数据集时,却发现这位作者的代码,可真是一步一个坑。这里把自己填了的,没填的,都分享一下。

官方代码

https://github.com/WXinlong/SOLO

基于mmdetection,那应该配置环境很简单,可是我发现第一步作者就给你埋了一个大坑。

作者install里介绍需要使用torch<=1.4 ,可是他在最近的一次更新都适配为torch1.5了。但是!使用torch1.5你依然会遇到奇奇怪怪的问题,这里就不列举了,我试了1.6,1.4,1.1都会有填不完的坑。

所以,按照作者最后一次更新,我又把代码改回去了,主要是把torchcheck改成atcheck,这里需要修改32处,大家可以去官方修改记录里改回去。
废话不多,修改完后,我使用如下的配置,终于能让代码跑起来了:

这里注意config里的num classes,又埋坑了。mask head中的num classes和我们理解的类别不一样,所以保持原来的256即可,整个config只需要修改一处num classes,等于你的类别数加一,这里划重点,后面要考。

按照上面的处理刚能跑起来,问题又来了,loss_ins不下降!!!!一直保持==3,我惊了,学习率使用的就是默认的0.01。经过多次修改学习率,我发现0.005还可以,loss终于下降了,在epoch=9和12的时候,学习率分别降低为10分之1。

最后的最后,loss定格在了0.3左右,ap比cascade,yolact低了20多个点,这明显是出bug了。疯狂查询后,我以为获得了救命稻草——“Grids”超参数。在一个github的issue中,有人通过增大grids数目,成功提升了15个点,但是经过我的多次修改,证明不能说提升轻微,只能说毫无卵用

如果各位大哥,知道为啥ap这么低,还望指点一波

SOLOv2 mmdetectionv2.3

在issue里,我找到了SOLOv2 在mmdetectionv2.3上的一个实现代码,这个安装没啥坑,按照官方安装即可,config配置很容易,但是AP出来都是0,或者-1,累了。不推荐使用

Detectron2框架

第一次见,宛如天人,我立刻关闭了mmdetection的界面
就在昨天晚上,找到了solov2基于detectron2的实现,总想着这下应该能实现了,开干
配置环境很简单,无脑操作,接下来是数据集配置
这里推荐两篇
第一篇这篇文章里数据集制作说的很清楚。制作好coco数据集后,直接修改train_net.py。完全没有必要按照第二篇新建一个训练.py
第二篇修改train net,按照这篇文章里新建的那个train文件来修改,缺啥补啥。
在这个代码中,开头部分有一个CLASS_NAMES =[“AA”],那么这里需不需要加“background”呢?通过试验,我是加上了。
重点来了,还记官方代码那部分说的num classes吗,类别数加1吗?这里通过实验同样需要,我看那两篇文章评论区居然有人说不需要?believe me

如果报错:
(1)

[Errno 2] No such file or directory: '/content/drive/MyDrive/AdelaiDet/datasets/coco/val2017/000001'

那么
"/usr/local/lib/python3.7/dist-packages/detectron2/data/dataset_mapper.py"125行,加个’.jpg’
(2)

"/usr/local/lib/python3.7/dist-packages/detectron2/evaluation/coco_evaluation.py", line 332
assert len(class_names) == precisions.shape[2]

那么用这段来代替332以及下面的数行

       assert len(class_names) - 1 == precisions.shape[2]
       results_per_category = []     
       precision = precisions[:, :, 0, 0, -1]
       precision = precision[precision > -1]
       ap = np.mean(precision) if precision.size else float("nan")
       name='ship'
       results_per_category.append(("{}".format(name), float(ap * 100)))

标签:实战,num,代码,py,precision,修改,心酸,classes,SOLOV2
来源: https://blog.csdn.net/weixin_43345668/article/details/118019621

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有