Извлечение платьев по фотографиям

Индустрия моды - очень прибыльное поле для искусственного интеллекта. Есть много областей, в которых специалисты по обработке данных могут разработать интересные сценарии использования и принести пользу. Свой интерес к этому сектору я уже проявила здесь, где разработала решение для рекомендации и маркировки платьев от интернет-магазина Zalando.

В этом посте я попытаюсь продолжить разработку системы, которая принимает на вход сырые изображения (взятые из Интернета или сделанные с помощью смартфона), и попытаюсь извлечь платья, показанные в ней. Помня, что проблемы сегментации печально известны из-за сильного шума, присутствующего в исходных изображениях; мы пытаемся разработать сильное решение с помощью хитрых приемов (во время предварительной обработки), которые имеют дело с этим аспектом.

В конце концов, вы также можете попробовать объединить это решение с упомянутым предыдущим. Это позволяет вам разработать систему рекомендаций и маркировки платьев в режиме реального времени с помощью фотографий, которые вы делаете в дороге.

НАБОР ДАННЫХ

Недавно также был запущен конкурс Kaggle по визуальному анализу и сегментации одежды. Это очень интересная задача, но это не для нас ... Моя цель - извлечь платья из фотографий, поэтому этот набор данных не подходит из-за его избыточности и мелкозернистых атрибутов. Нам нужны изображения, которые содержат в основном платья, поэтому лучше всего было собрать данные самостоятельно.

Я собрал в сети изображения людей, одетых в женские платья разного типа и в разных сценариях. Следующий шаг, необходимый для создания масок: это необходимо для каждой задачи сегментации объектов, если мы хотим обучить модель, которая сможет фокусироваться только на действительно интересных точках.

Ниже я привожу образец данных, имеющихся в нашем распоряжении. Я собрал исходные изображения из Интернета, а затем с удовольствием разрезаю их дальше, отделяя людей от платьев.

Мы используем эту дискриминацию, потому что хотим отметить разделение между фоном, кожей и одеждой. Фоны и скины являются наиболее значимыми источниками шума в такого рода задачах, поэтому мы стараемся их подавлять.

С помощью этих вырезок мы можем воссоздать наши маски, как показано ниже, это делается простой бинаризацией изображения. Кожа получается как разница между людьми и одеждой.

В качестве последнего шага мы объединяем все в одно трехмерное изображение. Это изображение декодирует соответствующие особенности нашего оригинального изображения, которое нас интересует. Наша цель - сохранить разделение между фоном и внешним видом: этот результат идеально подходит для нашей области применения!

Мы повторили этот процесс для каждого изображения в нашем наборе данных, чтобы иметь для каждого исходного изображения связанную маску трех измерений.

МОДЕЛЬ

В нашем распоряжении есть все, чтобы создать нашу модель. Рабочий процесс, который мы имеем в виду, очень прост:

Мы подбираем модель, которая получает на входе необработанное изображение и выводит трехмерную маску, то есть она способна воссоздать из исходных изображений желаемое разделение между кожей / фоном и одеждой. Таким образом, когда приходит новое необработанное изображение, мы можем разделить его на три разные части: фон, кожу и платье. Мы принимаем во внимание только интересующий нас канал (платье), используем его для создания маски из входного изображения и разрезаем его, чтобы воссоздать оригинальное платье.

Вся эта магия возможна благодаря мощи UNet. Этот глубокий сверточный автоэнкодер часто используется для подобной сегментации. Его легко воспроизвести в Keras, и мы обучаем его воссоздавать пиксель на пиксель для каждого канала нашей желаемой маски.

Перед началом обучения мы решили стандартизировать все наши исходные изображения с их средним значением RGB.

РЕЗУЛЬТАТЫ И ПРОГНОЗЫ

Мы замечаем, что во время прогнозирования, когда мы сталкиваемся с изображением с высоким уровнем шума (в терминах неоднозначного фона или кожи), наша модель начинает испытывать затруднения. Это неудобство можно преодолеть, просто увеличив количество обучающих изображений. Но мы также разрабатываем умный ярлык, чтобы избежать этих ошибок.

Мы используем алгоритм GrubCut , предоставляемый OpenCV. Этот алгоритм был реализован для отделения переднего плана от фона с использованием модели гауссовой смеси. Это помогает нам, потому что помогает направить человека на переднем плане, подавляя шум со всех сторон.

Вот простая функция, которую мы реализуем, чтобы сделать это возможным. Мы предполагаем, что интересующий нас человек стоит в центре изображения.

def cut(img):
   img = cv.resize(img,(224,224))
    
    mask = np.zeros(img.shape[:2],np.uint8)
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    height, width = img.shape[:2]
    rect = (50,10,width-100,height-20)
    cv.grabCut(img,mask,rect,bgdModel,fgdModel,5,
               cv.GC_INIT_WITH_RECT)
    mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
    img2 = img*mask2[:,:,np.newaxis]
    img2[mask2 == 0] = (255, 255, 255)
    
    final = np.ones(img.shape,np.uint8)*0 + img2
    
    return mask, final

Теперь мы применяем UNet и готовы увидеть результаты на новых изображениях!

Наш этап предварительной обработки в сочетании с полномочиями UNet позволяет добиться отличной производительности.

РЕЗЮМЕ

В этом посте мы разрабатываем комплексное решение для сегментации одежды. Для достижения этой цели мы используем мощный автоэнкодер в сочетании с умными методами предварительной обработки. Мы планируем это решение для того, чтобы использовать его в реалистичном сценарии с реальными фотографиями, с возможностью построения на его основе системы визуальных рекомендаций.

ПРОВЕРИТЬ РЕПО НА GITHUB

Оставайтесь на связи: Linkedin