AI一鍵去紋身,還原明星「廬山真面目」
這兩天在 Reddit 上看到了一個挺好玩的算法,立馬連夜寫文過來分享一波。
AI去除紋身:

國內(nèi)的一些影視作品、綜藝節(jié)目、B站視頻等,都有一些去除紋身的需求。
有些時候,我們需要把一些人身上的紋身覆蓋掉,以避免引人效仿。
來自印度的機器學習研究者 Vijish Madhavan 最近開源的一個機器學習工具 SkinDeep 滿足了我們這個需求。
項目靈感來源于賈斯汀 · 比伯一次拍 MV ,化妝師花費幾個小時的時間才把一身的紋身覆蓋掉,采用圖像的處理方式可以更省事省力。
SkinDeep
項目地址:https://github.com/vijishmadhavan/SkinDeep

使用 SkinDeep 相比于 Photoshop 更省事一些,畢竟節(jié)省了幾個小時的時間去修修補補。
我們先看下效果,下圖中第一行為輸入圖像,第二行為輸出圖像,輸出結果明顯感覺到,紋身被去除了。

臉部有大量密集紋身的圖像,還有其他裝飾,AI 的紋身去除效果也非常好:

與專業(yè)圖像處理軟件 photoshop 相比,效果也不錯:

看起來 SkinDeep 的效果還不錯,但如果紋身是彩色的,還會有一些痕跡。
數(shù)據(jù)集
完成這個項目需要大量的圖像對,因為沒有合適的數(shù)據(jù)集,很多時候訓練內(nèi)容采用合成數(shù)據(jù)來完成,具體來說:
首先將 APDrawing 數(shù)據(jù)集圖像對與一些背景去掉紋身設計的圖像疊加在一起,使用 Python OpenCV 實現(xiàn); 繪制數(shù)據(jù)集模擬紋身線條,有助于模型學習和刪除這些線條; APDrawing 數(shù)據(jù)集只有頭像,對于全身圖像,項目作者采用了以前的項目 ArtLine,并將輸出與輸入圖像疊加在一起;


ImageDraw.Draw 與森林綠色(forest green colour)色碼一起使用,并隨機放置在身體圖像上,類似于 fast.ai 中的 Crappify ;
Photoshop 也被用來在需要彎曲和角度改變的對象上放置紋身。

簡單看了下代碼,實現(xiàn)很簡單,采用 fast.ai 封裝的 unet 進行端到端的訓練,并不復雜。
算法測試
開源代碼使用 ipynb 文件,測試方法很簡單,就兩種:
本地:安裝 fast.ai ,用 jupyter 打開 ipynb。 colab:直接用 colab 打開。
本地搭建環(huán)境,所需要安裝的依賴:
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 運行,省去配置環(huán)境的麻煩。
https://colab.research.google.com/github/vijishmadhavan/SkinDeep/blob/master/SkinDeep_good.ipynb
測試效果:

絮叨
SkinDeep 的效果,作者還在優(yōu)化,一些紋身覆蓋面大、花色紋身等效果要差一些。
這個不是什么新的、高端算法,只是一個好玩、實用的應用。
資料分享
Python 程序員深度學習的“四大名著”:
這四本書內(nèi)容著實很不錯,非常適合學習機器學習、深度學習方向的小伙伴!我們都知道現(xiàn)在這方面的資料太多了,面對海量資源,往往陷入到“無從下手”的困惑出境,而且并非所有的書籍都是優(yōu)質(zhì)資源,浪費大量的時間是得不償失的。
獲得方式:
掃碼或者長按下方二維碼,點擊右上方關注; 后臺回復關鍵詞:4books;
