Синтез зображень за допомогою глибоких нейромереж. Лекція в Яндексі

Нехай у блозі Яндекса на Хабрахабре цей тиждень пройде під знаком нейронних мереж. Як ми бачимо, нейромережі зараз починають використовуватися в дуже багатьох областях, включаючи пошук. Здається, що «модно» шукати для них нові сфери застосування, а в тих сферах, де вони працюють вже якийсь час, процеси не такі цікаві.

Однак події в світі синтезу візуальних образів доводять зворотне. Так, ще кілька років тому почали використовувати нейромережі для операцій з зображеннями — але це був не кінець шляху, а його початок. Нещодавно керівник групи комп'ютерного зору «Сколтеха» і великий друг Яндекса і ШАДа Віктор Лемпицкий розповів про декілька нових способах застосування мереж до зображень. Оскільки сьогоднішня лекція — про картинки, то вона дуже наочна.


Під катом — розшифровка і більшість слайдів.



Добрий вечір. Я сьогодні буду говорити про згорткові нейромережі і буду припускати, що більшість з вас провели останні чотири роки не на безлюдному острові, тому що-то про згорткові глибокі нейромережі чули, і знаєте приблизно, як саме вони обробляють дані.



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



Далі вона перетворює подібний набір з трьох зображень в набір із ста зображень, де кожен прямоугольничек уявляє собі справді значуще зображення, заданий в MATLAB-форматі.

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

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

Але говорити я сьогодні буду головним чином не про них, а про новий популярний клас моделей, який я буду називати перевернутими чи розгорнутими нейромереж.



Ось приклад такої перевернутої нейромережі. Це добре відома модель фрайбурзької групи, Досовицкого і колег, яка навчена брати деякий вектор параметрів і синтезувати зображення, яке їм відповідає.

Більш конкретно, на вхід цієї нейромережі подається вектор, який кодує клас, визначений тип стільця, і ще один вектор, який кодує геометричні параметри камери. На виході ця нейромережа синтезує зображення стільця і маску, яка відокремлює стілець від фону.

Як бачите, відмінність такої розгорнутої нейромережі від традиційної — в тому, що вона все робить в зворотному порядку. Зображення у нас тепер не на вході, а на виході. І уявлення, які виникають у цій нейромережі, спочатку є просто векторами, а в деякий момент перетворюються в набори зображень. Поступово зображення комбінуються один з одним за допомогою узагальнених згорток, і на виході виходять картинки.



В принципі, нейромережа, зазначена на попередньому слайді, була навчена на базі синтетичних зображень стільців, які були отримані з декількох сотень CAD-моделей стільців. Кожне зображення має міткою класу стільця і параметрами камери, відповідної даному зображенню.



Звичайна нейромережа візьме на вхід зображення стільця, передбачить нам тип стільця і характеристики камери.



Нейромережа Досовицкого все робить навпаки — генерує зображення стільця на виході. Сподіваюся, різниця зрозуміла.

Цікаво, що компоненти перевернутої нейромережі майже в точності повторюють компоненти звичайної нейромережі. Єдина новизна і новий модуль, який виникає, — модуль зворотного пулинга, анпулинга. Ця операція бере картинки меншого розміру і перетворить їх у зображення більшого розміру. Таке можна робити багатьма способами, які працюють приблизно однаково. Наприклад, статті вони брали карти маленького розміру, просто вставляли між ними нулі, далі обробляли подібні зображення.

Дана модель виявилася дуже популярною, викликала багато інтересу і наступних робіт. Зокрема, виявилося, що така нейромережа працює дуже добре, незважаючи на гадану незвичайність, екзотичність і неприродність такої ідеї — розгорнути нейромережа догори ногами, зліва направо. Вона здатна не тільки до заучування навчальної множини, але і до дуже хорошим узагальнень.



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

Якщо задати собі питання, чому це так добре працює, то є кілька відповідей. Мене найбільше переконують два. Перший: чому повинно працювати погано, якщо добре працюють прямі нейромережі? І прямі, і розгорнуті мережі використовують одне і те ж властивість натуральних зображень про те, що їх статистика локальна і зовнішній вид шматочків зображень не залежить від того, на яку частину глобального зображення ми дивимося. Така властивість дозволяє нам розділяти, переиспользовать параметри всередині згорткових шарів звичайних згорткових нейромереж, та це ж властивість використовують розгорнуті мережі, використовують успішно — вона дає їм можливість відносно невеликою кількістю параметрів обробляти і запам'ятовувати великі обсяги даних.

Друге властивість, менш очевидне й відсутнє в прямих нейромережах: при навчанні розгорнутої мережі у нас є набагато більше навчальних даних, ніж здається на перший погляд. Кожна картинка містить в собі сотні тисяч пікселів, а кожен піксель, хоч він і не є незалежним прикладом, так чи інакше накладає обмеження на параметри мережі. Як наслідок, подібну розгорнуту нейромережа можна ефективно навчити по безлічі зображень, яке буде менше, ніж було б потрібно для гарного навчання прямий мережі схожої архітектури з тією ж кількістю параметрів. Грубо кажучи, ми можемо навчити хорошу модель для стільців, використовуючи тисячі або десятки тисяч зображень, але не мільйон.

Сьогодні я хотів би розповісти про три поточних проекту, пов'язаних з розгорнутими нейромережами або, принаймні, нейромережами, що видають на виході зображення. Я навряд чи зможу заглибитися в подробиці — вони доступні за посиланням і в статтях нашої групи — але сподіваюся, такий пробіг по верхах продемонструє вам гнучкість і цікавість даного класу задач. Може бути, він призведе до якихось ідей про те, як ще можна використовувати нейромережі для синтезу зображень.



Перша ідея присвячена синтезу текстур і стилізації зображень. Я буду говорити про клас методів, що співпадає з тим, що відбувається в Prisma і схожих програмах. Все це розвивалося паралельно і навіть злегка випереджаючи Prisma та схожі програми. Використовуються в ній ці методи чи ні — ми напевно не знаємо, але у нас є якісь припущення.

Починається все з класичної задачі текстурного синтезу. Цим завданням люди в комп'ютерній графіці займалися десятиліттями. Зовсім коротко вона формулюється так: даний зразок текстури і потрібно запропонувати метод, який зможе за даним зразком генерувати нові зразки тієї ж текстури.

Завдання синтезу текстур у чому впирається в задачу порівняння текстур. Як зрозуміти, що ці два зображення відповідають схожим текстурам, а ці два — несхожим? Досить очевидно, що якісь прості підходи, наприклад, порівняти три зображення попіксельно попарно або подивитися на гістограми — не приведуть нас до успіху, тому що схожість у цієї пари виявиться такою ж, як і в цій. Багато дослідників ламали голову над тим, як визначити заходи схожості текстур, як визначити якийсь текстурний дескриптор, щоб якась проста міра в таких просунутих дескрипторах добре б говорила, є текстури схожими чи ні.



Півтора року тому групою в Тюбінгені був досягнутий певний прорив. Насправді, вони узагальнили більш ранній метод на основі статистики вейвлетів, яку вони замінили на статистику активацій. Вона створює зображення і викликає в деякій глибокої предобычной мережі.

У своїх звичайних експериментах вони брали велику глибоку нейромережа, навчену для класифікації. Надалі виявилося, що тут можливі варіанти: мережа навіть може бути глибокою з випадковими вагами, якщо вони були ініціалізується певним чином.

Так чи інакше, статистика визначається так. Візьмемо зображення, пропустимо його через перші кілька згорткових шарів нейромережі. На цьому шарі отримаємо набір карт зображень Fl(t). t — зразок текстури. Його набір карт зображень — на l-шарі.

Далі ми вважаємо статистику текстур — вона повинна якось виключати з себе параметри, пов'язані з просторовим розташуванням того чи іншого елемента. Природний підхід — взяти всі пари карт в поданні. Ми беремо всі пари карт, вважаємо всі попарні скалярні твори між цими парами, беремо i-ту карту і j-ту карту, далі k-тий індекс пробігає всі можливі просторові положення, ми вважаємо подібне скалярний добуток і отримуємо i, j коефіцієнт, член матриці Грама. l-матриця Грама, порахована таким чином, описує нашу текстуру.

Далі, коли треба порівняти, схожі чи два зображення як текстури, ми просто беремо певний набір шарів: це може бути один шар — тоді ця сума включає в себе один член. Чи можемо взяти кілька згорткових шарів. Порівнюємо матриці Грама, пораховані таким чином для цих двох зображень. Порівнювати їх ми можемо просто поелементно.

Виявляється, така статистика дуже добре говорить про те, схожі дві текстури чи ні, — краще, ніж все, що було запропоновано до роботи на слайді.



Тепер, коли у нас є дуже хороша міра, що дозволяє порівнювати текстури, ми можемо взяти деяке випадкове наближення, випадковий шум. Нехай поточне зображення позначається як х і є якийсь зразок t. ми будемо пропускати наш поточний стан через нейромережа, дивитися на його поточну матрицю Грама. Далі за допомогою алгоритму зворотного поширення — розуміти, як треба змінити поточне розповсюдження, щоб його матриці Грама всередині нейромережі стали трохи більше схожі на матриці Грама зразка, який ми хочемо синтезировть. Поступово наше гучне зображення перетвориться в набір каменів.



Працює це дуже добре. Ось приклад з їх статті. Праворуч приклад, який ми хочемо повторити, а зліва синтезована текстура. Головна проблема — час роботи. Для невеликих зображень воно становить багато секунд.

Ідея цього підходу — радикально прискорити процес генерації текстур через використання перевернутої нейромережі.



Було запропоновано підготувати для даного текстурного зразка нову розгорнуту нейромережа, яка б брала на вхід деякий шум і видавала нові зразки текстури.

Таким чином х — який в попередньому підході був деякої незалежної змінної і ми їй маніпулювали, намагаючись створити текстури, — тепер стає залежною змінною, виходом нової нейромережі. У неї свої параметри θ. Ідея в тому, щоб перенести навчання в окрему стадію. Тепер ми беремо і вчимо нейромережа, налаштовуючи її параметри так, щоб для довільних векторів шуму виходять зображення мали матриці Грама, відповідні нашим зразком.

Функції втрати залишаються тими ж, але тепер у нас з'являється додатковий модуль, який ми можемо предобучить заздалегідь. Мінусом є те, що тепер є довгострокова стадія навчання, але плюс в наступному: після навчання ми можемо синтезувати нові зразки текстури просто шляхом синтезу нового вектора шуму, пропуску його через нейромережа, і це займає кілька десятків мілісекунд.

Оптимізація нейромережі теж проводиться методом стохастичного градієнтного спуску, а наше навчання відбувається так: ми синтезуємо вектор шуму, пропускаємо його через нейромережа, вважаємо матриці Грама, дивимося розбіжності і зворотним поширенням через весь цей шлях розуміємо, як саме треба змінити параметри нейромережі.

Тут деякі деталі архітектури, я їх пропущу. Архітектура повністю сверточная, в ній немає повноз'вязних шарів, і кількість параметрів невелика. Така схема, зокрема, не дозволяє мережі просто завчити наданий їй приклад текстури так, щоб видавати його знову і знову.



Приклад роботи архітектури. Зліва заданий зразок, а праворуч три приклади, які кожна з трьох нейромереж у верхньому, нижньому та середньому ряду видає для даних зразків. І це відбувається за кілька десятків мілісекунд, а не за секунди, як раніше. Особливість архітектури дозволяє нам синтезувати текстури довільного розміру.



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





Посередині наведено зразок текстури, отриманої за допомогою методу Готисса (нерозбірливо — прим. ред.), оптимізації, а праворуч приклади текстур, які видаються нейромережею просто шляхом перетворення вектора шуму.



Насправді те, що відбувається, можна проінтерпретувати так: получающаяся нейромережа є псевдооптимизатором і для деяких векторів шуму генерує деякий гарне рішення, яке потім може бути покращено, наприклад, за допомогою оптимізаційного підходу. Але зазвичай цього не потрібно, тому що получающееся рішення візуально має трохи більшу функцію втрат, але по візуальному якості не сильно поступається або перевершує те, що можна отримати, продовжуючи оптимізацію.



Що цікаво, даний підхід цілком можна узагальнити для стилізації зображень. Мова йде про процеси, коли за заданою фотографії і заданим зразком візуального стилю будується нове зображення, що має той же вміст, що і фотографія, і той же візуальний стиль, що і зразок стилю.

Єдина зміна: наша нейромережа буде приймати на вхід не тільки вектор шуму, але й зображення, яке потрібно стилізувати. Вона навчається для довільного приклад стилю.



У вихідній статті не вийшло побудувати архітектуру, яка давала б результати, порівнянні за якістю з оптимізаційним підходом. Пізніше Дмитро Ульянов, перший автор статті, знайшов архітектуру, що дозволило радикально поліпшити якість і домогтися якості стилізації, порівнянного з оптимізаційним підходом.

Тут зверху — фотографія і приклад візуального стилю, а внизу результат стилізації такої нейромережі, що вимагає декількох десятків мілісекунд, і результат оптимізаційного методу, який, в свою чергу, вимагає многосекундной оптимізації.



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



Тут, напевно, швидше правий.



Але в такому варіанті виходить досить несподіваний для мене результат. Здається, що підхід, заснований на перевернутої розгорнутої нейромережі, домагається найкращої стилізації, в той час як оптимізаційний метод застряє десь в поганому локальному мінімумі або десь на плато — тобто не може до кінця стилізувати фотографію.

До стилізації ще повернемося. Другий проект пов'язаний з нейромережею, яка вирішує таку задачу. Нам хотілося побудувати мережу, здатну взяти фотографію обличчя людини і перенаправити його погляд на цій фотографії.



Навіщо нам знадобилося вирішувати таку екзотичну завдання? Виявляється, є принаймні два додатки, де вона актуальна. Головне для нас — завдання поліпшення зорового контакту при відеоконференціях. Напевно, багато хто помічав, що коли ви розмовляєте по Skype або іншому видеоконференционному сервісу, то не можете дивитися з співрозмовником один одному в очі, тому що камера і обличчя співрозмовника рознесені по місцю розташування.

Ще одне застосування — постобробка кінофільмів. У вас є якась суперзірка, в якій хвилина зйомки коштує мільйон доларів. Ви відзняли дубль, а ця суперзірка подивилася не туди. І тепер треба або перезняти дубль, або — підредагувати напрямок погляду.



Щоб вирішити таке завдання, ми зібрали велику кількість послідовностей. В рамках них ми фіксували положення голови, освітлення — все, крім напрямку погляду. Протокол був такий, що ми могли відстежувати, куди людина дивиться. Кожен кадр анонсований відповідним напрямком погляду.



Це дозволило нам витягати з такого набору даних пари прикладів, для яких ми знаємо: єдина відмінність між зображеннями ліворуч і праворуч — напрям погляду. Наприклад, тут у кожному разі відміну становить 15 градусів у вертикальному напрямку.

Ми практично перейшли від такої складної задачі до класичної задачі навчання з вчителем. У нас є приклад зліва, і нам потрібно згенерувати приклад праворуч. На жаль, просто вирішувати цю задачу за допомогою чорного ящика, як казав Сергій, не виходить. Ми багато разів пробували чорний ящик, навіть темно-сірий ящик. Оскільки у нас вхід і вихід мають досить складну структуру, а навчальних даних досить багато, ми довго мучили людей. Рішення з допомогою чорного ящика не працює. Потрібно використовувати якусь специфіку задачі, а саме — те, що праве зображення може бути досить непогано наближене лівим зображенням після деякої нежорсткої деформації.



Була побудована нейромережа, яка приймає на вхід зображення зліва, а також бере положення особливих точок очі на даному зображенні. При цьому зображення кодується трьома картамиЕ червоної, зеленої та синьої. Кожна особлива точка теж кодується картою. Далі вона приймає на вхід кут, на який ми хочемо скерувати погляд на картинці, і будує поле викривлення, деформації. Потім таке поле застосовується до вхідного зображення дифференцируемым чином за допомогою spatial transformer layer. Він зараз є, наприклад, в torch і багатьох інших бібліотеках.

Для кожного прикладу в навчальній вибірці ми знаємо, як він повинен виглядати після деформації. Тому ми можемо порівняти те, що вийшло, і те, що повинно було вийти, порахувати втрати функції і після цього настроїти параметри нашої нейромережі зі стохастически градієнтним спуском так, щоб кінцевий результат був якомога ближче до GT.

Після слід якесь ускладнення моделі. Перший рівень вважає якесь грубе поле зміщень, другий — уточнює таке поле, а третій — моделює ті перетворення, які неможливо моделювати з допомогою ворпинга. Скажімо, при перенаправленні погляду вгору зазвичай характерним чином змінюється освітленість — бо джерело світла зазвичай розташований зверху, і таке не можна змоделювати за допомогою ворпинга. Відповідно, додається модуль, затемнює або освітлюючий деякі пікселі.

Всі три модулі тренуються разом з початку до кінця в процесі єдиного стохастичного спуску. Потім ми можемо застосовувати звичайну мережу до нових зображень, які вона ніколи не бачила, і отримувати приблизно такі результати. В даному випадку ми кожен раз беремо статичну картинку, беремо фіксовану нейромережа і, подаючи різні кути на вхід, можемо отримувати такі кумедні відео.



Ось ще статичні приклади. Така нейромережа додає плюс-мінус 15 градусів у вертикальному напрямку. Жоден з цих людей не представлений в тренувальному безлічі.



Приклад для горизонтального перенаправлення.



Ще набір прикладів. Ми раді сказати, що готується до випуску веб-демо, куди кожен зможе довантажити картинку і подивитися на результати.

Нарешті, третя система. Це зовсім свіжа стаття, перший раз про неї розповідаю. Вона присвячена нейросетям, які вчать візуальні маркери.

Візуальні маркери нас оточують і стають все більш помітними. Мова йде про зображення, в яких комп'ютером — і для комп'ютера ж — зашита якась інформація. Такі зображення виникають у реальному людському світі і володіють деякими небажаними властивостями. Вони, наприклад, естетично неідеальні. Я кажу про таких прикладах, як QR-коди, бар-коди.

Ще вони неідеальні з концептуальної точки зору в тому сенсі, що процес дизайну маркера і процес написання розпізнавання маркера розділені. Спочатку хтось придумав, як визначити маркер, як маркер повинен бути влаштований, а потім для нього вже пишеться розпізнавач.

Наша ідея — об'єднати процес створення маркера і процес створення розпізнавання маркера в єдиний оптимізаційний процес і паралельно домогтися деяких естетичних властивостей одержуваних маркерів.

Ми будуємо деяку ланцюжок нейромереж. Перша нейромережа називається синтезатором. Синтезатор бере на вхід послідовність біт, яку ми хочемо закодувати, і, будучи звичайною перевернутої розгорнутої нейромережею, перетворює її в зображення. Це точно така ж нейромережа, як та, про яку я говорив на початку доповіді.

Потім друга нейромережа бере отриманий маркер і симулює процес його роздрукування, вішання на стіну і фотографування. Іншими словами, вона перетворює такий маркер як комп'ютерний файл в маркер-фотографію на стіні. Це моделюється шляхом кількох перетворень — таких як накладення на фон, фільтрація, блюр і т. д.

Така нейромережа не містить параметрів, що настроюються. Замість цього в процесі навчання ми синтезуємо випадкові параметри, і вона таким чином перетворює зображення.

Остання нейромережа — стандартна і пряма. Вона приймає на вхід картинку і намагається встановити закодоване зображення. Ми можемо навчати весь ланцюжок, параметри синтезатора і параметри розпізнавання разом, шляхом мінімізації різниці між вхідний і вихідний рядками.

Ми можемо подивитися, які саме маркери нашої системи выучатся. Головна ідея, що синтезатор буде адаптований під розпізнавач, а розпізнавач — під синтезатор.



На даному слайді є приклади картинок. Кожна шістка відповідає набору маркерів, які, в свою чергу, відповідають випадковим бітовим послідовності. Зрозуміло, що вони відрізняються залежно від кількості біт, від того, наскільки сильні спотворення вносить розпізнавач, чорно-білі ми хочемо маркери або кольорові.

В цілому, вони мають цікаву регулярну структуру — якусь гармонійну, синусоїдальну.

Забавно їх порівняти з подібними візуальними ілюзіями для мереж. Їх багато групи запропонували, щоб викликати у фіксованих предобученных распознавателях деякі респонс.

Потім ми можемо роздрукувати отримані маркери, сфотографувати їх і переконатися, що наша нейромережа досить добре розпізнає закодовані в них біти.



Що найцікавіше, далі ми можемо в наше навчання додати новий модуль, який буде дивитися на отримувані маркери і робити їх схожими на приклади деяких текстур — в точності як я розповідав у другій частині доповіді.



Все це відбувається в рамках єдиного оптимізаційного процесу і дозволяє нам синтезувати маркери, подібні тим, що на слайді. Зліва заданий зразок текстури, праворуч — зразки маркерів для випадкових послідовностей. Цікавий факт: дивлячись на ці маркери, можна побачити, що деякі камінці не змінюються від маркера до маркера, а деякі частини маркера змінюються в залежності від біта. Така ситуація в точності відповідає тому, що відбувається в QR-коді, де у вас є по кутах чотири якорі, які не змінюються і використовуються для локалізації і є змінна частина коду. Ця нейромережа вивчила такий ефект — він не зашитий в її архітектуру.



Ще два приклади. Нейромережа навчається писемності.

Нейромережа навчається на фотографії храму Василя Блаженного. Нам здалося, що було б здорово, якщо б величезні QR-коди, налепленные на стінах в Москві, замінилися б чимось більш цікавим.



Я представив три статті. Хотів би подякувати своїх співавторів. Це їх результати, і в даній області є багато чого невирішеного. Головна невирішене завдання, на мій погляд, — побудова нейромереж, здатних синтезувати великі нові фотографії. Зараз багато вміють синтезувати по фотографії версію Ван Гога, але я не знаю нейромереж, які можуть по зображенню Ван Гога синтезувати вихідну фотографію. Це цікава невирішена задача. Спасибі.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.