Jaringan saraf menggambar secara online. Ostagram: layanan berbasis jaringan saraf yang menggabungkan foto dan ornamen menjadi karya seni


Sejak peneliti Jerman dari Universitas Tübingen mempresentasikan ide mereka untuk mentransfer gaya seniman terkenal ke foto lain pada Agustus 2015, mulai bermunculan layanan yang memonetisasi peluang ini. Ini diluncurkan di pasar Barat, dan salinan lengkapnya diluncurkan di pasar Rusia.

Bookmark

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

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

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

Ada dua versi berbayar: Premium menghasilkan gambar hingga 700 piksel di sepanjang sisi terpanjang dan menerapkan 600 iterasi pemrosesan jaringan saraf pada gambar (semakin banyak iterasi, semakin menarik dan intensif pemrosesan). Salah satu foto tersebut akan berharga 50 rubel.

Dalam versi HD, Anda dapat menyesuaikan jumlah iterasi: 100 akan berharga 50 rubel, dan 1000 akan berharga 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 seperti itu dengan pengiriman mulai dari 1800 rubel.

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

TJ menghubungi direktur komersial proyek tersebut, yang memperkenalkan dirinya sebagai Andrey. Menurutnya, Ostagram muncul sebelum Instapainting, namun terinspirasi dari proyek serupa bernama Vipart.

Ostagram dikembangkan oleh sekelompok mahasiswa dari NSTU. Alekseeva: setelah pengujian awal pada sekelompok kecil teman, pada akhir tahun 2015 mereka memutuskan untuk mempublikasikan proyek tersebut. Awalnya, pemrosesan gambar sepenuhnya gratis, dan rencananya adalah 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 manusia, dan klien akhir memerlukan waktu lama untuk menyesuaikan hasilnya sebelum menerapkannya ke kanvas, yang memerlukan sumber daya mesin yang besar.

Pembuat Ostagram ingin menggunakan server cloud Amazon untuk memproses gambar, tetapi setelah masuknya pengguna, menjadi jelas bahwa biayanya akan melebihi seribu dolar per hari dengan laba atas investasi yang minimal. Andrey, yang juga merupakan investor proyek tersebut, menyewa kapasitas server di Nizhny Novgorod.

Penonton proyek ini sekitar seribu orang setiap hari, namun pada hari-hari tertentu mencapai 40 ribu orang karena referensi dari media asing yang sudah lebih dulu memperhatikan proyek tersebut sebelum media dalam negeri (Ostagram bahkan berhasil berkolaborasi dengan DJ Eropa). Pada malam hari, saat lalu lintas sepi, pemrosesan gambar dapat memakan waktu 5 menit, dan pada siang hari dapat memakan waktu hingga satu jam.

Jika sebelumnya akses terhadap pemrosesan gambar sengaja dibatasi untuk pengguna asing (mereka berpikir untuk memulai monetisasi di Rusia), kini Ostagram lebih mengandalkan audiens Barat.

Saat ini, prospek pengembalian dana masih bersyarat. Jika setiap pengguna membayar 10 rubel untuk pemrosesan, mungkin itu akan membuahkan hasil. […]

Sangat sulit untuk menghasilkan uang di negara kita: masyarakat kita siap menunggu seminggu, tetapi tidak mau membayar sepeser pun untuk itu. Masyarakat Eropa lebih menyukai hal ini – dalam hal pembayaran untuk mempercepat, meningkatkan kualitas – sehingga mereka menargetkan pasar tersebut.

Andrey, perwakilan Ostagram

Menurut Andrey, tim Ostagram sedang mengerjakan versi baru situs tersebut dengan penekanan lebih besar pada sosialitas: “Ini akan serupa dengan layanan terkenal, tetapi apa yang harus dilakukan.” Perwakilan Facebook di Rusia sudah tertarik dengan proyek tersebut, namun negosiasi penjualan belum mencapai titik penjualan.

Contoh pekerjaan jasa

Di feed situs Ostagram, Anda juga dapat melihat kombinasi gambar yang menghasilkan foto akhir: seringkali ini lebih menarik daripada hasilnya sendiri. Dalam hal ini, filter - gambar yang digunakan sebagai efek pemrosesan - dapat disimpan untuk digunakan di masa mendatang.

Salam, Habr! Tentunya Anda telah memperhatikan bahwa topik penataan foto agar sesuai dengan berbagai gaya artistik sedang aktif dibahas di Internet Anda. Membaca semua artikel populer ini, Anda mungkin berpikir bahwa keajaiban sedang terjadi di balik terpal aplikasi ini, dan jaringan saraf benar-benar membayangkan dan menggambar ulang gambar dari awal. Kebetulan tim kami dihadapkan pada tugas serupa: sebagai bagian dari hackathon internal perusahaan, kami membuat stilisasi video, karena... Sudah ada aplikasi untuk foto. Dalam postingan ini, kami akan mengetahui bagaimana jaringan “menggambar ulang” gambar, dan kami akan menganalisis artikel yang memungkinkan hal ini. Saya menyarankan Anda membaca posting sebelumnya sebelum membaca materi ini dan, secara umum, dasar-dasar jaringan saraf konvolusional. Anda akan menemukan beberapa rumus, beberapa kode (saya akan memberikan contoh di Theano dan Lasagna), dan juga banyak gambar. Posting ini disusun dalam urutan kronologis kemunculan artikel dan, sesuai dengan idenya sendiri. Terkadang saya akan mencairkannya dengan pengalaman kami baru-baru ini. Inilah anak laki-laki dari neraka untuk menarik perhatian Anda.


Memvisualisasikan dan Memahami Jaringan Konvolusional (28 Nov 2013)

Pertama-tama, perlu disebutkan sebuah artikel di mana penulis dapat menunjukkan bahwa jaringan saraf bukanlah kotak hitam, tetapi hal yang sepenuhnya dapat ditafsirkan (omong-omong, saat ini hal ini tidak hanya dapat dikatakan tentang jaringan konvolusional untuk komputer. penglihatan). Para penulis memutuskan untuk mempelajari cara menafsirkan aktivasi neuron di lapisan tersembunyi; untuk ini mereka menggunakan jaringan saraf dekonvolusional (deconvnet), yang diusulkan beberapa tahun sebelumnya (omong-omong, oleh Seiler dan Fergus yang sama, yang merupakan penulisnya. publikasi). Jaringan dekonvolusi sebenarnya adalah jaringan yang sama dengan konvolusi dan penggabungan, namun diterapkan dalam urutan terbalik. Karya asli di deconvnet menggunakan jaringan dalam mode pembelajaran tanpa pengawasan untuk menghasilkan gambar. Kali ini, penulis menggunakannya hanya untuk mundur dari fitur yang diperoleh setelah meneruskan jaringan ke gambar aslinya. Hasilnya adalah gambar yang dapat diartikan sebagai sinyal yang menyebabkan aktivasi di neuron. Tentu saja timbul pertanyaan: bagaimana cara melakukan pembalikan melalui konvolusi dan nonlinier? Dan terlebih lagi melalui max-pooling, ini tentu saja bukan operasi yang bisa dibalik. 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 lapisan menjadi non-negatif. Oleh karena itu, ketika menelusuri kembali nonlinier, perlu juga diperoleh hasil non-negatif. Untuk itu penulis menyarankan untuk menggunakan ReLu yang sama. Dari perspektif arsitektur, Theano perlu mengganti fungsi operasi gradien (buku catatan yang sangat berharga ada di Resep Lasagna, dari sana Anda akan mendapatkan detail tentang kelas ModifiedBackprop).

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

Konvolusi terbalik

Ini sedikit lebih rumit, tetapi semuanya logis: cukup menerapkan versi transposisi dari kernel konvolusi yang sama, tetapi ke output dari ReLu terbalik, bukan lapisan sebelumnya yang digunakan dalam forward pass. Namun saya khawatir hal ini tidak begitu jelas dengan kata-kata, mari kita lihat visualisasi prosedur ini (Anda akan menemukan lebih banyak lagi visualisasi konvolusi).


Konvolusi dengan langkah=1

Konvolusi dengan langkah=1 Versi terbalik

Konvolusi dengan langkah=2

Konvolusi dengan langkah=2 Versi terbalik

Penggabungan terbalik

Operasi ini (tidak seperti operasi sebelumnya) umumnya tidak dapat dibalik. Namun kami tetap ingin mencapai hasil maksimal selama perjalanan pulang. Untuk melakukan hal ini, penulis menyarankan untuk menggunakan peta dimana lokasi maksimum berada pada saat lintasan langsung (max location switch). Selama reverse pass, sinyal input diubah menjadi unpooling sedemikian rupa sehingga kira-kira mempertahankan struktur sinyal asli di sini lebih mudah untuk dilihat daripada dijelaskan.



Hasil

Algoritme visualisasinya sangat sederhana:

  1. Lakukan umpan lurus.
  2. Pilih layer yang kita minati.
  3. Catat aktivasi satu atau lebih neuron dan setel ulang sisanya.
  4. Menarik kesimpulan sebaliknya.

Setiap kotak abu-abu pada gambar di bawah berhubungan dengan visualisasi filter (yang digunakan untuk konvolusi) atau bobot satu neuron, dan setiap gambar berwarna adalah bagian dari gambar asli yang mengaktifkan neuron terkait. Untuk lebih jelasnya, neuron dalam satu lapisan dikelompokkan ke dalam kelompok tematik. Secara umum, tiba-tiba ternyata jaringan saraf mempelajari persis apa yang ditulis Hubel dan Weisel dalam karya mereka tentang struktur sistem visual, sehingga mereka dianugerahi Hadiah Nobel pada tahun 1981. Berkat artikel ini, kami mendapatkan representasi visual tentang apa yang dipelajari jaringan saraf konvolusional di setiap lapisan. Pengetahuan inilah yang nantinya memungkinkan kita untuk memanipulasi konten gambar yang dihasilkan, tetapi hal ini masih jauh; beberapa tahun ke depan dihabiskan untuk menyempurnakan metode “trepanning” jaringan saraf. Selain itu, penulis artikel mengusulkan cara untuk menganalisis cara terbaik membangun arsitektur jaringan saraf konvolusional untuk mencapai hasil yang lebih baik (meskipun mereka tidak memenangkan ImageNet 2013, tetapi mereka berhasil mencapai puncak; UPD: ternyata mereka menang, Clarifai itu mereka).


Visualisasi fitur


Berikut contoh visualisasi aktivasi menggunakan deconvnet, saat ini hasilnya terlihat biasa saja, namun kemudian menjadi terobosan.


Peta Saliensi menggunakan deconvnet

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

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

Visualisasi Model Kelas

Jadi, bayangkan kita memiliki jaringan saraf terlatih untuk memecahkan masalah klasifikasi ke dalam sejumlah kelas tertentu. Mari kita nyatakan nilai aktivasi neuron keluaran, yang sesuai dengan kelasnya C. Kemudian masalah optimasi berikut memberi kita gambar yang memaksimalkan kelas yang dipilih:



Masalah ini dapat diselesaikan dengan mudah menggunakan Theano. Biasanya kami meminta kerangka kerja untuk mengambil turunan terhadap parameter model, namun kali ini kami berasumsi bahwa parameternya tetap dan turunannya diambil terhadap gambar masukan. Fungsi berikut memilih nilai maksimum lapisan keluaran dan mengembalikan fungsi yang menghitung turunan dari gambar masukan.


def kompilasi_saliency_function(net): """ Mengkompilasi fungsi untuk menghitung peta arti-penting dan kelas prediksi untuk minibatch gambar masukan tertentu. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministik=Benar) 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 aneh dengan wajah anjing di Internet - DeepDream. Dalam makalah aslinya, penulis menggunakan proses berikut 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 hasil turunannya.
  4. Kembali ke poin 2 atau keluar dari loop.

Gambar yang dihasilkan adalah:




Bagaimana jika kita menginisialisasi gambar pertama dengan foto asli dan memulai proses yang sama? Namun pada setiap iterasi kita akan memilih kelas secara acak, mereset sisanya dan menghitung nilai turunannya, maka kita akan mendapatkan mimpi mendalam seperti ini.


Perhatian 60mb


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

Ekstraksi Arti-penting Kelas

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


Saliency Maps menggunakan turunan


Sekali lagi hasilnya “biasa saja”. Penting untuk dicatat bahwa ini adalah cara baru untuk memvisualisasikan aktivasi (tidak ada yang menghalangi kami untuk menetapkan nilai aktivasi bukan pada lapisan terakhir, tetapi pada lapisan jaringan mana pun secara umum dan mengambil turunannya sehubungan dengan gambar masukan. ). Artikel berikutnya akan menggabungkan kedua pendekatan sebelumnya dan memberi kita alat tentang cara mengatur transfer gaya, yang akan dijelaskan nanti.

Berjuang untuk Kesederhanaan: Jaringan Semua Konvolusional (13 Apr 2015)

Artikel ini umumnya bukan tentang visualisasi, tetapi tentang fakta bahwa mengganti penggabungan dengan konvolusi dengan langkah besar tidak menyebabkan penurunan kualitas. Namun sebagai produk sampingan dari penelitian mereka, penulis mengusulkan cara baru untuk memvisualisasikan fitur, yang mereka gunakan untuk menganalisis secara lebih akurat apa yang dipelajari model. Idenya adalah sebagai berikut: jika kita hanya mengambil turunannya, maka selama dekonvolusi, fitur-fitur yang kurang dari nol pada gambar masukan tidak akan dikembalikan (menggunakan ReLu untuk gambar masukan). Dan hal ini berujung pada munculnya nilai-nilai negatif pada gambar yang disebarkan kembali. Di sisi lain, jika Anda menggunakan deconvnet, maka ReLu lain diambil dari turunan ReLu - ini memungkinkan Anda untuk tidak mengembalikan nilai negatif, tetapi seperti yang Anda lihat, hasilnya “biasa saja”. Namun bagaimana jika Anda menggabungkan kedua cara ini?




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

Kemudian Anda akan mendapatkan gambar yang benar-benar bersih dan dapat diinterpretasikan.


Peta Saliency menggunakan Propagasi Balik Terpandu

Masuk lebih dalam

Sekarang mari kita pikirkan apa manfaatnya bagi kita? Izinkan saya mengingatkan Anda bahwa setiap lapisan konvolusional adalah fungsi yang menerima tensor tiga dimensi sebagai masukan dan juga menghasilkan tensor tiga dimensi sebagai keluaran, mungkin dengan dimensi yang berbeda. D X w X H; D epth adalah jumlah neuron dalam lapisan, yang masing-masing menghasilkan peta fitur berukuran w kedelapan x H delapan.


Mari kita coba percobaan berikut pada jaringan VGG-19:



konv1_2

Ya, Anda hampir tidak melihat apa pun, karena... luas reseptifnya sangat kecil, ini konvolusi kedua masing-masing 3x3, luas totalnya 5x5. Namun jika diperbesar, kami melihat bahwa fitur tersebut hanyalah pendeteksi gradien.




konv3_3


konv4_3


konv5_3


kolam5


Sekarang mari kita bayangkan bahwa alih-alih nilai maksimum pada blok, kita akan mengambil turunan dari nilai jumlah semua elemen blok pada gambar masukan. Maka jelaslah area reseptif sekelompok neuron akan menutupi seluruh gambar masukan. Untuk lapisan awal kita akan melihat peta cerah, yang darinya kita menyimpulkan bahwa ini adalah detektor warna, lalu gradien, lalu tepian, dan seterusnya menuju pola yang lebih kompleks. Semakin dalam lapisannya, semakin redup gambarnya. Hal ini dijelaskan oleh fakta bahwa lapisan yang lebih dalam memiliki pola yang lebih kompleks yang mereka deteksi, dan pola kompleks lebih jarang muncul dibandingkan pola sederhana, sehingga peta aktivasi memudar. Metode pertama cocok untuk memahami lapisan dengan pola kompleks, dan metode kedua hanya untuk yang sederhana.


konv1_1


konv2_2


konv4_3


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

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 canggih yang memungkinkan kami memahami apa yang dipelajari jaringan saraf, serta menghapus apa yang sebenarnya tidak ingin kami pelajari. Penulis artikel ini sedang mengembangkan metode yang memungkinkan satu gambar menghasilkan peta aktivasi serupa dengan beberapa gambar target, dan bahkan mungkin lebih dari satu - ini adalah dasar dari stilisasi. Kami menerapkan white noise pada masukan, dan menggunakan proses berulang serupa seperti dalam mimpi mendalam, kami mengurangi gambar ini menjadi gambar yang peta fiturnya mirip dengan gambar target.

Kehilangan Konten

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




Mari kita tunjukkan pintu keluarnya Saya lapisan ke-th dari input sebagai. Kemudian jika kita meminimalkan jumlah residu tertimbang antara gambar masukan dan beberapa gambar yang kami tuju C, maka Anda akan mendapatkan apa yang Anda butuhkan. Mungkin.



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


# Inisialisasi dengan gambar noise yang dihasilkan_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 rentang(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = dihasilkan_gambar.get_value().astype("float64") xs.append(x0)

Jika kita menjalankan optimasi fungsi tersebut, kita akan segera mendapatkan gambar yang mirip dengan target. Sekarang kita dapat menggunakan white noise untuk membuat ulang gambar yang mirip dengan beberapa gambar konten.


Kehilangan Konten: konv4_2



Proses optimasi




Sangat mudah untuk melihat dua fitur dari gambar yang dihasilkan:

  • warna hilang - ini adalah akibat dari fakta bahwa dalam contoh spesifik hanya lapisan conv4_2 yang digunakan (atau, dengan kata lain, bobot w untuk lapisan tersebut bukan nol, dan untuk lapisan lainnya nol); seperti yang Anda ingat, lapisan awallah 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 telah “pindah”, mis. garis lurus sedikit melengkung - hal ini karena semakin dalam lapisannya, semakin sedikit informasi tentang posisi spasial fitur yang dikandungnya (akibat penggunaan konvolusi dan pengumpulan).

Menambahkan lapisan awal segera memperbaiki situasi warna.


Kehilangan Konten: konv1_1, konv2_1, konv4_2


Mudah-mudahan sekarang Anda merasa memiliki kendali atas apa yang digambar ulang pada gambar white noise.

Kehilangan Gaya

Dan sekarang kita sampai pada bagian yang paling menarik: bagaimana kita menyampaikan gayanya? Apa itu gaya? Tentu saja, gaya bukanlah sesuatu yang kami optimalkan di Content Loss, karena gaya berisi banyak informasi tentang posisi spasial fitur. Jadi, hal pertama yang perlu kita lakukan adalah menghapus informasi ini dari tampilan yang diterima di setiap lapisan.


Penulis menyarankan cara berikut ini. Mari kita ambil tensor pada keluaran lapisan tertentu, perluas sepanjang koordinat spasial dan hitung matriks kovarians antar cetakan. Mari kita nyatakan transformasi ini sebagai G. Apa yang sebenarnya telah kita lakukan? Kita dapat mengatakan bahwa kita menghitung seberapa sering fitur-fitur dalam suatu patch muncul secara berpasangan, atau, dengan kata lain, kita memperkirakan distribusi fitur-fitur dalam patch dengan distribusi normal multivariat.




Kemudian Style Loss dimasukkan sebagai berikut, dimana S- ini adalah beberapa gambar dengan gaya:



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


Vinsensius




Bagaimana jika Anda memasang foto dan bukan gambar gaya? Anda akan mendapatkan fitur-fitur familiar, warna-warna familiar, namun posisi spasialnya hilang sama sekali.


Foto dengan kehilangan gaya


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




kehilangan gaya sederhana

Kerugian gabungan

Tentu saja ada keinginan untuk menggabungkan kedua fungsi biaya ini. Kemudian kita akan menghasilkan gambar dari white noise sehingga akan mempertahankan fitur dari konten gambar (yang terkait dengan koordinat spasial), dan juga akan berisi fitur “gaya” yang tidak terkait dengan koordinat spasial, yaitu. kami berharap detail gambar konten tetap utuh dari tempatnya, tetapi akan digambar ulang dengan gaya yang diinginkan.



Sebenarnya ada juga regularizer, tapi kami akan menghilangkannya demi kesederhanaan. Masih menjawab pertanyaan berikut: lapisan (bobot) mana yang harus digunakan selama optimasi? Dan saya khawatir saya tidak memiliki jawaban atas pertanyaan ini, begitu pula penulis artikelnya. Mereka memiliki usulan untuk menggunakan yang berikut ini, tetapi ini tidak berarti bahwa kombinasi lain akan bekerja lebih buruk, ruang pencarian terlalu besar. Satu-satunya aturan yang mengikuti pemahaman model: tidak ada gunanya mengambil lapisan yang berdekatan, karena karakteristiknya tidak akan jauh berbeda satu sama lain, sehingga lapisan dari setiap grup konv*_1 ditambahkan ke gaya.


# Definisikan kerugian fungsi kerugian = # kerugian konten kerugian.tambahkan(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.tambahkan (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 penalti kerugian.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = jumlah(kerugian)

Model akhir dapat disajikan sebagai berikut.




Dan inilah hasil rumah bersama Van Gogh.



Mencoba mengendalikan prosesnya

Mari kita ingat bagian sebelumnya, sudah dua tahun sebelum artikel ini, ilmuwan lain sedang meneliti apa yang sebenarnya dipelajari oleh jaringan saraf. Berbekal semua artikel ini, Anda dapat menghasilkan visualisasi fitur dengan gaya berbeda, gambar berbeda, resolusi dan ukuran berbeda, dan mencoba memahami lapisan mana yang akan digunakan dengan bobot berapa. Namun bahkan menimbang ulang lapisan tersebut 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 perbedaan... ya, Anda mengerti. Tapi yang sebenarnya kami inginkan adalah kami menyukai gambar itu. Kombinasi cembung antara fungsi kehilangan konten dan gaya bukanlah ukuran dari apa yang dianggap indah oleh pikiran kita. Terlihat bahwa jika Anda melanjutkan stilisasi terlalu lama, fungsi biaya secara alami akan turun semakin rendah, namun keindahan estetika hasilnya menurun tajam.




Baiklah, ada satu masalah lagi. Katakanlah kita menemukan lapisan yang mengekstrak fitur yang kita perlukan. Katakanlah beberapa tekstur berbentuk segitiga. Namun lapisan ini juga mengandung banyak fitur lain, seperti lingkaran, yang sebenarnya tidak ingin kita lihat pada gambar yang dihasilkan. Secara umum, jika kita bisa mempekerjakan satu juta orang Cina, kita bisa memvisualisasikan semua fitur dari sebuah gambar gaya, dan dengan kekerasan, cukup tandai yang kita perlukan dan hanya sertakan mereka dalam fungsi biaya. Namun karena alasan yang jelas, hal ini tidak sesederhana itu. Namun bagaimana jika kita menghapus semua lingkaran yang tidak ingin kita lihat pada hasil gambar gaya? Maka aktivasi neuron terkait yang merespons lingkaran tidak akan berfungsi. Dan tentu saja, ini tidak akan muncul pada gambar yang dihasilkan. Sama halnya dengan bunga. Bayangkan gambar cerah dengan banyak warna. Sebaran warna akan sangat tersebar ke seluruh ruangan, dan sebaran gambar yang dihasilkan akan sama, namun dalam proses optimasi, puncak-puncak yang ada pada aslinya kemungkinan besar akan hilang. Ternyata mengurangi kedalaman bit palet warna saja sudah menyelesaikan masalah ini. Kepadatan distribusi sebagian besar warna akan mendekati nol, dan akan ada puncak yang besar di beberapa area. Jadi, dengan memanipulasi gambar 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. Hasilnya, para desainer dan manajer, yang dipersenjatai dengan Photoshop dan skrip untuk memvisualisasikan fitur, mencapai hasil tiga kali lebih cepat daripada apa yang dilakukan oleh ahli matematika dan pemrogram.


Contoh manipulasi warna dan ukuran fitur


Atau Anda bisa menggunakan gambar sederhana sebagai gaya



Hasil








Ini videonya, tapi hanya dengan tekstur yang tepat

Jaringan Tekstur: Sintesis Tekstur dan Gambar Bergaya Feed-forward (10 Mar 2016)

Tampaknya kita bisa berhenti di situ, jika bukan karena satu nuansa. Algoritme stilisasi di atas membutuhkan waktu yang sangat lama untuk diselesaikan. Jika kita mengambil implementasi yang menjalankan lbfgs pada CPU, prosesnya memakan waktu sekitar lima menit. Jika ditulis ulang agar optimasi masuk ke GPU, maka prosesnya akan memakan waktu 10-15 detik. Ini tidak bagus. Mungkin penulis artikel ini dan artikel berikutnya memikirkan hal yang sama. Kedua publikasi tersebut diterbitkan 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 hanya mengatur ulang Style Loss ke nol, inilah yang akan Anda dapatkan). Mereka mengusulkan untuk mengoptimalkan bukan gambar yang diperoleh dari white noise, tetapi beberapa jaringan saraf yang menghasilkan gambar bergaya.




Nah, jika proses styling tidak menyertakan optimasi apapun, Anda hanya perlu melakukan forward pass. Dan optimasi hanya diperlukan satu kali untuk melatih jaringan generator. Artikel ini menggunakan generator hierarki, di mana masing-masing berikutnya z ukurannya lebih besar dari yang sebelumnya dan diambil sampelnya dari noise dalam hal pembuatan tekstur, dan dari beberapa database gambar untuk melatih penata gaya. Sangat penting untuk menggunakan sesuatu selain bagian pelatihan dari imagenet, karena... fitur di dalam jaringan Kerugian dihitung oleh jaringan yang dilatih selama bagian pelatihan.



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

Sesuai dengan judulnya, penulis yang hanya terlambat 17 hari dengan ide jaringan generatif sedang berupaya meningkatkan resolusi gambar. Mereka rupanya terinspirasi oleh keberhasilan sisa pembelajaran pada imagenet terbaru.




Oleh karena itu, blok sisa dan blok konv.



Jadi, sekarang kami memiliki, selain kontrol atas gaya, generator yang cepat (berkat dua artikel ini, waktu pembuatan satu gambar diukur dalam puluhan ms).

Akhir

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



Menghasilkan sesuatu seperti ini.


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

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

Pertama, proyek ini dipublikasikan sebagai open source, dan kemudian layanan online yang dibuat berdasarkan prinsip yang sama muncul di Internet. Salah satu yang paling nyaman dan populer adalah Deep Dream Generator: memproses foto kecil di sini hanya membutuhkan waktu sekitar 15 detik (sebelumnya pengguna harus menunggu lebih dari satu jam).

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

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

Algoritma bermain catur misalnya menganalisis permainan catur. Dengan cara yang sama, algoritma AlphaGo dari Google DeepMind ke dalam permainan Go Cina - yang dianggap sebagai sebuah terobosan, karena Go jauh lebih kompleks dan non-linier daripada catur.

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

    Ada juga serangkaian gambar yang dapat dipahami di YouTube rol tentang cara kerja jaringan saraf.

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

Rupanya, bagian algoritmik dari layanan ini merupakan modifikasi dari program “Neural style” yang telah kita bahas.

Baru-baru ini, sebuah program telah muncul yang secara realistis mewarnai gambar hitam putih. Pada versi sebelumnya, program serupa melakukan tugasnya dengan kurang baik, dan merupakan pencapaian besar jika setidaknya 20% orang tidak dapat membedakan gambar asli dari gambar yang diwarnai oleh komputer.

Apalagi pewarnaan di sini hanya membutuhkan waktu sekitar 1 menit.

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

Layanan ini mungkin tampak seperti hiburan yang menyenangkan, namun kenyataannya semuanya jauh lebih menarik. Teknologi baru memasuki praktik seniman manusia dan mengubah pemahaman kita tentang seni. Kemungkinan besar manusia akan segera bersaing dengan mesin di bidang kreativitas.

Mengajarkan algoritma untuk mengenali gambar adalah tugas yang telah lama diperjuangkan oleh para pengembang kecerdasan buatan. Oleh karena itu, program yang mewarnai foto-foto lama dan menggambar anjing di langit dapat dianggap sebagai bagian dari proses yang lebih besar dan menarik.