चित्र तंत्रिका नेटवर्क। तंत्रिका नेटवर्क का उपयोग करके छवियों को स्टाइल करना: कोई रहस्यवाद नहीं, केवल शपथ लेना

घर / भूतपूर्व

सबसे साधारण तस्वीरों में, कई और पूरी तरह से अलग-अलग इकाइयाँ दिखाई नहीं देती हैं। अक्सर किसी कारण से कुत्ते। इस तरह की छवियों ने जून 2015 में इंटरनेट पर भरना शुरू किया, जब Google से डीपड्रीम लॉन्च किया गया था - पहले में से एक खुली सेवाएंतंत्रिका नेटवर्क पर आधारित और छवि प्रसंस्करण के लिए डिज़ाइन किया गया।

यह लगभग इस तरह होता है: एल्गोरिथ्म तस्वीरों का विश्लेषण करता है, उनमें ऐसे टुकड़े ढूंढता है जो इसे कुछ परिचित वस्तुओं की याद दिलाते हैं - और इन आंकड़ों के अनुसार छवि को विकृत करते हैं।

सबसे पहले, परियोजना को एक खुले स्रोत के रूप में रखा गया था, और फिर समान सिद्धांतों पर बनाई गई ऑनलाइन सेवाएं इंटरनेट पर दिखाई दीं। सबसे सुविधाजनक और लोकप्रिय में से एक डीप ड्रीम जेनरेटर है: यहां एक छोटी सी तस्वीर को संसाधित करने में केवल 15 सेकंड लगते हैं (पहले, उपयोगकर्ताओं को एक घंटे से अधिक इंतजार करना पड़ता था)।

तंत्रिका नेटवर्क ऐसी छवियां बनाना कैसे सीखते हैं? और वैसे, उन्हें ऐसा क्यों कहा जाता है?

उनके डिजाइन में तंत्रिका नेटवर्क एक जीवित जीव के वास्तविक तंत्रिका नेटवर्क की नकल करते हैं, लेकिन वे गणितीय एल्गोरिदम की मदद से ऐसा करते हैं। एक बुनियादी संरचना बनाने के बाद, आप इसे मशीन लर्निंग विधियों का उपयोग करके प्रशिक्षित कर सकते हैं। यदि हम पैटर्न मान्यता के बारे में बात कर रहे हैं, तो हजारों छवियों को तंत्रिका नेटवर्क से गुजरने की आवश्यकता होती है। यदि तंत्रिका नेटवर्क का कार्य अलग है, तो प्रशिक्षण अभ्यास अलग होगा।

शतरंज खेलने के लिए एल्गोरिदम, उदाहरण के लिए, विश्लेषण करें शतरंज का खेल. उसी रास्ते पर, Google के डीपमाइंड के अल्फ़ागो एल्गोरिदम ने गो के चीनी गेम में - जिसे एक सफलता के रूप में देखा गया क्योंकि गो शतरंज की तुलना में बहुत अधिक जटिल और गैर-रैखिक है।

    आप एक सरलीकृत तंत्रिका नेटवर्क मॉडल के साथ खेल सकते हैं और इसके सिद्धांतों को बेहतर ढंग से समझ सकते हैं।

    YouTube के पास हाथ से तैयार की जाने वाली बोधगम्य श्रृंखला भी है रोलर्सतंत्रिका नेटवर्क कैसे काम करते हैं इसके बारे में।

एक अन्य लोकप्रिय सेवा ड्रीम्सस्कोप है, जो न केवल कुत्तों के बारे में सपने देख सकती है, बल्कि विभिन्न पेंटिंग शैलियों की नकल भी कर सकती है। यहां इमेज प्रोसेसिंग भी बहुत सरल और तेज (लगभग 30 सेकंड) है।

जाहिर है, सेवा का एल्गोरिथम हिस्सा तंत्रिका शैली के कार्यक्रम का एक संशोधन है, जिस पर हम पहले ही चर्चा कर चुके हैं।

हाल ही में, एक कार्यक्रम सामने आया है जो वास्तविक रूप से श्वेत और श्याम छवियों को चित्रित करता है। पिछले संस्करणों में, इसी तरह के कार्यक्रमों ने अपना काम बहुत कम किया था, और इसे एक बड़ी उपलब्धि माना जाता था यदि कम से कम 20% लोग वास्तविक तस्वीर और कंप्यूटर-रंग के बीच अंतर नहीं बता सके।

इसके अलावा, यहां रंगीकरण में केवल 1 मिनट का समय लगता है।

उसी विकास कंपनी ने एक ऐसी सेवा भी शुरू की जो तस्वीरों में पहचानती है अलग - अलग प्रकारवस्तुओं।

ये सेवाएं केवल मनोरंजक मनोरंजन की तरह लग सकती हैं, लेकिन वास्तव में, सब कुछ बहुत अधिक दिलचस्प है। नई प्रौद्योगिकियां मानव कलाकारों के अभ्यास में प्रवेश करती हैं और कला की हमारी समझ को बदल देती हैं। शायद जल्द ही लोगों को रचनात्मकता के क्षेत्र में मशीनों से मुकाबला करना होगा।

टीचिंग पैटर्न रिकग्निशन एल्गोरिदम एक ऐसा कार्य है जिससे एआई डेवलपर्स लंबे समय से जूझ रहे हैं। इसलिए, पुरानी तस्वीरों को रंगीन करने और कुत्तों को आकाश में खींचने वाले कार्यक्रमों को एक बड़ी और अधिक पेचीदा प्रक्रिया का हिस्सा माना जा सकता है।

नमस्ते, हबर! निश्चित रूप से आपने देखा है कि विभिन्न के लिए फोटो स्टाइल करने का विषय कलात्मक शैलीइन आपके इंटरनेट में सक्रिय रूप से चर्चा की गई। इन सभी लोकप्रिय लेखों को पढ़कर, आप सोच सकते हैं कि इन अनुप्रयोगों के हुड के नीचे जादू चल रहा है, और तंत्रिका नेटवर्क वास्तव में कल्पना कर रहा है और छवि को खरोंच से फिर से खींच रहा है। ऐसा ही हुआ कि हमारी टीम को एक समान कार्य का सामना करना पड़ा: एक आंतरिक कॉर्पोरेट हैकथॉन के हिस्से के रूप में, हमने एक वीडियो स्टाइल बनाया, क्योंकि। तस्वीरों के लिए पहले से ही एक ऐप था। इस पोस्ट में, हम इस बात पर एक नज़र डालेंगे कि नेटवर्क कैसे छवियों को "फिर से खींचता है", और उन लेखों को देखेंगे जिन्होंने इसे संभव बनाया। मैं अनुशंसा करता हूं कि आप इस सामग्री को पढ़ने से पहले और सामान्य रूप से दृढ़ तंत्रिका नेटवर्क की मूल बातें पढ़ने से पहले अपने आप को अंतिम पोस्ट से परिचित कराएं। आपको कुछ सूत्र मिलेंगे, कुछ कोड (मैं थीनो और लासग्ने पर उदाहरण दूंगा), साथ ही साथ बहुत सारी तस्वीरें भी। यह पोस्ट में बनाया गया है कालानुक्रमिक क्रम मेंलेखों की उपस्थिति और, तदनुसार, विचार स्वयं। कभी-कभी मैं इसे अपने हाल के अनुभव से कम कर दूंगा। यहाँ ध्यान के लिए नरक से एक लड़का है।


संवादात्मक नेटवर्क को विज़ुअलाइज़ करना और समझना (28 नवंबर 2013)

सबसे पहले, यह उस लेख का उल्लेख करने योग्य है जिसमें लेखक यह दिखाने में सक्षम थे कि एक तंत्रिका नेटवर्क एक ब्लैक बॉक्स नहीं है, बल्कि काफी व्याख्या करने योग्य चीज है (वैसे, आज यह न केवल कंप्यूटर के लिए दृढ़ नेटवर्क के बारे में कहा जा सकता है नज़र)। लेखकों ने यह जानने का फैसला किया कि छिपे हुए परत न्यूरॉन्स की सक्रियता की व्याख्या कैसे करें, इसके लिए उन्होंने कई साल पहले प्रस्तावित डीकोनवोल्यूशनल न्यूरल नेटवर्क (डीकॉनवनेट) का इस्तेमाल किया (वैसे, उसी ज़ीलर और फर्गस द्वारा, जो इस प्रकाशन के लेखक हैं। कुंआ)। एक deconvolutional नेटवर्क वास्तव में विपरीत क्रम में लागू किए गए कनवल्शन और पूलिंग के साथ एक ही नेटवर्क है। deconvnet पर मूल कार्य ने छवियों को उत्पन्न करने के लिए एक असुरक्षित शिक्षण मोड में नेटवर्क का उपयोग किया। इस बार, लेखकों ने नेटवर्क के माध्यम से मूल छवि तक आगे बढ़ने के बाद प्राप्त सुविधाओं से रिवर्स पास के लिए इसका इस्तेमाल किया। परिणाम एक छवि है जिसे एक संकेत के रूप में व्याख्या किया जा सकता है जो न्यूरॉन्स पर इस सक्रियण का कारण बना। स्वाभाविक रूप से, यह सवाल उठता है: दृढ़ संकल्प और अरैखिकता के माध्यम से एक रिवर्स पास कैसे बनाया जाए? और इससे भी अधिक मैक्स-पूलिंग के माध्यम से, यह निश्चित रूप से एक उल्टा ऑपरेशन नहीं है। आइए तीनों घटकों को देखें।

रिवर्स रेलु

दृढ़ नेटवर्क में, सक्रियण फ़ंक्शन का अक्सर उपयोग किया जाता है रेलु (एक्स) = अधिकतम (0, एक्स), जो परत पर सभी सक्रियणों को गैर-ऋणात्मक बनाता है। तदनुसार, गैर-रैखिकता से वापस गुजरते समय, गैर-नकारात्मक परिणाम प्राप्त करना भी आवश्यक है। इसके लिए लेखक उसी ReLu का उपयोग करने का प्रस्ताव करते हैं। थीनो वास्तुकला के दृष्टिकोण से, ऑपरेशन के ग्रेडिएंट फ़ंक्शन को ओवरराइड करना आवश्यक है (असीम रूप से मूल्यवान नोटबुक लसग्ना व्यंजनों में है, वहां से आप संशोधितबैकप्रॉप वर्ग क्या है, इसका विवरण प्राप्त करेंगे)।

क्लास ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd) = out_grads #return (grd * (grd> 0))।astype(inp.dtype),) # स्पष्ट रूप से सुधारें वापसी (self.nonlinearity(grd),) # दी गई गैर-रैखिकता का उपयोग करें

रिवर्स कनवल्शन

यहां यह थोड़ा अधिक जटिल है, लेकिन सब कुछ तार्किक है: यह एक ही कनवल्शन कर्नेल के ट्रांसपोज़्ड संस्करण को लागू करने के लिए पर्याप्त है, लेकिन फॉरवर्ड पास में उपयोग की गई पिछली परत के बजाय रिवर्स ReLu से आउटपुट के लिए। लेकिन मुझे डर है कि शब्दों में यह इतना स्पष्ट नहीं है, आइए इस प्रक्रिया के विज़ुअलाइज़ेशन को देखें (आपको दृढ़ संकल्प के और भी अधिक दृश्य मिलेंगे)।


कनवल्शन जब स्ट्राइड=1

कनवल्शन जब स्ट्राइड=1 उल्टा संस्करण

कनवल्शन जब स्ट्राइड=2

कनवल्शन जब स्ट्राइड=2 उल्टा संस्करण

रिवर्स पूलिंग

यह ऑपरेशन (पिछले वाले के विपरीत) आम तौर पर उलटा नहीं होता है। लेकिन हम अभी भी रिवर्स पास के दौरान किसी तरह से अधिकतम से गुजरना चाहेंगे। ऐसा करने के लिए, लेखक उस मानचित्र का उपयोग करने का सुझाव देते हैं जहां प्रत्यक्ष पास (अधिकतम स्थान स्विच) के दौरान अधिकतम था। रिवर्स पास के दौरान, इनपुट सिग्नल को इस तरह से अनपूलिंग में बदल दिया जाता है कि मूल सिग्नल की संरचना को लगभग संरक्षित किया जा सके, यहां वर्णन करने की तुलना में देखना वास्तव में आसान है।



परिणाम

विज़ुअलाइज़ेशन एल्गोरिथ्म अत्यंत सरल है:

  1. सीधा पास बनाओ।
  2. उस परत का चयन करें जिसमें हम रुचि रखते हैं।
  3. एक या अधिक न्यूरॉन्स की सक्रियता को ठीक करें और बाकी को रीसेट करें।
  4. एक अनुमान लगाएं।

नीचे दी गई छवि में प्रत्येक ग्रे वर्ग एक फिल्टर (जो दृढ़ संकल्प के लिए लागू किया जाता है) या एक न्यूरॉन के वजन के दृश्य से मेल खाता है, और प्रत्येक रंग चित्रमूल छवि का वह हिस्सा है जो संबंधित न्यूरॉन को सक्रिय करता है। स्पष्टता के लिए, एक परत के भीतर न्यूरॉन्स को समूहीकृत किया जाता है विषयगत समूह. सामान्य तौर पर, यह अचानक पता चला कि तंत्रिका नेटवर्क ठीक वही सीखता है जो हुबेल और वीसेल ने दृश्य प्रणाली की संरचना पर अपने काम के बारे में लिखा था, जिसके लिए उन्हें सम्मानित किया गया था। नोबेल पुरुस्कार 1981 में। इस लेख के लिए धन्यवाद, हमें एक दृश्य प्रतिनिधित्व मिला है कि प्रत्येक परत पर एक दृढ़ तंत्रिका नेटवर्क क्या सीखता है। यह ज्ञान है जो बाद में उत्पन्न छवि की सामग्री में हेरफेर करने की अनुमति देगा, लेकिन यह अभी भी बहुत दूर है, अगले कुछ वर्षों में तंत्रिका नेटवर्क के "ट्रेपनेशन" के तरीकों में सुधार हुआ है। इसके अलावा, लेख के लेखकों ने विश्लेषण करने का एक तरीका प्रस्तावित किया कि कैसे प्राप्त करने के लिए एक दृढ़ तंत्रिका नेटवर्क की वास्तुकला का निर्माण करना सबसे अच्छा है सर्वोत्तम परिणाम(हालांकि, उन्होंने इमेजनेट 2013 नहीं जीता, लेकिन शीर्ष पर पहुंच गए; युपीडी: यह पता चला कि वे जीत गए, क्लेरिफाई वही हैं जो वे हैं)।


फ़ीचर विज़ुअलाइज़ेशन


यहाँ deconvnet का उपयोग करके सक्रियणों के विज़ुअलाइज़ेशन का एक उदाहरण दिया गया है, आज यह परिणाम पहले से ही ऐसा दिखता है, लेकिन तब यह एक सफलता थी।


deconvnet का उपयोग कर प्रमुख मानचित्र

डीप इनसाइड कनवल्शनल नेटवर्क्स: विज़ुअलाइज़िंग इमेज क्लासिफिकेशन मॉडल्स एंड सैलेंसी मैप्स (19 अप्रैल 2014)

यह लेख एक दृढ़ तंत्रिका नेटवर्क में निहित ज्ञान विज़ुअलाइज़ेशन विधियों के अध्ययन के लिए समर्पित है। लेखक ग्रेडिएंट डिसेंट के आधार पर दो विज़ुअलाइज़ेशन विधियों का प्रस्ताव करते हैं।

क्लास मॉडल विज़ुअलाइज़ेशन

तो, कल्पना कीजिए कि हमारे पास एक निश्चित संख्या में वर्गों में वर्गीकरण समस्या को हल करने के लिए एक प्रशिक्षित तंत्रिका नेटवर्क है। वर्ग से मेल खाने वाले आउटपुट न्यूरॉन के सक्रियण मान के रूप में निरूपित करें सी. फिर निम्न अनुकूलन समस्या हमें ठीक वही छवि देती है जो चयनित वर्ग को अधिकतम करती है:



थीनो का उपयोग करके इस कार्य को हल करना आसान है। आमतौर पर हम फ्रेमवर्क को मॉडल मापदंडों के व्युत्पन्न लेने के लिए कहते हैं, लेकिन इस बार हम मान लेते हैं कि पैरामीटर निश्चित हैं और व्युत्पन्न इनपुट छवि से लिया गया है। निम्न फ़ंक्शन आउटपुट परत के अधिकतम मान का चयन करता है और एक फ़ंक्शन देता है जो इनपुट छवि के संबंध में व्युत्पन्न की गणना करता है।


defcompile_saliency_function(net): """ इनपुट छवियों के दिए गए मिनीबैच के लिए प्रमुख मानचित्रों और अनुमानित कक्षाओं की गणना करने के लिए एक फ़ंक्शन संकलित करता है। """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], नियतात्मक = सही) max_outp = T.max(outp, अक्ष = 1) सामर्थ्य = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, अक्ष = 1) वापसी थीनो.फंक्शन (,)

आपने शायद इंटरनेट पर कुत्तों की अजीबोगरीब तस्वीरें देखी होंगी - डीपड्रीम। मूल लेख में, लेखक चयनित वर्ग को अधिकतम करने वाली छवियों को उत्पन्न करने के लिए निम्नलिखित प्रक्रिया का उपयोग करते हैं:

  1. प्रारंभिक छवि को शून्य के साथ प्रारंभ करें।
  2. इस छवि से व्युत्पन्न के मूल्य की गणना करें।
  3. छवि को व्युत्पन्न से परिणामी छवि में जोड़कर बदलें।
  4. चरण 2 पर लौटें या लूप से बाहर निकलें।

परिणामी छवियां हैं:




और अगर आप पहली इमेज को इनिशियलाइज़ करते हैं असली फोटोऔर एक ही प्रक्रिया चलाते हैं? लेकिन प्रत्येक पुनरावृत्ति पर हम एक यादृच्छिक वर्ग चुनेंगे, बाकी को शून्य पर सेट करेंगे और व्युत्पन्न के मूल्य की गणना करेंगे, तब हमें इतना गहरा सपना मिलता है।


सावधानी 60 एमबी


इतने सारे कुत्ते के चेहरे और आंखें क्यों हैं? यह आसान है: छवि नेट में 1000 वर्गों में से लगभग 200 कुत्ते हैं, उनकी आंखें हैं। और बहुत सारे वर्ग भी हैं जहाँ सिर्फ लोग हैं।

कक्षा सामर्थ्य निष्कर्षण

यदि इस प्रक्रिया को वास्तविक फोटो के साथ आरंभ किया जाता है, पहले पुनरावृत्ति के बाद रोक दिया जाता है और व्युत्पन्न के मूल्य को चित्रित किया जाता है, तो हमें ऐसी छवि मिलती है, जिसे मूल में जोड़कर, हम चयनित वर्ग के सक्रियण मूल्य को बढ़ाएंगे।


व्युत्पन्न का उपयोग करते हुए प्रमुख मानचित्र


फिर, परिणाम "तो-तो" है। यह ध्यान रखना महत्वपूर्ण है कि यह सक्रियणों की कल्पना करने का एक नया तरीका है (कुछ भी हमें सक्रियण मानों को अंतिम परत पर नहीं, बल्कि सामान्य रूप से किसी भी नेटवर्क परत पर और इनपुट छवि के संबंध में व्युत्पन्न लेने से रोकता है)। अगला लेख दोनों पिछले दृष्टिकोणों को मिलाएगा और हमें स्टाइल ट्रांसफर सेट करने के तरीके के बारे में एक टूल देगा, जिसका वर्णन बाद में किया जाएगा।

सरलता के लिए प्रयास: सभी कन्वेन्शनल नेट (13 अप्रैल 2015)

यह लेख आम तौर पर विज़ुअलाइज़ेशन के बारे में नहीं है, लेकिन इस तथ्य के बारे में है कि पूलिंग को एक बड़े स्ट्राइड के साथ बदलने से गुणवत्ता का नुकसान नहीं होता है। लेकिन उनके शोध के उप-उत्पाद के रूप में, लेखकों ने सुविधाओं को देखने का एक नया तरीका प्रस्तावित किया, जिसे उन्होंने और अधिक पर लागू किया सटीक विश्लेषणमॉडल क्या सीखता है। उनका विचार इस प्रकार है: यदि हम केवल व्युत्पन्न लेते हैं, तो deconvolution के दौरान, वे सुविधाएँ जो इनपुट छवि में थीं, वापस नहीं जातीं शून्य से कम(इनपुट छवि पर ReLu लागू करना)। और यह इस तथ्य की ओर जाता है कि प्रचारित बैक इमेज पर नकारात्मक मान दिखाई देते हैं। दूसरी ओर, यदि आप deconvnet का उपयोग करते हैं, तो ReLu के व्युत्पन्न से एक और ReLu लिया जाता है - यह आपको नकारात्मक मानों को वापस नहीं छोड़ने की अनुमति देता है, लेकिन जैसा कि आपने देखा, परिणाम "इतना-सो" है। लेकिन क्या होगा अगर हम इन दो तरीकों को मिला दें?




क्लास गाइडेडबैकप्रॉप (संशोधित बैकप्रॉप): डीईएफ़ ग्रेड (स्वयं, इनपुट, आउट_ग्रैड्स): (आईएनपी,) = इनपुट्स (जीआरडी,) = आउट_ग्रेड्स डीटाइप = इनप। डीटाइप रिटर्न (जीआरडी * (आईएनपी> 0))। एस्टाइप (डीटाइप) * (जीआरडी) > 0)। astype (dtype),)

तब आपको पूरी तरह से साफ और व्याख्या करने योग्य छवि मिलती है।


मार्गदर्शित बैकप्रोपेगेशन का उपयोग करते हुए प्रमुख मानचित्र

भीतर जाओ

आइए अब सोचें, यह हमें क्या देता है? मैं आपको याद दिला दूं कि प्रत्येक संकेंद्रित परत एक ऐसा कार्य है जो इनपुट के रूप में त्रि-आयामी टेंसर प्राप्त करता है और आउटपुट के रूप में त्रि-आयामी टेंसर भी उत्पन्न करता है, शायद एक अलग आयाम का डीएक्स वूएक्स एच; डी epth परत में न्यूरॉन्स की संख्या है, उनमें से प्रत्येक आकार के साथ एक फीचर मैप बनाता है वूआईजीटीएच एक्स एचआठ।


आइए VGG-19 नेटवर्क पर निम्नलिखित प्रयोग करें:



रूपा1_2

हाँ, आप लगभग कुछ भी नहीं देखते हैं, क्योंकि। ग्रहणशील क्षेत्र बहुत छोटा है, यह क्रमशः दूसरा कनवल्शन 3x3 है, कुल क्षेत्रफल 5x5 है। लेकिन ज़ूम इन करने पर, हम देखते हैं कि यह फीचर सिर्फ एक ग्रेडिएंट डिटेक्टर है।




रूपांतरण3_3


रूपांतरण4_3


रूपांतरण5_3


पूल5


और अब कल्पना करें कि प्लेट पर अधिकतम के बजाय, हम इनपुट छवि पर प्लेट के सभी तत्वों के योग के मूल्य का व्युत्पन्न लेंगे। तब स्पष्ट रूप से न्यूरॉन्स के समूह का ग्रहणशील क्षेत्र संपूर्ण इनपुट छवि को कवर करेगा। शुरुआती परतों के लिए, हम उज्ज्वल नक्शे देखेंगे, जिनसे हम यह निष्कर्ष निकालते हैं कि ये रंग डिटेक्टर हैं, फिर ग्रेडिएंट, फिर बॉर्डर, और इसी तरह अधिक जटिल पैटर्न की ओर। परत जितनी गहरी होगी, उतनी ही धुंधली छवि प्राप्त होगी। यह इस तथ्य से समझाया गया है कि गहरी परतों में एक अधिक जटिल पैटर्न होता है जिसे वे पहचानते हैं, और एक जटिल पैटर्न एक साधारण से कम दिखाई देता है, और इसलिए सक्रियण मानचित्र मंद हो जाता है। पहला तरीका जटिल पैटर्न वाली परतों को समझने के लिए उपयुक्त है, और दूसरा सरल लोगों के लिए बिल्कुल सही है।


रूपा1_1


रूपा2_2


रूपांतरण4_3


आप कई छवियों और .

कलात्मक शैली का एक तंत्रिका एल्गोरिथम (2 सितंबर 2015)

तो, तंत्रिका नेटवर्क के पहले सफल ट्रेपनेशन के बाद से कुछ साल बीत चुके हैं। हम (मानवता के अर्थ में) हमारे हाथ में है शक्तिशाली उपकरण, जो आपको यह समझने की अनुमति देता है कि तंत्रिका नेटवर्क क्या सीखता है, साथ ही वह हटा देता है जिसे हम वास्तव में सीखना पसंद नहीं करते हैं। इस लेख के लेखक एक ऐसी विधि विकसित कर रहे हैं जो आपको एक छवि उत्पन्न करने की अनुमति देती है समान नक्शाकुछ लक्ष्य छवि पर सक्रियण, और शायद एक से भी अधिक - यह स्टाइल का आधार है। हम इनपुट को सफेद शोर खिलाते हैं, और इसी तरह की पुनरावृत्ति प्रक्रिया में जैसे कि गहरे सपने में, हम इस छवि को एक में लाते हैं जिसमें फीचर मैप लक्ष्य छवि के समान होते हैं।

सामग्री हानि

जैसा कि पहले ही उल्लेख किया गया है, तंत्रिका नेटवर्क की प्रत्येक परत किसी न किसी आयाम के त्रि-आयामी टेंसर का उत्पादन करती है।




आइए आउटपुट को निरूपित करें मैंइनपुट से वें परत के रूप में . फिर अगर हम इनपुट छवि के बीच अवशिष्टों के भारित योग को कम करते हैं और कुछ छवि जिसकी हम कामना करते हैं सी, तो आपको वही मिलता है जो आपको चाहिए। शायद।



इस लेख के साथ प्रयोग करने के लिए, आप इस जादुई लैपटॉप का उपयोग कर सकते हैं, जहां गणना होती है (GPU और CPU दोनों पर)। GPU का उपयोग तंत्रिका नेटवर्क की विशेषताओं और लागत फ़ंक्शन के मूल्य की गणना करने के लिए किया जाता है। थीनो एक ऐसा फ़ंक्शन तैयार करता है जो उद्देश्य फ़ंक्शन के ग्रेडिएंट की गणना कर सकता है eval_gradइनपुट छवि द्वारा एक्स. इसके बाद इसे lbfgs में फीड किया जाता है और पुनरावृत्ति प्रक्रिया शुरू होती है।


# एक शोर छवि के साथ आरंभ करें generate_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generate_image.get_value().astype("float64") xs = xs.append(x0) # ऑप्टिमाइज़ करें, परिणाम को समय-समय पर i इन रेंज(8) के लिए सेव करें: प्रिंट(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generate_image.get_value().astype("float64") xs.append(x0)

यदि हम ऐसे फ़ंक्शन का अनुकूलन चलाते हैं, तो हमें जल्दी से लक्ष्य के समान एक छवि मिल जाएगी। अब हम सफेद शोर से छवियों को फिर से बना सकते हैं जो कुछ सामग्री छवि की तरह दिखते हैं।


सामग्री हानि: रूपा4_2



अनुकूलन प्रक्रिया




परिणामी छवि की दो विशेषताओं को नोटिस करना आसान है:

  • खोए हुए रंग - यह इस तथ्य का परिणाम है कि में विशिष्ट उदाहरणकेवल conv4_2 परत का उपयोग किया गया था (या, दूसरे शब्दों में, वजन w इसके लिए शून्य नहीं था, और अन्य परतों के लिए शून्य); जैसा कि आपको याद है, यह शुरुआती परतें हैं जिनमें रंगों और ढाल संक्रमणों के बारे में जानकारी होती है, और बाद की परतों में बड़े विवरणों के बारे में जानकारी होती है, जिसे हम देखते हैं - रंग खो जाते हैं, लेकिन सामग्री नहीं होती है;
  • कुछ घर "चलो चलते हैं", यानी। सीधी रेखाएँ थोड़ी घुमावदार होती हैं - ऐसा इसलिए होता है क्योंकि परत जितनी गहरी होती है, कम जानकारीइसमें शामिल सुविधा की स्थानिक स्थिति के बारे में (दृढ़ संकल्प और पूलिंग लागू करने का परिणाम)।

शुरुआती परतों को जोड़ने से रंगों के साथ स्थिति तुरंत ठीक हो जाती है।


सामग्री हानि: रूपांतरण1_1, रूपांतरण2_1, रूपांतरण4_2


उम्मीद है कि अब तक आपको यह महसूस हो गया होगा कि श्वेत शोर छवि पर जो कुछ भी होता है, उस पर आपका नियंत्रण होता है।

शैली हानि

और अब हम सबसे दिलचस्प हो गए हैं: हम शैली को कैसे व्यक्त कर सकते हैं? शैली क्या है? जाहिर है, शैली वह नहीं है जिसे हमने सामग्री हानि में अनुकूलित किया है, क्योंकि इसमें सुविधाओं की स्थानिक स्थिति के बारे में बहुत सारी जानकारी है। इसलिए पहली बात यह है कि किसी भी तरह से प्रत्येक परत पर प्राप्त विचारों से इस जानकारी को हटा दें।


लेखक निम्नलिखित विधि का प्रस्ताव करता है। आइए टेंसर को किसी परत के आउटपुट पर लें, इसे स्थानिक निर्देशांक में विस्तारित करें और प्लेटों के बीच सहसंयोजक मैट्रिक्स की गणना करें। आइए इस परिवर्तन को इस प्रकार निरूपित करें जी. हमने वास्तव में क्या किया है? यह कहा जा सकता है कि हमने गिना कि प्लेट के अंदर की विशेषताएं कितनी बार जोड़े में होती हैं, या, दूसरे शब्दों में, हमने बहुभिन्नरूपी सामान्य वितरण के साथ प्लेटों में सुविधाओं के वितरण का अनुमान लगाया है।




फिर स्टाइल लॉस इस प्रकार दर्ज किया जाता है, जहां एसशैली के साथ कुछ छवि है:



क्या हम विन्सेंट के लिए प्रयास करेंगे? सिद्धांत रूप में, हमें कुछ अपेक्षित मिलता है - वान गाग की शैली में शोर, सुविधाओं की स्थानिक व्यवस्था के बारे में जानकारी पूरी तरह से खो जाती है।


विंसेंट




अगर हम स्टाइल इमेज के बजाय फोटो लगाएं तो क्या होगा? आपको पहले से ही परिचित विशेषताएं, परिचित रंग मिलते हैं, लेकिन स्थानिक स्थिति पूरी तरह से खो जाती है।


स्टाइल लॉस के साथ फोटो


निश्चित रूप से आपने सोचा है कि हम कॉन्वर्सिस मैट्रिक्स की गणना क्यों करते हैं, और कुछ नहीं? आखिरकार, सुविधाओं को एकत्रित करने के कई तरीके हैं ताकि स्थानिक निर्देशांक खो जाएं। यह वास्तव में एक खुला प्रश्न है, और यदि आप कुछ बहुत ही सरल लेते हैं, तो परिणाम नाटकीय रूप से नहीं बदलेगा। आइए इसे जांचें, हम सहसंयोजक मैट्रिक्स की गणना नहीं करेंगे, बल्कि प्रत्येक प्लेट के औसत मूल्य की गणना करेंगे।




सरल शैली हानि

संयुक्त नुकसान

स्वाभाविक रूप से, इन दो लागत कार्यों को मिलाने की इच्छा है। फिर हम सफेद शोर से ऐसी छवि उत्पन्न करेंगे कि यह सामग्री-छवि (जो स्थानिक निर्देशांक के लिए बाध्यकारी है) से सुविधाओं को बनाए रखेगी, और "शैली" विशेषताएं भी होंगी जो स्थानिक निर्देशांक से बंधे नहीं हैं, यानी। हम उम्मीद करते हैं कि सामग्री छवि विवरण यथावत रखेंगे, लेकिन सही शैली के साथ फिर से बनाए जाएंगे।



वास्तव में, एक नियमितकर्ता भी है, लेकिन हम इसे सरलता के लिए छोड़ देंगे। जवाब देना बाकी है अगला सवाल: अनुकूलन के लिए किन परतों (वजन) का उपयोग किया जाना चाहिए? और मुझे डर है कि मेरे पास इस प्रश्न का उत्तर नहीं है, और न ही लेख के लेखक हैं। उनके पास निम्नलिखित का उपयोग करने का सुझाव है, लेकिन इसका मतलब यह बिल्कुल नहीं है कि दूसरा संयोजन भी बदतर काम करेगा बड़ी जगहतलाशी। मॉडल की समझ से पालन करने वाला एकमात्र नियम यह है कि पड़ोसी परतों को लेने का कोई मतलब नहीं है, क्योंकि उनके संकेत एक-दूसरे से अधिक भिन्न नहीं होंगे, इसलिए शैली में प्रत्येक रूपांतरण*_1 समूह की एक परत जोड़ी जाती है।


# लॉस फंक्शन लॉस को परिभाषित करें = # कंटेंट लॉस लॉस। एपेंड (0.001 * कंटेंट_लॉस (फोटो_फीचर्स, जेन_फीचर्स, "कॉन्व 4_2")) # स्टाइल लॉस लॉस। एपेंड (0.2e6 * स्टाइल_लॉस (आर्ट_फीचर्स, जेन_फीचर्स, "कनव 1_1")) लॉस। एपेंड (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv4_1") ) हानियाँ जोड़ें।

अंतिम मॉडल को निम्नलिखित रूप में प्रस्तुत किया जा सकता है।




और यहाँ वान गाग के घरों का परिणाम है।



प्रक्रिया को नियंत्रित करने का प्रयास

आइए पिछले भागों को याद करें, वर्तमान लेख से दो साल पहले, अन्य वैज्ञानिक खोज कर रहे हैं कि तंत्रिका नेटवर्क वास्तव में क्या सीखता है। इन सभी लेखों के साथ, आप फीचर विज़ुअलाइज़ेशन उत्पन्न कर सकते हैं। विभिन्न शैलियों, विभिन्न छवियां, विभिन्न संकल्प और आकार, और यह समझने की कोशिश करें कि कौन सी परतें किस वजन के साथ लेनी हैं। लेकिन परतों को फिर से भारित करना भी क्या हो रहा है पर पूर्ण नियंत्रण नहीं देता है। यहाँ समस्या अधिक वैचारिक है: हम गलत फ़ंक्शन का अनुकूलन कर रहे हैं! ऐसा कैसे, तुम पूछो? उत्तर सरल है: यह फ़ंक्शन अवशिष्ट को कम करता है ... ठीक है, आपको विचार मिलता है। लेकिन हम वास्तव में चाहते हैं कि हमें छवि पसंद आए। सामग्री और शैली हानि कार्यों का उत्तल संयोजन यह नहीं है कि हमारा मन क्या सुंदर मानता है। यह देखा गया है कि यदि स्टाइलिंग को बहुत लंबे समय तक जारी रखा जाता है, तो लागत कार्य स्वाभाविक रूप से कम और कम हो जाता है, लेकिन परिणाम की सौंदर्य सुंदरता तेजी से गिरती है।




ठीक है, एक और समस्या है। मान लीजिए कि हमें एक परत मिली है जो हमें आवश्यक सुविधाओं को निकालती है। मान लीजिए कि कुछ बनावट त्रिकोणीय हैं। लेकिन इस परत में अभी भी कई अन्य विशेषताएं हैं, जैसे कि मंडलियां, जिन्हें हम वास्तव में परिणामी छवि में नहीं देखना चाहते हैं। सामान्यतया, यदि हम एक लाख चीनी लोगों को काम पर रख सकते हैं, तो हम एक शैली छवि की सभी विशेषताओं की कल्पना कर सकते हैं, और संपूर्ण खोज द्वारा केवल उन लोगों को चिह्नित करें जिनकी हमें आवश्यकता है, और केवल उन्हें लागत फ़ंक्शन में शामिल करें। लेकिन स्पष्ट कारणों से, यह इतना आसान नहीं है। लेकिन क्या होगा यदि हम उन सभी मंडलियों को हटा दें जिन्हें हम परिणाम में स्टाइलशीट से प्रदर्शित नहीं करना चाहते हैं? तब संबंधित न्यूरॉन्स की सक्रियता जो हलकों पर प्रतिक्रिया करती है, बस काम नहीं करेगी। और, ज़ाहिर है, यह परिणामी तस्वीर में दिखाई नहीं देगा। फूलों के साथ भी ऐसा ही है। बहुत सारे रंगों के साथ एक उज्ज्वल छवि प्रस्तुत करें। पूरे अंतरिक्ष में रंगों का वितरण बहुत धुंधला हो जाएगा, परिणामी छवि का वितरण समान होगा, लेकिन अनुकूलन प्रक्रिया के दौरान, जो चोटियां मूल पर थीं, वे शायद खो जाएंगी। यह पता चला कि थोड़ी गहराई में एक साधारण कमी रंगो की पटियाइस समस्या को हल करता है। अधिकांश रंगों का वितरण घनत्व शून्य के करीब होगा, और कई क्षेत्रों में बड़ी चोटियाँ होंगी। इस प्रकार, फ़ोटोशॉप में मूल में हेरफेर करके, हम छवि से निकाली गई सुविधाओं में हेरफेर कर रहे हैं। किसी व्यक्ति के लिए अपनी इच्छाओं को गणित की भाषा में तैयार करने की तुलना में दृष्टिगत रूप से व्यक्त करना आसान होता है। अलविदा। नतीजतन, डिजाइनरों और प्रबंधकों, फ़ोटोशॉप और स्क्रिप्ट से लैस सुविधाओं को देखने के लिए, गणितज्ञों और प्रोग्रामर की तुलना में तीन गुना तेजी से परिणाम प्राप्त किया।


रंग और सुविधाओं के आकार में हेरफेर करने का एक उदाहरण


और आप तुरंत एक साधारण छवि को शैली के रूप में ले सकते हैं



परिणाम








और यहाँ एक विडोसिक है, लेकिन केवल सही बनावट के साथ

बनावट नेटवर्क: बनावट और शैलीबद्ध छवियों का फ़ीड-फ़ॉरवर्ड संश्लेषण (10 मार्च 2016)

ऐसा लगता है कि इसे रोका जा सकता है, अगर एक बारीकियां नहीं। उपरोक्त स्टाइलिंग एल्गोरिदम बहुत लंबे समय तक काम करता है। यदि हम एक कार्यान्वयन लेते हैं जहां सीपीयू पर एलबीएफजीएस चलाया जाता है, तो प्रक्रिया में लगभग पांच मिनट लगते हैं। यदि आप इसे फिर से लिखते हैं ताकि ऑप्टिमाइज़ेशन GPU में चला जाए, तो इस प्रक्रिया में 10-15 सेकंड का समय लगेगा। यह अच्छा नहीं है। शायद इस और अगले लेख के लेखकों ने इसी के बारे में सोचा था। पिछले लेख के लगभग एक साल बाद, दोनों प्रकाशन स्वतंत्र रूप से 17 दिन अलग हुए। वर्तमान लेख के लेखक, पिछले एक के लेखकों की तरह, बनावट निर्माण में लगे हुए थे (यदि आप स्टाइल लॉस को रीसेट करते हैं, तो यह लगभग वही है जो आपको मिलता है)। उन्होंने सफेद शोर से प्राप्त छवि को अनुकूलित करने का सुझाव नहीं दिया, लेकिन कुछ तंत्रिका नेटवर्क जो एक शैलीबद्ध छवि उत्पन्न करते हैं।




अब, यदि स्टाइलिंग प्रक्रिया में कोई अनुकूलन शामिल नहीं है, तो केवल एक फॉरवर्ड पास करने की आवश्यकता है। और जनरेटर नेटवर्क को प्रशिक्षित करने के लिए केवल एक बार अनुकूलन की आवश्यकता होती है। यह आलेख एक पदानुक्रमित जनरेटर का उपयोग करता है जहां प्रत्येक निम्नलिखित जेडपिछले वाले की तुलना में बड़ा है और बनावट निर्माण के मामले में शोर से और स्टाइलाइज़र प्रशिक्षण के लिए कुछ छवि डेटाबेस से नमूना लिया गया है। इमेजनेट के प्रशिक्षण भाग के अलावा किसी अन्य चीज़ का उपयोग करना महत्वपूर्ण है, क्योंकि लॉस-नेटवर्क के अंदर की विशेषताओं की गणना केवल प्रशिक्षण भाग पर प्रशिक्षित नेटवर्क द्वारा की जाती है।



रीयल-टाइम स्टाइल ट्रांसफर और सुपर-रिज़ॉल्यूशन के लिए अवधारणात्मक नुकसान (27 मार्च 2016)

जैसा कि नाम से ही स्पष्ट है, लेखक, जो एक जनरेटिंग नेटवर्क के विचार के साथ केवल 17 दिन की देरी से थे, छवियों के संकल्प को बढ़ाने में व्यस्त थे। ऐसा लगता है कि वे नवीनतम इमेजनेट पर अवशिष्ट सीखने की सफलता से प्रेरित हैं।




तदनुसार अवशिष्ट ब्लॉक और रूपांतरण ब्लॉक।



इस प्रकार, अब स्टाइलिंग नियंत्रण के अलावा, हमारे हाथों में एक तेज़ जनरेटर भी है (इन दो लेखों के लिए धन्यवाद, एक छवि के लिए पीढ़ी का समय दसियों एमएस में मापा जाता है)।

अंत

हमने पहले वीडियो स्टाइलिंग एप्लिकेशन के लिए एक और स्टाइलिंग एप्लिकेशन बनाने के लिए शुरुआती बिंदु के रूप में समीक्षा किए गए लेखों और लेखकों के कोड की जानकारी का उपयोग किया:



कुछ इस तरह उत्पन्न करें।


अगस्त 2015 से, टुबिंगन विश्वविद्यालय के जर्मन शोधकर्ताओं ने शैली हस्तांतरण की संभावना पर अपना प्रस्तुत किया प्रसिद्ध कलाकारअन्य तस्वीरों पर, ऐसी सेवाएँ दिखाई देने लगीं जिन्होंने इस अवसर का मुद्रीकरण किया। इसे पश्चिमी बाजार में और रूसी बाजार में लॉन्च किया गया - इसकी पूरी प्रति।

बुकमार्क करने के लिए

इस तथ्य के बावजूद कि ओस्टाग्राम ने दिसंबर में लॉन्च किया, यह अप्रैल के मध्य में सामाजिक नेटवर्क में तेजी से लोकप्रियता हासिल करना शुरू कर दिया। वहीं, 19 अप्रैल तक VKontakte पर प्रोजेक्ट में एक हजार से भी कम लोग थे।

सेवा का उपयोग करने के लिए, आपको दो छवियां तैयार करने की आवश्यकता है: एक तस्वीर जिसे संसाधित करने की आवश्यकता है, और एक तस्वीर जिसमें मूल चित्र पर ओवरले करने के लिए शैली के उदाहरण हैं।

सेवा का एक मुफ़्त संस्करण है: यह छवि के सबसे लंबे किनारे के साथ 600 पिक्सेल तक के न्यूनतम रिज़ॉल्यूशन में एक छवि बनाता है। उपयोगकर्ता को फ़ोटो पर फ़िल्टर लागू करने के केवल एक पुनरावृत्तियों का परिणाम प्राप्त होता है।

दो भुगतान किए गए संस्करण हैं: प्रीमियम सबसे लंबी तरफ 700 पिक्सेल तक की छवि बनाता है और छवि पर तंत्रिका नेटवर्क प्रसंस्करण के 600 पुनरावृत्तियों को लागू करता है (अधिक पुनरावृत्तियों, अधिक दिलचस्प और गहन प्रसंस्करण)। ऐसी एक तस्वीर की कीमत 50 रूबल होगी।

एचडी संस्करण में, आप पुनरावृत्तियों की संख्या को समायोजित कर सकते हैं: 100 की लागत 50 रूबल और 1000 - 250 रूबल होगी। इस मामले में, छवि में सबसे लंबी तरफ 1200 पिक्सेल तक का रिज़ॉल्यूशन होगा, और इसका उपयोग कैनवास पर मुद्रण के लिए किया जा सकता है: ओस्टाग्राम 1800 रूबल से डिलीवरी के साथ यह सेवा प्रदान करता है।

फरवरी में, ओस्टाग्राम के प्रतिनिधि "विकसित पूंजीवाद वाले देशों से" उपयोगकर्ताओं से छवि प्रसंस्करण के अनुरोधों को स्वीकार नहीं करेंगे, लेकिन फिर दुनिया भर के VKontakte उपयोगकर्ताओं के लिए फोटो प्रसंस्करण तक पहुंच प्राप्त करेंगे। गिटहब पर प्रकाशित ओस्टाग्राम कोड को देखते हुए, इसे निज़नी नोवगोरोड के 30 वर्षीय निवासी सर्गेई मोरुगिन द्वारा विकसित किया गया था।

टीजे ने संपर्क किया वाणिज्यिक निर्देशकएंड्री द्वारा पेश की गई परियोजना। उनके अनुसार, ओस्टाग्राम इंस्टापेंटिंग से पहले दिखाई दिया, लेकिन विपार्ट नामक एक समान परियोजना से प्रेरित था।

Ostagram NNSTU के छात्रों के एक समूह द्वारा विकसित किया गया था। अलेक्सेवा: 2015 के अंत में दोस्तों के एक संकीर्ण समूह पर प्रारंभिक परीक्षण के बाद, उन्होंने परियोजना को सार्वजनिक करने का निर्णय लिया। प्रारंभ में, छवि प्रसंस्करण पूरी तरह से मुफ्त था, और इसे मुद्रित चित्रों को बेचकर पैसा कमाने की योजना बनाई गई थी। एंड्री के अनुसार, छपाई सबसे बड़ी समस्या बन गई: तंत्रिका नेटवर्क द्वारा संसाधित लोगों की तस्वीरें शायद ही कभी सुखद लगती हैं मनुष्य की आंख, और अंतिम क्लाइंट को कैनवास पर लागू करने से पहले परिणाम को लंबे समय तक समायोजित करने की आवश्यकता होती है, जिसके लिए बहुत सारे मशीन संसाधनों की आवश्यकता होती है।

छवि प्रसंस्करण के लिए, ओस्टाग्राम के निर्माता अमेज़ॅन क्लाउड सर्वर का उपयोग करना चाहते थे, लेकिन उपयोगकर्ताओं की आमद के बाद, यह स्पष्ट हो गया कि निवेश पर न्यूनतम रिटर्न के साथ उनकी लागत एक दिन में एक हजार डॉलर से अधिक होगी। एंड्री, जो परियोजना में एक निवेशक भी है, ने निज़नी नोवगोरोड में सर्वर सुविधाओं को किराए पर लिया।

परियोजना के दर्शक एक दिन में लगभग एक हजार लोग हैं, लेकिन कुछ दिनों में यह संक्रमण के कारण 40 हजार लोगों तक पहुंच गया विदेशी मीडिया, जिन्होंने पहले ही घरेलू लोगों से पहले इस परियोजना पर ध्यान दिया है (ओस्टाग्राम यूरोपीय डीजे के साथ सहयोग करने में भी कामयाब रहे)। रात में, जब ट्रैफ़िक कम होता है, तो इमेज प्रोसेसिंग में 5 मिनट लग सकते हैं और दिन में एक घंटे तक का समय लग सकता है।

यदि पहले विदेशी उपयोगकर्ता जानबूझकर इमेज प्रोसेसिंग तक सीमित पहुंच रखते थे (यह रूस से मुद्रीकरण शुरू करने के लिए सोचा गया था), अब ओस्टाग्राम पहले से ही पश्चिमी दर्शकों पर अधिक निर्भर है।

आज तक, पेबैक की संभावनाएं सशर्त हैं। यदि प्रत्येक उपयोगकर्ता ने प्रसंस्करण के लिए 10 रूबल का भुगतान किया, तो शायद यह भुगतान करेगा। […]

हमारे देश में मुद्रीकरण करना बहुत मुश्किल है: हमारे लोग एक सप्ताह इंतजार करने को तैयार हैं, लेकिन वे इसके लिए एक पैसा भी नहीं देंगे। यूरोपीय लोग इसके लिए अधिक अनुकूल हैं - तेजी के लिए भुगतान करने, गुणवत्ता में सुधार के मामले में - इसलिए उन्मुखीकरण उस बाजार में जाता है।

एंड्री, ओस्टाग्राम प्रतिनिधि

एंड्री के अनुसार, ओस्टाग्राम टीम इस पर काम कर रही है नया संस्करणसामाजिकता पर एक मजबूत फोकस वाली साइट: "यह एक प्रसिद्ध सेवा की तरह दिखाई देगी, लेकिन क्या करना है।" रूस में फेसबुक के प्रतिनिधि पहले से ही इस परियोजना में रुचि रखते हैं, लेकिन सौदा अभी तक बिक्री पर बातचीत के लिए नहीं आया है।

सेवा कार्य उदाहरण

ओस्टाग्राम वेबसाइट पर फ़ीड में, आप यह भी देख सकते हैं कि अंतिम शॉट्स में छवियों के किस संयोजन के परिणामस्वरूप: अक्सर यह परिणाम से भी अधिक दिलचस्प होता है। उसी समय, फिल्टर - प्रसंस्करण के लिए एक प्रभाव के रूप में उपयोग किए जाने वाले चित्र - को आगे उपयोग के लिए सहेजा जा सकता है।

© 2022 skudelnica.ru -- प्यार, विश्वासघात, मनोविज्ञान, तलाक, भावनाएं, झगड़े