Jaringan saraf menggambar gambar. Ostagram: layanan berbasis jaringan saraf yang menggabungkan foto dan ornamen menjadi mahakarya artistik

Sejak Agustus 2015, peneliti Jerman dari Universitas Tübingen mempresentasikan kemungkinan transfer gaya seniman terkenal di foto lain, mulai bermunculan layanan yang memonetisasi peluang ini. Itu diluncurkan di pasar Barat, dan di pasar Rusia - salinan lengkapnya.

Ke bookmark

Terlepas dari kenyataan bahwa Ostagram diluncurkan pada bulan Desember, itu mulai dengan cepat mendapatkan popularitas di jejaring sosial pada pertengahan April. Pada saat yang sama, pada 19 April, proyek di VKontakte memiliki kurang dari seribu orang.

Untuk menggunakan layanan ini, Anda perlu menyiapkan dua gambar: foto yang perlu diproses, dan gambar dengan contoh gaya untuk ditumpangkan pada gambar aslinya.

Layanan ini memiliki versi gratis: ia membuat gambar dengan resolusi minimum hingga 600 piksel di sepanjang sisi terpanjang gambar. Pengguna hanya menerima hasil dari salah satu iterasi penerapan filter ke foto.

Ada dua versi berbayar: Premium menghasilkan gambar hingga 700 piksel sepanjang sisi terpanjang dan menerapkan 600 iterasi pemrosesan jaringan saraf ke gambar (semakin banyak iterasi, semakin menarik dan intensif pemrosesan). Satu gambar seperti itu akan menelan biaya 50 rubel.

Dalam versi HD, Anda dapat menyesuaikan jumlah iterasi: 100 akan dikenakan biaya 50 rubel, dan 1000 - 250 rubel. Dalam hal ini, gambar akan memiliki resolusi hingga 1200 piksel pada sisi terpanjang, dan dapat digunakan untuk mencetak di atas kanvas: Ostagram menawarkan layanan ini dengan pengiriman mulai 1800 rubel.

Pada bulan Februari, perwakilan Ostagram tidak akan menerima permintaan pemrosesan gambar dari pengguna "dari negara-negara dengan kapitalisme maju", tetapi kemudian akses ke pemrosesan foto untuk pengguna VKontakte dari seluruh dunia. Dilihat dari kode Ostagram yang diterbitkan di GitHub, itu dikembangkan oleh Sergey Morugin, seorang penduduk Nizhny Novgorod berusia 30 tahun.

TJ dihubungi direktur komersial proyek, diperkenalkan oleh Andrey. Menurutnya, Ostagram muncul sebelum Instapainting, namun terinspirasi dari proyek serupa bernama Vipart.

Ostagram dikembangkan oleh sekelompok mahasiswa dari NNSTU. Alekseeva: setelah pengujian awal pada sekelompok kecil teman pada akhir 2015, mereka memutuskan untuk mempublikasikan proyek tersebut. Awalnya, pemrosesan gambar benar-benar gratis, dan direncanakan untuk menghasilkan uang dengan menjual lukisan cetak. Menurut Andrey, pencetakan ternyata menjadi masalah terbesar: foto orang yang diproses oleh jaringan saraf jarang terlihat enak dipandang mata, dan klien akhir perlu menyesuaikan hasilnya dalam waktu lama sebelum mengaplikasikannya ke kanvas, yang mana membutuhkan banyak sumber daya mesin.

Untuk pemrosesan gambar, pembuat Ostagram ingin menggunakan server cloud Amazon, tetapi setelah masuknya pengguna, menjadi jelas bahwa biayanya akan melebihi seribu dolar sehari dengan pengembalian investasi minimal. Andrey yang juga investor proyek tersebut menyewa fasilitas server di Nizhny Novgorod.

Penonton proyek ini sekitar seribu orang per hari, tetapi pada beberapa hari mencapai 40 ribu orang karena peralihan dari media asing yang telah memperhatikan proyek tersebut sebelum media domestik (Ostagram bahkan berhasil berkolaborasi dengan DJ Eropa). Di malam hari, saat lalu lintas sepi, pemrosesan gambar dapat memakan waktu 5 menit, dan memakan waktu hingga satu jam di siang hari.

Jika sebelumnya pengguna asing sengaja membatasi akses ke pemrosesan gambar (dianggap memulai monetisasi dari Rusia), kini Ostagram sudah lebih mengandalkan audiens Barat.

Sampai saat ini, prospek pengembaliannya bersyarat. Jika setiap pengguna membayar 10 rubel untuk diproses, mungkin itu akan terbayar. […]

Sangat sulit untuk menghasilkan uang di negara kami: orang-orang kami siap menunggu seminggu, tetapi mereka tidak akan membayar sepeser pun untuk itu. Orang Eropa lebih menyukai hal ini - dalam hal membayar untuk mempercepat, meningkatkan kualitas - jadi orientasinya mengarah ke pasar itu.

Andrey, perwakilan Ostagram

Menurut Andrey, tim Ostagram sedang mengerjakan versi baru situs dengan fokus kuat pada sosialitas: "Ini akan terlihat seperti layanan terkenal, tetapi apa yang harus dilakukan." Perwakilan Facebook di Rusia telah tertarik dengan proyek tersebut, tetapi kesepakatan belum sampai pada negosiasi penjualan.

Contoh pekerjaan jasa

Dalam umpan di situs web Ostagram, Anda juga dapat melihat kombinasi gambar apa yang menghasilkan bidikan akhir: seringkali ini bahkan lebih menarik daripada hasil itu sendiri. Pada saat yang sama, filter - gambar yang digunakan sebagai efek untuk diproses - dapat disimpan untuk digunakan lebih lanjut.

Salam, Habr! Tentunya Anda telah memperhatikan bahwa tema foto gaya untuk berbagai gaya artistik dibahas secara aktif di internet Anda ini. Membaca semua artikel populer ini, Anda mungkin berpikir bahwa keajaiban sedang terjadi di bawah kap aplikasi ini, dan jaringan saraf benar-benar berfantasi dan menggambar ulang gambar dari awal. Kebetulan tim kami dihadapkan pada tugas serupa: sebagai bagian dari hackathon internal perusahaan, kami membuat gaya video, karena. sudah ada aplikasi untuk foto. Dalam posting ini, kita akan melihat bagaimana jaringan "menggambar ulang" gambar, dan melihat artikel yang memungkinkan. Saya menganjurkan agar Anda membiasakan diri dengan posting terakhir sebelum membaca materi ini dan secara umum dengan dasar-dasar jaringan saraf convolutional. Anda akan menemukan beberapa rumus, beberapa kode (saya akan memberikan contoh pada Theano dan Lasagna), serta banyak gambar. Posting ini dibangun di urutan kronologis penampilan artikel dan, karenanya, ide itu sendiri. Terkadang saya akan mencairkannya dengan pengalaman kami baru-baru ini. Ini anak laki-laki dari neraka untuk diperhatikan.


Memvisualisasikan dan Memahami Jaringan Konvolusional (28 Nov 2013)

Pertama-tama, perlu disebutkan artikel di mana penulis dapat menunjukkan bahwa jaringan saraf bukanlah kotak hitam, tetapi hal yang cukup dapat ditafsirkan (omong-omong, hari ini tidak hanya tentang jaringan konvolusi untuk komputer penglihatan). Penulis memutuskan untuk mempelajari cara menafsirkan aktivasi neuron lapisan tersembunyi, untuk ini mereka menggunakan jaringan saraf dekonvolusional (deconvnet) yang diusulkan beberapa tahun sebelumnya (omong-omong, oleh Zeiler dan Fergus yang sama, yang merupakan penulis publikasi ini sebagai Sehat). Jaringan dekonvolusi sebenarnya adalah jaringan yang sama dengan konvolusi dan penyatuan yang diterapkan dalam urutan terbalik. Karya asli tentang deconvnet menggunakan jaringan dalam mode pembelajaran tanpa pengawasan untuk menghasilkan gambar. Kali ini, penulis menggunakannya hanya untuk umpan balik dari fitur yang diperoleh setelah melewati jaringan ke gambar asli. Hasilnya adalah gambar yang dapat diinterpretasikan sebagai sinyal yang menyebabkan aktivasi ini pada neuron. Secara alami, muncul pertanyaan: bagaimana membuat umpan balik melalui konvolusi dan nonlinier? Dan terlebih lagi melalui max-pooling, ini tentunya bukan operasi terbalik. Mari kita lihat ketiga komponen tersebut.

Membalikkan ReLu

Dalam jaringan konvolusional, fungsi aktivasi sering digunakan ReLu(x) = maks(0, x), yang membuat semua aktivasi pada layer menjadi non-negatif. Dengan demikian, ketika melewati nonlinier, juga perlu untuk mendapatkan hasil non-negatif. Untuk ini, penulis mengusulkan untuk menggunakan ReLu yang sama. Dari sudut pandang arsitektur Theano, penting untuk mengesampingkan fungsi gradien operasi (notebook yang sangat berharga ada di resep lasagna, dari sana Anda akan mendapatkan detail tentang kelas ModifiedBackprop).

Class ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # secara eksplisit memperbaiki return (self.nonlinearity(grd),) # gunakan nonlinier yang diberikan

Membalikkan Konvolusi

Ini sedikit lebih rumit, tetapi semuanya logis: cukup menerapkan versi transposisi dari kernel konvolusi yang sama, tetapi ke keluaran dari ReLu terbalik alih-alih lapisan sebelumnya yang digunakan dalam lintasan maju. Tapi saya khawatir dengan kata-kata itu tidak begitu jelas, mari kita lihat visualisasi prosedur ini (Anda akan menemukan lebih banyak lagi visualisasi konvolusi).


Konvolusi saat langkah = 1

Konvolusi saat langkah = 1 versi terbalik

Konvolusi saat langkah = 2

Konvolusi saat langkah = 2 versi terbalik

Pengumpulan Terbalik

Operasi ini (tidak seperti yang sebelumnya) umumnya tidak dapat dibalik. Tapi kami masih ingin melewati maksimum dengan cara tertentu selama umpan balik. Untuk melakukan ini, penulis menyarankan untuk menggunakan peta dimana maksimum berada selama direct pass (max location switch). Selama reverse pass, sinyal input diubah menjadi unpooling sedemikian rupa untuk mempertahankan struktur sinyal asli, lebih mudah untuk dilihat daripada dijelaskan di sini.



Hasil

Algoritme visualisasi sangat sederhana:

  1. Lakukan umpan lurus.
  2. Pilih layer yang kita minati.
  3. Perbaiki aktivasi satu atau lebih neuron dan atur ulang sisanya.
  4. Buat kesimpulan.

Setiap kotak abu-abu pada gambar di bawah sesuai dengan visualisasi filter (yang diterapkan untuk konvolusi) atau bobot neuron tunggal, dan masing-masing gambar berwarna adalah bagian dari gambar asli yang mengaktifkan neuron yang sesuai. Untuk kejelasan, neuron dalam satu lapisan dikelompokkan menjadi kelompok tematik. Secara umum, tiba-tiba ternyata jaringan saraf mempelajari dengan tepat apa yang ditulis oleh Hubel dan Weisel dalam pekerjaan mereka tentang struktur sistem visual, yang untuknya mereka dianugerahi Penghargaan Nobel pada tahun 1981. Berkat artikel ini, kami mendapatkan representasi visual tentang apa yang dipelajari oleh jaringan saraf convolutional di setiap lapisan. Pengetahuan inilah yang nantinya akan memungkinkan untuk memanipulasi konten gambar yang dihasilkan, tetapi ini masih jauh, beberapa tahun ke depan telah digunakan untuk meningkatkan metode "trepanasi" jaringan saraf. Selain itu, penulis artikel mengusulkan cara untuk menganalisis cara terbaik membangun arsitektur jaringan saraf konvolusional untuk mencapai hasil terbaik(namun, mereka tidak memenangkan ImageNet 2013, tetapi menjadi yang teratas; UPD: ternyata mereka menang, Clarifai apa adanya).


Visualisasi fitur


Ini adalah contoh visualisasi aktivasi menggunakan deconvnet, hari ini hasilnya terlihat biasa saja, tetapi kemudian menjadi terobosan.


Saliency Maps menggunakan deconvnet

Deep Inside Convolutional Networks: Memvisualisasikan Model Klasifikasi Gambar dan Saliency Maps (19 Apr 2014)

Artikel ini dikhususkan untuk mempelajari metode visualisasi pengetahuan yang terkandung dalam jaringan saraf convolutional. Penulis mengusulkan dua metode visualisasi berdasarkan penurunan gradien.

Visualisasi Model Kelas

Jadi, bayangkan kita memiliki jaringan syaraf terlatih untuk memecahkan masalah klasifikasi menjadi sejumlah kelas tertentu. Dilambangkan sebagai nilai aktivasi dari neuron keluaran yang sesuai dengan kelas C. Kemudian masalah pengoptimalan berikut memberi kita gambar yang memaksimalkan kelas yang dipilih:



Tugas ini mudah diselesaikan menggunakan Theano. Biasanya kita meminta framework untuk mengambil turunan dari parameter model, namun kali ini kita asumsikan bahwa parameternya tetap dan turunannya diambil dari gambar masukan. Fungsi berikut memilih nilai maksimum dari lapisan keluaran dan mengembalikan fungsi yang menghitung turunan sehubungan dengan gambar masukan.


def compile_saliency_function(net): """ Mengkompilasi fungsi untuk menghitung peta arti-penting dan kelas yang diprediksi untuk minibatch tertentu dari gambar input. """ 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) kembalikan theano.fungsi(, )

Anda mungkin pernah melihat gambar anjing yang aneh di Internet - DeepDream. Dalam artikel asli, penulis menggunakan proses selanjutnya untuk menghasilkan gambar yang memaksimalkan kelas yang dipilih:

  1. Inisialisasi gambar awal dengan nol.
  2. Hitung nilai turunan dari gambar ini.
  3. Ubah gambar dengan menambahkan gambar yang dihasilkan dari turunannya.
  4. Kembali ke langkah 2 atau keluar dari loop.

Gambar yang dihasilkan adalah:




Tetapi bagaimana jika Anda menginisialisasi gambar pertama dengan foto asli dan memulai proses yang sama? Namun pada setiap iterasi kita akan memilih kelas secara acak, mengatur sisanya menjadi nol dan menghitung nilai turunannya, maka kita mendapatkan mimpi yang begitu dalam.


Perhatian 60 mb


Mengapa ada begitu banyak wajah dan mata anjing? Sederhana saja: ada hampir 200 anjing di jaring gambar dari 1000 kelas, mereka memiliki mata. Dan juga banyak kelas yang hanya berisi orang.

Ekstraksi Saliency Kelas

Jika proses ini diinisialisasi dengan foto asli, dihentikan setelah iterasi pertama dan menggambar nilai turunannya, maka kita akan mendapatkan gambar seperti itu, menambahkan yang mana ke yang asli, kita akan meningkatkan nilai aktivasi dari kelas yang dipilih.


Saliency Maps Menggunakan Derivatif


Sekali lagi, hasilnya "biasa saja". Penting untuk dicatat bahwa ini jalan baru visualisasi aktivasi (tidak ada yang menghalangi kami untuk memperbaiki nilai aktivasi bukan pada lapisan terakhir, tetapi secara umum pada lapisan jaringan mana pun dan mengambil turunan sehubungan dengan gambar input). Artikel selanjutnya akan menggabungkan kedua pendekatan sebelumnya dan memberi kita alat tentang cara menyiapkan transfer gaya, yang akan dijelaskan nanti.

Berjuang untuk Kesederhanaan: Jaring Konvolusional (13 Apr 2015)

Artikel ini umumnya bukan tentang visualisasi, tetapi tentang fakta bahwa mengganti kumpulan dengan konvolusi dengan langkah besar tidak menyebabkan hilangnya kualitas. Tetapi sebagai produk sampingan dari penelitian mereka, penulis mengusulkan cara baru untuk memvisualisasikan fitur, yang mereka terapkan untuk menganalisis secara lebih akurat apa yang dipelajari model. Ide mereka adalah sebagai berikut: jika kita hanya mengambil turunannya, maka fitur-fitur yang kurang dari nol pada gambar masukan tidak akan kembali selama dekonvolusi (menggunakan ReLu untuk gambar masukan). Dan ini mengarah pada fakta bahwa nilai negatif muncul pada gambar belakang yang disebarkan. Di sisi lain, jika Anda menggunakan deconvnet, maka ReLu lain diambil dari turunan ReLu - ini memungkinkan Anda untuk tidak melewatkan nilai negatif, tetapi seperti yang Anda lihat, hasilnya "biasa saja". Tetapi bagaimana jika kita menggabungkan kedua metode ini?




kelas GuidedBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = input (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd > 0).astype(dtype),)

Kemudian Anda mendapatkan gambar yang benar-benar bersih dan dapat ditafsirkan.


Saliency Maps menggunakan Guided Backpropagation

Pergi lebih dalam

Sekarang mari kita pikirkan, apa yang diberikan ini kepada kita? Izinkan saya mengingatkan Anda bahwa setiap lapisan konvolusional adalah fungsi yang menerima tensor tiga dimensi sebagai input dan juga menghasilkan tensor tiga dimensi sebagai output, mungkin dari dimensi yang berbeda. D X w X H; D epth adalah jumlah neuron pada layer yang masing-masing menghasilkan peta fitur dengan ukuran w x H delapan.


Mari kita coba eksperimen berikut di jaringan VGG-19:



konv1_2

Ya, Anda hampir tidak melihat apa-apa, karena. area penerima sangat kecil, ini adalah konvolusi kedua 3x3, masing-masing, luas totalnya 5x5. Namun saat memperbesar, kami melihat bahwa fitur tersebut hanyalah pendeteksi gradien.




konv3_3


konv4_3


konv5_3


kolam5


Dan sekarang bayangkan bahwa alih-alih maksimum pada pelat, kami akan mengambil turunan dari nilai jumlah semua elemen pelat pada gambar input. Maka jelas area reseptif kelompok neuron akan menutupi seluruh gambar masukan. Untuk lapisan awal, kita akan melihat peta terang, yang darinya kita menyimpulkan bahwa ini adalah pendeteksi warna, lalu gradien, lalu batas, dan seterusnya menuju pola yang lebih kompleks. Semakin dalam lapisan, semakin redup gambar yang diperoleh. Hal ini dijelaskan oleh fakta bahwa lapisan yang lebih dalam memiliki pola yang lebih kompleks yang mereka deteksi, dan pola kompleks lebih jarang muncul daripada yang sederhana, dan oleh karena itu peta aktivasi meredup. Cara pertama cocok untuk memahami lapisan dengan pola yang rumit, dan yang kedua tepat untuk yang sederhana.


konv1_1


konv2_2


konv4_3


Anda dapat mengunduh database aktivasi yang lebih lengkap untuk beberapa gambar dan file .

Algoritma Neural Gaya Artistik (2 Sep 2015)

Jadi, beberapa tahun telah berlalu sejak trepanasi jaringan saraf pertama yang berhasil. Kami (dalam arti kemanusiaan) memiliki alat yang ampuh di tangan kami yang memungkinkan kami untuk memahami apa yang dipelajari jaringan saraf, serta menghapus apa yang sebenarnya tidak ingin kami pelajari. Penulis artikel ini sedang mengembangkan metode yang memungkinkan Anda membuat satu gambar menghasilkan peta aktivasi yang serupa dengan beberapa gambar target, dan bahkan mungkin lebih dari satu - ini adalah dasar penataan gaya. Kami memasukkan derau putih ke input, dan dalam proses berulang yang serupa seperti dalam mimpi yang dalam, kami membawa gambar ini ke gambar yang peta fiturnya mirip dengan gambar target.

kehilangan konten

Seperti yang telah disebutkan, setiap lapisan jaringan saraf menghasilkan tensor tiga dimensi dari beberapa dimensi.




Mari kita tunjukkan outputnya Saya lapisan th dari input sebagai. Kemudian jika kita meminimalkan jumlah bobot residu antara gambar input dan beberapa citra yang kita cita-citakan C, lalu Anda mendapatkan apa yang Anda butuhkan. Mungkin.



Untuk bereksperimen dengan artikel ini, Anda dapat menggunakan laptop ajaib ini, tempat perhitungan dilakukan (baik di GPU maupun di CPU). GPU digunakan untuk menghitung fitur jaringan saraf dan nilai fungsi biaya. Theano menghasilkan fungsi yang dapat menghitung gradien dari fungsi tujuan eval_grad oleh gambar masukan X. Ini kemudian dimasukkan ke dalam lbfgs dan proses berulang dimulai.


# Menginisialisasi dengan noise image 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) # Optimalkan, simpan hasilnya secara berkala untuk i dalam range(8): print(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)

Jika kami menjalankan pengoptimalan fungsi seperti itu, maka kami akan segera mendapatkan gambar yang mirip dengan target. Sekarang kita dapat membuat ulang gambar dari derau putih yang terlihat seperti beberapa gambar konten.


Kehilangan Konten: conv4_2



Proses pengoptimalan




Sangat mudah untuk melihat dua fitur dari gambar yang dihasilkan:

  • kehilangan warna - ini adalah hasil dari fakta bahwa di contoh spesifik hanya lapisan conv4_2 yang digunakan (atau, dengan kata lain, bobot w bukan nol untuknya, dan nol untuk lapisan lainnya); seperti yang Anda ingat, itu adalah lapisan awal yang berisi informasi tentang warna dan transisi gradien, dan lapisan selanjutnya berisi informasi tentang detail yang lebih besar, yang kami amati - warnanya hilang, tetapi isinya tidak;
  • beberapa rumah "ayo pergi", mis. garis lurus sedikit melengkung - ini karena semakin dalam lapisannya, semakin sedikit informasi tentang posisi spasial dari fitur yang dikandungnya (hasil penerapan konvolusi dan penyatuan).

Menambahkan lapisan awal segera memperbaiki situasi dengan warna.


Kehilangan Konten: conv1_1, conv2_1, conv4_2


Mudah-mudahan sekarang Anda merasa bahwa Anda memiliki kendali atas apa yang digambar ulang ke gambar derau putih.

kehilangan gaya

Dan sekarang kita sampai pada hal yang paling menarik: bagaimana kita bisa menyampaikan gayanya? Apa itu gaya? Jelas, gayanya bukan yang kami optimalkan di Content Loss, karena berisi banyak informasi tentang posisi spasial fitur Jadi hal pertama yang harus dilakukan adalah menghapus informasi ini dari tampilan yang diterima di setiap lapisan.


Penulis mengusulkan metode berikut. Mari kita ambil tensor pada keluaran beberapa lapisan, perluas dalam koordinat spasial dan hitung matriks kovarians di antara pelat. Mari kita nyatakan transformasi ini sebagai G. Apa yang sebenarnya telah kita lakukan? Dapat dikatakan bahwa kita menghitung seberapa sering kenampakan di dalam pelat terjadi secara berpasangan, atau dengan kata lain, kita mengaproksimasi distribusi kenampakan dalam pelat dengan distribusi normal multivariat.




Kemudian Style Loss dimasukkan sebagai berikut, di mana S adalah beberapa gambar dengan gaya:



Haruskah kita mencoba untuk Vincent? Pada prinsipnya, kami mendapatkan sesuatu yang diharapkan - kebisingan dalam gaya Van Gogh, informasi tentang penataan ruang fitur benar-benar hilang.


Vincent




Bagaimana jika kita meletakkan foto alih-alih gambar gaya? Anda sudah mendapatkan fitur yang familiar, warna yang familiar, tetapi posisi spasialnya benar-benar hilang.


Foto dengan kehilangan gaya


Tentunya Anda bertanya-tanya mengapa kami menghitung matriks kovarians, dan bukan yang lain? Lagi pula, ada banyak cara untuk mengagregasi fitur sehingga koordinat spasial hilang. Ini benar-benar pertanyaan terbuka, dan jika Anda mengambil sesuatu yang sangat sederhana, hasilnya tidak akan berubah secara dramatis. Mari kita periksa ini, kita tidak akan menghitung matriks kovarian, tetapi hanya nilai rata-rata dari setiap lempeng.




kehilangan gaya sederhana

Kerugian gabungan

Secara alami, ada keinginan untuk memadukan kedua fungsi biaya ini. Kemudian kami akan menghasilkan gambar seperti itu dari white noise yang akan mempertahankan fitur dari konten-gambar (yang mengikat koordinat spasial), dan juga akan ada fitur "gaya" yang tidak terikat dengan koordinat spasial, yaitu. semoga detail gambar konten tetap utuh, tetapi digambar ulang dengan gaya yang tepat.



Sebenarnya, ada juga regularizer, tapi kami akan mengabaikannya demi kesederhanaan. Tetap menjawab pertanyaan berikut: lapisan (bobot) apa yang digunakan dalam pengoptimalan? Dan saya khawatir saya tidak memiliki jawaban untuk pertanyaan ini, begitu pula penulis artikelnya. Mereka memiliki saran untuk menggunakan yang berikut ini, tetapi ini tidak berarti kombinasi lain akan bekerja lebih buruk, ruang pencarian terlalu besar. Satu-satunya aturan yang mengikuti dari pemahaman model adalah tidak masuk akal untuk mengambil lapisan tetangga, karena tanda mereka tidak akan berbeda jauh satu sama lain, oleh karena itu lapisan dari setiap grup conv*_1 ditambahkan ke gaya.


# Tentukan kerugian fungsi kerugian = # kerugian konten kerugian.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # kerugian gaya kerugian.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) kerugian.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) kerugian.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) kerugian.append(0.2e6 * style_loss(art_features, gen_features, "conv4_1") ) kerugian.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # total variasi kerugian penalti.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = jumlah(kerugian)

Model akhir dapat disajikan dalam bentuk berikut.




Dan inilah hasil rumah dengan Van Gogh.



Mencoba untuk mengontrol proses

Mari kita ingat bagian sebelumnya, dua tahun sebelum artikel ini, ilmuwan lain telah mempelajari apa yang sebenarnya dipelajari oleh jaringan saraf. Berbekal semua artikel ini, Anda dapat menghasilkan visualisasi fitur dari berbagai gaya, berbagai gambar, resolusi dan ukuran yang berbeda, dan coba pahami lapisan mana yang harus diambil bobotnya. Tetapi bahkan menimbang ulang lapisan tidak memberikan kendali penuh atas apa yang terjadi. Masalahnya di sini lebih konseptual: kami mengoptimalkan fungsi yang salah! Bagaimana bisa, Anda bertanya? Jawabannya sederhana: fungsi ini meminimalkan sisa ... yah, Anda mengerti. Tapi yang benar-benar kami inginkan adalah kami menyukai gambar itu. Kombinasi cembung dari fungsi kehilangan konten dan gaya bukanlah ukuran dari apa yang dianggap indah oleh pikiran kita. Telah diamati bahwa jika gaya dilanjutkan terlalu lama, fungsi biaya secara alami turun semakin rendah, tetapi keindahan estetika hasilnya turun tajam.




Oke, ada satu masalah lagi. Katakanlah kita menemukan lapisan yang mengekstrak fitur yang kita butuhkan. Katakanlah beberapa tekstur berbentuk segitiga. Namun layer ini masih mengandung banyak fitur lain, seperti lingkaran, yang sebenarnya tidak ingin kita lihat pada gambar yang dihasilkan. Secara umum, jika kami dapat mempekerjakan satu juta orang Tionghoa, kami dapat memvisualisasikan semua fitur gambar gaya, dan dengan pencarian menyeluruh cukup menandai yang kami butuhkan, dan hanya memasukkannya ke dalam fungsi biaya. Tapi untuk alasan yang jelas, itu tidak mudah. Tapi bagaimana jika kita menghapus semua lingkaran yang tidak ingin kita tampilkan di hasil dari stylesheet? Maka aktivasi neuron yang sesuai yang merespons lingkaran tidak akan berfungsi. Dan, tentu saja, ini tidak akan muncul pada gambar yang dihasilkan. Sama halnya dengan bunga. Hadirkan gambar yang cerah dengan banyak warna. Distribusi warna akan sangat menyebar ke seluruh ruang, distribusi gambar yang dihasilkan akan sama, tetapi selama proses pengoptimalan, puncak yang ada pada aslinya mungkin akan hilang. Ternyata penurunan sederhana dalam kedalaman bit Palet warna memecahkan masalah ini. Kepadatan distribusi sebagian besar warna akan mendekati nol, dan akan ada puncak besar di beberapa area. Jadi, dengan memanipulasi yang asli di Photoshop, kami memanipulasi fitur yang diekstraksi dari gambar. Lebih mudah bagi seseorang untuk mengungkapkan keinginannya secara visual daripada mencoba merumuskannya dalam bahasa matematika. Selamat tinggal. Akibatnya, desainer dan manajer, dipersenjatai dengan Photoshop dan skrip untuk memvisualisasikan fitur, mencapai hasil tiga kali lebih cepat daripada yang dilakukan oleh matematikawan dan pemrogram.


Contoh memanipulasi warna dan ukuran fitur


Dan Anda bisa langsung mengambil gambar sederhana sebagai gaya



hasil








Dan inilah vidosik, tetapi hanya dengan tekstur yang tepat

Jaringan Tekstur: Sintesis Umpan-maju Tekstur dan Gambar Bergaya (10 Mar 2016)

Tampaknya ini bisa dihentikan, jika tidak satu nuansa. Algoritme gaya di atas berfungsi untuk waktu yang sangat lama. Jika kita mengambil implementasi di mana lbfgs dijalankan di CPU, maka prosesnya memakan waktu sekitar lima menit. Jika Anda menulis ulang sehingga pengoptimalan masuk ke GPU, maka prosesnya akan memakan waktu 10-15 detik. Ini tidak bagus. Mungkin penulis artikel ini dan artikel selanjutnya memikirkan hal yang sama. Kedua publikasi tersebut keluar secara independen dengan selang waktu 17 hari, hampir setahun setelah artikel sebelumnya. Penulis artikel saat ini, seperti penulis artikel sebelumnya, terlibat dalam pembuatan tekstur (jika Anda baru saja mengatur ulang Style Loss, ini kira-kira yang Anda dapatkan). Mereka menyarankan untuk mengoptimalkan bukan gambar yang diperoleh dari white noise, tetapi beberapa jaringan saraf yang menghasilkan gambar bergaya.




Sekarang, jika proses penataan tidak menyertakan pengoptimalan apa pun, hanya penerusan maju yang perlu dilakukan. Dan pengoptimalan hanya diperlukan sekali untuk melatih jaringan generator. Artikel ini menggunakan generator hierarkis di mana masing-masing mengikuti z lebih besar dari yang sebelumnya dan diambil sampelnya dari derau jika terjadi pembuatan tekstur, dan dari beberapa database gambar untuk pelatihan penata gaya. Sangat penting untuk menggunakan sesuatu selain bagian pelatihan dari imagenet, karena fitur di dalam Loss-network dihitung oleh jaringan yang dilatih hanya pada bagian pelatihan.



Kerugian Persepsi untuk Transfer Gaya Real-Time dan Super-Resolution (27 Mar 2016)

Sesuai dengan namanya, penulis yang baru terlambat 17 hari dengan ide jaringan pembangkit sibuk meningkatkan resolusi gambar. Mereka tampaknya terinspirasi oleh keberhasilan sisa pembelajaran di imagenet terbaru.




Dengan demikian blok sisa dan blok konv.



Jadi, sekarang selain kontrol gaya, kami juga memiliki generator cepat di tangan kami (berkat dua artikel ini, waktu pembuatan untuk satu gambar diukur dalam puluhan md).

Akhir

Kami menggunakan informasi dari artikel yang ditinjau dan kode penulis sebagai titik awal untuk membuat aplikasi gaya lain untuk aplikasi gaya video pertama:



Menghasilkan sesuatu seperti ini.


Dalam foto-foto paling biasa, banyak entitas yang tidak dapat dibedakan sepenuhnya muncul. Paling sering karena alasan tertentu anjing. Gambar seperti itu mulai memenuhi Internet pada Juni 2015, ketika DeepDream dari Google diluncurkan - salah satu layanan terbuka pertama berdasarkan jaringan saraf dan dirancang untuk pemrosesan gambar.

Itu terjadi kira-kira seperti ini: algoritme menganalisis foto, menemukan fragmen di dalamnya yang mengingatkannya pada beberapa objek yang sudah dikenal - dan mendistorsi gambar sesuai dengan data ini.

Pertama, proyek ditata sebagai sumber terbuka, dan kemudian layanan online yang dibuat dengan prinsip yang sama muncul di Internet. Salah satu yang paling nyaman dan populer adalah Deep Dream Generator: hanya perlu sekitar 15 detik untuk memproses foto kecil di sini (sebelumnya, pengguna harus menunggu lebih dari satu jam).

Bagaimana jaringan saraf belajar membuat gambar seperti itu? Dan mengapa, omong-omong, mereka disebut demikian?

Jaringan saraf dalam desainnya meniru jaringan saraf nyata dari organisme hidup, tetapi mereka melakukannya dengan bantuan algoritme matematika. Setelah membuat struktur dasar, Anda dapat melatihnya menggunakan metode pembelajaran mesin. Jika kita berbicara tentang pengenalan pola, maka ribuan gambar harus melewati jaringan saraf. Jika tugas jaringan saraf berbeda, maka latihannya akan berbeda.

Algoritma untuk bermain catur, misalnya menganalisis permainan catur. Sepanjang jalur yang sama, algoritme AlphaGo Google DeepMind ke dalam permainan Cina Go - yang dipuji sebagai terobosan karena Go jauh lebih kompleks dan non-linier daripada catur.

    Anda dapat bermain-main dengan model jaringan saraf yang disederhanakan dan lebih memahami prinsipnya.

    YouTube juga memiliki serangkaian gambar tangan yang dapat dipahami rol tentang bagaimana jaringan saraf bekerja.

Layanan populer lainnya adalah Dreamscope, yang tidak hanya dapat memimpikan anjing, tetapi juga meniru berbagai gaya melukis. Pemrosesan gambar di sini juga sangat sederhana dan cepat (sekitar 30 detik).

Ternyata, bagian algoritmik dari layanan ini merupakan modifikasi dari program Neural style, yang sudah kita bahas.

Baru-baru ini, sebuah program telah muncul yang melukis gambar hitam putih secara realistis. Di versi sebelumnya, program serupa melakukan tugasnya dengan kurang baik, dan dianggap sebagai pencapaian yang luar biasa jika setidaknya 20% orang tidak dapat membedakan antara gambar asli dan gambar berwarna komputer.

Apalagi, pewarnaan di sini hanya membutuhkan waktu sekitar 1 menit.

Perusahaan pengembang yang sama juga meluncurkan layanan yang mengenali gambar jenis yang berbeda objek.

Layanan ini mungkin tampak seperti hiburan yang menyenangkan, tetapi sebenarnya semuanya jauh lebih menarik. Teknologi baru memasuki praktik seniman manusia dan mengubah pemahaman kita tentang seni. Mungkin sebentar lagi orang harus bersaing dengan mesin di bidang kreativitas.

Mengajar algoritme pengenalan pola adalah tugas yang telah lama diperjuangkan oleh pengembang AI. Oleh karena itu, program yang mewarnai foto-foto lama dan menggambar anjing di langit dapat dianggap sebagai bagian dari proses yang lebih besar dan lebih menarik.


Atas