باختصار ، فإن مهمة هذا المشروع هي تلوين واستعادة الصور القديمة. سأتعمق أكثر في التفاصيل ، لكن أولاً ، دعنا نرى الصور! بالمناسبة ، معظم الصور المصدر مأخوذة من subreddit r / TheWayWeWere ، أشكر الجميع على مثل هذه اللقطات الكبيرة عالية الجودة.
هذه مجرد أمثلة قليلة ، وهي نموذجية تمامًا!ماريا أندرسون مثل الجنية الصغيرة وصفحتها Lyubov Ryabtsova في الباليه الجمال النائم في المسرح الإمبراطوري ، سانت بطرسبرغ ، روسيا ، 1890
امرأة تسترخي في غرفة معيشتها (1920 ، السويد)
طلاب الطب يقفون بالقرب من جثة ، حوالي عام 1890
سيرفر في هاواي ، 1890
حصان الغزل ، 1898
الجزء الداخلي من شريط ميلر وشوميكر ، 1899
باريس في ثمانينيات القرن التاسع عشر
منظر جوي لإدنبره في عشرينيات القرن العشرين
امرأة تكساس في عام 1938
الناس في محطة واترلو يشاهدون التلفزيون لأول مرة ، لندن ، 1936
درس الجغرافيا عام 1850
مدخني الأفيون الصينيين عام 1880
يرجى ملاحظة أنه حتى الصور القديمة و / أو ذات الجودة الرديئة لا تزال تبدو رائعة جدًا:ديدوود ، داكوتا الجنوبية ، 1877
الإخوة والأخوات عام 1877 (ديدوود)
ساحة بورتسموث في سان فرانسيسكو ، 1851
الساموراي ، حوالي ستينيات القرن التاسع عشر
بالطبع ، النموذج ليس مثاليًا. هذه اليد الحمراء تدفعني للجنون ، لكنها تعمل بشكل خيالي:
سينيكا إيروكويس جيرل ، 1908
يمكنها أيضًا تلوين الرسومات بالأبيض والأسود:
التفاصيل الفنية
هذا هو نموذج التعلم العميق. على وجه الخصوص ، جمعت بين النهج التالية:
- GAN الانتباه الذاتي . الشيء الوحيد هو أن Unet المدربة مسبقًا تستخدم كمولد ، وقمت فقط بتغييرها للتطبيع الطيفي ، وفي الواقع ، آلية الانتباه الذاتي. هذا تعديل بسيط إلى حد ما. سأخبرك أن الفرق مذهل مقارنة بالإصدار السابق من Wasserstein GAN ، والذي حاولت أن أجعله يعمل. لقد أعجبت بنظرية Wasserstein GAN ، ولكنها في الواقع لا تعمل. لكنني وقعت في حب شبكة GAN ذات الاهتمام الذاتي.
- هيكل تعليمي مثل النمو التدريجي لشبكة GAN (ولكن ليس هو نفسه تمامًا). الفرق هو أن عدد الطبقات لا يزال ثابتًا: لقد قمت للتو بتغيير حجم بيانات الإدخال وضبط سرعة التعلم بحيث كانت التحولات بين الأحجام ناجحة. يبدو أنها تنتج نفس النتيجة النهائية ، ولكنها تتعلم بشكل أسرع وأكثر استقرارًا وتقوم بتعميم أفضل.
- قاعدة TTUR (قاعدة تحديث مقياس الوقت اثنين). هذا واضح تمامًا: تكرار واحد إلى واحد للمولد / المميّز (النقد) وسرعة تدريب أعلى للتمييز.
- تتكون وظيفة فقدان المولد من جزأين: أحدهما هو الوظيفة الرئيسية لفقدان الإدراك (أو فقدان الميزة) بناءً على VGG16 - فهو ببساطة يدفع نموذج المولد لتكرار صورة الإدخال. الجزء الثاني هو تقدير الخسائر من المميِّز (النقد). للفضول: فقط وظيفة الخسارة الحسية لا تكفي للحصول على نتيجة جيدة. يميل ببساطة إلى تشجيع مجموعة من البني / الأخضر / الأزرق - كما تعلمون ، من خلال خداع الاختبار ، ما هي الشبكات العصبية الجيدة حقًا! النقطة الأساسية هي أن GANs تتعلم بشكل أساسي وظيفة الخسارة بالنسبة لك ، وهي في الواقع خطوة كبيرة نحو المثل الأعلى الذي نسعى إليه في التعلم الآلي. وبالطبع ، ستتحسن النتائج بشكل ملحوظ عندما يتعلم الجهاز نفسه ما قمت بترميزه يدويًا من قبل. بالطبع ، هذا هو الحال هنا.
جمال هذا النموذج هو أنه جيد جدًا في مجموعة متنوعة من تعديلات الصور. ما تراه أعلاه هو نتائج نموذج التلوين ، ولكن هذا مكون واحد فقط في خط الأنابيب الذي أريد تطويره بنفس النموذج.
بعد ذلك ، سأحاول إتقان الصور القديمة ، والعنصر التالي على جدول الأعمال هو نموذج لتحسين التشبع والثراء (defade). وهي الآن في المراحل الأولى من التدريب. هذا هو في الأساس نفس النموذج ، ولكن مع بعض إعدادات التباين / السطوع كمحاكاة للصور الباهتة والصور التي تم التقاطها بمعدات قديمة / ضعيفة. لقد تلقيت بالفعل بعض النتائج المشجعة:

تفاصيل المشروع
ما هو جوهر هذا المشروع؟ أريد فقط تطبيق GAN بحيث تبدو الصور القديمة جيدة جدًا. والأهم من ذلك ، سيجعل المشروع
مفيدًا . ونعم ، أنا مهتم بالتأكيد بالعمل مع الفيديو ، لكنني بحاجة أولاً إلى معرفة كيفية جعل هذا النموذج تحت السيطرة على استهلاك الذاكرة (هذا وحش حقيقي). سيكون من الجيد إذا لم تتعلم النماذج من يومين إلى ثلاثة أيام على 1080Ti (للأسف ، نموذجي لـ GAN). على الرغم من أن هذا هو طفلي ، وسأقوم بتحديث الرمز وتحسينه بنشاط في المستقبل المنظور ، لكني سأحاول جعل البرنامج سهل الاستخدام قدر الإمكان ، على الرغم من أنه قد تكون هناك بعض الصعوبات في ذلك.
وأقسم أنني سأوثق الرمز بشكل صحيح ... يومًا ما. من المسلم به أنني من هؤلاء الذين يؤمنون بـ "كود التوثيق الذاتي" (LOL).
نموذج الإطلاق الذاتي
المشروع مبني على مكتبة رائعة Fast.AI. لسوء الحظ ، هذه نسخة قديمة ، ويبقى تحديثها إلى إصدار جديد (هذا بالتأكيد على جدول الأعمال). إذن ، المتطلبات الأساسية ، باختصار:
- المكتبة القديمة Fast.AI. بعد أن دفنت نفسي في المشروع لمدة شهرين ، فاتني القليل مما حدث له ، لأن تلك التي تم تصنيفها الآن على أنها "قديمة" لا تبدو بالفعل مثل تلك التي لدي. كل شيء تغير في الشهرين الماضيين أو نحو ذلك. لذلك ، إذا لم يكن هناك شيء يعمل مع الإصدارات الأخرى ، فقد شوكة هنا . مرة أخرى ، التحديث إلى الإصدار الأخير مدرج على جدول الأعمال ، أعتذر مقدمًا.
- كافة تبعيات Fast.AI : هناك ملفات ..txt وملفات environment.yml مريحة.
- Pytorch 0.4.1 (مطلوب spectral_norm ، لذلك تحتاج إلى أحدث إصدار مستقر).
- جوبيتر لاب .
- Tensorboard (أي تثبيت Tensorflow) و TensorboardX . أعتقد أن هذا ليس ضروريًا تمامًا ، ولكنه أسهل بكثير. من أجل راحتك ، لقد قمت بالفعل بتوفير جميع الخطافات / عمليات رد الاتصال الضرورية في Tensorboard! هناك أمثلة على استخدامها. من الجدير بالذكر أنه بشكل افتراضي ، يتم تسجيل الصور أثناء المعالجة في Tensorboard كل 200 تكرار ، لذلك ستحصل على عرض مستمر ومريح لما يفعله النموذج.
- ImageNet : مجموعة بيانات ممتازة للتدريب.
- بطاقة رسومات قوية . أود حقاً الحصول على ذاكرة أكبر من 11 جيجا بايت في جهاز GeForce 1080Ti. إذا كان لديك شيء أضعف ، فسيكون من الصعب. Unet و Critic رائعة بشكل سخيف ، لكن كلما كبروا ، كانت النتائج أفضل.
إذا كنت ترغب في بدء معالجة الصور بنفسك الآن دون تدريب النموذج ، يمكنك تنزيل الأوزان الجاهزة
هنا . ثم افتح ColorizationVisualization.ipynb في JupyterLab. تأكد من وجود خط به رابط للأوزان:
colorizer_path = Path('/path/to/colorizer_gen_192.h5')
ثم تحتاج إلى تحميل نموذج التلوين بعد تهيئة netG:
load_model(netG, colorizer_path)
ثم فقط ضع أي صور في المجلد / test_images / ، حيث تبدأ البرنامج. يمكنك تصور النتائج في مفكرة Jupyter مع الأسطر التالية:
vis.plot_transformed_image("test_images/derp.jpg", netG, md.val_ds, tfms=x_tfms, sz=500)
سأحفظ حجمًا يبلغ حوالي 500 بكسل ، زائدًا أو ناقصًا ، إذا قمت بتشغيل البرنامج على GPU مع الكثير من الذاكرة (على سبيل المثال ، GeForce 1080Ti 11 GB). إذا كانت هناك ذاكرة أقل ، فعليك تقليل حجم الصور أو محاولة تشغيلها على وحدة المعالجة المركزية. لقد حاولت فعلًا القيام بالأمر الأخير ، ولكن لسبب ما عمل النموذج بشكل بطيء وبسخافة ، ولم أجد الوقت للتحقيق في المشكلة. أوصى المتذوقون ببناء Pytorch من المصادر ، ثم ستؤدي إلى زيادة كبيرة في الأداء. همم ... في تلك اللحظة لم يكن ذلك قبل ذلك.
معلومات إضافية
يمكن أيضًا تصور الصور التي تم إنشاؤها كما تتعلم في Jupyter: تحتاج فقط إلى تعيينها على
true عند إنشاء مثيل من ربط التصور هذا:
GANVisualizationHook(TENSORBOARD_PATH, trainer, 'trainer', jupyter=True, visual_iters=100
أفضل أن أترك
الكاذبة وأستخدم Tensorboard فقط. صدقوني ، أنت تريد أيضًا أن تفعل ذلك. أيضًا ، إذا تركتها للعمل لفترة طويلة جدًا ، سيأكل جوبيتر الكثير من الذاكرة مع هذه الصور.
يتم أيضًا حفظ أوزان النماذج تلقائيًا أثناء دورات تدريب GANTrainer. بشكل افتراضي ، يتم حفظها كل 1000 تكرار (هذه عملية مكلفة). يتم تخزينها في المجلد الجذر الذي حددته للتدريب ، ويتوافق الاسم مع save_base_name المحدد في جدول التدريب. يتم تخزين الأوزان بشكل منفصل لكل حجم تمرين.
أوصي بتصفح التعليمات البرمجية من الأعلى إلى الأسفل ، بدءًا من Jupyter Notebook. أتخذ هذه الملاحظات ببساطة كواجهة ملائمة للنماذج الأولية والتصور ، كل شيء آخر سيذهب إلى ملفات .py بمجرد أن أجد مكانًا لهم. لدي بالفعل أمثلة على التصور الذي يمكنك تشغيله بسهولة ومشاهدته: ما عليك سوى فتح xVisualization في Notebook ، وصور الاختبار المدرجة في المشروع مدرجة هناك (توجد في test_images).
إذا رأيت جداول GAN ، فهذا هو أبشع شيء في المشروع ، فقط إصداري من تطبيق GAN للتعلم التدريجي ، وهو مناسب لمولد Unet.
الأوزان المدربة مسبقًا لمولد الألوان موجودة
هنا أيضًا. لا يزال مشروع DeFade قيد العمل ، وسأحاول وضع أوزان جيدة في غضون أيام قليلة.
عادة أثناء التدريب سترى النتائج الجيدة الأولى في منتصف الطريق ، أي بحجم 192 بكسل (إذا كنت تستخدم الأمثلة التدريبية المقدمة).
أنا متأكد من أنني أخطأت في مكان ما ، لذا يرجى إعلامي إذا كان الأمر كذلك.
المشكلات المعروفة
- عليك أن تلعب قليلا مع حجم الصورة للحصول على أفضل نتيجة. من الواضح أن النموذج يعاني من بعض نسبة العرض إلى الارتفاع ونسبة العرض إلى الارتفاع عند إنشاء الصور. كان الوضع أسوأ بكثير ، لكن الوضع تحسن بشكل ملحوظ مع زيادة الإضاءة / التباين وإدخال التعلم التدريجي. أريد التخلص من هذه المشكلة تمامًا والتركيز عليها ، ولكن حتى الآن لا تيأس إذا كانت الصورة مشبعة بشكل مفرط أو مع أعطال غريبة. على الأرجح ، سيصبح كل شيء طبيعيًا بعد تغيير حجم صغير. كقاعدة ، للصور المشبعة تحتاج إلى زيادة الحجم.
- بالإضافة إلى ما سبق: إن الحصول على أفضل الصور يرجع حقًا إلى فن اختيار المعلمات المثلى . نعم ، تم تحديد النتائج يدويًا. أنا سعيد جدًا بالجودة ، ويعمل النموذج بشكل موثوق تمامًا ، ولكن ليس تمامًا. المشروع لا يزال مستمرا! أعتقد أنه يمكن استخدام الأداة "كفنان AI" ، لكنها ليست جاهزة بعد لعامة الناس. ليس فقط الوقت.
- لتعقيد الوضع: في الوقت الحاضر ، يأكل النموذج بوحشية الذاكرة ، لذلك على بطاقة 1080Ti اتضح لمعالجة الصور بحد أقصى 500-600 بكسل. أراهن أن هناك العديد من خيارات التحسين هنا ، لكنني لم أفعلها بعد.
- أضفت حشوة صفرية إلى مولّد Unet لأي شيء لا يتناسب مع الأحجام المتوقعة (هكذا يمكنني تحميل صورة ذات حجم عشوائي). لقد كان اختراقًا سريعًا جدًا ، ويؤدي إلى حدود غبية يمنى وسفلية عند إخراج صور الاختبار ذات الحجم التعسفي. أنا متأكد من أن هناك طريقة أفضل ، ولكن لم أجدها بعد.
- العارضة تحب الملابس الزرقاء. لست متأكدًا تمامًا من السبب ، فالحل في البحث!
هل تريد المزيد؟
سأنشر نتائج جديدة
على تويتر .
إضافة من المترجم.من الأخير على تويتر:
ممثلو الجنسية أنفسهم في مخبأهم ، 1880
(
أصلي )
بناء مترو أنفاق لندن ، 1860
(
أصلي )
الأحياء الفقيرة في بالتيمور ، 1938
جيم على التايتانيك ، 1912
(
أصلي )