2019百度之星之各种踩坑
收藏
快速回复
2019百度之星之各种踩坑
收藏
快速回复

各位参赛的小伙伴们,你们模型都训好了吗?都用的什么呀?现在都多少分了呀?带着这几天踩坑经历,挥泪记录一下(踩坑过程中多谢另一位参赛者的帮助和交流,帮助我少走了不少弯路,这里暂不透露该参赛者姓名)

1. SSD分支?YoloV3分支?还是PaddleDetection?

    我前几天写过一个关于到底用PaddleDetection里面哪个框架的帖子。然而,在真正搞起来之后,我才发现我真的是太naive了...首先PaddleDetection封装的过于复杂,不利于改动,初学者看的话真的是一头雾水;这时SSD和YoloV3的分支显得友好许多,至少很多东西修改起来得心应手,没有那么多封装。由于YoloV3模型较大,所以...最终我还是选择了官方推荐的SSD。而且baseline_model用的也是SSD,大家可以用这个分支验证一下。

2. 竟然全是SSD的预处理?难怪官方推荐SSD

   有一定经验的小伙伴一定会很快就发现,测评工具score.py里面的数据预处理默认就是SSD的那一套,300x300,均值127.5。所以,使用其他框架的小伙伴一定要注意,预处理要一致,否则本地验证一时爽,先上测评....我就不多说了。

3. COCO到底有多少类?91 or 81?

   如果你使用PaddleDetection,你会发现它和score.py一样,都是81类:80类目标和1类背景。但是如果你用SSD这个分支,会发现,怎么是91类呢?这不对啊。解释如下:COCO除去背景确实有90类,但是这90类分为了两个level,其中80类相当于子类,就是我们经常训练的,另外10类为父类,是包含那80类的。所以在使用SSD分支时,一定要在reader那里将10个父类去掉,否则结果会不正确的。具体修改方法可以参见:https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/PaddleDetection/ppdet/data/source/coco_loader.py

4. 训练好的模型怎么在score中无法加载呢?_model_ 这个文件在哪里?

   如果你将train完的model直接丢进score中,一定会报错的,这是因为train保存的是vars,而我们最终要提交的模型是inference,而且也只有在inference中才会有_model_这个文件。所以呢,写个脚本,把模型load进来,再存成inference。

5. 模型能加载了,可视为什么结果不对呀?或者计算score时出错?

   这个问题就更有意思了,不论使用PaddleDetection、SSD、还是YOLO,直接存成inference都不行,为什么呢?详见本次比赛提交格式说明:【模型的输出包含bbox、score和background_label】等等等,然后思考一下如何来存inference吧。

6. 想自己搞点新模型怎么办?

   很多期待拿好成绩的参赛者都会想要复现一些最近比较好的模型,这是在所难免的,但同时带来的问题就是,预训练模型没有怎么办。这几天我测了两个模型(模型保密,哈哈),预训练是我自己在imagenet上做的,top1在0.65-0.68左右。同样使用两块1070Ti显卡,在coco2017上同样训练30epochs,有预训练的模型map达到了0.15,而没有预训练的只有0.13多点。从这个角度简单看一下,如果真要想自己搞点事情,最好还是在imagenet上训一波,然后再拿过来训练检测网络比较好。

7. 量化训练

   关于使用compressor进行量化训练的问题,官方提供了demo【https://aistudio.baidu.com/aistudio/projectdetail/86232】,小伙伴们可以去参考一下。不过在我使用量化脚本训练时,我并没有使用compressor,而是使用了量化的low api,这样做主要是能够更加方便的调试,也可以更加直观的把控训练情况。PS. 有小伙伴说量化训练训着训着就nan的事儿,我确实也遇到过,而且概率还不低,这个情况是谁的锅现在还无法确定。

8. 剪枝训练

   相比于量化的巨大收益,剪枝也是不甘示弱的。我这里使用的是compressor进行的剪枝训练,我设定了0.4的剪枝比例,成功地将madds降低了40%,这一点paddle做的还是不错的。不过剪枝训练加保存模型这里有很多的坑,小伙伴们可要注意了。继续说剪枝,我使用剪枝训练了15个epochs,map降低了0.014,madds降低了40%,其实最终计算,整体收益并不是很大。也许再多训一些可能会提升吧,也有可能剪枝对于检测网来说没有backbone那样稳定,who knows。

9. 蒸馏训练

  蒸馏训练在这里应该是非常的难了(至少我研究了好久),而且配置起来也相当的复杂,代码改动量也是相当的大,这里先不描述了。。。等我有了效果再来更新。

【踩坑未完,待续......】

 

10
收藏
回复
全部评论(38)
时间顺序
学学没完
#2 回复于2019-07

赞一个

0
回复
l
liguanghui2588
#3 回复于2019-07

这还有技术坑

0
回复
r
rose20135188
#4 回复于2019-07

看看都是些啥坑

0
回复
w
wangwei8638
#5 回复于2019-07

任重而道远

0
回复
A
AIStudio785837
#6 回复于2019-07

模型训练也有坑

0
回复
A
AIStudio783002
#7 回复于2019-07

期待避坑指南

0
回复
Seigato
#8 回复于2019-07
期待避坑指南

等我踩得差不多了再写一篇

0
回复
Seigato
#9 回复于2019-07
模型训练也有坑

大体上还好,细节上事儿还挺多的

0
回复
w
wangwei8638
#10 回复于2019-07
Seigato #9
大体上还好,细节上事儿还挺多的

请教一下官方提供的基线只能做测评吗?训练、测试、验证要自己写?

0
回复
大手拉小手0123
#11 回复于2019-07

增加了不少经验

0
回复
Seigato
#12 回复于2019-07
请教一下官方提供的基线只能做测评吗?训练、测试、验证要自己写?

官方基线模型是基于SSD的,可以作为预训练模型直接加载进去继续训练。也可以拿来做测评。

0
回复
w
wangwei8638
#13 回复于2019-07
Seigato #12
官方基线模型是基于SSD的,可以作为预训练模型直接加载进去继续训练。也可以拿来做测评。

在本机训练,还是AI平台呢,感觉都很慢

0
回复
何必固執丶
#14 回复于2019-07

这个真的需要一步一步的走,错过一部就跟不上了

0
回复
r
rose20135188
#15 回复于2019-07

等大家把坑填好了再认真学习一遍。

0
回复
Seigato
#16 回复于2019-07
在本机训练,还是AI平台呢,感觉都很慢

我在本机跑的,方便调试,后期考虑到aistudio上同步训练

0
回复
Seigato
#17 回复于2019-07
这个真的需要一步一步的走,错过一部就跟不上了

任重而道远。。。

0
回复
w
wangwei8638
#18 回复于2019-07
Seigato #16
我在本机跑的,方便调试,后期考虑到aistudio上同步训练

这个方法也好

0
回复
一方通行
#19 回复于2019-08

求教保存inference的api中,`fluid.io.save_inference_model`里面`feeded_var_names`和`target_vars`这两个参数应该如何设置~

0
回复
w
wangwei8638
#20 回复于2019-08
Seigato #12
官方基线模型是基于SSD的,可以作为预训练模型直接加载进去继续训练。也可以拿来做测评。

感谢,顶起

0
回复
小青年CAI
#21 回复于2019-08
求教保存inference的api中,`fluid.io.save_inference_model`里面`feeded_var_names`和`target_vars`这两个参数应该如何设置~

请问你解决这个问题了么,我也遇到了同样的问题

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户