Как удалить татуировку с помощью глубокого обучения

Автор оригинала: Pranjal Saxena
  • Перевод
  • Tutorial

Глубокое обучение — интересная тема и моя любимая область исследований. Мне очень нравится играть с новыми исследовательскими разработками специалистов по глубокому обучению. Я только что наткнулся на удивительный репозиторий GitHub одного из моих товарищей по группе компьютерного зрения. Мне он так понравился, что я решил поделиться им. Основа репозитория — генеративно-состязательная сеть (GAN), которая способна удалять татуировки с тела.  В преддверии старта нового потока курса по Machine Learning и Deep Learning, расскажу вам шаг за шагом, как применять упомянутый репозиторий на примере фотографии в Pexels.


Запуск Google Colab

Google Colab бесплатно предоставляет мощные возможности графического процессора, чтобы выполнять или обучать наши модели глубокого обучения за меньшее время. Введите в браузере следующий URL-адрес и нажмите клавишу Enter:

https://colab.research.google.com/

После запуска войдите в свою учётную запись Google. Если вы уже вошли, платформа просто выберет основную учётную запись для входа. Не беспокойтесь! Ваши данные здесь в безопасности. После входа перейдите к файлу и откройте новую записную книжку.

Клонирование репозитория GitHub

Теперь в только что созданной записной книжке мы должны выполнить такую команду:

!git clone https://github.com/vijishmadhavan/SkinDeep.git SkinDeep
Эта команда клонирует код GitHub в вашу среду Colab.
Эта команда клонирует код GitHub в вашу среду Colab.

Теперь, на следующем шаге, мы должны использовать клонированный репозиторий. Для этого в соседней ячейке записной книжки выполните эту команду:

cd SkinDeep

Установка библиотек

Чтобы установить все необходимые библиотеки, в очередной ячейке выполните:

!pip install -r colab_requirements.txt

Определение архитектуры модели

Теперь настало время инициализировать архитектуру модели. Архитектура доступна в том же репозитории GitHub, который мы клонировали. Чтобы инициализировать модель, в соседней ячейке выполните следующий код:

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()

Загрузка файла модели

После инициализации модели загрузите предварительно обученную модель GAN для удаления татуировок. В очередной ячейке выполните эти команды:

MODEL_URL = "https://www.dropbox.com/s/vxgw0s7ktpla4dk/SkinDeep2.pkl?dl=1"
urllib.request.urlretrieve(MODEL_URL, "SkinDeep2.pkl")
path = Path(".")
learn=load_learner(path, 'SkinDeep2.pkl')

Входное изображение

Наконец, можно определить своё входное изображение для тестирования. В приведённом ниже сегменте кода подставьте URL-адрес изображения.

url = 'https://images.pexels.com/photos/5045947/pexels-photo-5045947.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260' #@param {type:"string"}

response = requests.get(url)
img = PIL.Image.open(BytesIO(response.content)).convert("RGB")
img_t = T.ToTensor()(img)
img_fast = Image(img_t)
show_image(img_fast, figsize=(8,8), interpolation='nearest');

Тестирование модели и получение результатов

Начинается самое интересное. Запустим модель, чтобы получить результат. В соседней ячейке выполните следующие строки кода:

p,img_hr,b = learn.predict(img_fast)
Image(img_hr).show(figsize=(8,8))

Заключение

Вот и всё. Мы обсудили пошаговое реальное применение модели SkinDeep для удаления татуировок с кожи. Подобные забавы — лишь малая демонстрация потенциала глубокого обучение. Оно способно способно генерировать новые функции без вмешательства человека, из ограниченного набора функций, расположенных в наборе учебных данных. Для специалистов это означает, что они могут использовать более сложные наборы функций по сравнению с традиционным ПО для машинного обучения. Если вас заинтересовала эта сфера — ждем вас на расширенном курсе Machine Learning и Deep Learning, в котором мы совместили изучение DL с классическим курсом по ML, чтобы студент начал с основ и постепенно перешел к более сложным вещам.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
SkillFactory
Школа Computer Science. Скидка 10% по коду HABR

Комментарии 12

    +1
    Я думал это будет что то вроде — поставить обучаться какую-либо сложную модель и затем радиатором от видеокарты выжечь тату.
      +4
      Вот и всё. Мы обсудили пошаговое реальное применение модели SkinDeep для удаления татуировок с кожи.

      Что обидно — нет, не обсудили. Вы дали код и инструкцию по его запуску, а пояснений, как это чудо техники работает не дали нисколько. Альтернативы не обсудили, плюсы и минусы. Это инструкция по развертыванию решения, а не пояснение или дискуссия.
        +4
        Примерно с тем же успехом можно разговаривать с телевизором. Это перевод текста некоего индуса (а вы знаете, что одной из рекомендаций для индопрограммистов с недавних пор стало «развивайте личное портфолио, заведите свой техноблог, где вы будете писать вот такие инструкции»?), опубликованный на хабре как перевод в корпоративном блоге системы «переводим все гуглотранслейтом». Никто в этой цепочке не заинтересован в том, чтобы что-то «обсудить».
          0
          Обсуждать можно лишь с теми, кто готов это делать конструктивно, спокойно и без пренебрежения ко всем сразу — программистам из другой страны, корпблогам и переводам.
            +2
            Я интернационалист, и программистов всех стран ненавижу одинаково (а равно всех цветов кожи, всех гендеров и так далее).
          +2
          Все больше убеждаюсь, что пометка о том, что публикация переводная — не заметна читателям. В ней передано то, что хотел передать автор и вы правы, это только код и инструкция по запуску, а не детальное объяснение. Можно еще глянуть как работает SkinDeep вот тут.
            0
            Заметна. Но ребята из SkillFactory могут выбирать, какие статьи переводить. В моем понимании, переводить инструкцию по запуску нет особенного смысла, да и это не тот материал, который хотелось бы видеть на Хабре.

            У меня возникло ощущение, что статья была выбрана по принципу «звучит хайпово, а переводится быстро». Поэтому ворчу :)
            0
            Там очень интересный генератор. U-net c механизмом (само)внимания. Судя по ссылкам в репо, проект вырос из омолаживателя :) github.com/jantic/DeOldify. Если бы кто-то всё это рассказал, а заодно про спектральную нормализацию и прочие трюки, была бы классная статья.
            0
            А можно так удалить «женщину в красном» испортившую свадебные фотографии своим присутствием?)
              +1
              «А скажите, и в магазине можно также стенку приподнять?»(с) :-)
              Можно, например у Nvidia есть InPainting, который использует алгоритмы глубокого обучения
                +1
                Стенку в магазине — ладно. А вот можно с помощью этого подушку заменить на какой-нибудь офисный фон? И еще глаза закрытые поменять на открытые, и лицу придать выражение напряженного внимания? И все это на видео в реальном времени? Друг просил узнать…
                0
                много их. вот например theinpaint.com

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое