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

Создание набора изображений

Чтобы создать свой набор данных, я сохранил файлы изображений с emojipedia.org для первых 111 смайликов (от 😀 до 😾) в нескольких версиях (например, Apple, Samsung, WhatsApp), что в сумме составило 1449 изображений смайликов, которые я вручную пометил. в алфавитно-цифровом порядке к соответствующему смайлику и версии. Например, 1a.png — это версия первого эмодзи от Apple: 😀.

Затем я написал серию скриптов Python для преобразования всех файлов в формат JPEG и стандартизации размеров изображений, определяя изображение наименьшего размера в наборе изображений, а затем изменяя размер всех остальных изображений в наборе изображений до того же размера: 64x64x3. .

Увеличение набора изображений

Я знал, что 1449 изображений было бы недостаточно для того, чтобы модель научилась обобщающим образом распознавать посредственный рисунок смайлика человека. Чтобы создать более крупный набор данных, я написал серию скриптов Python, чтобы дополнить набор данных синтетическими изображениями, созданными путем последовательного создания версии каждого изображения:

  • Повернуто на 10°, 20°, 30°, 40° и негатив каждого из них (10x изображений)
  • Перевернуто по горизонтали (2x изображения)
  • Оттенки серого (2 изображения)
  • Черно-белое (2x изображения)

Эти скрипты увеличили набор изображений в 80 раз, создав набор изображений из более чем 100 000 изображений, сохранив при этом обозначения меток каждого файла. Например, 1a_bw.png будет соответствовать черно-белой копии оригинального 1a.png.

Сегментация набора изображений

Я решил использовать соотношение 4:1 для тренировочного и тестового наборов. Чтобы сегментировать набор изображений таким образом, я написал сценарий, который последовательно перебирал каждый файл изображения в наборе изображений и случайным образом назначал 20% файлов тестовому набору, а все остальные файлы назначал обучающему набору. Это привело к более чем 20 000 изображений в тестовом наборе и более 80 000 изображений в обучающем наборе.

Превращение наборов изображений в наборы данных

Чтобы превратить наборы изображений в наборы данных, которые можно было бы использовать в качестве входных данных для модели, я написал серию скриптов Python, чтобы превратить обучающий набор и тестовый набор в четыре пустых массива, используя числовую часть имени каждого файла в качестве метки для каждый обучающий пример и тестовый пример. Например, y=1 будет соответствовать всем 80+ примерам, связанным с эмодзи 😀. Четыре массива numpy:

  1. train_set_x (m_train, n, n, n_channels)
  2. train_set_y (1, m_train)
  3. test_set_x (m_test, n, n, n_channels)
  4. test_set_y (1, m_test)

Где n = 64, а n_channels = 3. Для массивов x каждый фрагмент m_train или m_test представляет разные обучения или тестовый пример, представленный трехмерным массивом, представляющим изображение размером 64×64 пикселя с 3 слоями каналов, соответствующими цветовым слоям RGB каждого пикселя. Для массивов y каждый фрагмент m_train или m_test представляет собой метку для каждого примера, т. е. какой эмодзи он соответствует.

Важное примечание. Чтобы одноканальные изображения (т. е. изображения в градациях серого и черно-белые) правильно вписывались в массивы x в стандартном формате, я включил скрипт для обнаружить эти изображения во время этого процесса. Когда они обнаружены, скрипт затем обрабатывает изображение в массив 64×64×3, состоящий из 3 дублирующих матриц64×64 одного канала, наложенных друг на друга. Затем этот массив добавляется к соответствующему массиву x набора данных.

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

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

Разработка модели

Я решил использовать библиотеку Keras для сборки своей модели. Чтобы выбрать архитектуру модели, я начал с архитектуры сверточной нейронной сети распознавания лиц с двоичной классификацией, которую я использовал в одном из заданий программирования специализации глубокого обучения, чтобы предсказать, выглядит ли кто-то счастливым.

Это имело для меня интуитивный смысл, поскольку распознавание лиц и распознавание смайликов казалось связанными проблемами. Однако, поскольку моя модель должна была быть моделью мультиклассовой классификации, а не моделью бинарной классификации, одно ключевое изменение, которое мне пришлось внести, заключалось в том, чтобы последний слой выдавал 111 значений вместо 1.

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

Я определенно мог бы быть более методичным в своем исследовании дизайна модели, но, в конце концов, эта архитектура оказалась наиболее производительной:

Наконец, хотя в выходных данных модели Счастливый дом использовалась сигмовидная функция активации для бинарной классификации, я заменил ее на функцию активации Softmax для мультиклассовой классификации.

Обучение и оценка модели

Я тренировал модель с оптимизацией Адам и функцией потерь категориальная кросс-энтропия. Я использовал размер пакета из 32 примеров и тренировал его в течение трех эпох:

  • После первой эпохи: модель достигла точности 51% на тренировочном наборе.
  • После второй эпохи: модель достигла точности 86% на тренировочном наборе и 88% на тестовом наборе.
  • После третьей эпохи: модель достигла точности 92% на тренировочном наборе и 91,37% на тестовом наборе.

Развертывание модели

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

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

DrawMoji правильно идентифицирован 😯. Есть несколько смайликов с одинаковой формой рта, но все они имеют совершенно разные черты глаз/бровей.

DrawMoji правильно идентифицирован 🤠. Ковбойская шляпа — уникальная деталь тренировочного комплекта.

DrawMoji ошибочно определил 😘 как 🤮. Помимо того, что это довольно забавно, что могло бы понравиться Кальвину из Кальвина и Гоббса, это еще и интересно. Есть некоторые общие черты, которые могут объяснить эту ошибочную идентификацию: у обоих есть по крайней мере одна бровь, у обоих есть один глаз в форме , и у обоих есть форма вне рта. Но почему разные цвета (например, красное сердце и зеленая рвота) не подсказывают модели, что они разные? На рисунке сердце на самом деле черное. Для любого заданного смайлика ~ 75% примеров в наборах данных также имеют оттенки серого или черно-белые из-за того, как я увеличил набор изображений. Это может объяснить, почему модель допустила эту ошибку, и выявить серьезный недостаток описанного выше подхода к дополнению.

DrawMoji ошибочно определил 🤩 как 😷. Эта ошибка тоже забавна: может быть, модель делает какой-то социальный комментарий о пандемии? Нет. Этот рисунок был сделан с помощью тонких линий, из-за чего форму глаза ⭐️ было труднее распознать после обработки в стандартном формате ввода. Кроме того, рот был нарисован в форме прямоугольника (теряя некоторую точность с темой смайлика), и, поскольку это одна из форм, которая, вероятно, четко выделяется моделью, это может объяснить, почему модель предсказала только другие смайлики с прямоугольной формой. особенность рта.

DrawMoji ошибочно определил 🥴 как 😣. Поначалу было удивительно, что модель неправильно идентифицировала его. Рисунок выглядит как очень точный рисунок того, что показано на клавиатуре эмодзи iPhone; однако на самом деле этот смайлик выглядит немного по-разному на разных платформах. На многих из них у него выпученные глаза, а на WhatsApp — язык.

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

Есть несколько общих черт между входным изображением и предсказанным смайликом: у обоих есть брови; у обоих одинаковые формы бровей по крайней мере для одной брови; у обоих кривые рты. Человеку эти сходства могут показаться незначительными, но модель могла счесть эти сходства более убедительными с математической точки зрения.

Размышления

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

Если бы мне пришлось потратить больше времени на этот проект, я бы провел более методичное исследование пространства архитектуры модели. Определенно существует более эффективная с вычислительной точки зрения архитектура модели, но, поскольку это была моя первая модель, я был счастлив найти работающую архитектуру. 🥳

Я рассматриваю возможность превращения этой модели в интерактивный веб-сайт, где человек может попробовать свои силы в рисовании смайликов, а затем DrawMoji может попытаться угадать, какие смайлики нарисовал человек, почти как игра в рисование между человеком и ИИ. 🤖

А пока я благодарен за этот опыт и никогда больше не буду смотреть на смайлики прежним взглядом. 🙃

Спасибо за чтение.