Вдъхване на живот в монохромното: Дълбоко обучение за оцветяване

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

Внасянето на цвят в изображение в сива скала представлява завладяващо предизвикателство. Значително количество информация – оригиналните хроматични данни – по своята същност се губи, когато изображението се рендира в монохромно. Как може един алгоритъм да знае истинския цвят на цвете, рокля или небето само от стойностите на яркостта? Отговорът се крие в фините улики, вградени в самото изображение в сива скала: текстури, форми, контекст и взаимодействието на светлина и сянка. Докато определянето на точния оригинален цвят може да е невъзможно (тази роза наистина ли беше пурпурна, или може би нюанс на розово?), целта се измества към създаване на правдоподобно и естетически убедително оцветяване. Целта е да се създаде изображение, което човешки наблюдател би намерил за достоверно, дори потенциално неразличимо от оригинална цветна фотография.

Моделите за дълбоко обучение се отличават с разкриването на сложни модели и статистически връзки в огромни набори от данни. Чрез обучение на тези модели върху милиони изображения, сравнявайки версиите в сива скала с техните оригинални цветни аналози, алгоритмите се научават да свързват специфични текстури и структури с вероятни цветове. Те научават, че тревата обикновено е зелена, небето често е синьо и определени текстури съответстват на дървесна шарка или плат. Това е подобно на информирано предположение, но такова, което се основава на огромна визуална енциклопедия. Алгоритъмът не “знае” истинския цвят в човешкия смисъл, но може да прави силно вероятни прогнози въз основа на научени корелации.

Езикът на цвета: CIELab и невронните мрежи

За да се справим с оцветяването по изчислителен път, се нуждаем от подходящ начин за представяне на цвета. Докато RGB (Red, Green, Blue) е често срещан за дисплеи, той смесва информация за яркост (luminance) и цветност (chrominance). По-изгодна система за тази задача е цветовото пространство CIELab. Този модел елегантно разделя цвета на три отделни компонента:

  • L (Lightness): Този канал представлява информацията в сива скала, варираща от чисто черно до чисто бяло. Това по същество са входните данни, които вече имаме в черно-бяло изображение.
  • a: Този канал кодира спектъра от зелено (отрицателни стойности) до червено (положителни стойности).
  • b: Този канал кодира спектъра от синьо (отрицателни стойности) до жълто (положителни стойности).

Красотата на CIELab се крие в това разделяне. Нашият модел за дълбоко обучение може да се съсредоточи върху прогнозирането на двата канала за цветност (‘a’ и ‘b’) въз основа единствено на входния канал за яркост (‘L’). Основната задача става: като се има предвид информацията в сива скала (L), кои са най-вероятните съответни стойности ‘a’ и ‘b’ за всеки пиксел?

Ранните опити често използваха Конволюционни Невронни Мрежи (CNNs) – тип архитектура за дълбоко обучение, особено подходяща за обработка на данни с решетъчна структура като изображения. Тези мрежи бяха обучени върху големи набори от данни с изображения (като ImageNet), за да предсказват директно стойностите ‘a’ и ‘b’ за всеки пиксел, третирайки го като регресионен проблем (предсказване на непрекъснати стойности). Въпреки това се появи често срещан недостатък: получените оцветявания често изглеждаха ненаситени или приглушени. Защо? Помислете за обект като ябълка. Тя може правдоподобно да бъде червена, зелена или дори жълта. Ако мрежата се опита да осредни тези възможности по време на регресия, тя може да се спре на скучен, кафеникав компромис вместо на ярък, специфичен цвят. Този ефект на осредняване между множество правдоподобни цветове имаше тенденция да измива резултатите.

Промяна на парадигмата: Оцветяването като класификация

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

Ето концептуалната промяна:

  1. Квантувано цветово пространство: Непрекъснатият спектър от възможни стойности ‘a’ и ‘b’ се дискретизира в предварително определен набор от представителни цветови “кофи” или класове. Мислете за това като за намаляване на огромна палитра до управляем, но всеобхватен набор от различни цветови опции в равнината ‘a’-‘b’.
  2. Предсказване на вероятности: За всеки пиксел във входното изображение в сива скала, CNN не предсказва единична стойност ‘a’ и ‘b’. Вместо това, тя извежда разпределение на вероятностите по квантуваните цветови кофи. По същество тя казва: “За този пиксел има 70% шанс да принадлежи към ‘ярко червена кофа #5’, 20% шанс да е ‘бледо червена кофа #2’, 5% шанс да е ‘кафеникава кофа #12’” и т.н.
  3. Справяне с неяснотата: Този вероятностен подход по своята същност се справя с цветовата неяснота. Ако даден обект може да бъде в няколко цвята (като ябълката), мрежата може да присвои значителни вероятности на няколко различни цветови кофи, отразявайки тази несигурност, без да прибягва до безлично осредняване.
  4. Декодиране до ярък цвят: Последната стъпка включва преобразуването на това разпределение на вероятностите обратно в един, специфичен цвят за всеки пиксел. Наивен подход може да бъде просто да се избере цветовата кофа с най-висока вероятност (модата). Въпреки това, за да се насърчи наситеността и да се избегне проблемът с ненаситеността, се използват техники като изчисляване на отгрятото средно (annealed mean) на разпределението. Този метод дава по-голяма тежест на по-малко вероятни, но по-цветни (с по-висока наситеност) прогнози, ефективно “разрешавайки равенствата” в полза на наситеността, като същевременно все още зачита цялостното предсказано разпределение.

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

Надникване под капака: Практически работен процес с дълбоко обучение

Докато обучението на такава сложна CNN от нулата е монументална задача, изискваща огромни изчислителни ресурси и обширни набори от данни, използването на предварително обучени модели прави тази технология достъпна. Нека разгледаме концептуалните стъпки, включени в използването на предварително обучен модел за дълбоко обучение (по-специално такъв, изграден с помощта на рамката Caffe, както в оригиналния пример) за оцветяване на изображения, реализиран с помощта на Python и често използвани библиотеки.

1. Сглобяване на инструментариума:

Основата обикновено включва Python, универсален език за програмиране, популярен в науката за данните и AI. Ключови библиотеки играят решаваща роля:

  • NumPy: От съществено значение за ефективни числови операции, особено за работа с многомерните масиви, които представляват изображения.
  • OpenCV (cv2): Мощна библиотека за задачи в областта на компютърното зрение. Тя предоставя функции за четене, запис, манипулиране и показване на изображения и, което е от решаващо значение, включва модул за Дълбоки Невронни Мрежи (DNN), способен да зарежда и изпълнява модели, обучени в различни рамки като Caffe, TensorFlow и PyTorch.
  • Argparse: Стандартна библиотека на Python за създаване на лесни за използване интерфейси на командния ред, позволяващи на потребителите лесно да задават входни параметри като пътя до файла с изображението.
  • OS: Използва се за основни взаимодействия с операционната система, като конструиране на пътища до файлове по начин, който работи на различни системи (Windows, macOS, Linux).

2. Придобиване на предварително обучената интелигентност:

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

  • Файл с архитектурата на модела (.prototxt за Caffe): Този файл дефинира структурата на невронната мрежа – слоевете, техните типове, връзки и параметри. Това е планът на модела.
  • Файл с обучени тегла (.caffemodel за Caffe): Този файл съдържа числовите тегла, научени от мрежата по време на нейното обширно обучение. Тези тегла капсулират “знанието”, което моделът е придобил за картографиране на характеристики в сива скала към вероятности за цвят. Това е дестилираната интелигентност.
  • Данни за квантуване на цветовете (.npy файл): Този файл на NumPy обикновено съхранява централните точки на квантуваните цветови кофи, използвани в описания по-горе класификационен подход. Той действа като референтна палитра за предсказаните вероятности за цвят.

Тези файлове представляват кулминацията на потенциално седмици или месеци обучение на мощен хардуер.

3. Зареждане на механизма за оцветяване:

След като необходимите файлове са локализирани, DNN модулът на OpenCV предоставя механизма за зареждане на предварително обучената мрежа в паметта. Функцията cv2.dnn.readNetFromCaffe (или еквиваленти за други рамки) приема файловете с архитектурата и теглата като вход и инстанцира мрежата, правейки я готова за извод (процесът на правене на прогнози върху нови данни). Точките за квантуване на цветовете от файла .npy също се зареждат, обикновено с помощта на NumPy.

4. Фина настройка на мрежовите компоненти (ако е необходимо):

Понякога специфични слоеве в предварително обучената мрежа се нуждаят от леки корекции преди извода. В контекста на обсъждания модел за оцветяване, базиран на класификация:

  • Корекция на изходния слой: Последният слой, отговорен за извеждането на прогнозите за каналите ‘a’ и ‘b’ (напр. наречен class8_ab в референтния модел), може да се наложи да бъде изрично зареден с центровете на цветовите кофи от файла .npy. Това гарантира, че изходните вероятности на мрежата правилно се съпоставят с предварително дефинираната цветова палитра. Точките често се преоформят и преобразуват до подходящия тип данни (напр. float32), преди да бъдат присвоени на “blobs” на слоя (Caffe термин за контейнери с данни).
  • Ребалансиране на цветовете: Друг слой (напр. conv8_313_rh) може да бъде коригиран, за да повлияе на баланса между различните цветове в изхода, потенциално повишавайки наситеността или коригирайки отклонения, научени по време на обучението. Това често включва задаване на blobs на слоя на специфични научени стойности (като стойността 2.606, спомената в оригиналния код, вероятно получена емпирично или по време на обучение).

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

5. Подготовка на входното изображение:

Входното изображение в сива скала трябва да премине през няколко стъпки на предварителна обработка, преди да бъде подадено към невронната мрежа:

  • Зареждане: Изображението се чете от указания път на файла с помощта на cv2.imread. Дори ако е в сива скала, OpenCV може да го зареди по подразбиране като 3-канално BGR изображение, дублирайки сивата стойност във всички канали.
  • Нормализация: Стойностите на пикселите, обикновено вариращи от 0 до 255, се мащабират до по-малък диапазон, често от 0.0 до 1.0, чрез деление на 255.0. Тази нормализация помага за стабилизиране на процеса на обучение и извод на мрежата.
  • Преобразуване на цветовото пространство: Изображението се преобразува от стандартното цветово пространство BGR в цветовото пространство CIELab с помощта на cv2.cvtColor. Това е от решаващо значение за изолиране на канала за яркост (L).
  • Преоразмеряване: Повечето предварително обучени CNN очакват входни изображения с фиксиран размер (напр. 224x224 пиксела, често срещан стандарт, повлиян от набори от данни като ImageNet). Изображението LAB се преоразмерява съответно с помощта на cv2.resize. Тази стандартизация осигурява съвместимост с архитектурата на мрежата.
  • Изолиране и центриране на L канала: Каналът за яркост (L) се извлича от преоразмереното LAB изображение. Често неговите стойности (обикновено 0-100 в LAB) след това се центрират около нула чрез изваждане на средна стойност (напр. 50). Това центриране е друга често срещана практика, която може да подобри производителността на мрежата.

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

6. Стъпката на извода: Предсказване на цвят:

Тук се случва магията:

  • Създаване на Blob: Обработеният L канал (сега 2D масив) се преобразува в “blob”, 4-измерен формат на масив, очакван от DNN модула (cv2.dnn.blobFromImage). Този формат обикновено включва измерения за размер на партидата, канали, височина и ширина.
  • Пряко преминаване (Forward Pass): Blob-ът се задава като вход към заредената мрежа с помощта на net.setInput. След това се извиква методът net.forward(). Това задейства изчислението: входните данни преминават през слоевете на мрежата, претърпявайки трансформации, диктувани от научените тегла, като в крайна сметка произвеждат предсказания изход. За нашия модел за оцветяване изходът представлява предсказаните канали ‘a’ и ‘b’ (или по-скоро разпределенията на вероятностите по цветовите кофи).
  • Преоформяне на изхода: Суровият изход от мрежата трябва да бъде преоформен и транспониран обратно в 2D пространствен формат, съответстващ на каналите ‘a’ и ‘b’.

Мрежата вече е генерирала най-доброто си предположение за цветовата информация въз основа на входното изображение в сива скала.

7. Реконструиране на цветното изображение:

Последният етап включва комбиниране на предсказаната цветова информация с данните от оригиналното изображение:

  • Преоразмеряване на предсказаните канали: Предсказаните канали ‘a’ и ‘b’ (които в момента са с размер 224x224, съответстващ на входа на мрежата) трябва да бъдат преоразмерени обратно до оригиналните размери на входното изображение с помощта на cv2.resize. Това гарантира, че цветовата информация се подравнява правилно със структурата на оригиналното изображение.
  • Извличане на оригиналната яркост: От решаващо значение е каналът за яркост (L) да се извлече от оригиналното, пълноразмерно LAB изображение (създадено по време на предварителната обработка преди преоразмеряването). Използването на оригиналния L канал запазва оригиналните детайли и структура на яркостта на изображението, които биха се влошили, ако се използва преоразмереният L канал.
  • Конкатенация: Оригиналният L канал се комбинира (конкатенира) с преоразмерените, предсказани канали ‘a’ и ‘b’ по оста на цветовия канал. Това сглобява отново пълно LAB изображение, вече с предсказан цвят.
  • Преобразуване обратно в показваем формат: Полученото LAB изображение се преобразува обратно в цветовото пространство BGR с помощта на cv2.cvtColor, тъй като това е стандартният формат, очакван от повечето функции за показване на изображения (като cv2.imshow).
  • Изрязване и мащабиране: Стойностите на пикселите в BGR изображението, които в момента са в нормализирания диапазон (вероятно 0.0 до 1.0), се изрязват, за да се гарантира, че остават в този валиден диапазон (стойностите понякога могат леко да надхвърлят границите поради процеса на предсказване). След това те се мащабират обратно до стандартния целочислен диапазон 0-255, необходим за показване или запазване като стандартен файл с изображение.

8. Визуализация:

Накрая, функции като cv2.imshow могат да се използват за показване на оригиналното изображение в сива скала заедно с неговия новооцветен аналог, позволявайки незабавно визуално сравнение.

Изпълнение на процеса:

Обикновено скрипт, реализиращ тези стъпки, се изпълнява от командния ред. Използвайки настройката argparse, потребителят предоставя пътя до входното изображение в сива скала като аргумент (напр. python colorize_image.py --image my_photo.jpg). След това скриптът изпълнява стъпките за зареждане, предварителна обработка, извод и реконструкция, като в крайна сметка показва или запазва оцветения резултат.

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