你好纹身网站源码,我是杰克。
这三天在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,我们上期见。
······················································· ····
发表评论