Ini adalah implementasi Pytorch dari makalah ini merupakan algoritma saraf gaya artistik oleh Leon A. Gatys, Alexander S. Ecker, dan Matthias Bethge. Kode ini didasarkan pada gaya saraf Justin Johnson.
Makalah ini menyajikan algoritma untuk menggabungkan konten satu gambar dengan gaya gambar lain menggunakan jaringan saraf konvolusional. Inilah contoh yang memetakan gaya artistik malam berbintang ke foto malam hari kampus Stanford:
Menerapkan gaya gambar yang berbeda ke gambar konten yang sama memberikan hasil yang menarik. Di sini kami mereproduksi Gambar 2 dari kertas, yang membuat foto tubingen di Jerman dalam berbagai gaya:
Berikut adalah hasil dari menerapkan gaya berbagai karya seni pada foto jembatan Golden Gate ini:
Algoritma memungkinkan pengguna untuk menukar bobot relatif dari istilah rekonstruksi gaya dan konten, seperti yang ditunjukkan dalam contoh ini di mana kami port gaya potret diri Picasso 1907 ke Brad Pitt:
Dengan mengubah ukuran gambar gaya sebelum mengekstraksi fitur gaya, kita dapat mengontrol jenis fitur artistik yang ditransfer dari gambar gaya; Anda dapat mengontrol perilaku ini dengan bendera -style_scale . Di bawah ini kita melihat tiga contoh rendering jembatan Golden Gate dengan gaya malam berbintang. Dari kiri ke kanan, -style_scale adalah 2.0, 1.0, dan 0.5.
Anda dapat menggunakan lebih dari satu gambar gaya untuk memadukan banyak gaya artistik.
Searah jarum jam dari kiri atas: "The Starry Night" + "The Scream", "The Scream" + "Composition VII", "Duduk Nude" + "Komposisi VII", dan "Duduk Telanjang" + "Malam Berat" "
Saat menggunakan beberapa gambar gaya, Anda dapat mengontrol sejauh mana mereka dicampur:
Jika Anda menambahkan flag -original_colors 1 maka gambar output akan mempertahankan warna gambar asli.
Ketergantungan:
Ketergantungan opsional:
Setelah menginstal dependensi, Anda harus menjalankan skrip berikut untuk mengunduh model VGG:
python models/download_models.py
Ini akan mengunduh model VGG-19 asli. Model VGG-16 asli juga akan diunduh. Secara default model VGG-19 asli digunakan.
Jika Anda memiliki GPU memori yang lebih kecil maka menggunakan model NIN ImageNet akan lebih baik dan memberikan hasil yang sedikit lebih buruk namun sebanding. Anda bisa mendapatkan detail pada model dari BVLC Caffe Modelzoo. Model NIN diunduh saat Anda menjalankan skrip download_models.py .
Anda dapat menemukan instruksi instalasi terperinci untuk Ubuntu dan Windows di panduan instalasi.
Penggunaan Dasar:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
Penggunaan Cudnn dengan model NIN:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
Untuk menggunakan beberapa gambar gaya, lulus daftar yang dipisahkan koma seperti ini:
-style_image starry_night.jpg,the_scream.jpg .
Perhatikan bahwa jalur ke gambar tidak boleh berisi ~ karakter untuk mewakili direktori home Anda; Anda harus menggunakan jalur relatif atau jalur absolut penuh.
Opsi :
-image_size : Panjang sisi maksimum (dalam piksel) dari gambar yang dihasilkan. Default adalah 512.-style_blend_weights : Berat untuk memadukan gaya beberapa gambar gaya, sebagai daftar yang dipisahkan koma, seperti -style_blend_weights 3,7 . Secara default semua gambar gaya sama -sama tertimbang.-gpu : ID nol yang diindeks dari GPU untuk digunakan; Untuk mode CPU set -gpu ke c .Opsi Optimalisasi :
-content_weight : Berapa berat istilah rekonstruksi konten. Default adalah 5e0.-style_weight : Berapa berat istilah rekonstruksi gaya. Default adalah 1E2.-tv_weight : Berat total variasi-variasi (TV); Ini membantu memperlancar gambar. Default adalah 1E-3. Diatur ke 0 untuk menonaktifkan regularisasi TV.-num_iterations : Default adalah 1000.-init : Metode untuk menghasilkan gambar yang dihasilkan; salah satu random atau image . Default adalah random yang menggunakan inisialisasi noise seperti di kertas; image diinisialisasi dengan gambar konten.-init_image : Mengganti gambar inisialisasi dengan gambar yang ditentukan pengguna.-optimizer : algoritma optimasi untuk digunakan; baik lbfgs atau adam ; Default adalah lbfgs . L-BFG cenderung memberikan hasil yang lebih baik, tetapi menggunakan lebih banyak memori. Beralih ke Adam akan mengurangi penggunaan memori; Saat menggunakan Adam, Anda mungkin perlu bermain dengan parameter lain untuk mendapatkan hasil yang baik, terutama berat gaya, berat konten, dan tingkat pembelajaran.-learning_rate : Tingkat belajar untuk digunakan dengan Adam Optimizer. Default adalah 1e1.-normalize_gradients : Jika ada bendera ini, gradien gaya dan konten dari setiap lapisan akan dinormalisasi L1.Opsi Output :
-output_image : Nama gambar output. Default out.png .-print_iter : Cetak kemajuan setiap iterasi print_iter . Diatur ke 0 untuk menonaktifkan pencetakan.-save_iter : Simpan gambar setiap iterasi save_iter . Diatur ke 0 untuk menonaktifkan Hasil Menengah Menyimpan.Opsi Lapisan :
-content_layers : Daftar nama lapisan yang dipisahkan koma untuk digunakan untuk rekonstruksi konten. Default adalah relu4_2 .-style_layers : Daftar nama lapisan yang dipisahkan koma untuk digunakan untuk rekonstruksi gaya. Default adalah relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 .Opsi lain :
-style_scale : Skala untuk mengekstrak fitur dari gambar gaya. Default adalah 1.0.-original_colors : Jika Anda mengatur ini ke 1, maka gambar output akan menjaga warna gambar konten.-model_file : path ke file .pth untuk model VGG Caffe. Default adalah model VGG-19 asli; Anda juga dapat mencoba model VGG-16 asli.-pooling : Jenis Lapisan Pooling untuk Digunakan; salah satu max atau avg . Default adalah max . Model VGG-19 menggunakan lapisan pengumpulan maksimal, tetapi kertas menyebutkan bahwa mengganti lapisan ini dengan lapisan pengumpulan rata-rata dapat meningkatkan hasilnya. Saya belum bisa mendapatkan hasil yang baik menggunakan pengumpulan rata -rata, tetapi opsinya ada di sini.-seed : Nilai integer yang dapat Anda tentukan untuk hasil yang dapat diulang. Secara default nilai ini acak untuk setiap proses.-multidevice_strategy : Daftar indeks layer yang dipisahkan koma untuk membagi jaringan saat menggunakan beberapa perangkat. Lihat penskalaan multi-GPU untuk detail lebih lanjut.-backend : nn , cudnn , openmp , atau mkl . Default adalah nn . mkl membutuhkan backend MKL Intel.-cudnn_autotune : Saat menggunakan backend CUDNN, lewati bendera ini untuk menggunakan cudnn autotuner bawaan untuk memilih algoritma konvolusi terbaik untuk arsitektur Anda. Ini akan membuat iterasi pertama sedikit lebih lambat dan dapat mengambil sedikit lebih banyak memori, tetapi dapat secara signifikan mempercepat backend Cudnn. Masalah: Program kehabisan memori dan mati
Solusi: Cobalah mengurangi ukuran gambar: -image_size 256 (atau lebih rendah). Perhatikan bahwa ukuran gambar yang berbeda kemungkinan akan membutuhkan nilai non -default untuk -style_weight dan -content_weight untuk hasil yang optimal. Jika Anda menjalankan GPU, Anda juga dapat mencoba menjalankan dengan -backend cudnn untuk mengurangi penggunaan memori.
Masalah: -backend cudnn lebih lambat dari default NN Backend
Solusi: Tambahkan bendera -cudnn_autotune ; Ini akan menggunakan Autotuner CUDNN bawaan untuk memilih algoritma konvolusi terbaik.
Masalah: Dapatkan pesan kesalahan berikut:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
Solusi: Karena campuran dengan lokasi lapisan, model yang lebih lama membutuhkan perbaikan agar kompatibel dengan versi pytorch yang lebih baru. Skrip donwload_models.py yang disertakan akan secara otomatis melakukan perbaikan ini setelah mengunduh model.
Secara default, neural-style-pt menggunakan backend nn untuk konvolusi dan L-BFG untuk optimasi. Ini memberikan hasil yang baik, tetapi keduanya dapat menggunakan banyak memori. Anda dapat mengurangi penggunaan memori dengan yang berikut:
-backend cudnn untuk menggunakan backend cudnn. Ini hanya akan bekerja dalam mode GPU.-optimizer adam untuk menggunakan Adam, bukan L -BFGS. Ini harus secara signifikan mengurangi penggunaan memori, tetapi mungkin memerlukan penyetelan parameter lain untuk hasil yang baik; Secara khusus Anda harus bermain dengan tingkat pembelajaran, berat konten, dan berat gaya. Ini harus bekerja dalam mode CPU dan GPU.-image_size 256 untuk menghasilkan gambar pada setengah ukuran default.Dengan pengaturan default, neural-style-pt menggunakan sekitar 3,7 GB memori GPU pada sistem saya; Beralih ke Adam dan Cudnn mengurangi jejak memori GPU menjadi sekitar 1GB.
Kecepatan dapat bervariasi banyak tergantung pada backend dan pengoptimal. Berikut adalah beberapa kali untuk menjalankan 500 iterasi dengan -image_size=512 pada Tesla K80 dengan pengaturan yang berbeda:
-backend nn -optimizer lbfgs : 117 detik-backend nn -optimizer adam : 100 detik-backend cudnn -optimizer lbfgs : 124 detik-backend cudnn -optimizer adam : 107 detik-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 detik-backend cudnn -cudnn_autotune -optimizer adam : 91 detikBerikut adalah tolok ukur yang sama di GTX 1080:
-backend nn -optimizer lbfgs : 56 detik-backend nn -optimizer adam : 38 detik-backend cudnn -optimizer lbfgs : 40 detik-backend cudnn -optimizer adam : 40 detik-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 detik-backend cudnn -cudnn_autotune -optimizer adam : 24 detik Anda dapat menggunakan beberapa perangkat CPU dan GPU untuk memproses gambar pada resolusi yang lebih tinggi; Lapisan jaringan yang berbeda akan dihitung pada perangkat yang berbeda. Anda dapat mengontrol perangkat GPU dan CPU mana yang digunakan dengan bendera -gpu , dan Anda dapat mengontrol cara membagi lapisan di seluruh perangkat menggunakan flag -multidevice_strategy .
Misalnya di server dengan empat GPU, Anda dapat memberikan bendera -gpu 0,1,2,3 untuk diproses pada GPU 0, 1, 2, dan 3 dalam urutan itu; Dengan juga memberikan bendera -multidevice_strategy 3,6,12 Anda menunjukkan bahwa dua lapisan pertama harus dihitung pada GPU 0, lapisan 3 hingga 5 harus dihitung pada GPU 1, lapisan 6 hingga 11 harus dihitung pada GPU 2, dan lapisan yang tersisa harus dihitung pada GPU 3. Anda perlu menyetel -multidevice_strategy .
Kami dapat mencapai hasil yang sangat berkualitas tinggi pada resolusi tinggi dengan menggabungkan pemrosesan multi-GPU dengan generasi multiskala seperti yang dijelaskan dalam makalah yang mengendalikan faktor perseptual dalam transfer gaya saraf oleh Leon A. Gatys, Alexander S. Ecker, Matthias Bethge, Aaron Hertzmann dan Eli Shechtman.
Berikut adalah gambar 4016 x 2213 yang dihasilkan di server dengan delapan GPU Tesla K80:
Skrip yang digunakan untuk menghasilkan gambar ini dapat ditemukan di sini.
Gambar diinisialisasi dengan white noise dan dioptimalkan menggunakan L-BFGS.
Kami melakukan rekonstruksi gaya menggunakan conv1_1 , conv2_1 , conv3_1 , conv4_1 , dan conv5_1 lapisan dan rekonstruksi konten menggunakan lapisan conv4_2 . Seperti di koran, kerugian rekonstruksi lima gaya memiliki bobot yang sama.
Jika Anda menemukan kode ini berguna untuk penelitian Anda, silakan kutipnya menggunakan kutipan yang disediakan.