След като получих сертификати за „Deep Learning Specialization“ на deeplearning.ai през 2020 г., исках да приложа знанията си на практика, като изградя свой собствен модел на задълбочено обучение за интересно и забавно приложение. Реших да създам модел за разпознаване на изображения, който ще се научи да разпознава изображения на емотикони по толкова обобщаващ начин, че да може да разпознае посредствената рисунка на емотикони на човек.

Изграждане на набора изображения

За да създам своя набор от данни, запазих файловете с изображения от 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, за да превърна набора за обучение и набора за тестване в четири numpy масива, използвайки цифровата част от всяко име на файл като етикет за всеки пример за обучение и пример за тест. Например y=1 би съответствало на всичките 80+ примера, свързани с 😀 emoji. Четирите numpy масива са:

  1. train_set_x (m_влак, n, n, n_канали)
  2. train_set_y (1, m_train)
  3. test_set_x (m_test, n, n, n_канали)
  4. test_set_y (1, m_test)

Където n= 64 и n_channels = 3. За x масивите всеки срез от m_train или m_test представлява различно трениране или тестов примерпредставен от 3D масив, представящ изображението като 64×64 пиксела с 3 слоя на канала, съответстващи на RGB цветовите слоеве на всеки пиксел. За y масивите всеки отрязък от m_train или m_test представлява етикета за всеки пример, т.е. към кое емотикони се съпоставя.

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

За да помогна с обучението на модела по-късно, нормализирах стойностите на масива x за по-бърза конвергенция и „кодирах еднократно“ масивите y за използване на категориалната кръстосана ентропия загуба функция.

И накрая, стартирах скрипт за извадка от наборите от данни за конкретни примери и съответните им етикети, за да гарантирам, че верността на етикета на примера е запазена по време на обработката, и отстранявам грешки при всякакви проблеми.

Проектиране на модел

Реших да използвам библиотеката Keras, за да създам моя модел. За да избера моделна архитектура, започнах с архитектурата на конволюционна невронна мрежа за двоично класифициране, лицево разпознаване, която използвах в едно от програмните задачи на Deep Learning Specialization, за да предвидя дали някой изглежда щастлив или не.

Това имаше интуитивен смисъл за мен, тъй като разпознаването на лица и разпознаването на емотикони изглеждаха като свързани проблеми. Въпреки това, тъй като моят модел ще бъде многокласов класификационен модел вместо бинарен класификационен модел, една ключова промяна, която трябваше да направя, беше крайният слой да има изход от 111 стойности вместо 1.

Моите ранни опити да прикача такъв слой в края на архитектурата „Happy House“ на мястото на единичния изходен слой не дадоха обещаващи резултати. Моята интуиция беше, че многокласовата класификация ще изисква по-задълбочено разбиране на функциите в набора от данни и затова добавих допълнителни конволюционни слоеве със съответните слоеве за нормализиране на партиди, активиране и максимално обединяване.

Определено можех да бъда по-методичен в моето изследване на дизайна на модела, но в крайна сметка това е архитектурата, която беше най-ефективна:

И накрая, докато изходът на модела „Happy House“ използва „функция за активиране на Sigmoid“ за двоична класификация, промених това на функция за активиране „Softmax“ за многокласова класификация.

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

Обучих модела с оптимизация на „Адам“ и функция на загуба на „категорична кръстосана ентропия“. Използвах партида от 32 примера и я обучих за три епохи:

  • След първата епоха: моделът достигна 51% точност на тренировъчния комплект.
  • След втората епоха: моделът достигна 86% точност на набора за обучение и 88% точност на набора за тестване.
  • След третата епоха: моделът достигна 92% точност на набора за обучение и 91,37% точност на набора за тестване.

Разгръщане на модела

С предимно функциониращ модел след това поисках рисунки на емотикони от семейството и приятелите, за да тествам умението на модела да идентифицира ръчно нарисувани изображения. След това изрязах всички файлове с изображения и използвах скрипт, за да ги конвертирам всички в стандартната входна форма за модела. Разглеждането на тези съвсем нови входни данни и прогнозите на модела хвърля малко светлина върху това как моделът разбира изображенията и ограниченията на това разбиране.

DrawMoji почти правилно идентифицира 😃, но го идентифицира като 😀,пропускайки малки разлики във формите на очите. Може би на рисунката очите не са били толкова високи, колкото на действителното емотикони и така моделът е трябвало да направи труден избор.

DrawMoji правилно идентифициран 😯. Има няколко емотикони с една и съща форма на уста, но всички те имат доста различни черти на очите/веждите.

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

DrawMoji погрешно идентифицира 😘 като 🤮. Освен че е доста смешно по начин, който Калвин от „Калвин и Хобс“ може да оцени, това е и интересно. Има някои общи черти, които биха могли да обяснят тази погрешна идентификация: и двете имат поне една вежда, и двете имат по едно око с форма на „‹“ и двете имат форма извън устата. Но защо различните цветове (т.е. червено сърце срещу зелено повръщане) не подсказват на модела, че те са различни? На рисунката сърцето всъщност е черно. За всяко дадено емоджи ~75% от примерите в наборите от данни също са в сива скала или черно-бели поради начина, по който увеличих набора от изображения. Това може да обясни защо моделът е допуснал тази грешка и показва силен недостатък на горния подход за увеличаване.

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

DrawMoji погрешно идентифицира 🥴 като 😣. Първоначално беше изненадващо, че моделът не идентифицира правилно този. Чертежът изглежда като наистина точен чертеж на това, което е показано на емоджи клавиатурата на iPhone; обаче това емотикони всъщност изглежда малко по-различно на различните платформи. На много от тях има гугли очи, а на WhatsApp има език.

Тъй като комплектът за обучение на DrawMoji включва изображения от много различни платформи, моделът вероятно не се е научил да разпознава това емоджи, както и други емоджи, които са по-хомогенни в различните платформи, като 😣.

Има няколко общи черти между въведеното изображение и предвиденото емотикони: и двете имат вежди; и двете имат сходни форми на веждите за поне една вежда; и двете имат извити усти. На човек тези прилики може да не изглеждат много, но моделът може да е намерил тези прилики за по-убедителни от математическа гледна точка.

Отражения

Този проект ми даде по-голяма оценка за цялата работа, която може да отиде в създаването на добре етикетиран и достатъчно голям набор от данни за обучение на модели за дълбоко обучение. Освен това получих повече оценка за клопките и недостатъците надолу по веригата, които могат да възникнат по време на увеличаване на данните. 🧐

Ако трябваше да отделя повече време на този проект, щях да проведа по-методично изследване на моделното архитектурно пространство. Определено има по-ефективна в изчислително отношение архитектура на модела, но тъй като това беше първият ми модел, бях щастлив, че открих архитектура, която работи. 🥳

Обмислям да превърна този модел в интерактивен уебсайт, където човек може да опита ръката си в рисуването на емотикони, а след това DrawMoji може да опита ръката си в отгатването кои емотикони е нарисувал човекът, почти като игра на картинка между човек и AI. 🤖

Дотогава съм благодарен за това преживяване и никога повече няма да гледам на емотикони по същия начин. 🙃

Благодаря ви, че прочетохте.