纹身网站源码-AI一键祛纹身,还原知名明星“庐山真面目”

你好纹身网站源码,我是杰克。

这三天在Reddit上看到一个很有趣的算法,立马冒雨写了一篇文章分享一波。

AI去除纹身:

国外的一些影视作品、综艺节目、B站视频等,都有一些去除纹身的需求。

有时,我们需要遮盖一些人的纹身,以防止被模仿。

来自俄罗斯的机器学习研究者 Vijish Madhavan 最近开源的一款机器学习工具 SkinDeep 就满足了我们的需求。

该项目的灵感源于贾斯汀·比伯拍摄 MV 时。 化妆师花了好几个小时才将他全身的纹身遮盖掉。 使用图像处理方法可以节省时间和精力。

纹身网站设计_纹身网站素材_纹身网站源码

肤浅

项目地址:

使用 SkinDeep 比 Photoshop 麻烦更少,尽管它可以节省几个小时的修复时间。

我们先看一下疗效。 右图中第一行是输入图像,第二行是输出图像。 输出结果很明显,纹身不仅被去除了。

纹身网站源码_纹身网站设计_纹身网站素材

头上有很多密集纹身的图像,以及其他装饰。 AI的纹身去除效果也很好:

与专业图像处理软件photoshop相比,疗效也不错:

看起来SkinDeep的疗效还不错,但是如果纹身是彩色的,就会有一些痕迹。

数据集

完成该项目需要大量图像对。 由于没有合适的数据集,很多时候训练内容是使用合成数据来完成的。 具体来说:

简单看了一下代码,实现非常简单。 使用fast.ai封装的unet进行端到端训练并不复杂。

算法测试

纹身网站素材_纹身网站设计_纹身网站源码

开源代码使用ipynb文件,测试方法很简单,有两种:

本地搭建环境,需要安装的依赖:

fastai==1.0.61
numpy==1.17.2
pandas==1.1.2 
torch==1.6.0
torchvision===0.7.0

用Anaconda本地安装第三方库,下载代码后用jupyter打开ipynb运行。

代码并不复杂,核心代码就几行:

import fastai
from fastai.vision import *
from fastai.utils.mem import *
from fastai.vision import open_image, load_learner, image, torch
import numpy as np
import urllib.request
import PIL.Image
from io import BytesIO
import torchvision.transforms as T
from PIL import Image
import requests
from io import BytesIO
import fastai
from fastai.vision import *
from fastai.utils.mem import *
from fastai.vision import open_image, load_learner, image, torch
import numpy as np
import urllib.request
import PIL.Image
from io import BytesIO
import torchvision.transforms as T

class FeatureLoss(nn.Module):
    def __init__(self, m_feat, layer_ids, layer_wgts):
        super().__init__()
        self.m_feat = m_feat
        self.loss_features = [self.m_feat[i] for i in layer_ids]
        self.hooks = hook_outputs(self.loss_features, detach=False)
        self.wgts = layer_wgts
        self.metric_names = ['pixel',] + [f'feat_{i}' for i in range(len(layer_ids))
              ] + [f'gram_{i}' for i in range(len(layer_ids))]

    def make_features(self, x, clone=False):
        self.m_feat(x)
        return [(o.clone() if clone else o) for o in self.hooks.stored]
    
    def forward(self, input, target):
        out_feat = self.make_features(target, clone=True)
        in_feat = self.make_features(input)
        self.feat_losses = [base_loss(input,target)]
        self.feat_losses += [base_loss(f_in, f_out)*w
                             for f_in, f_out, w in zip(in_feat, out_feat, self.wgts)]
        self.feat_losses += [base_loss(gram_matrix(f_in), gram_matrix(f_out))*w**2 * 5e3
                             for f_in, f_out, w in zip(in_feat, out_feat, self.wgts)]
        self.metrics = dict(zip(self.metric_names, self.feat_losses))
        return sum(self.feat_losses)
    
    def __del__(self): self.hooks.remove()

纹身网站设计_纹身网站源码_纹身网站素材

其实你也可以直接打开Colab来运行纹身网站源码,省去了配置环境的麻烦。

测试功效:

唠叨

SkinDeep的疗效仍在作者优化中。 一些覆盖范围大、色彩鲜艳的纹身效果较差。

这不是什么新的高端算法,而是一个有趣且实际的应用。

记得给Jack点个star,我们上期见。

······················································· ····