<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          AI一鍵去紋身,還原明星「廬山真面目」

          共 5160字,需瀏覽 11分鐘

           ·

          2021-04-15 21:56

          這兩天在 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


          長按掃描關注,回復4books即可獲取



          瀏覽 82
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  97很鲁| 亚洲一级自拍 | 在线精品自偷自拍无码 | 奇米影视666 | 免费内射视频 |