【学术研究】多任务联合训练
多任务联合训练是什么
这个是华为的需求,手机端需要一个轻量的人体分析的模块,他们之前的训练方式是一个一个任务分开训的,固定相应权重,虽然也能满足业务需求,但比较低效,所以希望我们出一个联合训练的解决方案,并且认为能够利用任务的共性达到更好的训练效果。
华为的需求,手机端需要一个轻量模型做人体分析,项目一期是做了densepose,mask的联合,其实也不算真正的联合,因为没有端到端,因为只是在训head,我们把既有mask和densepose标注的coco GT抠出来了训head,最后再接上检测器,这是之前刷densepose比赛的经验,会比较好,但其实uv的精度会比单独训练低一个点左右,二期我们又在这个基础上加上了keypoint(人体关键点) parsing(人体部位分割),同时真正做到端到端,将检测也加入训练。
这个项目的难点有两个:
1.各任务loss差距较大,训练不稳定,容易loss爆炸
2.如何更好的利用数据标注,因为不同任务可利用标注不同,如果取交集,样本会急剧下降,而且我们的parsing还是不同的数据集,如果使用交集,怎么处理一个任务存在空标注时,他的head该怎样继续优化。
3.如何分配loss保证精度不降低,同时怎么利用联合训练再涨一下点
具体模型:
一期是以mobilenetv3做的
二期是以dla的backbone做的,因为它的结构更利于检测
加入loss配比和过采样,目前是达到了部分精度提升明显,部分下降的效果,
mask >= hier > keypoint > densepose == parsing
mask,parsing,densepose会涨,keypoints,hier会掉点
但还没有做到所有精度提升的效果。后续讨论是打算用无监督继续做head这块的优化,因为目前还是比较暴力,直接不反传。因为看分类的一些工作感觉无监督这块做的比较好了,会超过有监督的精度。
数据集的问题
哪些任务会涨?
mask,parsing,densepose 会涨
keypoints,hier 会降低
尝试
- 辅助网络,把mask贴回原图加一个简单的二分类分支
- 自动化loss
- 无/自监督
为什么会涨?
box,mask 几乎不变
parsing,densepose都是像素级别的预测
parsing,densepose数据标注比较少之前的1x迭代次数比较少,有更多任务监督,主干网络对于人体特征预测更加好
keypoint降权精度降低
keypoint pretrain 找回
loss这块并集具体怎么处理?
- 同一数量级并没有涨
- mask : parsing : keypoint : densepose = 1:2:0.5:1
每个任务的loss是哪些?
cls: cross_entropy 处理多分类
parsing: cross_entropy 处理多分类
keypoint: cross_entropy 处理多分类 把位置当成类别
densepose: cross_entropy算I分块损失 / smooth_l1_loss算uv坐标损失 处理多分类
box:smooth_l1_loss
mask: binary_cross_entropy_with_logits 处理二分类
hier: fcos focal loss / iou loss
最终的精度?
部分涨部分不涨,训练编码器