Якось друг попросив допомогти з дипломною роботою і дав посилання на статтю, в якій говоритися про відновлення зображення за допомогою самоорганізованих карт Кохонена. Почитавши статтю, я спочатку вирішив, що це маячня якась, і що нейромережа до відновлення ніяким боком не стикується. Але, я трохи помилявся, виявилося, що цей метод дуже захоплюючий, і коли я його таки зробив, не міг набалуватися.
Як же це працює?
Карта Кохонена представляє з себе двомірну сітку NXxNY, що складається з нейронів. Кожен нейрон у сітці представляється квадратиком SxS - цей квадратик називається вектором ваги, значення якого дорівнює кольору відповідного пікселя.
Для навчання в мережу подаються фрагменти зображення SxS, після чого мережа шукає самий схожий на цей фрагмент нейрон, так званий BMU (best matching unit), і підганяє його вагові коефіцієнти таким чином, щоб він ще більше був схожий на поданий фрагмент. А потім ще тренує сусідів, але вже з меншою інтенсивністю. Чим далі відстоїть нейрон від BMU, тим менший внесок на нього надає поданий фрагмент. Так мережа навчається до тих пір, поки відхилення BMU для кожного поданого фрагмента досягне деякої мінімальної величини.
Ось пару прикладів, на першій картинці представлена мережа 120х120 з нейронами 3х3, а на другому малюнку мережа 24х24 з нейронами 15х15. Краса!
Відновлення відбувається подібним чином, береться фрагмент SxS пошкодженого зображення, і по не пошкоджених пікселях шукає BMU, після чого пошкоджені пікселі замінюються відповідними значеннями з вектора ваги нейрона.
Як нейромережа «бачить» картинку?
Щоб подивитися як нейромережа «бачить» картинку, я придумав наступний метод. Беремо навчену нейромережу, і для кожного пікселя в картинці створюємо фрагмент SxS, подаємо його в нейромережу, витягуємо з неї колір центрального пікселя і записуємо цей колір за тими ж координатами, але в нову картинку. Отримана в результаті картинка відображає потенціал відновлення зображення даною нейромережею. Для експірементів я використовував таку картинку
Завдяки цьому методу я виявив кілька цікавих властивостей.
- Чим більший розмір S - тим менш чітким виходить зображення
На зображенні показано зображення, створені з нейронами 3х3 і 15х15. Як видно, 3х3 взагалі мало чим відрізняється від оригіналу. У 15х15 вже виходить розмазаним.
- Чим більше нейронів у мережі, тим більше палітра кольорів.
На першій картинці використовувалася сітка 4х4, і 120х120 на другій. Як видно, у мережі 4х4 переходи між кольорами різкі.
- Чим більше ітерацій навчання, тим точніше відновлені кольори відповідають кольорам реальної картинки і тим краще видно деталі. На першій картинці використовувалася нейромережа 10x10, навчена на 10 фрагментах, а на другій на 10000 фрагментах.
До речі, зверніть увагу, відновлення добре навченої мережею 10х10 і 120х120 візуально дуже слабо відрізняються, тільки якщо сильно придивитися до деталей можна знайти невеликі відмінності.
Я оформив генератор у вигляді невеликого додатку, так що можна побалуватися самим (перевіряв на webkit і FF).
Відновлення невеликих випадкових пошкоджень
Невеликі випадкові пошкодження легко усуваються мережами з маленькими нейронами, наприклад 3х3 або 5х5 цілком достатньо. Вони працюють швидко і якісно. Ось приклад відновлення зображення в якому пошкоджено 25% пікселів, мережею 10x10 і нейронами 5х5
Для відновлення випадкових пошкоджень також зробив окремий додаток.
Відновлення великих областей
Щоб відновити великі пошкоджені ділянки, потрібно, щоб розмір нейрона S перевищував розмір пошкодженої області. Відповідно, чим більший розмір пошкоджень, тим більш розмазаною буде відновлена ділянка.
На малюнку показано відновлення фрагмента 10х10 мережею з нейроном 15х15
Відновлення < 20% відомих пікселів
На жаль, за такими зображеннями неможливо побудувати карту, тому на жаль, відновити їх безпосередньо не вийде, але зате їх можна відновити якщо взяти вже навчену мережу. На малюнку наведено приклад відновлення зображення по 12% відомих пікселів. Мережа тренувалася на розширеному зображенні.
По-моєму дуже непогано вийшло, для такого обсяг пошкоджень.
UPD: про практичне застосування, розроблених мною, додатків:
Метою мого дослідження є перевірити концепт, а не надати робочий додаток на всі випадки життя, тому всі розмови про яке-небудь серйозне практичне застосування тієї версії, яка існує на сьогоднішній день, не мають ніякого сенсу.
