1. 前言
绘制是图像编辑的基础功能之一,可以在绘制的基础上发展有趣的游戏和特效。 例如,一键改变背景,一键将任务漫画化,一键将人物素描化等。 得益于这些好玩的游戏,从CVPy网站的一键插画功能上线以来,从评价数量来看,人气之高远远领先于CV派内其他高手,可见该模式的人气程度。
笔者最近也对该模型背后的U-2-Net网络产生了兴趣,收集数据对脸部素描化模型进行了训练。 虽然受到数据集的限制,只能转换成脸部图像,但自己很享受。 除了享受模型的乐趣之外,我还期待着在训练模型的过程中,以及遇到问题解决问题的过程中,加深对模型的理解。
笔者最近从一开始就训练了一键图形模型,并在训练中不断测试不同阶段模型的表现。 看到模型一点一点收敛,抠图效果渐渐变好了。
在这里记录训练的过程和训练的效果。 也可以作为后来者的参考。
事先说好,模型训练需要时间!
2. 代码 数据 环境准备
2.1 代码
代码是U-2-Net的开源代码,可以从Github下载。 3359 Github.com /美国/u-2 -网络。 这个模型本来有很明显的检查,作为一键模型也很有趣。
需要注意的是,对于最新安装的Pytorch,在获取loss值时,必须将loss.data[0]修改为loss.data.item )。
笔者在训练中曾试图将Loss函数变更为其他的,例如变更为BCE和SSIM的加权参见U-2-Net作者去年的文章BASNet ),但没有出现明显的提高。 虽然也修改过输出频道训练过其他模型,但是暂时没有得到有趣的结果,所以打算积累经验。
对于
2.2 数据
数据集,我们使用论文中提供的DUTS数据集将培训集和测试集分开。 在网上搜索直接下载就行了。
当然,也可以使用自己的数据集,以DUTS的形式重新组织数据集。
然后,将训练代码中数据读取部分的路径变更为自己准备的数据路径。
2.3 机器
集团中的一位土豪赞助了4张卡机器,4张RTX 5000,1张卡16G内存。 跑步确实比单卡爽多了。
然后,根据Anaconda安装培训所需的Python环境,创建虚拟环境,安装pytorch、torchvision、skimage、opencv等,直接安装pip安装或conda install 不说多余的话。
另外,对于多卡,代码需要进行细微的变更。 生成模型后,将代码转换为:
iftorch.cuda.is_available ) :
net.cuda ) )
修改为
iftorch.cuda.is_available ) :
net.cuda ) )
net=nn .数据并行)网络) ) ) )。
3. 训练与测试
3.1 模型训练
以上的代码、数据、计算机和运行环境就绪后,就可以开始培训了。 卡片训练的命令大致如下。
cuda _ visible _ devices=0、1、2、3诺赫普python3- uu U2网络日志_网络日志_日志
然后,tail命令在查看日志文件log_train.log后,如果看到如下所示的输出,则开始运行。
另外,通过watch -n 1 nvidia-smi命令观察GPU的情况,可以发现4张卡被活用。
模型训练近一周,达到了与论文相近的效果。
另外,由于中间保存过多,为了节省空间,笔者删除了过多的前期模型。 以下所示的前期效果是其他训练的前期模型的效果。
3.2 各阶段模型测试
笔者对测试代码结构进行了微调,将测试转移到了Jupy
ter里,这样画图看效果更加直观。
笔者测试模型的时候,每张图都会画出三个图:黑色背景的抠图结果、模型输出的Mask或称Alpha,原图。这样对比来看结果一目了然。这里每张图都展示了四个阶段模型的测试效果。显然,以下图片都不在训练集里面。
四个阶段对比着看,能更加直观地感受到模型的收敛过程。
从以下四个阶段的对比图可以看出,随着训练的进行
前景逐渐变亮,背景逐渐变暗,即前景收敛于1,背景收敛于0。前两幅图之间的对比最为明显。前景的轮廓从模糊到清晰细锐,轮廓处的不确定区域,越来越少。注意指缝和发梢部分的Mask的变化,细节越来越清晰。
下面这幅图请注意这个卡通人物背后背的那个是蜗牛还是啥的东西的轮廓的细化过程。以及其嘴角的一撮小胡子。这个图美中不足的是两脚之间的背景没有被识别出来。
下面这张图值得关注的应该就是其发梢的抠图细化过程、腰部的亮度变化过程。还有就是其手中的衣服了,对于要不要把一副也给抠出来,模型看起来也很纠结啊。
这个图最引人瞩目的莫过于这位落后的汽车在风中凌乱的发丝,这不是难为模型吗?说实话,如果不是看到Mask里胸前多出的东西,我都没注意到这个东西,衣服的胸结还是啥。
这大概就是训练了五天左右的效果,模型仍然在缓慢的收敛中,故事仍然在继续……
直到我实在是受不了越来越慢的收敛速度,等不及训练其他魔改的模型,终止了训练任务……
本着报喜不报忧的原则,下面再放几张测试效果还不错的图片,效果不怎么样的就不拿出来献丑了。
上面的抠图效果还是有待提高,比如头发等边缘处,还是可见部分背景未分离。前几天刚转发了动物抠图的新论文,边缘和毛发的抠图效果很赞。其单开一条支路专门做轮廓边缘处的抠图的思路值得参考。
不过,作者暂时开源了测试代码,并没有训练代码。我昨晚肝到十二点半,终于根据论文实现了一版训练代码,但是貌似收敛得更慢,这个优化还是慢慢来吧。
就这训练速度,想快也快不起来啊。反正就是玩,好玩就行。