هذا هو تطبيق Pytorch للورقة خوارزمية عصبية للأسلوب الفني بقلم ليون أ. جاتيس ، ألكساندر س. إكر ، وماتياس بيثج. يعتمد الرمز على أسلوب جوستين جونسون العصبي.
تقدم الورقة خوارزمية للجمع بين محتوى الصورة بأسلوب صورة أخرى باستخدام الشبكات العصبية التلافيفية. فيما يلي مثال على رسم النمط الفني في ليلة النجوم على صورة ليلية لحرم ستانفورد:
تطبيق نمط الصور المختلفة على نفس صورة المحتوى يعطي نتائج مثيرة للاهتمام. هنا نعيد إنتاج الشكل 2 من الورقة ، التي تجعل صورة للأنابين في ألمانيا في مجموعة متنوعة من الأساليب:
فيما يلي نتائج تطبيق أسلوب مختلف الأعمال الفنية على هذه الصورة لجسر البوابة الذهبية:
تتيح الخوارزمية للمستخدم مقايضة الوزن النسبي لمصطلحات إعادة بناء النمط والمحتوى ، كما هو موضح في هذا المثال حيث نقوم بتنفيذ نمط الصورة الذاتية لعام 1907 في بيكاسو على براد بيت:
من خلال تغيير حجم صورة النمط قبل استخراج ميزات النمط ، يمكننا التحكم في أنواع الميزات الفنية التي يتم نقلها من صورة النمط ؛ يمكنك التحكم في هذا السلوك باستخدام علم -style_scale . نرى أدناه ثلاثة أمثلة على تقديم جسر البوابة الذهبية بأسلوب ليلة النجوم. من اليسار إلى اليمين ، -style_scale هو 2.0 و 1.0 و 0.5.
يمكنك استخدام أكثر من صورة نمط واحدة لمزج أنماط فنية متعددة.
في اتجاه عقارب الساعة من أعلى اليسار: "The Starry Night" + "The Scream" ، "Scream" + "Composition VII" ، "Nude" + "Composition VII" ، و "Nude" + "The Starry Night"
عند استخدام صور نمط متعددة ، يمكنك التحكم في الدرجة التي تمتزج بها:
إذا قمت بإضافة FLAG -original_colors 1 ، فسيحتفظ صورة الإخراج بألوان الصورة الأصلية.
التبعيات:
تبعيات اختيارية:
بعد تثبيت التبعيات ، ستحتاج إلى تشغيل البرنامج النصي التالي لتنزيل نموذج VGG:
python models/download_models.py
هذا سوف تنزيل نموذج VGG-19 الأصلي. سيتم أيضًا تنزيل طراز VGG-16 الأصلي. بشكل افتراضي ، يتم استخدام نموذج VGG-19 الأصلي.
إذا كان لديك وحدة معالجة رسومات ذاكرة أصغر ، فسيكون استخدام نموذج NIN ImageNet أفضل ويعطي نتائج أسوأ ولكن قابلة للمقارنة. يمكنك الحصول على التفاصيل على النموذج من BVLC Caffe ModelZoo. يتم تنزيل طراز Nin عند تشغيل البرنامج النصي download_models.py .
يمكنك العثور على إرشادات تثبيت مفصلة لـ Ubuntu و Windows في دليل التثبيت.
الاستخدام الأساسي:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
استخدام Cudnn مع نموذج NIN:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
لاستخدام صور نمط متعددة ، تمرير قائمة مفصولة بفاصلة مثل هذا:
-style_image starry_night.jpg,the_scream.jpg .
لاحظ أن المسارات إلى الصور يجب ألا تحتوي على حرف ~ لتمثيل الدليل المنزلي الخاص بك ؛ يجب عليك بدلاً من ذلك استخدام مسار نسبي أو مسار مطلق كامل.
خيارات :
-image_size : الحد الأقصى للطول الجانبي (بالبكسل) من الصورة التي تم إنشاؤها. الافتراضي هو 512.-style_blend_weights : وزن مزج نمط صور النمط المتعدد ، كقائمة مفصولة فاصلة ، مثل -style_blend_weights 3,7 . بشكل افتراضي ، يتم وزن جميع صور النمط على قدم المساواة.-gpu : معرف صفر من وحدة معالجة الرسومات للاستخدام ؛ لمجموعة وضع وحدة المعالجة المركزية -gpu إلى c .خيارات التحسين :
-content_weight : كم من وزن مصطلح إعادة بناء المحتوى. الافتراضي هو 5E0.-style_weight : ما مدى وزن مصطلح إعادة بناء النمط. الافتراضي هو 1E2.-tv_weight : وزن تنظيم التغير الكلي (TV) ؛ هذا يساعد على تهدئة الصورة. الافتراضي هو 1E-3. ضبط على 0 لتعطيل تنظيم التلفزيون.-num_iterations : الافتراضي هو 1000.-init : طريقة لإنشاء الصورة التي تم إنشاؤها ؛ واحدة من random أو image . الافتراضي random الذي يستخدم تهيئة الضوضاء كما في الورقة ؛ تهيئة image مع صورة المحتوى.-init_image : يحل محل صورة التهيئة مع صورة محددة للمستخدم.-optimizer : خوارزمية التحسين للاستخدام ؛ إما lbfgs أو adam ؛ الافتراضي هو lbfgs . تميل L-BFGS إلى إعطاء نتائج أفضل ، ولكنها تستخدم المزيد من الذاكرة. التحول إلى آدم سيقلل من استخدام الذاكرة ؛ عند استخدام آدم ، ربما تحتاج إلى اللعب مع معلمات أخرى للحصول على نتائج جيدة ، وخاصة وزن النمط ووزن المحتوى ومعدل التعلم.-learning_rate : معدل التعلم لاستخدامه مع Optimizer Adam. الافتراضي هو 1E1.-normalize_gradients : إذا كانت هذه العلامة موجودة ، فسيتم تطبيع التدرجات من كل طبقة من كل طبقة.خيارات الإخراج :
-output_image : اسم صورة الإخراج. الافتراضي هو out.png .-print_iter : طباعة تقدم كل تكرارات print_iter . ضبط على 0 لتعطيل الطباعة.-save_iter : احفظ الصورة كل تكرارات save_iter . ضبط على 0 لتعطيل حفظ النتائج الوسيطة.خيارات الطبقة :
-content_layers : قائمة مفصولة بفواصل من أسماء الطبقات التي يجب استخدامها لإعادة بناء المحتوى. الافتراضي هو relu4_2 .-style_layers : قائمة مفصولة بأسماء الطبقة التي يجب استخدامها لإعادة بناء النمط. الافتراضي هو relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 .خيارات أخرى :
-style_scale : مقياس لاستخراج الميزات من صورة النمط. الافتراضي هو 1.0.-original_colors : إذا قمت بتعيين هذا على 1 ، فإن صورة الإخراج ستحتفظ بألوان صورة المحتوى.-model_file : مسار إلى ملف .pth لنموذج VGG Caffe. الافتراضي هو نموذج VGG-19 الأصلي ؛ يمكنك أيضًا تجربة طراز VGG-16 الأصلي.-pooling : نوع طبقات التجميع للاستخدام ؛ واحد من max أو avg . الافتراضي هو max . تستخدم طرازات VGG-19 طبقات تجميع الأقصى ، لكن الورق يذكر أن استبدال هذه الطبقات بطبقات التجميع المتوسطة يمكن أن تحسن النتائج. لم أتمكن من الحصول على نتائج جيدة باستخدام متوسط التجميع ، ولكن الخيار هنا.-seed : قيمة عدد صحيح يمكنك تحديده للنتائج القابلة للتكرار. بشكل افتراضي ، هذه القيمة عشوائية لكل تشغيل.-multidevice_strategy : قائمة مفصولة بفاصلة من مؤشرات الطبقة التي لتقسيم الشبكة عند استخدام أجهزة متعددة. انظر التحجيم متعدد GPU لمزيد من التفاصيل.-backend : nn ، cudnn ، openmp ، أو mkl . الافتراضي هو nn . يتطلب mkl خلفية MKL من Intel.-cudnn_autotune : عند استخدام الواجهة الخلفية Cudnn ، قم بتمرير هذه العلامة لاستخدام Cudnn Autotuner المدمج لتحديد أفضل خوارزميات إيلاء للهندسة المعمارية. هذا سيجعل التكرار الأول أبطأ قليلاً ويمكن أن يستغرق المزيد من الذاكرة ، ولكنه قد يسرع بشكل كبير من الواجهة الخلفية Cudnn. المشكلة: ينفد البرنامج من الذاكرة ويموت
الحل: حاول تقليل حجم الصورة: -image_size 256 (أو أقل). لاحظ أن أحجام الصور المختلفة ستتطلب على الأرجح قيمًا غير متفرقة لـ -style_weight و -content_weight للحصول على النتائج المثلى. إذا كنت تعمل على وحدة معالجة الرسومات ، فيمكنك أيضًا محاولة التشغيل مع -backend cudnn لتقليل استخدام الذاكرة.
المشكلة: -backend cudnn أبطأ من الواجهة الخلفية الافتراضية
الحل: أضف العلم -cudnn_autotune ؛ سيستخدم هذا Cudnn Autotuner المدمج لتحديد أفضل خوارزميات إتلاف.
المشكلة: احصل على رسالة الخطأ التالية:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
الحل: نظرًا لخليط مع مواقع الطبقة ، تتطلب النماذج القديمة إصلاحًا ليكون متوافقًا مع الإصدارات الأحدث من Pytorch. سيقوم برنامج donwload_models.py المضمن تلقائيًا بتنفيذ هذه الإصلاحات بعد تنزيل النماذج.
بشكل افتراضي ، يستخدم neural-style-pt الواجهة الخلفية nn للتلوين و L-BFGs للتحسين. هذه تعطي نتائج جيدة ، ولكن يمكن كلاهما استخدام الكثير من الذاكرة. يمكنك تقليل استخدام الذاكرة بما يلي:
-backend cudnn لاستخدام الواجهة الخلفية Cudnn. هذا سوف يعمل فقط في وضع GPU.-optimizer adam لاستخدام ADAM بدلاً من L -BFGS. هذا من شأنه أن يقلل بشكل كبير من استخدام الذاكرة ، ولكن قد يتطلب ضبط المعلمات الأخرى لتحقيق نتائج جيدة ؛ على وجه الخصوص ، يجب أن تلعب مع معدل التعلم ووزن المحتوى ووزن النمط. هذا يجب أن يعمل في كل من وسائط وحدة المعالجة المركزية و GPU.-image_size 256 لإنشاء صورة بنصف الحجم الافتراضي.مع الإعدادات الافتراضية ، يستخدم PP على الطراز العصبي حوالي 3.7 جيجابايت من ذاكرة GPU على نظامي ؛ التبديل إلى آدم و Cudnn يقلل من بصمة ذاكرة GPU إلى حوالي 1 جيجابايت.
يمكن أن تختلف السرعة كثيرًا اعتمادًا على الواجهة الخلفية والمحسّنة. فيما يلي بعض الأوقات لتشغيل 500 تكرار باستخدام -image_size=512 على Tesla K80 مع إعدادات مختلفة:
-backend nn -optimizer lbfgs : 117 ثانية-backend nn -optimizer adam : 100 ثانية-backend cudnn -optimizer lbfgs : 124 ثانية-backend cudnn -optimizer adam : 107 ثانية-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 ثانية-backend cudnn -cudnn_autotune -optimizer adam : 91 ثانيةفيما يلي نفس المعايير على GTX 1080:
-backend nn -optimizer lbfgs : 56 ثانية-backend nn -optimizer adam : 38 ثانية-backend cudnn -optimizer lbfgs : 40 ثانية-backend cudnn -optimizer adam : 40 ثانية-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 ثانية-backend cudnn -cudnn_autotune -optimizer adam : 24 ثانية يمكنك استخدام أجهزة CPU و GPU متعددة لمعالجة الصور بدقة أعلى ؛ سيتم حساب طبقات مختلفة من الشبكة على أجهزة مختلفة. يمكنك التحكم في أجهزة GPU و CPU باستخدام علامة -gpu ، ويمكنك التحكم في كيفية تقسيم الطبقات عبر الأجهزة باستخدام علامة -multidevice_strategy .
على سبيل المثال ، في خادم يحتوي على أربعة وحدات معالجة الرسومات ، يمكنك إعطاء العلم -gpu 0,1,2,3 للمعالجة على GPUS 0 و 1 و 2 و 3 في هذا الترتيب ؛ من خلال إعطاء العلم -multidevice_strategy 3,6,12 تشير إلى أنه ينبغي حساب الطبقتين الأوليين على GPU 0 ، يجب حساب الطبقات 3 إلى 5 على GPU 1 ، يجب حساب الطبقات من 6 إلى 11 على GPU 2 ، ويجب حساب الطبقات المتبقية على GPU 3. ستحتاج إلى تحكم في مواجهة -multidevice_strategy .
يمكننا تحقيق نتائج عالية الجودة بدقة عالية من خلال الجمع بين معالجة GPU متعددة مع توليد متعدد المقاييس كما هو موضح في الورقة التي تتحكم في العوامل الإدراكية في النقل العصبي من قبل ليون أ. جاتيس ، ألكساندر س.
فيما يلي صورة 4016 × 2213 التي تم إنشاؤها على خادم مع ثمانية وحدات معالجة الرسومات Tesla K80:
يمكن العثور على البرنامج النصي المستخدم لإنشاء هذه الصورة هنا.
تتم تهيئة الصور مع الضوضاء البيضاء وتحسينها باستخدام L-BFGs.
نقوم بإجراء عمليات إعادة بناء النمط باستخدام طبقات conv1_1 و conv2_1 و conv3_1 و conv4_1 و conv5_1 وإعادة بناء المحتوى باستخدام طبقة conv4_2 . كما في الورقة ، فإن خسائر إعادة بناء النمط الخمسة لها أوزان متساوية.
إذا وجدت هذا الرمز مفيدًا لبحثك ، فيرجى الاستشهاد به باستخدام الاقتباس المقدم.