如何从头训练一个一键抠图模型

1. 前言

抠图是图像编辑的基础功能之一,在抠图的基础上可以发展出很多有意思的玩法和特效。比如一键更换背景、一键任务卡通化、一键人物素描化等。正是因为这些有意思的玩法,CVPy网站上的一键抠图功能上线以来,从赞数来看,人气之高已经遥遥领先于CV派内其他高手,可见此模型的受欢迎程度。

笔者最近也是对此模型背后的U-2-Net网络很感兴趣,收集数据训练了人脸素描化模型,尽管受限于数据集,只能在人脸图片上转换成功,但自己仍然玩的不亦乐乎。不仅乐于玩模型的有意思的效果,更乐在训练模型过程中,以及遇到问题解决问题过程中,对模型理解的不断加深。

笔者最近对一键扣图模型从头训练了一遍,并在训练过程中持续测试了不同阶段模型的表现,看着模型一点点的收敛,抠图效果慢慢变好。

此处记录下训练过程以及训练的效果。也可以对后来者有一个参考。

提前说一声,模型训练很耗时!

2. 代码 & 数据 & 环境准备

2.1 代码

代码是U-2-Net的开源代码,可以从Github下载:https://github.com/NathanUA/U-2-Net。这个模型本来是做显著性检测的,但是当成一键扣图模型也很好玩。

需要注意的地方是,如果是安装的最新的Pytorch,获取loss值的时候,需要将loss.data[0] 修改为loss.data.item()

笔者在训练过程中曾尝试修改Loss函数为其他的,比如改成BCESSIM的加权(参考U-2-Net作者去年的文章BASNet),未见明显提升。也曾修改输出通道训练其他模型,暂无好玩的结果,就当是积累经验了。

2.2 数据

数据集我们就用论文中提到的DUTS数据集,已经分好了训练集和测试集。网上搜一下直接下载即可。

当然,也可以用自己的数据集,按照DUTS的格式重新组织下数据集即可。

然后在训练代码里面把数据读取部分的路径更换为自己准备的数据的路径。

2.3 机器

群里一土豪赞助了一台4卡的机器,4块 RTX 5000,每张卡16G内存。跑起来确实比单卡爽多了。

然后基于Anaconda安装训练所需的Python环境,创建虚拟环境,安装pytorch, torchvision, skimage, opencv等等,直接pip install或者conda install即可。不多说。

另外多卡的话,代码还需要有一些细微的改动,在构建模型之后,将代码:

    if torch.cuda.is_available():net.cuda()

修改为

    if torch.cuda.is_available():net.cuda()net = nn.DataParallel(net)

3. 训练与测试

3.1 模型训练

以上代码、数据、机器和运行环境都已经准备好之后,就可以开始训练了。多卡训练的命令大概长下面这样:

CUDA_VISIBLE_DEVICES=0,1,2,3 nohup python3 -u u2net_train.py > log_train.log &

然后tail命令查看日志文件log_train.log,如果看到下面这样的输出,说明跑起来了:

再用命令watch -n 1 nvidia-smi查看GPU的情况,可以看到四张卡都被充分利用起来了。

模型训练将近一周,达到了接近论文的效果。

另外,由于中间保存过多,为了节省空间,笔者删掉了太多前期模型,以下展示的前期效果是另外一次训练的前期模型的效果。

3.2 各阶段模型测试

笔者微调测试代码结构,把测试转移到了Jupyter里,这样画图看效果更加直观。

笔者测试模型的时候,每张图都会画出三个图:黑色背景的抠图结果、模型输出的Mask或称Alpha,原图。这样对比来看结果一目了然。这里每张图都展示了四个阶段模型的测试效果。显然,以下图片都不再训练集里面。

四个阶段对比着看,能更加直观地感受到模型的收敛过程。

从以下四个阶段的对比图可以看出,随着训练的进行

  • 前景逐渐变量,背景逐渐变暗,即前景收敛于1,背景收敛于0。前两幅图之间的对比最为明显。
  • 前景的轮廓从模糊到清晰细锐,轮廓处的不确定区域,越来越少。
  • 注意指缝和发梢部分的Mask的变化,细节越来越清晰。

下面这幅图请注意这个卡通人物背后背的那个是蜗牛还是啥的东西的轮廓的细化过程。以及其嘴角的一撮小胡子。这个图美中不足的是两脚之间的背景没有被识别出来。

下面这张图值得关注的应该就是其发梢的抠图细化过程、腰部的亮度变化过程。还有就是其手中的衣服了,对于要不要把一副也给抠出来,模型看起来也很纠结啊。

这个图最引人瞩目的莫过于这位美女在风中凌乱的发丝,这不是难为模型吗?说是话,如果不是看到Mask里胸前多出的东西,我都没注意到这个东西,衣服的胸结还是啥。

这大概就是训练了五天左右的效果,模型仍然在缓慢的收敛中,故事仍然在继续…

直到我实在是受不了越来越慢的收敛速度,等不及训练其他魔改的模型,终止了训练任务…

本着报喜不报忧的原则,下面再放几张测试效果还不错的图片,效果不怎么样的就不难处理献丑了

上面的抠图效果还是有待提高,比如头发等边缘处,还是可见部分背景未分离。前几天刚转发了动物抠图的新论文,边缘和毛发的抠图效果很赞。其单开一条支路专门做轮廓边缘处的抠图的思路值得参考。

不过,作者暂时开源了测试代码,并没有训练代码。我昨晚肝到十二点半,终于根据论文实现了一版训练代码,但是貌似收敛的更慢,这个优化还是慢慢来吧。

就这训练速度,想快也快不起来啊。反正就是玩,好玩就行。

如何从头训练一个一键抠图模型相关推荐

  1. pascal行人voc_在一个很小的Pascal VOC数据集上训练一个实例分割模型

    只使用1349张图像训练Mask-RCNN,有代码. 代码:https://github.com/kayoyin/tiny-inst-segmentation 介绍 计算机视觉的进步带来了许多有前途的 ...

  2. NLP:训练一个中文问答模型Ⅰ

    训练一个中文问答模型I-Step by Step   本文基于经典的NMT架构(Seq2Seq+Attention),训练了一个中文问答模型,把问题到答案之间的映射看作是问题到答案的翻译.基于Tens ...

  3. NLP:训练一个中文问答模型Ⅱ

    训练一个中文问答模型Ⅱ-Step by Step   接上一篇 中文问答模型Ⅰ基于这次仍是基于NMT架构训练,但是把Seq2Seq替换为Transformer架构,还有一点不同是,本次没有采用分词训练 ...

  4. 【实例分割yolact++】从头训练自己的yolact++模型

    目录 0.前言 1.整个流程 2.具体过程 2.1 下载Github上的项目 2.2 使用labelme打标签 2.2.1 安装labelme 2.2.2 如何标注 2.3 制作COCO格式的数据集 ...

  5. CNN之从头训练一个猫狗图片分类模型

    猫狗图片下载地址: 链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw 提取码:2xq4 说明:大概有816M大小,分为train和test,trai ...

  6. 使用transformers从头训练Bert

    比赛数据是脱敏后得数据,所以无法用网上公开得权重去finetune,于是自己从头训练一个BERT,为什么选择用transformers,因为它实在太酷了.如果不了解transformers,请看链接所 ...

  7. 用训练好的paddlepaddle模型继续训练模型和验证数据ckpt

    # 模型加载 model = hub.Module(name='ernie', task='seq-cls', num_classes=14) tokenizer = model.get_tokeni ...

  8. 【经验帖】深度学习如何训练出好的模型

    深度学习在近年来得到了广泛的应用,从图像识别.语音识别到自然语言处理等领域都有了卓越的表现.但是,要训练出一个高效准确的深度学习模型并不容易.不仅需要有高质量的数据.合适的模型和足够的计算资源,还需要 ...

  9. 深度学习如何训练出好的模型

    深度学习在近年来得到了广泛的应用,从图像识别.语音识别到自然语言处理等领域都有了卓越的表现.但是,要训练出一个高效准确的深度学习模型并不容易.不仅需要有高质量的数据.合适的模型和足够的计算资源,还需要 ...

最新文章

  1. 推送提交到另一个分支
  2. 正则表达式调用“或”变量
  3. h264.265裸流和音频(ALAW或PCM)封装为mp4
  4. const_iterator简单介绍
  5. css3优惠卷上方锯齿_css3怎么实现锯齿边框?
  6. day33 java的多线程(5)
  7. C语言实现文件类型统计程序,C语言实现文件类型统计函数
  8. Windows Server 2008 R2 install Visual Studio 2015 failed
  9. 飞机大战游戏微信小程序源码
  10. 【ubantu18.04 有线网络驱动安装 r8215-9.007.01】
  11. 如何管理网络营销渠道冲突?
  12. 计算机领域顶级会议列表
  13. Be For Web
  14. 服务降级,限流,削峰
  15. LJX的校园:体育课
  16. python爬取斗鱼图片
  17. 连夜看了30多篇改进YOLO的中文核心期刊 我似乎发现了一个能发论文的规律
  18. 科技创梦 乐赢未来!第十九届ChinaJoy如期开幕
  19. python爬取中国银行当日外汇牌价
  20. 尼康D5100、D5200 设置技巧

热门文章

  1. 虚拟环境 计算机,網络虚拟环境与计算机应用.ppt
  2. 分销商城小程序系统怎么选择?
  3. 埋头工作就能触及 “ 宇宙真理 ”
  4. H3C--交换技术综合实践
  5. 第四章-循环程序设计代码实例(C++蓝豹子)
  6. 类静态数据成员的定义及初始化
  7. 台式电脑没鼠标怎么移动光标_不用鼠标怎么移动光标
  8. 亲爱的,听说做完这一百件事,我们就不用分手了。dear,i miss you...
  9. linux学习笔记整理(三)
  10. [附源码]计算机毕业设计Python+uniapp基于Android的校园考勤APPo0400(程序+源码+LW+远程部署)