其他分享
首页 > 其他分享> > 运行SOLOV2 心酸经历,实战帖

运行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