تنهای سپیا و گرادیانهای خاکستری عکسهای قدیمی جذابیت منحصر به فردی دارند و لحظاتی یخزده در زمان را ثبت میکنند. با این حال، آنها اغلب فاقد فوریت پر جنب و جوش صحنه اصلی هستند. تصور کنید که رنگهای زندگی را دوباره به این خاطرات گرامی بدمید، و یک پرتره سیاه و سفید محو شده را به پنجرهای تبدیل کنید که دنیای سوژه را با رنگ کامل آشکار میکند. این فرآیند تحولآفرین، که به عنوان رنگیسازی تصویر شناخته میشود، مدتهاست که هنرمندان و مورخان را مجذوب خود کرده است. امروزه، با پیشرفتهای هوش مصنوعی، به ویژه یادگیری عمیق، رنگیسازی خودکار به نتایجی دست مییابد که زمانی در قلمرو داستانهای علمی تخیلی بود.
آوردن رنگ به یک تصویر خاکستری چالشی جذاب را ارائه میدهد. مقدار قابل توجهی از اطلاعات - دادههای رنگی اصلی - ذاتاً هنگام رندر شدن یک تصویر به صورت تکرنگ از بین میرود. چگونه یک الگوریتم میتواند رنگ واقعی یک گل، یک لباس یا آسمان را تنها از روی مقادیر روشنایی بداند؟ پاسخ در سرنخهای ظریفی نهفته است که در خود تصویر خاکستری تعبیه شدهاند: بافتها، شکلها، زمینه و تعامل نور و سایه. در حالی که تعیین رنگ اصلی دقیق ممکن است غیرممکن باشد (آیا آن گل رز واقعاً قرمز تیره بود، یا شاید سایهای از صورتی؟)، هدف به سمت ایجاد یک رنگیسازی قابل قبول و از نظر زیباییشناختی قانعکننده تغییر میکند. هدف تولید تصویری است که یک ناظر انسانی آن را باورپذیر بیابد، حتی به طور بالقوه از یک عکس رنگی اصلی قابل تشخیص نباشد.
مدلهای یادگیری عمیق در کشف الگوهای پیچیده و روابط آماری در مجموعه دادههای عظیم برتری دارند. با آموزش این مدلها بر روی میلیونها تصویر، مقایسه نسخههای خاکستری با همتایان رنگی اصلی آنها، الگوریتمها یاد میگیرند که بافتها و ساختارهای خاص را با رنگهای محتمل مرتبط کنند. آنها یاد میگیرند که چمن معمولاً سبز است، آسمانها اغلب آبی هستند و بافتهای خاصی با بافت چوب یا پارچه مطابقت دارند. این شبیه به یک حدس آگاهانه است، اما حدسی که توسط یک دایرهالمعارف بصری عظیم اطلاعرسانی شده است. الگوریتم رنگ واقعی را به معنای انسانی ‘نمیداند’، اما میتواند پیشبینیهای بسیار محتملی را بر اساس همبستگیهای آموخته شده انجام دهد.
زبان رنگ: CIELab و شبکههای عصبی
برای مقابله محاسباتی با رنگیسازی، به روشی مناسب برای نمایش رنگ نیاز داریم. در حالی که RGB
(قرمز، سبز، آبی) برای نمایشگرها رایج است، اطلاعات روشنایی (brightness) و رنگینگی (chrominance) را با هم ترکیب میکند. یک سیستم سودمندتر برای این کار، فضای رنگی CIELab
است. این مدل به زیبایی رنگ را به سه مؤلفه مجزا تقسیم میکند:
L
(Lightness): این کانال اطلاعات خاکستری را نشان میدهد، از سیاه خالص تا سفید خالص. این اساساً دادههای ورودی است که ما قبلاً در یک تصویر سیاه و سفید داریم.a
: این کانال طیف از سبز (مقادیر منفی) تا قرمز (مقادیر مثبت) را رمزگذاری میکند.b
: این کانال طیف از آبی (مقادیر منفی) تا زرد (مقادیر مثبت) را رمزگذاری میکند.
زیبایی CIELab
در این جداسازی نهفته است. مدل یادگیری عمیق ما میتواند بر پیشبینی دو کانال رنگینگی (‘a
‘ و ‘b
‘) تنها بر اساس کانال ورودی روشنایی (‘L
‘) تمرکز کند. وظیفه اصلی این میشود: با توجه به اطلاعات خاکستری (L
)، محتملترین مقادیر ‘a
‘ و ‘b
‘ مربوطه برای هر پیکسل چیست؟
تلاشهای اولیه اغلب از شبکههای عصبی کانولوشنی (CNN
ها) استفاده میکردند - نوعی معماری یادگیری عمیق که به ویژه در پردازش دادههای شبکهمانند مانند تصاویر مهارت دارد. این شبکهها بر روی مجموعه دادههای تصویری بزرگ (مانند ImageNet
) آموزش داده شدند تا مستقیماً مقادیر ‘a
‘ و ‘b
‘ را برای هر پیکسل پیشبینی کنند و آن را به عنوان یک مسئله رگرسیون (پیشبینی مقادیر پیوسته) در نظر بگیرند. با این حال، یک دام رایج پدیدار شد: رنگیسازیهای حاصل اغلب کمرنگ یا مات به نظر میرسیدند. چرا؟ یک شیء مانند سیب را در نظر بگیرید. به طور قابل قبولی میتواند قرمز، سبز یا حتی زرد باشد. اگر شبکه سعی کند این احتمالات را در طول رگرسیون میانگین بگیرد، ممکن است به جای یک رنگ خاص و پر جنب و جوش، روی یک مصالحه کسلکننده و مایل به قهوهای قرار گیرد. این اثر میانگینگیری در میان چندین رنگ قابل قبول، تمایل به شستن نتایج داشت.
تغییر پارادایم: رنگیسازی به عنوان طبقهبندی
برای غلبه بر مشکل کمرنگی و تولید رنگهای زندهتر و واقعیتر، یک رویکرد پیچیدهتر مسئله را بازتعریف میکند. به جای در نظر گرفتن پیشبینی رنگ به عنوان رگرسیون، آن را به عنوان یک وظیفه طبقهبندی مشاهده میکند.
در اینجا تغییر مفهومی وجود دارد:
- فضای رنگی کوانتیزه شده: طیف پیوسته مقادیر ممکن ‘
a
‘ و ‘b
‘ به مجموعهای از پیش تعریف شده از ‘سطلها’ یا کلاسهای رنگی نماینده گسسته میشود. به آن به عنوان کاهش یک پالت گسترده به مجموعهای قابل مدیریت، اما جامع، از گزینههای رنگی متمایز در صفحه ‘a
‘-‘b
‘ فکر کنید. - پیشبینی احتمالات: برای هر پیکسل در تصویر خاکستری ورودی،
CNN
یک مقدار واحد ‘a
‘ و ‘b
‘ را پیشبینی نمیکند. در عوض، یک توزیع احتمال را در میان سطلهای رنگی کوانتیزه شده خروجی میدهد. اساساً میگوید: ‘برای این پیکسل، 70٪ احتمال وجود دارد که به ‘سطل قرمز پر جنب و جوش شماره 5’ تعلق داشته باشد، 20٪ احتمال دارد که ‘سطل قرمز کمرنگ شماره 2’ باشد، 5٪ احتمال دارد که ‘سطل مایل به قهوهای شماره 12’ باشد، و غیره. - پرداختن به ابهام: این رویکرد احتمالی ذاتاً ابهام رنگ را مدیریت میکند. اگر یک شیء میتواند چندین رنگ داشته باشد (مانند سیب)، شبکه میتواند احتمالات قابل توجهی را به چندین سطل رنگی مختلف اختصاص دهد، که این عدم قطعیت را بدون توسل به یک میانگین بیروح منعکس میکند.
- رمزگشایی به رنگ پر جنب و جوش: مرحله نهایی شامل ترجمه این توزیع احتمال به یک رنگ واحد و خاص برای هر پیکسل است. یک رویکرد ساده ممکن است این باشد که به سادگی سطل رنگی با بالاترین احتمال (مد) را انتخاب کنید. با این حال، برای تشویق به سرزندگی و جلوگیری از مشکل کمرنگی، از تکنیکهایی مانند محاسبه میانگین آنیل شده توزیع استفاده میشود. این روش وزن بیشتری به پیشبینیهای کمتر محتمل اما رنگارنگتر (اشباع بالاتر) میدهد، و به طور مؤثر ‘گرهها را به نفع سرزندگی باز میکند’ در حالی که همچنان به توزیع پیشبینی شده کلی احترام میگذارد.
این چارچوب طبقهبندی، همراه با طراحی دقیق تابع هزینه (معیار مورد استفاده برای ارزیابی عملکرد مدل در طول آموزش) به طور خاص برای رنگیسازی، به مدل اجازه میدهد تا رابطه پیچیده بین ویژگیهای خاکستری و توزیع رنگهای محتمل را بیاموزد. نتیجه تصاویری است که نه تنها به طور قابل قبولی رنگی شدهاند، بلکه دارای غنا و جذابیت بصری هستند که اغلب در روشهای مبتنی بر رگرسیون قبلی وجود نداشت.
نگاهی به زیر کاپوت: یک گردش کار عملی یادگیری عمیق
در حالی که آموزش چنین CNN
پیچیدهای از ابتدا یک کار عظیم است که به منابع محاسباتی عظیم و مجموعه دادههای گسترده نیاز دارد، استفاده از مدلهای از پیش آموزش دیده این فناوری را در دسترس قرار میدهد. بیایید مراحل مفهومی مربوط به استفاده از یک مدل یادگیری عمیق از پیش آموزش دیده (به طور خاص مدلی که با استفاده از چارچوب Caffe
ساخته شده است، مانند مثال اصلی) برای رنگیسازی تصویر، که با استفاده از پایتون و کتابخانههای رایج پیادهسازی شده است، را مرور کنیم.
۱. گردآوری جعبه ابزار:
پایه معمولاً شامل پایتون است، یک زبان برنامهنویسی همهکاره که در علم داده و هوش مصنوعی محبوب است. کتابخانههای کلیدی نقشهای حیاتی ایفا میکنند:
NumPy
: برای عملیات عددی کارآمد، به ویژه مدیریت آرایههای چند بعدی که تصاویر را نشان میدهند، ضروری است.OpenCV
(cv2
): یک کتابخانه قدرتمند برای وظایف بینایی کامپیوتر. توابعی را برای خواندن، نوشتن، دستکاری و نمایش تصاویر فراهم میکند و به طور حیاتی، شامل یک ماژول شبکه عصبی عمیق (DNN
) است که قادر به بارگیری و اجرای مدلهای آموزش دیده در چارچوبهای مختلف مانندCaffe
،TensorFlow
وPyTorch
است.Argparse
: یک کتابخانه استاندارد پایتون برای ایجاد رابطهای خط فرمان کاربرپسند، که به کاربران امکان میدهد به راحتی پارامترهای ورودی مانند مسیر فایل تصویر را مشخص کنند.OS
: برای تعاملات اولیه سیستم عامل، مانند ساخت مسیرهای فایل به روشی که در سیستمهای مختلف (ویندوز،macOS
، لینوکس) کار کند، استفاده میشود.
۲. کسب هوش از پیش آموزش دیده:
به جای ساختن شبکه عصبی آجر به آجر، ما از فایلهایی استفاده میکنیم که نمایانگر شبکهای هستند که قبلاً برای رنگیسازی آموزش دیدهاند. اینها معمولاً شامل موارد زیر است:
- فایل معماری مدل (
.prototxt
برایCaffe
): این فایل ساختار شبکه عصبی را تعریف میکند - لایهها، انواع آنها، اتصالات و پارامترها. این طرح اولیه مدل است. - فایل وزنهای آموزش دیده (
.caffemodel
برایCaffe
): این فایل حاوی وزنهای عددی است که شبکه در طول فرآیند آموزش گسترده خود آموخته است. این وزنها ‘دانش’ی را که مدل در مورد نگاشت ویژگیهای خاکستری به احتمالات رنگ به دست آورده است، در بر میگیرند. این هوش تقطیر شده است. - دادههای کوانتیزاسیون رنگ (فایل
.npy
): این فایلNumPy
معمولاً نقاط مرکزی سطلهای رنگی کوانتیزه شده را که در رویکرد طبقهبندی شرح داده شده قبلی استفاده میشود، ذخیره میکند. این به عنوان پالت مرجع برای احتمالات رنگ پیشبینی شده عمل میکند.
این فایلها نقطه اوج هفتهها یا ماهها آموزش بالقوه بر روی سختافزار قدرتمند را نشان میدهند.
۳. بارگیری موتور رنگیسازی:
با قرار گرفتن فایلهای لازم، ماژول DNN
OpenCV
مکانیزمی را برای بارگیری شبکه از پیش آموزش دیده در حافظه فراهم میکند. تابع cv2.dnn.readNetFromCaffe
(یا معادلهای آن برای چارچوبهای دیگر) فایلهای معماری و وزنها را به عنوان ورودی میگیرد و شبکه را نمونهسازی میکند و آن را برای استنتاج (فرآیند انجام پیشبینی بر روی دادههای جدید) آماده میکند. نقاط کوانتیزاسیون رنگ از فایل .npy
نیز معمولاً با استفاده از NumPy
بارگیری میشوند.
۴. تنظیم دقیق اجزای شبکه (در صورت لزوم):
گاهی اوقات، لایههای خاصی در شبکه از پیش آموزش دیده قبل از استنتاج نیاز به تنظیمات جزئی دارند. در زمینه مدل رنگیسازی مبتنی بر طبقهبندی مورد بحث:
- تنظیم لایه خروجی: لایه نهایی مسئول خروجی پیشبینیهای کانال ‘
a
‘ و ‘b
‘ (به عنوان مثال، با نامclass8_ab
در مدل مرجع) ممکن است نیاز داشته باشد که به صراحت با مراکز سطل رنگ از فایل.npy
بارگیری شود. این تضمین میکند که احتمالات خروجی شبکه به درستی به پالت رنگ از پیش تعریف شده نگاشت شوند. نقاط اغلب قبل از تخصیص به ‘blobs’ لایه (اصطلاحCaffe
برای ظروف داده) تغییر شکل داده و به نوع داده مناسب (به عنوان مثال،float32
) تبدیل میشوند. - متعادلسازی مجدد رنگ: لایه دیگری (به عنوان مثال،
conv8_313_rh
) ممکن است برای تأثیرگذاری بر تعادل بین رنگهای مختلف در خروجی تنظیم شود، که به طور بالقوه اشباع را افزایش میدهد یا سوگیریهای آموخته شده در طول آموزش را اصلاح میکند. این اغلب شامل تنظیمblobs
لایه به مقادیر آموخته شده خاص است (مانند مقدار2.606
ذکر شده در کد اصلی، که احتمالاً به صورت تجربی یا در طول آموزش به دست آمده است).
این مراحل مدل عمومی از پیش آموزش دیده را برای تفاوتهای ظریف خاص وظیفه رنگیسازی با استفاده از رویکرد طبقهبندی تنظیم میکنند.
۵. آمادهسازی تصویر ورودی:
تصویر خاکستری ورودی قبل از تغذیه به شبکه عصبی باید چندین مرحله پیش پردازش را طی کند:
- بارگیری: تصویر از مسیر فایل مشخص شده با استفاده از
cv2.imread
خوانده میشود. حتی اگر خاکستری باشد،OpenCV
ممکن است به طور پیشفرض آن را به عنوان یک تصویرBGR
3 کاناله بارگیری کند و مقدار خاکستری را در کانالها تکرار کند. - نرمالسازی: مقادیر پیکسل، که معمولاً از 0 تا 255 متغیر هستند، با تقسیم بر 255.0 به محدوده کوچکتر، اغلب 0.0 تا 1.0، مقیاسبندی میشوند. این نرمالسازی به تثبیت فرآیند یادگیری و استنتاج شبکه کمک میکند.
- تبدیل فضای رنگی: تصویر از فضای رنگی پیشفرض
BGR
به فضای رنگیCIELab
با استفاده ازcv2.cvtColor
تبدیل میشود. این برای جداسازی کانال روشنایی (L
) حیاتی است. - تغییر اندازه: اکثر
CNN
های از پیش آموزش دیده انتظار دارند تصاویر ورودی با اندازه ثابت (به عنوان مثال، 224x224 پیکسل، یک استاندارد رایج تحت تأثیر مجموعه دادههایی مانندImageNet
) باشند. تصویرLAB
بر این اساس با استفاده ازcv2.resize
تغییر اندازه داده میشود. این استانداردسازی سازگاری با معماری شبکه را تضمین میکند. - جداسازی و مرکزیت کانال L: کانال روشنایی (
L
) از تصویرLAB
تغییر اندازه داده شده استخراج میشود. اغلب، مقادیر آن (معمولاً 0-100 درLAB
) سپس با کم کردن یک مقدار میانگین (به عنوان مثال، 50) حول صفر متمرکز میشوند. این مرکزیت یکی دیگر از روشهای رایج است که میتواند عملکرد شبکه را بهبود بخشد.
این کانال L
با دقت پیش پردازش شده اکنون آماده ارائه به شبکه است.
۶. مرحله استنتاج: پیشبینی رنگ:
اینجاست که جادو اتفاق میافتد:
- ایجاد Blob: کانال
L
پردازش شده (اکنون یک آرایه 2 بعدی) به یک ‘blob’ تبدیل میشود، یک فرمت آرایه 4 بعدی که توسط ماژولDNN
(cv2.dnn.blobFromImage
) انتظار میرود. این فرمت معمولاً شامل ابعادی برای اندازه دسته، کانالها، ارتفاع و عرض است. - گذر رو به جلو (Forward Pass):
blob
به عنوان ورودی به شبکه بارگیری شده با استفاده ازnet.setInput
تنظیم میشود. سپس، متدnet.forward()
فراخوانی میشود. این محاسبات را آغاز میکند: دادههای ورودی از طریق لایههای شبکه جریان مییابند، تحت تبدیلهایی که توسط وزنهای آموخته شده دیکته میشوند، قرار میگیرند و در نهایت خروجی پیشبینی شده را تولید میکنند. برای مدل رنگیسازی ما، خروجی نشاندهنده کانالهای پیشبینی شده ‘a
‘ و ‘b
‘ (یا بهتر بگوییم، توزیعهای احتمال بر روی سطلهای رنگی) است. - تغییر شکل خروجی: خروجی خام از شبکه باید تغییر شکل داده و به فرمت فضایی 2 بعدی مربوط به کانالهای ‘
a
‘ و ‘b
‘ تبدیل (transpose) شود.
شبکه اکنون بهترین حدس خود را برای اطلاعات رنگ بر اساس تصویر خاکستری ورودی تولید کرده است.
۷. بازسازی تصویر رنگی:
مرحله نهایی شامل ترکیب اطلاعات رنگ پیشبینی شده با دادههای تصویر اصلی است:
- تغییر اندازه کانالهای پیشبینی شده: کانالهای پیشبینی شده ‘
a
‘ و ‘b
‘ (که در حال حاضر اندازه 224x224 دارند و با ورودی شبکه مطابقت دارند) باید با استفاده ازcv2.resize
به ابعاد اصلی تصویر ورودی تغییر اندازه داده شوند. این تضمین میکند که اطلاعات رنگ به درستی با ساختار تصویر اصلی هماهنگ شوند. - استخراج روشنایی اصلی: به طور حیاتی، کانال روشنایی (
L
) از تصویرLAB
اصلی و با اندازه کامل (که در طول پیش پردازش قبل از تغییر اندازه ایجاد شده است) استخراج میشود. استفاده از کانالL
اصلی، جزئیات و ساختار روشنایی اصلی تصویر را حفظ میکند، که در صورت استفاده از کانالL
تغییر اندازه داده شده، تخریب میشود. - الحاق (Concatenation): کانال
L
اصلی با کانالهای پیشبینی شده ‘a
‘ و ‘b
‘ تغییر اندازه داده شده در امتداد محور کانال رنگ ترکیب (الحاق) میشود. این یک تصویرLAB
کامل را دوباره مونتاژ میکند، اکنون با رنگ پیشبینی شده. - تبدیل مجدد به فرمت قابل نمایش: تصویر
LAB
حاصل با استفاده ازcv2.cvtColor
به فضای رنگیBGR
تبدیل میشود، زیرا این فرمت استانداردی است که توسط اکثر توابع نمایش تصویر (مانندcv2.imshow
) انتظار میرود. - برش (Clipping) و مقیاسبندی: مقادیر پیکسل در تصویر
BGR
، که در حال حاضر در محدوده نرمال شده (احتمالاً 0.0 تا 1.0) هستند، برش داده میشوند تا اطمینان حاصل شود که در این محدوده معتبر باقی میمانند (مقادیر گاهی اوقات میتوانند به دلیل فرآیند پیشبینی کمی از مرزها فراتر روند). سپس، آنها به محدوده عدد صحیح استاندارد 0-255 که برای نمایش یا ذخیره به عنوان یک فایل تصویر استاندارد مورد نیاز است، مقیاسبندی میشوند.
۸. تجسم:
در نهایت، توابعی مانند cv2.imshow
میتوانند برای نمایش تصویر خاکستری اصلی در کنار همتای تازه رنگی شده آن استفاده شوند، که امکان مقایسه بصری فوری را فراهم میکند.
اجرای فرآیند:
معمولاً، اسکریپتی که این مراحل را پیادهسازی میکند از خط فرمان اجرا میشود. با استفاده از تنظیمات argparse
، کاربر مسیر تصویر خاکستری ورودی را به عنوان آرگومان ارائه میدهد (به عنوان مثال، python colorize_image.py --image my_photo.jpg
). سپس اسکریپت مراحل بارگیری، پیش پردازش، استنتاج و بازسازی را اجرا میکند و در نهایت نتیجه رنگی شده را نمایش میدهد یا ذخیره میکند.
این گردش کار، با استفاده از مدلهای از پیش آموزش دیده و کتابخانههای قدرتمند، تئوری پیچیده رنگیسازی یادگیری عمیق را به ابزاری عملی تبدیل میکند که قادر به افزودن رنگ پر جنب و جوش و قابل قبول به تصاویر تکرنگ است و به طور مؤثر شکاف بین گذشته و حال را پر میکند.