درود، حبر! مطمئناً متوجه شده اید که موضوع سبک سازی عکس ها متناسب با سبک های هنری مختلف به طور فعال در این اینترنت های شما مورد بحث قرار گرفته است. با خواندن این همه مقاله پرطرفدار، ممکن است فکر کنید که در زیر کاپوت این برنامه ها جادو اتفاق می افتد و شبکه عصبی واقعاً در حال تصور و ترسیم مجدد تصویر از ابتدا است. اتفاقاً تیم ما با کار مشابهی روبرو شد: به عنوان بخشی از یک هکاتون داخلی شرکتی، یک سبک سازی ویدیویی ایجاد کردیم، زیرا ... قبلاً یک برنامه برای عکس وجود داشت. در این پست، نحوه ترسیم مجدد تصاویر توسط شبکه را بررسی خواهیم کرد و مقالاتی را که این امکان را فراهم کرده اند را تجزیه و تحلیل خواهیم کرد. توصیه می کنم قبل از مطالعه این مطالب و به طور کلی مبانی شبکه های عصبی کانولوشنال، پست قبلی را مطالعه کنید. فرمول‌ها، کدهایی (نمونه‌هایی روی Theano و Lasagne می‌آورم) و همچنین تعداد زیادی عکس پیدا خواهید کرد. این پست به ترتیب زمانی ظاهر مقالات و بر این اساس، خود ایده ها تنظیم شده است. گاهی اوقات من آن را با تجربه اخیر خود رقیق می کنم. اینجا پسری از جهنم است تا توجه شما را جلب کند.


تجسم و درک شبکه های کانولوشن (28 نوامبر 2013)

اول از همه، شایان ذکر است مقاله ای که در آن نویسندگان توانسته اند نشان دهند که یک شبکه عصبی یک جعبه سیاه نیست، بلکه یک چیز کاملاً قابل تفسیر است (به هر حال، امروز این را می توان نه تنها در مورد شبکه های کانولوشن برای رایانه گفت: بینایی). نویسندگان تصمیم گرفتند یاد بگیرند که چگونه فعال سازی نورون ها را در لایه های پنهان تفسیر کنند. انتشار). یک شبکه deconvolution در واقع همان شبکه با کانولوشن و ادغام است، اما به ترتیب معکوس اعمال می شود. کار اصلی در deconvnet از شبکه در حالت یادگیری بدون نظارت برای تولید تصاویر استفاده کرد. این بار، نویسندگان آن را صرفاً برای عقب نشینی از ویژگی های به دست آمده پس از عبور از شبکه به سمت تصویر اصلی استفاده کردند. نتیجه تصویری است که می تواند به عنوان سیگنالی که باعث این فعال شدن در نورون ها شده است تفسیر شود. طبیعتاً این سؤال مطرح می شود: چگونه می توان از کانولوشن و غیرخطی عبور معکوس ایجاد کرد؟ و حتی بیشتر از آن از طریق max-pooling، این مطمئناً یک عملیات معکوس نیست. بیایید به هر سه مؤلفه نگاه کنیم.

ReLu معکوس

در شبکه های کانولوشن اغلب از تابع فعال سازی استفاده می شود ReLu(x) = حداکثر (0، x)، که باعث می شود تمام فعال سازی های روی لایه غیر منفی باشد. بر این اساس، هنگام بازگشت از حالت غیرخطی، به دست آوردن نتایج غیرمنفی نیز ضروری است. برای این، نویسندگان پیشنهاد می کنند از همان ReLu استفاده کنید. از منظر معماری، Theano باید تابع گرادیان عملیات را نادیده بگیرد (نوت بوک بی نهایت ارزشمند در دستور العمل های لازانیا است، از آنجا جزئیات کلاس ModifiedBackprop را خواهید دید).

کلاس ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # صریحاً اصلاح return (self.nonlinearity(grd),) # از غیرخطی بودن داده شده استفاده کنید

پیچیدگی معکوس

این کمی پیچیده‌تر است، اما همه چیز منطقی است: کافی است یک نسخه جابجا شده از همان هسته کانولوشن را اعمال کنید، اما به‌جای لایه قبلی که در گذر رو به جلو استفاده می‌شد، در خروجی‌های ReLu معکوس استفاده کنید. اما من می ترسم که این در کلمات چندان واضح نباشد، بیایید به تجسم این رویه نگاهی بیندازیم (شما تجسم های بیشتری از کانولوشن ها خواهید یافت).


پیچیدگی با گام = 1

پیچیدگی با گام = 1 نسخه معکوس

پیچیدگی با گام = 2

پیچیدگی با گام = 2 نسخه معکوس

ادغام معکوس

این عملیات (برخلاف موارد قبلی) عموماً معکوس پذیر نیست. اما ما هنوز هم دوست داریم در طول مسیر برگشت به نحوی از حداکثر عبور کنیم. برای انجام این کار، نویسندگان پیشنهاد می‌کنند که از نقشه‌ای استفاده کنید که در آن حداکثر در طی یک پاس مستقیم (حداکثر سوئیچ‌های مکان) وجود دارد. در طول عبور معکوس، سیگنال ورودی به گونه‌ای تبدیل به unpooling می‌شود که تقریباً ساختار سیگنال اصلی را حفظ می‌کند.



نتیجه

الگوریتم تجسم بسیار ساده است:

  1. یک پاس مستقیم انجام دهید.
  2. لایه مورد نظر خود را انتخاب کنید.
  3. فعال شدن یک یا چند نورون را ضبط کنید و بقیه را ریست کنید.
  4. نتیجه مخالف بگیرید.

هر مربع خاکستری در تصویر زیر مربوط به تجسم فیلتر (که برای کانولوشن استفاده می شود) یا وزن یک نورون است و هر تصویر رنگی بخشی از تصویر اصلی است که نورون مربوطه را فعال می کند. برای وضوح، نورون های درون یک لایه به گروه های موضوعی گروه بندی می شوند. به طور کلی، ناگهان معلوم شد که شبکه عصبی دقیقاً متوجه می شود که هوبل و ویزل در کار خود در مورد ساختار سیستم بصری در مورد آن چیزی که در سال 1981 جایزه نوبل دریافت کردند، می نویسند. با تشکر از این مقاله، ما یک نمایش بصری از آنچه یک شبکه عصبی کانولوشن در هر لایه می آموزد، دریافت کردیم. این دانش است که بعداً به ما امکان می‌دهد تا محتوای تصویر تولید شده را دستکاری کنیم، اما چند سال آینده صرف بهبود روش‌های «ترپنینگ» شبکه‌های عصبی شد. علاوه بر این، نویسندگان مقاله روشی را برای تجزیه و تحلیل بهترین روش ساخت معماری یک شبکه عصبی کانولوشن برای دستیابی به نتایج بهتر پیشنهاد کردند (اگرچه آنها برنده ImageNet 2013 نشدند، اما به بالاترین سطح رسیدند. UPD: معلوم است که آنها بردند، کلاریفای همان چیزی است که هستند).


تجسم ویژگی


در اینجا مثالی از تجسم فعال‌سازی‌ها با استفاده از deconvnet آورده شده است، امروز این نتیجه خیلی خوب به نظر می‌رسد، اما پس از آن موفقیت‌آمیز بود.


نقشه های برجسته با استفاده از deconvnet

Deep Inside Convolutional Networks: Visualizing Image Classification Models and Saliency Maps (19 آوریل 2014)

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

تجسم مدل کلاس

بنابراین، تصور کنید که ما یک شبکه عصبی آموزش دیده برای حل یک مشکل طبقه بندی به تعداد معینی از کلاس ها داریم. اجازه دهید مقدار فعال‌سازی نورون خروجی را که مربوط به کلاس است، نشان دهیم ج. سپس مسئله بهینه سازی زیر دقیقاً تصویری را به ما می دهد که کلاس انتخاب شده را به حداکثر می رساند:



این مشکل را می توان به راحتی با استفاده از Theano حل کرد. معمولاً از فریمورک می‌خواهیم که مشتق را با توجه به پارامترهای مدل بگیرد، اما این بار فرض می‌کنیم که پارامترها ثابت هستند و مشتق با توجه به تصویر ورودی گرفته می‌شود. تابع زیر حداکثر مقدار لایه خروجی را انتخاب می کند و تابعی را برمی گرداند که مشتق تصویر ورودی را محاسبه می کند.


def compile_saliency_function(net): """ تابعی را برای محاسبه نقشه های برجسته و کلاس های پیش بینی شده برای یک دسته کوچک از تصاویر ورودی کامپایل می کند. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"]، deterministic=True) max_outp = T.max(outp، axis=1) saliency = theano.grad(max_outp.sum()، wrt=inp) max_class = T.argmax(outp، axis=1) بازگشت theano.function(, )

احتمالاً تصاویر عجیبی با چهره سگ در اینترنت دیده اید - DeepDream. در مقاله اصلی، نویسندگان از فرآیند زیر برای تولید تصاویری استفاده می کنند که کلاس انتخاب شده را به حداکثر می رساند:

  1. تصویر اولیه را با صفر مقداردهی کنید.
  2. مقدار مشتق را از این تصویر محاسبه کنید.
  3. تصویر را با اضافه کردن تصویر حاصل از مشتق به آن تغییر دهید.
  4. به نقطه 2 برگردید یا از حلقه خارج شوید.

تصاویر به دست آمده عبارتند از:




اگر اولین تصویر را با یک عکس واقعی مقداردهی اولیه کنیم و همین روند را شروع کنیم چه؟ اما در هر تکرار یک کلاس تصادفی انتخاب می کنیم، بقیه را بازنشانی می کنیم و مقدار مشتق را محاسبه می کنیم، سپس چیزی شبیه به این رویای عمیق به دست می آوریم.


احتیاط 60 مگابایت


چرا این همه صورت و چشم سگ وجود دارد؟ ساده است: تقریباً 200 سگ از 1000 کلاس در تصویر نت وجود دارد، آنها چشم دارند. و همچنین بسیاری از کلاس ها که در آن افراد به سادگی وجود دارند.

استخراج برجستگی کلاس

اگر این فرآیند با یک عکس واقعی مقداردهی اولیه شود، پس از اولین تکرار متوقف شود و مقدار مشتق ترسیم شود، چنین تصویری به دست خواهیم آورد که با اضافه کردن آن به اصلی، مقدار فعال سازی کلاس انتخاب شده را افزایش خواهیم داد.


نقشه های برجسته با استفاده از مشتق


باز هم نتیجه "چنین" است. توجه به این نکته مهم است که این یک روش جدید برای تجسم فعال‌سازی‌ها است (هیچ چیز مانع از این نمی‌شود که مقادیر فعال‌سازی را نه در آخرین لایه، بلکه در هر لایه از شبکه به طور کلی ثابت کنیم و مشتق را با توجه به تصویر ورودی بگیریم. ). مقاله بعدی هر دو رویکرد قبلی را ترکیب می کند و ابزاری در مورد نحوه تنظیم انتقال سبک به ما ارائه می دهد که بعدا توضیح داده خواهد شد.

تلاش برای سادگی: شبکه همه جانبه (13 آوریل 2015)

این مقاله به طور کلی در مورد تجسم نیست، بلکه در مورد این واقعیت است که جایگزین کردن Pooling با Convolution با یک گام بزرگ منجر به افت کیفیت نمی شود. اما به عنوان محصول جانبی تحقیقات خود، نویسندگان روش جدیدی را برای تجسم ویژگی‌ها پیشنهاد کردند که از آن برای تجزیه و تحلیل دقیق‌تر آنچه مدل یاد می‌گیرد استفاده کردند. ایده آنها به این صورت است: اگر به سادگی مشتق را بگیریم، در حین دکانولوشن آن ویژگی هایی که در تصویر ورودی کمتر از صفر بودند، پس داده نمی شوند (با استفاده از ReLu برای تصویر ورودی). و این منجر به ظاهر شدن مقادیر منفی روی تصویر در حال انتشار می شود. از طرف دیگر، اگر از deconvnet استفاده می کنید، ReLu دیگری از مشتق ReLu گرفته می شود - این به شما امکان می دهد مقادیر منفی را پس نزنید، اما همانطور که دیدید، نتیجه "چنین" است. اما اگر این دو روش را با هم ترکیب کنید چه؟




class GuidedBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads dtype = inp.dtype بازگشت (grd * (inp > 0).atype(dtype) * (grd > 0).atype(dtype)،)

سپس یک تصویر کاملا تمیز و قابل تفسیر خواهید داشت.


نقشه های برجستگی با استفاده از پس انتشار هدایت شده

عمیق تر برو

حالا بیایید به این فکر کنیم که این چه چیزی به ما می دهد؟ به شما یادآوری کنم که هر لایه کانولوشن تابعی است که یک تانسور سه بعدی را به عنوان ورودی دریافت می کند و همچنین یک تانسور سه بعدی را به عنوان خروجی تولید می کند، شاید با ابعاد متفاوت. د x w x ساعت; د epth تعداد نورون های لایه است که هر یک از آنها یک نقشه ویژگی از اندازه ایجاد می کند w igth x ساعتهشت


بیایید آزمایش زیر را در شبکه VGG-19 امتحان کنیم:



conv1_2

بله، شما تقریباً هیچ چیز نمی بینید، زیرا ... ناحیه پذیرنده بسیار کوچک است، این دومین پیچش 3x3 است، به ترتیب، مساحت کل 5x5 است. اما با بزرگنمایی، می بینیم که این ویژگی فقط یک آشکارساز گرادیان است.




conv3_3


conv4_3


conv5_3


استخر 5


حالا بیایید تصور کنیم که به جای حداکثر روی بلوک، مشتق مقدار مجموع همه عناصر بلوک را روی تصویر ورودی می گیریم. سپس بدیهی است که ناحیه پذیرنده گروهی از نورون ها کل تصویر ورودی را پوشش می دهد. برای لایه‌های اولیه، نقشه‌های روشنی خواهیم دید که از آن‌ها نتیجه می‌گیریم که اینها آشکارسازهای رنگ، سپس گرادیان، سپس لبه‌ها و غیره به سمت الگوهای پیچیده‌تر هستند. هر چه لایه عمیق تر باشد، تصویر کم نورتر می شود. این با این واقعیت توضیح داده می شود که لایه های عمیق تر الگوی پیچیده تری دارند که آنها را تشخیص می دهند، و یک الگوی پیچیده کمتر از یک الگوی ساده ظاهر می شود، بنابراین نقشه فعال سازی محو می شود. روش اول برای درک لایه هایی با الگوهای پیچیده مناسب است و روش دوم فقط برای لایه های ساده است.


conv1_1


conv2_2


conv4_3


می توانید دیتابیس کامل تری از فعال سازی های چند تصویر و .

الگوریتم عصبی سبک هنری (2 سپتامبر 2015)

بنابراین، چند سال از اولین ترپاناسیون موفق شبکه عصبی می گذرد. ما (به معنای انسانیت) ابزار قدرتمندی در دست داریم که به ما امکان می‌دهد بفهمیم یک شبکه عصبی چه می‌آموزد، و همچنین آنچه را که واقعاً نمی‌خواهیم یاد بگیرد را حذف کنیم. نویسندگان این مقاله در حال توسعه روشی هستند که به یک تصویر اجازه می دهد تا نقشه فعال سازی مشابهی را با برخی از تصاویر هدف ایجاد کند، و شاید حتی بیش از یک - این اساس سبک سازی است. ما نویز سفید را به ورودی اعمال می‌کنیم و با استفاده از یک فرآیند تکراری مشابه مانند رویای عمیق، این تصویر را به تصویری کاهش می‌دهیم که نقشه‌های ویژگی مشابه تصویر هدف باشد.

از دست دادن محتوا

همانطور که قبلا ذکر شد، هر لایه از شبکه عصبی یک تانسور سه بعدی با ابعاد خاصی تولید می کند.




بیایید خروجی را نشان دهیم منلایه هفتم از ورودی به عنوان . سپس اگر مجموع وزنی باقیمانده بین تصویر ورودی را به حداقل برسانیم و تصویری که ما به دنبال آن هستیم ج، سپس دقیقاً آنچه را که نیاز دارید دریافت خواهید کرد. شاید.



برای آزمایش این مقاله، می توانید از این لپ تاپ جادویی استفاده کنید، محاسبات در آنجا انجام می شود (هم روی GPU و هم روی CPU). GPU برای محاسبه ویژگی های شبکه عصبی و مقدار تابع هزینه استفاده می شود. Theano تابعی تولید می کند که می تواند گرادیان تابع هدف را محاسبه کند eval_gradتوسط تصویر ورودی x. سپس به lbfgs وارد می شود و فرآیند تکراری آغاز می شود.


# مقداردهی اولیه را با یک تصویر نویز ایجاد کنید. = xs.append(x0) # Optimize، ذخیره نتیجه به صورت دوره ای برای i در محدوده(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generated_image.get_value().atype("float64") xs.append(x0)

اگر بهینه سازی چنین تابعی را اجرا کنیم، به سرعت تصویری شبیه به هدف بدست می آوریم. اکنون می‌توانیم از نویز سفید برای بازسازی تصاویری که شبیه به برخی از تصاویر محتوا هستند استفاده کنیم.


از دست دادن محتوا: conv4_2



فرآیند بهینه سازی




به راحتی می توان به دو ویژگی تصویر حاصل توجه کرد:

  • رنگ ها از بین رفتند - این نتیجه این واقعیت است که در یک مثال خاص فقط از لایه conv4_2 استفاده شده است (یا به عبارت دیگر وزن w برای آن غیر صفر و برای لایه های دیگر صفر بود). همانطور که به یاد دارید، این لایه های اولیه هستند که حاوی اطلاعاتی در مورد رنگ ها و انتقال گرادیان هستند، و لایه های بعدی حاوی اطلاعاتی در مورد جزئیات بزرگتر هستند، چیزی که ما مشاهده می کنیم - رنگ ها گم می شوند، اما محتوا نیست.
  • برخی از خانه ها "جابه جا شده اند"، یعنی. خطوط مستقیم کمی منحنی هستند - این به این دلیل است که هر چه لایه عمیق تر باشد، اطلاعات کمتری در مورد موقعیت مکانی ویژگی موجود در آن وجود دارد (نتیجه استفاده از کانولوشن و ادغام).

افزودن لایه های اولیه بلافاصله وضعیت رنگ را اصلاح می کند.


از دست دادن محتوا: conv1_1، conv2_1، conv4_2


امیدواریم که تا به حال احساس کنید که کنترلی روی آنچه که در تصویر نویز سفید دوباره ترسیم می شود، دارید.

از دست دادن سبک

و اکنون به جالب ترین قسمت می رسیم: چگونه می توانیم سبک را منتقل کنیم؟ استایل چیست؟ بدیهی است که سبک چیزی نیست که ما در Content Loss بهینه سازی کنیم، زیرا حاوی اطلاعات زیادی در مورد موقعیت مکانی ویژگی ها است، بنابراین اولین کاری که باید انجام دهیم این است که به نوعی این اطلاعات را از نماهای دریافتی در هر لایه حذف کنیم.


نویسنده روش زیر را پیشنهاد می کند. بیایید تانسور را در خروجی یک لایه خاص بگیریم، آن را در امتداد مختصات فضایی گسترش دهیم و ماتریس کوواریانس بین قالب ها را محاسبه کنیم. اجازه دهید این تبدیل را به عنوان نشان دهیم جی. واقعا ما چه کرده ایم؟ می‌توانیم بگوییم که ما محاسبه کرده‌ایم که ویژگی‌های درون یک پچ چند بار به صورت جفت اتفاق می‌افتند، یا به عبارت دیگر، توزیع ویژگی‌ها در وصله‌ها را با توزیع نرمال چند متغیره تقریبی کردیم.




سپس Style Loss به صورت زیر وارد می شود که در آن س- این یک تصویر با سبک است:



آیا آن را برای وینسنت امتحان کنیم؟ ما در اصل چیزی مورد انتظار را دریافت می کنیم - سر و صدا به سبک ون گوگ، اطلاعات در مورد ترتیب فضایی ویژگی ها به طور کامل از بین می رود.


وینسنت




اگر به جای یک تصویر سبک، یک عکس قرار دهید چه؟ ویژگی های آشنا، رنگ های آشنا را دریافت خواهید کرد، اما موقعیت مکانی کاملاً از بین رفته است.


عکس با افت سبک


احتمالاً از خود پرسیده اید که چرا ماتریس کوواریانس را محاسبه می کنیم نه چیز دیگری؟ از این گذشته، راه‌های زیادی برای تجمیع ویژگی‌ها وجود دارد تا مختصات فضایی از بین برود. این واقعاً یک سؤال باز است، و اگر چیزی بسیار ساده را در نظر بگیرید، نتیجه به طور چشمگیری تغییر نخواهد کرد. بیایید این را بررسی کنیم، ماتریس کوواریانس را محاسبه نمی کنیم، بلکه فقط مقدار میانگین هر صفحه را محاسبه می کنیم.




از دست دادن سبک ساده

ضرر ترکیبی

به طور طبیعی، تمایل به ترکیب این دو تابع هزینه وجود دارد. سپس تصویری از نویز سفید تولید می‌کنیم به طوری که ویژگی‌های تصویر محتوا (که به مختصات فضایی مرتبط هستند) را حفظ می‌کند و همچنین شامل ویژگی‌های «سبکی» می‌شود که به مختصات فضایی مرتبط نیستند، یعنی. امیدواریم جزئیات تصویر محتوا از جای خود دست نخورده باقی بماند، اما با سبک دلخواه دوباره ترسیم شود.



در واقع یک تنظیم کننده نیز وجود دارد، اما برای سادگی آن را حذف می کنیم. پاسخ به این سوال باقی می ماند: از کدام لایه ها (وزن ها) در طول بهینه سازی استفاده شود؟ و من می ترسم که من و نویسندگان مقاله پاسخی برای این سوال نداشته باشم. آنها پیشنهادی برای استفاده از موارد زیر دارند، اما این به هیچ وجه به این معنی نیست که ترکیب دیگری بدتر کار خواهد کرد، فضای جستجو خیلی بزرگ است. تنها قاعده ای که از درک مدل به دست می آید: گرفتن لایه های مجاور فایده ای ندارد، زیرا ویژگی های آنها تفاوت چندانی با یکدیگر نخواهد داشت، بنابراین یک لایه از هر گروه conv*_1 به سبک اضافه می شود.


# تعریف تلفات تابع از دست دادن = # از دست دادن محتوا losses.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # style loss losses.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) losses.append (0.2e6 * style_loss(art_features، gen_features، "conv2_1")) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) losses.append(0.2e6 * style_loss(art_features, "4e_features, "genv ) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # total variation penalty losses.append(0.1e-7 * total_variation_loss(تصویر_تولید شده)) total_loss = مجموع (زیان)

مدل نهایی را می توان به صورت زیر ارائه کرد.




و در اینجا نتیجه خانه هایی با ون گوگ است.



تلاش برای کنترل روند

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




خوب، یک مشکل دیگر وجود دارد. فرض کنید لایه ای پیدا کردیم که ویژگی های مورد نیاز ما را استخراج می کند. فرض کنید برخی از بافت ها مثلثی هستند. اما این لایه همچنین شامل بسیاری از ویژگی‌های دیگر مانند دایره‌ها است که ما واقعاً نمی‌خواهیم آن‌ها را در تصویر حاصل ببینیم. به طور کلی، اگر می‌توانستیم یک میلیون چینی استخدام کنیم، می‌توانیم تمام ویژگی‌های یک تصویر سبک را تجسم کنیم، و با زور فقط مواردی را که نیاز داریم علامت‌گذاری کنیم و فقط آنها را در تابع هزینه لحاظ کنیم. اما به دلایل واضح آنقدرها هم ساده نیست. اما اگر به سادگی تمام دایره هایی را که نمی خواهیم در نتیجه مشاهده کنیم را از تصویر استایل حذف کنیم، چه؟ سپس فعال شدن نورون های مربوطه که به دایره ها پاسخ می دهند به سادگی کار نخواهد کرد. و طبیعتاً این در تصویر حاصل ظاهر نخواهد شد. در مورد گلها هم همینطور است. تصویری روشن با رنگ های زیاد را تصور کنید. توزیع رنگ ها در کل فضا بسیار لکه دار خواهد شد و توزیع تصویر حاصل یکسان خواهد بود، اما در فرآیند بهینه سازی، آن پیک هایی که روی اصلی بودند احتمالا از بین خواهند رفت. مشخص شد که به سادگی کاهش عمق بیت پالت رنگ این مشکل را حل می کند. چگالی توزیع اکثر رنگ ها نزدیک به صفر خواهد بود و در چند ناحیه پیک های بزرگی وجود خواهد داشت. بنابراین، با دستکاری نسخه اصلی در فتوشاپ، ویژگی های استخراج شده از تصویر را دستکاری می کنیم. بیان خواسته های خود به صورت بصری برای شخص آسان تر از این است که بخواهد آنها را به زبان ریاضی فرموله کند. خداحافظ در نتیجه، طراحان و مدیران، مجهز به فتوشاپ و اسکریپت‌هایی برای تجسم ویژگی‌ها، سه برابر سریع‌تر از آنچه ریاضی‌دانان و برنامه‌نویسان انجام می‌دادند، به نتایج دست یافتند.


نمونه ای از دستکاری رنگ و اندازه ویژگی ها


یا می توانید از یک تصویر ساده به عنوان سبک استفاده کنید



نتایج








این یک ویدیو است، اما فقط با بافت مناسب

شبکه‌های بافت: سنتز فید فوروارد بافت‌ها و تصاویر سبک (10 مارس 2016)

به نظر می رسد که ما می توانستیم در آنجا متوقف شویم، اگر نه برای یک نکته ظریف. تکمیل الگوریتم سبک سازی فوق زمان بسیار زیادی را می طلبد. اگر پیاده‌سازی را در نظر بگیریم که lbfgs روی CPU اجرا می‌شود، این فرآیند حدود پنج دقیقه طول می‌کشد. اگر آن را بازنویسی کنید تا بهینه سازی به پردازنده گرافیکی برود، فرآیند 10-15 ثانیه طول می کشد. این خوب نیست شاید نویسندگان این مقاله و مقاله بعدی به همین موضوع فکر کرده باشند. هر دو نشریه به طور مستقل و با فاصله 17 روز و تقریبا یک سال پس از مقاله قبلی منتشر شدند. نویسندگان مقاله فعلی، مانند نویسندگان مقاله قبلی، مشغول تولید بافت هستند (اگر فقط Style Loss را به صفر تنظیم کنید، این همان چیزی است که دریافت خواهید کرد). آنها پیشنهاد کردند که نه یک تصویر به دست آمده از نویز سفید، بلکه برخی از شبکه های عصبی که یک تصویر تلطیف شده تولید می کنند، بهینه سازی کنند.




حال، اگر فرآیند استایل شامل هیچ بهینه‌سازی نباشد، فقط باید یک پاس رو به جلو انجام دهید. و بهینه سازی فقط یک بار برای آموزش شبکه ژنراتور مورد نیاز است. این مقاله از یک مولد سلسله مراتبی استفاده می کند، که در آن هر کدام بعدی zاز نظر اندازه بزرگتر از قبلی و نمونه برداری از نویز در مورد تولید بافت، و از برخی پایگاه داده تصویر برای آموزش سبک. استفاده از چیزی غیر از بخش آموزشی imagenet بسیار مهم است، زیرا... ویژگی های داخل شبکه Loss توسط شبکه آموزش دیده در طول بخش آموزش محاسبه می شود.



تلفات ادراکی برای انتقال سبک در زمان واقعی و وضوح فوق العاده (27 مارس 2016)

همانطور که از عنوان پیداست، نویسندگانی که تنها 17 روز با ایده یک شبکه مولد تاخیر داشتند، روی افزایش وضوح تصاویر کار می کردند. آنها ظاهراً از موفقیت یادگیری باقی مانده در جدیدترین ایمیج نت الهام گرفته بودند.




بر این اساس، بلوک باقیمانده و بلوک تبدیل.



بنابراین، اکنون ما علاوه بر کنترل روی استایل، یک مولد سریع داریم (به لطف این دو مقاله، زمان تولید یک تصویر در ده‌ها میلی‌ثانیه اندازه‌گیری می‌شود).

پایان

ما از اطلاعات مقالات بررسی شده و کد نویسندگان به عنوان نقطه شروع برای ایجاد یک برنامه کاربردی دیگر برای استایل دهی اولین برنامه استایلینگ ویدیو استفاده کردیم:



چیزی شبیه به این تولید می کند.


در معمولی ترین عکس ها، موجودیت های متعدد و نه کاملاً قابل تشخیص ظاهر می شوند. اغلب، به دلایلی، سگ ها. اینترنت پر از چنین تصاویری در ژوئن 2015 شد، زمانی که DeepDream گوگل راه اندازی شد - یکی از اولین سرویس های باز مبتنی بر شبکه های عصبی و طراحی شده برای پردازش تصویر.

چیزی شبیه به این اتفاق می افتد: الگوریتم عکس ها را تجزیه و تحلیل می کند، قطعاتی را در آنها پیدا می کند که آن را به یاد برخی از اشیاء آشنا می اندازد - و تصویر را مطابق با این داده ها تحریف می کند.

ابتدا این پروژه به صورت متن باز منتشر شد و سپس خدمات آنلاین ایجاد شده بر اساس همان اصول در اینترنت ظاهر شد. یکی از راحت‌ترین و محبوب‌ترین آنها Deep Dream Generator است: پردازش یک عکس کوچک در اینجا فقط حدود 15 ثانیه طول می‌کشد (قبلاً کاربران مجبور بودند بیش از یک ساعت منتظر بمانند).

چگونه شبکه های عصبی ایجاد چنین تصاویری را یاد می گیرند؟ و به هر حال، چرا آنها به این نام خوانده می شوند؟

شبکه های عصبی در ساختار خود از شبکه های عصبی واقعی یک موجود زنده تقلید می کنند، اما این کار را با استفاده از الگوریتم های ریاضی انجام می دهند. با ایجاد یک ساختار اولیه، می توانید آن را با استفاده از روش های یادگیری ماشینی آموزش دهید. اگر در مورد تشخیص تصویر صحبت می کنیم، هزاران تصویر باید از طریق یک شبکه عصبی منتقل شوند. اگر وظیفه شبکه عصبی متفاوت باشد، تمرینات آموزشی متفاوت خواهند بود.

الگوریتم های بازی شطرنج، به عنوان مثال، بازی های شطرنج را تجزیه و تحلیل می کنند. به همین ترتیب، الگوریتم AlphaGo از Google DeepMind به بازی چینی Go - که به عنوان یک پیشرفت در نظر گرفته شد، زیرا Go بسیار پیچیده تر و غیر خطی تر از شطرنج است.

    شما می توانید با یک مدل ساده از شبکه های عصبی بازی کنید و اصول آن را بهتر درک کنید.

    همچنین یک سری نقاشی قابل درک در یوتیوب وجود دارد غلطک هادر مورد نحوه عملکرد شبکه های عصبی

یکی دیگر از سرویس های محبوب Dreamscope است که نه تنها می تواند در مورد سگ ها رویاپردازی کند، بلکه از سبک های مختلف نقاشی نیز تقلید می کند. پردازش تصویر در اینجا نیز بسیار ساده و سریع است (حدود 30 ثانیه).

ظاهراً بخش الگوریتمی سرویس، اصلاح برنامه "سبک عصبی" است که قبلاً در مورد آن صحبت کردیم.

اخیراً برنامه ای ظاهر شده است که تصاویر سیاه و سفید را به طور واقعی رنگ می کند. در نسخه‌های قبلی، برنامه‌های مشابه کار خود را خیلی کمتر انجام می‌دادند و اگر حداقل 20 درصد از مردم نمی‌توانستند تصویر واقعی را از تصویر رنگ‌شده توسط رایانه تشخیص دهند، دستاورد بزرگی محسوب می‌شد.

علاوه بر این، رنگ آمیزی در اینجا فقط حدود 1 دقیقه طول می کشد.

همین شرکت توسعه همچنین سرویسی را راه اندازی کرد که انواع مختلف اشیاء را در تصاویر تشخیص می دهد.

این خدمات ممکن است فقط یک سرگرمی سرگرم کننده به نظر برسد، اما در واقعیت همه چیز بسیار جالب تر است. فن آوری های جدید وارد عمل هنرمندان انسانی شده و درک ما از هنر را تغییر می دهد. این احتمال وجود دارد که مردم به زودی مجبور به رقابت با ماشین ها در زمینه خلاقیت شوند.

آموزش الگوریتم‌ها برای تشخیص تصاویر، کاری است که توسعه‌دهندگان هوش مصنوعی مدت‌هاست با آن دست و پنجه نرم می‌کنند. بنابراین، برنامه‌هایی که عکس‌های قدیمی را رنگی می‌کنند و سگ‌ها را در آسمان می‌کشند، می‌توانند بخشی از یک فرآیند بزرگ‌تر و جذاب‌تر در نظر گرفته شوند.

از زمانی که محققان آلمانی از دانشگاه توبینگن ایده خود را مبنی بر انتقال سبک هنرمندان مشهور به عکس های دیگر در آگوست 2015 ارائه کردند، خدماتی ظاهر شدند که از این فرصت درآمدزایی می کنند. در بازار غرب عرضه شد و نسخه کامل آن در بازار روسیه عرضه شد.

نشانک ها

با وجود این واقعیت که Ostagram در ماه دسامبر راه اندازی شد، در اواسط آوریل شروع به محبوبیت سریع در شبکه های اجتماعی کرد. در همان زمان، تا 19 آوریل، کمتر از هزار نفر در پروژه VKontakte بودند.

برای استفاده از این سرویس، باید دو تصویر تهیه کنید: یک عکس که باید پردازش شود، و یک عکس با نمونه ای از سبک برای پوشش روی عکس اصلی.

این سرویس یک نسخه رایگان دارد: تصویری با حداقل وضوح حداکثر تا 600 پیکسل در طول طولانی ترین سمت تصویر ایجاد می کند. کاربر تنها نتیجه یکی از تکرارهای اعمال فیلتر روی عکس را دریافت می کند.

دو نسخه پولی وجود دارد: Premium تصویری تا 700 پیکسل در طولانی‌ترین ضلع تولید می‌کند و 600 تکرار پردازش شبکه عصبی را روی تصویر اعمال می‌کند (هرچه تکرار بیشتر باشد، پردازش جالب‌تر و فشرده‌تر است). یک چنین عکس 50 روبل هزینه خواهد داشت.

در نسخه HD، می توانید تعداد تکرارها را سفارشی کنید: 100 تکرار 50 روبل و 1000 250 روبل هزینه دارد. در این حالت، تصویر تا 1200 پیکسل در طولانی ترین سمت وضوح خواهد داشت و می توان از آن برای چاپ روی بوم استفاده کرد: Ostagram چنین خدماتی را با تحویل از 1800 روبل ارائه می دهد.

در ماه فوریه، نمایندگان Ostagram اعلام کردند که درخواست پردازش تصویر از سوی کاربران "از کشورهای دارای سرمایه داری توسعه یافته" را نمی پذیرند، اما سپس به پردازش عکس برای کاربران VKontakte از سراسر جهان دسترسی خواهند داشت. با قضاوت بر اساس کد Ostagram منتشر شده در GitHub، این کد توسط سرگئی موروگین، ساکن 30 ساله نیژنی نووگورود توسعه یافته است.

تی جی با مدیر بازرگانی پروژه تماس گرفت که خود را آندری معرفی کرد. به گفته او، Ostagram قبل از Instapainting ظاهر شد، اما از پروژه مشابهی به نام Vipart الهام گرفت.

Ostagram توسط گروهی از دانشجویان از NSTU توسعه یافته است. الکسیوا: پس از آزمایش اولیه روی یک گروه باریک از دوستان، در پایان سال 2015 تصمیم گرفتند پروژه را عمومی کنند. در ابتدا، پردازش تصویر کاملا رایگان بود و برنامه این بود که از طریق فروش نقاشی های چاپ شده درآمد کسب کنید. به گفته آندری، چاپ بزرگترین مشکل است: عکس های افراد پردازش شده توسط یک شبکه عصبی به ندرت برای چشم انسان خوشایند به نظر می رسند و مشتری نهایی قبل از اعمال آن روی بوم به زمان زیادی نیاز دارد تا نتیجه را تنظیم کند، که نیاز به آن دارد. منابع ماشینی بزرگ

سازندگان Ostagram می خواستند از سرورهای ابری آمازون برای پردازش تصاویر استفاده کنند، اما پس از هجوم کاربران مشخص شد که هزینه ها با حداقل بازگشت سرمایه از هزار دلار در روز فراتر می رود. آندری که در این پروژه نیز سرمایه گذار است، ظرفیت سرور را در نیژنی نووگورود اجاره کرد.

مخاطبان این پروژه روزانه حدود هزار نفر است، اما در برخی از روزها به دلیل مراجعه رسانه های خارجی که پیش از رسانه های داخلی متوجه پروژه شده بودند، به 40 هزار نفر می رسید (اوستاگرام حتی موفق به همکاری با دی جی های اروپایی شد). در شب، زمانی که ترافیک کم است، پردازش تصویر ممکن است 5 دقیقه و در روز تا یک ساعت طول بکشد.

اگر دسترسی قبلی به پردازش تصویر عمداً به کاربران خارجی محدود می شد (آنها به فکر شروع کسب درآمد در روسیه بودند)، اکنون Ostagram بیشتر روی مخاطبان غربی حساب می کند.

امروز، چشم انداز جبران مشروط است. اگر هر کاربر 10 روبل برای پردازش بپردازد، شاید نتیجه دهد. […]

کسب درآمد در کشور ما بسیار دشوار است: مردم ما آماده اند یک هفته صبر کنند، اما یک ریال برای آن پرداخت نخواهند کرد. اروپایی ها نسبت به این امر مطلوب تر هستند - از نظر پرداخت هزینه برای افزایش سرعت، بهبود کیفیت - بنابراین آنها آن بازار را هدف قرار می دهند.

آندری، نماینده Ostagram

به گفته آندری، تیم Ostagram در حال کار بر روی نسخه جدیدی از سایت با تاکید بیشتر بر اجتماعی بودن است: "این شبیه به یک سرویس شناخته شده خواهد بود، اما چه باید کرد." نمایندگان فیس بوک در روسیه قبلاً به این پروژه علاقه داشتند، اما این موضوع هنوز به مذاکره در مورد فروش نرسیده است.

نمونه کارهای خدماتی

در فید وب سایت Ostagram، می توانید ترکیبی از تصاویر را نیز مشاهده کنید که منجر به عکس های نهایی شده است: اغلب این حتی از خود نتیجه جالب تر است. در این مورد، فیلترها - تصاویری که به عنوان جلوه ای برای پردازش استفاده می شوند - می توانند برای استفاده در آینده ذخیره شوند.