بازسازی عکس‌های قدیمی با هوش‌مصنوعی

به راستی تسلی بزرگی است که کسی بتواند در زمان های درد و تنهایی و فراق، دست کم یک خاطره ی کامل درخشنده را به یاد آورد. آندره موروا
به راستی تسلی بزرگی است که کسی بتواند در زمان های درد و تنهایی و فراق، دست کم یک خاطره ی کامل درخشنده را به یاد آورد. آندره موروا


موضوع بازسازی تصاویر قدیمی همیشه یکی از آرزوهای پاک بشریت بوده! خیلی وقت‌ها دوست داریم عکس‌های چهره قدیمی از اجدادمون رو بتونیم واضح‌تر ببینیم که ببینیم چه شکلی بودند. این تسک به نوعی حذف نویز و بهبود و بازسازی تصاویر است. خب فرض کنید میخواید خودتون به عنوان یه نقاش دیجیتال چهره قدیمی بابابزرگ رو بازسازی کنید. برای اینکه با کیفیت بالا بتونید بازسازی کنید احتمالا قسمت‌هایی که نویز داره رو از ذهن خودتون و اطلاعات prior درباره چهره انسان‌ها (که در طول حیات یاد گرفتید) نقاشی می‌کشید و برخی قسمت‌هایی رو هم که جزییات بیشتری دارند، می‌تونید یه عکس تمیز از یه صورت جلوتون بذارید و با کمک اون عکس تمیز بازسازی رو انجام بدید. در دنیای هوش‌مصنوعی هم همین‌طور بوده. ینی قبلا برای بازسازی این تصاویر یا از اطلاعات prior درباره فیچر‌های صورت انسان استفاده می‌کردند یا با استفاده از برخی عکس‌های رفرنس این بازسازی رو انجام می‌دادند. اما یه نکته مهمی این وسط وجود داره. شما احتمالا هر چقدر نقاش ماهرتری باشید، قسمت‌های نویزی رو با کیفیت بهتری رسم می‌کنید. پس مهمه که اطلاعات prior درباره نقاشی و صورت انسان رو به‌طور همزمان داشته باشید. حالا یه سوال! در دنیای AI کدوم شبکه‌ست که از همه بهتر نقاشی می‌کشه؟ بله درسته! شبکه GAN. دقیقا ایده مقاله‌ای که می‌خوایم معرفی کنیم مبتنی بر استفاده از همین شبکه‌ها در بازسازی تصاویر قدیمی است. با این پست از انتشارات اورفیت همراه باشید تا این مقاله رو بهتر درک کنید.

معماری کلی روش GFP-GAN. ابتدا ورودی به شبکه degradation removal داده می‌شه و بعد خروجی اون بخشی به سمت شبکه GAN و بهشی به سمت Channel-Split SFT میره. ماژول Channel-Split SFT خروجی GAN رو هم استفاده می‌کنه و با ترکیب تابعی از f_spatial و خروجی GAN خروجی مورد نظر رو برای توابع هزینه آماده می‌کنه. توابع هزینه هم چندین بخش هستند که بخش‌هایی مربوط به fidelity تصویر و بخش‌هایی مربوط به realness تصاویر هستند.
معماری کلی روش GFP-GAN. ابتدا ورودی به شبکه degradation removal داده می‌شه و بعد خروجی اون بخشی به سمت شبکه GAN و بهشی به سمت Channel-Split SFT میره. ماژول Channel-Split SFT خروجی GAN رو هم استفاده می‌کنه و با ترکیب تابعی از f_spatial و خروجی GAN خروجی مورد نظر رو برای توابع هزینه آماده می‌کنه. توابع هزینه هم چندین بخش هستند که بخش‌هایی مربوط به fidelity تصویر و بخش‌هایی مربوط به realness تصاویر هستند.


در این مقاله از این ایده استفاده شده که احتمالا بهترین دانش prior درباره بازسازی چهره، در شبکه‌ای است که بلده خوب چهره‌ها رو رسم کنه (مثل StyleGan2). در واقع در این مقاله از این شبکه به صورت pre-trained استفاده شده. اما یه چالش بزرگ وجود داره. شبکه StyleGan2 یاد گرفته که از یه سری نویز، تصاویر غیرواقعی تولید کنه که خیلی واقعی هستند! اما در این تسک ما علاوه بر واقعی بودن برامون مهمه که تصویر خروجی شباهت بسیار بالایی به تصویر ورودی داشته باشه(fidelity). در واقع شبکه باید به تصویر ورودی وفادار باشه. معماری کلی این سیستم رو می‌تونید در تصویر بالا ببینید. برای اینکه تصویر ورودی رو بتونند به GAN بدند ابتدا اون رو از یه شبکه U-Net رد می‌کنند که نوعی Auto Encoder است و همون Degradation Removal است که در تصویر بالا می‌بینید. این ماژول تا حدی بلده که نویزهای موجود در تصاویر رو کاهش بده اما برای بازسازی تصاویری که محو شدند کافی نیست و در واقع قراره که خروجی اون به شبکه GAN داده بشه. ماژول degradation removal تصاویر ورودی رو به یه فضای پنهان F_latent می‌بره که این فضای پنهان به عنوان ورودی GAN استفاده می‌شه.قسمت‌هایی که در ماژول Degradation Removal به عنوان F_spatial معرفی شدند (که در تصویر بالا مشخص هستند) در واقع فیچر‌های مکانی تصویر ورودی رو یادگرفتند. از این بردارها باید حتما استفاده کنیم چرا که تصویر نهایی هم باید به نوعی این فیچرها رو داشته باشه تا وفاداری به ورودی اصلی حفظ بشه. در واقع کل سیستم باید یاد بگیره که از این بردارها که به نوعی فیچرهای مکانی تصاویر ورودی هستند استفاده کنه تا نزدیکی خودش رو به تصویر اصلی حفظ کنه و این کار رو در قالب توابع هزینه که در قسمت بعد معرفی می‌کنیم انجام میده. نکته‌ای که در شبکه Channel-Split SFT رعایت میشه اینه که بخشی از خروجی GAN رو که مربوط به ویژگی‌های realness تصویر است، از یه تابع همانی رد میکنه و به اون دستی نمیزنه و split دیگه رو (که مربوط به fidelity است) با F-spatial که از یه شبکه CNN رد شده ترکیب می‌کنه و در نهایت هم باز کل خروجی تابع همانی و این قسمت رو concat می‌کنه و خروجی رو به سمت تابع loss میفرسته. برداری که به سمت توابع هزینه فرستاده میشه بخش‌هایی از اون شامل فیچرهای مختلف تصویر ورودی‌ست که باعث میشه با کمک بخش‌هایی از تابع هزینه که مربوط به fidelity هستند وفاداری به تصویر اصلی بهتر حفظ بشه. توابع هزینه در این مساله از چهار بخش تشکیل شدند که در قسمت بعدی به اون‌ها می‌پردازیم.

توابع هزینه

این روش از ۴ تابع هزینه همزمان استفاده می‌کنه و سعی می‌کنه که مجموع این توابع رو به صورت کمینه نگه داره که در تصویر زیر قابل مشاهده است.

اولین جمله مربوط به تابع هزینه بازسازی تصویر است. این تابع برای ماژول Removal Degradation استفاده می‌شه و شامل تفاوت تصویر نویزی و تصویر اصلی است که با فاصله نرم L1 محاسبه می‌شه (‌البته یه جمله دیگه هم داره که وارد جزییاتش نمیشیم). جمله دوم مربوط به تابع هزینه GAN است که تابع هزینه‌ای مشابه StyleGan2 داره و سعی بر این است که قسمت discriminator نتونه غیرواقعی بودن تصاویر رو تشخیص بده. در واقع با وجود این تابع هزینه بخش realness تصاویر می‌خواد تضمین بشه. جمله سوم مربوط به facial component loss است. در واقع در این مقاله سعی شده برای چشم‌ها و دهان یه تدابیر ویژه اندیشیده بشه که جزییات با کیفیتی داشته باشن. به همین دلیل از قسمت discriminator شبکه GAN استفاده شده تا غیر واقعی بودن این قسمت‌های صورت رو هم تشخیص بدن و هر چقدر که کمتر این شبکه بتونه غیرواقعی بودن این قسمت‌ها رو تشخیص بده مقدار تابع هزینه کمتر میشه. جمله نهایی مربوط به قسمت Identity Preserving است. با این جمله باز قراره fidelity حفظ بشه. نحوه کار به این صورت است که یه شبکه که مربوط به face recognition است (مثل ArcFace) و می‌تونه فیچرهای صورت رو استخراج کنه رو استفاده می‌کنند و قراره اختلاف خروجی این شبکه به ازای تصویر ورودی و تصویر تمیزشده مینیمم بشه و به زبان ساده‌تر قراره تصویر رو طوری تمیز بکنیم که هنوز ArcFace تشخیص بده که این بابایی که تصویرش رو تمیز کردیم همون بابا‌ست!!

جمع‌بندی و نتایج

در نهایت و در قسمت جمع‌بندی این متد با بقیه متدهای پرچم‌دار مقایسه شده و در عمل هم نشون داده شده که چقدر تاثیرگذار است. در تصویر زیر یه نمونه بسیار زیبا ازش می‌تونید ببنید:

تصاویر خروجی به ازای متد‌های مشهور در حوزه بازسازی تصاویر. اولین تصویر از سمت چپ، تصویر اصلی و آخرین تصویر از سمت چپ مربوط به متد GFP-GAN است.
تصاویر خروجی به ازای متد‌های مشهور در حوزه بازسازی تصاویر. اولین تصویر از سمت چپ، تصویر اصلی و آخرین تصویر از سمت چپ مربوط به متد GFP-GAN است.


همچنین عملکرد این مدل بر روی جزییات چشم‌ها و لب‌ها نیز در مقایسه با دیگر متدها بررسی شده که در تمامی موارد میشه گفت متد GFP-GAN اون‌ها رو شکست داده. نکته مهم اینه که برای تست، هم دادگان ساختگی و هم دادگان واقعی استفاده شده و باز هم در تمامی اون‌ها این متد پیروز بوده. برای انجام یادگیری از دیتاست FFHO استفاده شده که شامل ۷۰۰۰۰ تصویر با کیفیته و برای اینکه تصاویر نویزی از توش دربیاد از روش‌های استاندارد استفاده شده که فرمولش رو در زیر می‌تونید ببینید:

در این روش تصویر y با عملگر کانوولوشن با Gaussian Blur Kernel ترکیب شده و سپس با نرخ r اقدام به downsampling کردن و بعد نویز سفید به تصاویر اضافه شده و در انتها با فرمت JPEG و نرخ کیفیت q فشرده‌سازی انجام شده. برای تست کردن همون‌طور که گفتیم هم از دیتاست ساختگی CelebA-test استفاده شده و هم از دادگان واقعی مثل CelebChild-Test. در نهایت این دوستان گرامی مدل رو بر روی هاگینگ‌فیس گذاشتند و شما می‌تونید از دمو استفاده کنید. اگه تا الان باور نکردید حتما سری به دمو بزنید و از نتایج حیرت کنید. البته دقت کنید که این مدل فقط چهره‌ها رو بهبود میده و بنابراین اگه یه عکس قدیمی دارید که کلی منظره داره نباید توقع داشته باشید بهبودی حاصل بشه.

و در نهایت برای تست سیستم عکس یکی از نوامیس ناصرالدین شاه رو به همراه خودش براتون به GFP-GAN دادیم که کیفیت کار بهتر مشخص بشه!!!

در سمت چپ تصویر ناصرالدین شاه و صبیه و در سمت راست تصویر بازسازی‌شده ناصرالدین شاه و صبیه!
در سمت چپ تصویر ناصرالدین شاه و صبیه و در سمت راست تصویر بازسازی‌شده ناصرالدین شاه و صبیه!


لینک دمو: https://huggingface.co/spaces/akhaliq/GFPGAN

لینک مقاله: https://arxiv.org/abs/2101.04061


پ.ن.۱: نگاه کنید که چه زیبا با ترکیب ساده ولی دقیق مفاهیمی که داریم و شبکه‌های pre-trained چه چیز غولی ساخته شده.

پ.ن.۲: به کانال ما سر بزنید!