lizhengwei1992 / Semantic_Human_Matting

Semantic Human Matting
532 stars 146 forks source link

请问knn-matting 这一步到底有必要做吗, 这一步能用GPU做吗 #51

Open LoveU3tHousand2 opened 3 years ago

LoveU3tHousand2 commented 3 years ago

我的服务器上运行knn-matting两分钟才能处理一张图片,这太慢了。

BarCodeReader commented 3 years ago

兄弟看来你并未明白knn-matting是干嘛的。。。

LoveU3tHousand2 commented 3 years ago

麻烦指教一下, 新手入门, 模型出来了也抠出来东西了 ,就是边缘不太理想

BarCodeReader commented 3 years ago

数据集都公开了,你直接拿数据集里面的alpha做,你knn-matting只是为了在没有alpha的情况下,用knn来造alpha。。。

LoveU3tHousand2 commented 3 years ago

感谢解惑! 我明白了, 目前我用30000+图片训练了T-NET 200epochs M-NET 400 epochs 得出的效果如附件, 可以看出来目前主要是人像边缘如头发丝这类的扣取不够精确, 想请问 如果想要优化这方面 应该朝着哪方面努力呢? 【训练轮数?】 【数据集优化?】 【关于trimap的算法优化?(gen_trimap.py? | train.py? | dataset.py?)】 感谢大佬为小白答疑解惑, 如果我问的问题词不达意或是根本概念扭曲了还请见谅。 image

BarCodeReader commented 3 years ago

抠不出来很好的边缘是你的TNet不够好,没法把该抠和不该抠的地方正确标记出来。 阿里的这个数据集前景f和背景b占的比例非常大,训练模型去检测u其实难度还是有的。 改数据集, 加更多u占比更大的图进去。

而且你如果训练30k+的图,泛化能力不知道怎么样,你可以试试下面这个图,你就知道了。 woman

LoveU3tHousand2 commented 3 years ago

我如果说我不知道 ‘u’ 代表的是什么。。。 你会打我吗 您说T-NET不够好是指的训练的结果不够好还是训练的算法不够好呢? 我推测是结果? 因为如果要我改算法估计够呛。。 看来就只能优化数据集 小白这里还有一个疑惑一直也没人给解答 就是 我训练了出来的模型pth文件, 更改了数据集之后 直接在原有模型上面继续训练 会有正向的效果吗

LoveU3tHousand2 commented 3 years ago

hair 捂面 这个效果。。。

BarCodeReader commented 3 years ago

如果你有不知道的东西,就去看他们的文章。 改了数据集,你最好重头训练。 阿里的这个数据集说实话让你明白这个系统是怎么运行的,足够了。 但是你想要一个很宽泛,很一般化的模型,你还需要做很多东西。 最主要的还是数据集。模型基本上够好了。

LoveU3tHousand2 commented 3 years ago

十分感谢您提供的方向!! 谢谢!

LoveU3tHousand2 commented 3 years ago

大佬 我又回来了。 还是抠图的这个问题, 之前根据你的建议, 加上我自己这段时间的学习。 基本概念上的东西了解了个大概。 现在仍然是这个SHM项目的问题, 我在DIM的数据集(也就是爱分割)取了10000张左右, 然后自己在网上找了一些抠的特别好的图, u占比比较大的图 和符公司合需求的一些图 总共200多张 然后 通过随机裁剪、缩放、翻转变成了15000张 组成了现在目前26331张的数据集

可是我现在遇到了问题 就是loss震荡、 我必须设置自适应学习率衰减 才能让loss值持续往下走 。 T-net的pre_trained训练了70轮 loss_p =0.09 loss_t: =0.12

目前感觉这样设置收敛会越来越慢, 所以我有以下问题像听听您的意见:

  1. 我的这种数据集增强的方式会不会对训练有特别大的负面的影响?(自制数据集最原始的图片只有253张,分辨率很高,alpha图质量特别高 , 经过处理、前背景更换 变成了15000张)
  2. 通过自适应减小学习率的方法目前看来的确可以使得loss_p loss_t持续下降, 而不是反复震荡; 但是会不会对结果有负面影响
  3. loss值到多少,这个模型算是收敛的比较好? 不管我学习率怎么下降, loss都趋于不变 是否代表模型收敛?
  4. 我发现爱分割的数据集抠出来的图其实边缘效果很一般。 如果我只用我自制的数据集训练, 用我说的如上增强方法, 我原图至少需要找到多少张呢?
LoveU3tHousand2 commented 3 years ago

最后一个问题, 阿里的这个算法, 和U2NET比 , 哪个做人像分割的效果会好一些?

LoveU3tHousand2 commented 3 years ago

又想起来一个问题, 如果说第一步pre_trained for T-NET主要是trimap的训练, 那么我在这个训练中增大u图的比例, 在end-to-end中减少一些 会不会对整体效果比较好。

LoveU3tHousand2 commented 3 years ago

我的u区域的图比例会不会过大?

BarCodeReader commented 3 years ago

不错不错,加油加油。 所以如果我没理解错的话,你现在的数据集=爱分割10K + 自己的15K 1>就数据集来讲,我觉得没啥大问题。但是尽量保证数据的统一性。因为就像你说的,爱分割质量其实不高的,而且我很担心爱分割的数据集有数据污染,就是说训练集和测试集有互相交叉,毕竟那么多图在里面,我们不可能一张一张去看。 2> 我不清楚你说的自适应是什么意思,adam?ada_delta?还是说你用lr_scheduler选择reduce lr on plateau? 震荡很可能是gradient太大,你也可以考虑gradient clipping。 3> 训练的好坏不是看loss,而是看你validation的效果。如果你validation精确度上不去了,你loss再小都没用,越小说明你过拟合了。 4> 这个问题其实很难回答。但是既然adobe能够用大概300来张训练出个DIM, 我觉得你的应该差不多。你可以尝试用更多。 5> u2net其实是属于saliency detection, 是直接给你一个前景/背景图。 matting是要用到trimap,再变成前景/背景。总体来讲matting更能胜任头发丝这种精准抠图。

LoveU3tHousand2 commented 3 years ago

这么快就回复了,真的是好人啊大佬,我是用lr_schedule类似的方法做的学习率衰减,因为公司目前给的资源有限(因为还没成果)所以batchsize只能设置的特别小。。。只能在学习率上做手脚。。那么的话我正在跑的训练如果效果不好的话就尝试一下gradientclip 的方法,如果可以的话我就再自己做一些数据集,感谢大佬 !!! Sent from my iPhone

On May 27, 2021, at 6:06 PM, @.***> wrote:



不错不错,加油加油。 所以如果我没理解错的话,你现在的数据集=爱分割10K + 自己的15K 1>就数据集来讲,我觉得没啥大问题。但是尽量保证数据的统一性。因为就像你说的,爱分割质量其实不高的,而且我很担心爱分割的数据集有数据污染,就是说训练集和测试集有互相交叉,毕竟那么多图在里面,我们不可能一张一张去看。 2> 我不清楚你说的自适应是什么意思,adam?ada_delta?还是说你用lr_scheduler选择reduce lr on plateau? 震荡很可能是gradient太大,你也可以考虑gradient clipping。 3> 训练的好坏不是看loss,而是看你validation的效果。如果你validation精确度上不去了,你loss再小都没用,越小说明你过拟合了。 4> 这个问题其实很难回答。但是既然adobe能够用大概300来张训练出个DIM, 我觉得你的应该差不多。你可以尝试用更多。 5> u2net其实是属于saliency detection, 是直接给你一个前景/背景图。 matting是要用到trimap,再变成前景/背景。总体来讲matting更能胜任头发丝这种精准抠图。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHubhttps://github.com/lizhengwei1992/Semantic_Human_Matting/issues/51#issuecomment-849507613, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AQTQZ5H2R63FCPCQ3UZNTSTTPYKRTANCNFSM4YUY4N2Q.

BarCodeReader commented 3 years ago

大佬不敢当,共同学习探讨吧。

LoveU3tHousand2 commented 3 years ago

谢谢! 结果出来了再叨扰你!

发送自 Windows 10 版邮件https://go.microsoft.com/fwlink/?LinkId=550986应用

发件人: @.> 发送时间: 2021年5月27日 18:35 收件人: @.> 抄送: @.>; @.> 主题: Re: [lizhengwei1992/Semantic_Human_Matting] 请问knn-matting 这一步到底有必要做吗, 这一步能用GPU做吗 (#51)

大佬不敢当,共同学习探讨吧。

― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHubhttps://github.com/lizhengwei1992/Semantic_Human_Matting/issues/51#issuecomment-849525532, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AQTQZ5F4UIR3DVBKROG4JFDTPYOAPANCNFSM4YUY4N2Q.

LoveU3tHousand2 commented 3 years ago

大佬, 我刚才读了一下SHM论文, 发现这里的代码关于pre_train_T(M)net、 end_to_end 的实现好像和论文里的不太一样, 作者似乎是把pre_train_Mnet 整合到了end2end当中去? 这样是否代表着 pre_train_Mnet这一步单独划出来训练是没有必要的?

BarCodeReader commented 3 years ago

有必要单独做,因为你直接放一起两个net不一定能收敛。 论文里面也是先把2个都训练好了,再放到一起fine tune做end to end。 所以你要先单独训练Mnet。

LoveU3tHousand2 commented 3 years ago

我有点蒙, 作者提供的代码是 pre_train_T_Net. finetune-> end_to_end, 您的意思是说pre_train_T. finetune->pre_train_M. finetune -> end_to_end ? 那么我pre_train Mnet, 损失函数怎么设置呢? 数据集需要更变吗。。

下面是原代码的损失函数部分: criterion = nn.CrossEntropyLoss() L_t = criterion(trimap_pre, trimap_gt[:,0,:,:].long())

------------------------------------- # prediction loss L_p # ------------------------ eps = 1e-6 # l_alpha L_alpha = torch.sqrt(torch.pow(alpha_pre - alpha_gt, 2.) + eps).mean()

# L_composition    fg = torch.cat((alpha_gt, alpha_gt, alpha_gt), 1) * img    fg_pre = torch.cat((alpha_pre, alpha_pre, alpha_pre), 1) * img
L_composition = torch.sqrt(torch.pow(fg - fg_pre, 2.) + eps).mean()
L_p = 0.5*L_alpha + 0.5*L_composition
# train_phase    if args.train_phase == 'pre_train_t_net':        loss = L_t    if args.train_phase == 'end_to_end':        loss = L_p + 0.01*L_t            return loss, L_alpha, L_composition, L_t
BarCodeReader commented 3 years ago

这里的实现是TNet + MNet = Model, 然后统一训练model。也不是不可以,只要你的tnet和mnet都能收敛就行了。之所以不常这样做是因为每个net的收敛速度不一样,有时第一个net已经过拟合和第二个才开始收敛。 我的训练步骤是先tnet, 然后freeze tnet,用tnet的结果去训练mnet,最后把tnet和mnet放一起微调。也就是和论文里面一样的步骤。 具体怎么训练看你,你要训练哪个net就针对性的用哪个loss就好。跟数据集关系不大,只要你有rgb彩色图,trimap和最后的alpha图这三个就好。 如果你是预训练好了的mnet,你可以直接训练tnet然后再放一起微调就好了。

LoveU3tHousand2 commented 3 years ago

好的 , 大概意思我了解了, 但是:把 tnet 和mnet放在一起微调。 还能这样做吗。就是torch可以加载两个模型?

两个模型放在一起微调的具体代码实现有没有推荐文章我去看看呀~。

不过还是感谢, 如果正在进行的训练效果不好至少根据您的建议我能有几个方向去改进了。

BarCodeReader commented 3 years ago

现在这个repo的model里面就是加载的两个模型

LoveU3tHousand2 commented 3 years ago

可能我把名词的概念弄混淆了。我以为的是torch.load(model1.ckpt) , torch.load(model2.ckpt) 您的意思是说 单独训练T-Net这个网络生成T.ckpt , 然后再用T.ckpt fine-tune 训练M-Net这个网络, 然后最后再用这个repo的end2end 进行最后的微调对吗。 所以意思就是这个repo的网络一开始就是M+T一起训练的 , 只不过第一步只反向传播Loss_T.

我理解的对吗?~

LoveU3tHousand2 commented 3 years ago

等等我又看了一遍你的回复, 你要训练哪个net就针对性的用哪个loss就好 所以说我加一个pre_train_M_net 只用更改loss吗。 代码上其他东西都不用改吗? 例如network.py

BarCodeReader commented 3 years ago

train.py这里写了 image 你如果要做mnet的,或者单独某个net,仿照写一个就好了。

BarCodeReader commented 3 years ago

可能我把名词的概念弄混淆了。我以为的是torch.load(model1.ckpt) , torch.load(model2.ckpt) 您的意思是说 单独训练T-Net这个网络生成T.ckpt , 然后再用T.ckpt fine-tune 训练M-Net这个网络, 然后最后再用这个repo的end2end 进行最后的微调对吗。 所以意思就是这个repo的网络一开始就是M+T一起训练的 , 只不过第一步只反向传播Loss_T.

我理解的对吗?~

是的。正确。

LoveU3tHousand2 commented 3 years ago

谢谢啦! 帮助很大!

LoveU3tHousand2 commented 3 years ago

我又来了, 有点沮丧, 仔细地看了论文和这个项目作者的代码, 才发现连作者自己都说了 这是论文的轻量级实现, T-net 完全和论文不一样, M-net也减少了一个channel, 我自己做的数据集放进去 学习的就是一直欠拟合的状态。 我原本以为是数据量大的问题, 然后我把20000多张数据减少到10000张了, 跑到Loss_p 0.03. Loss_t 0.16之后就再也下不去了 无论怎么调整参数。 并且在训练集上的表现都差强人意 ,DIM的高清原图放进去 效果极差。 大佬 我现在是不是只能改网络结构了 加入论文中同量级的T-net? 给m-net加个channel? 大佬你有什么建议吗。 如果网络变复杂了 那么对算力 显存 时间的要求是不是又更大了? 想把这个项目做到我想要的效果, 是我一个人目前的设备资源能完成的事吗,怀疑自己ing; 下面我会贴一些现在的结果 大佬你帮忙分析一下。。

LoveU3tHousand2 commented 3 years ago

这里是目前我手上整体效果最好的模型的测试结果: image 然后就是拿这张稍微微调了一下的测试图1来说明我想要什么样的一样边缘效果⬇️ :(只看头发) image

而这个是我现在手上整体效果的图2: image 可以看出来 头发上的问题。。。 而当我增强了数据集之后对生成图2的模型进行end2end微调之后,结果图3呵呵了: image

图3根本没有像我认为我的我加入了高质量细节图就能够微调到我想要的地步;

我想要的是图1的细节效果并且我肩膀不会少一块这样的结果。 (目前正在用图2进行 loss = L_t + 0.05 L_p的微调。)

不知道有没有用。

大佬 我现在到底是继续试试微调? (因为这几种结果要是可以取其精华弃其糟粕,就能差不多达到要求) 还是开始好好再看看CNN 计算机视觉 , 图像分割 的理论, 然后改成和论文一样的实现?

大佬你做这个的时候有改网络结构吗, 还是是你这边不要求这么好的细节。。

BarCodeReader commented 3 years ago

我没有用这个repo。我自己写的网络和代码。我用deeplab的网络来做tnet,mnet我直接拿dim论文的模型做的(主要是懒的换了,先试试效果如何)。 训练也和这里不一样,我先训练tnet,再训练mnet最后放一起微调。

我训练出来也无法达到阿里说的那样的效果。我在这个之前发了一张黑人妹子的图给你,我的模型也无法做到完美抠图。但是我训练的模型至少在阿里这个数据集上表现不错。(但是没卵用因为这个数据集和真实应用场景差距有点大, 我不仅需要做人像,还要全身像,物体,动物,各种杂七杂八的都要抠图。。。)

我做这个前前后后花了半年多吧,我在阿里这个数据集上可以拿到比较好的结果。我用了大概200张大自然背景图,和阿里这个数据集的alpha图进行混合。人物也有做翻转,缩放,然后进行训练。

但是,我这边无法重现阿里报告里面的结果。就算我用论文里面的pspnet,我也拿不到他们报告里面的效果。更无法达到dim里面的那种效果。所以我觉得如果报告是准确的, 应该还有很多细节没有透露,比如训练前有预处理,训练完了还有后续处理。

最近我没有在做这个项目了,只能为你提供这大半年我走的路的经验。不过今年第四季度左右我可能再重新做这个。你的预测结果缺胳膊少腿,你可以考虑用自然背景/室内背景来合成更多的图,这样有助于模型学习到背景和前景。

加油不要灰心,我之前做这个也是心累。不是你虐它,就是它虐你。抄起键盘就是干. :)

LoveU3tHousand2 commented 3 years ago

谢谢, 我大概知道了 应该是我把这个事情讲的太简单了以为搞清楚原理 搞懂算法 读懂论文就能够在短时间实现他, 从而把实现它的周期想的太短了。 我会继续调整一下数据集 尝试一下修改网络 看能不能进一步优化。 当然也不是想达到论文的效果, 能有上面图1的效果并且fg完整就不错了。 多嘴问一句 大佬您是专门做AI方面工作的吗, 像这样一个项目周期这么长, 你手里的设备是大概什么规模的啊? 这种项目从论文到落地 都是你一个人做还是团队做啊? 应该你手里同时段不止一个项目吧?

momoknight commented 2 years ago

数据集都公开了,你直接拿数据集里面的alpha做,你knn-matting只是为了在没有alpha的情况下,用knn来造alpha。。。

请问数据集里有alpha吗,为什么我只看到原始图像和matting文件夹,没有alpha matte

LoveU3tHousand2 commented 2 years ago

Alpha是用原图和matting分离的,上网查一下代码

Sent from my iPhone

On May 20, 2022, at 21:46, Zero @.***> wrote:



数据集都公开了,你直接拿数据集里面的alpha做,你knn-matting只是为了在没有alpha的情况下,用knn来造alpha。。。

请问数据集里有alpha吗,为什么我只看到原始图像和matting文件夹,没有alpha matte

— Reply to this email directly, view it on GitHubhttps://github.com/lizhengwei1992/Semantic_Human_Matting/issues/51#issuecomment-1132920224, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AQTQZ5G6GXIBIAMV6QMLYILVK6JRJANCNFSM4YUY4N2Q. You are receiving this because you authored the thread.Message ID: @.***>

momoknight commented 2 years ago

感谢回复。 不好意思,没太懂,能有相关的代码链接吗?

LoveU3tHousand2 commented 2 years ago

唔,你就百度RGB转RGBA 蒙版 之类的关键词

Sent from my iPhone

On May 22, 2022, at 09:40, Zero @.***> wrote:



感谢回复。 不好意思,没太懂,能有相关的代码链接吗?

— Reply to this email directly, view it on GitHubhttps://github.com/lizhengwei1992/Semantic_Human_Matting/issues/51#issuecomment-1133799455, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AQTQZ5G23PH3N6ZPUJ57LNDVLGF7PANCNFSM4YUY4N2Q. You are receiving this because you authored the thread.Message ID: @.***>

momoknight commented 2 years ago

感谢