Ini adalah kode sumber dan model terlatih untuk demo webcam pix2pix yang saya posting baru-baru ini di twitter dan vimeo. Ini menggunakan pembelajaran mendalam, atau untuk memasukkan beberapa kata kunci: autoencoder jaringan permusuhan generatif bersyarat konvolusional yang dalam .
video 1
video 2
Kode dalam repo khusus ini sebenarnya tidak ada hubungannya dengan pix2pix, GAN, atau bahkan pembelajaran mendalam. Ini hanya memuat model tensorflow yang telah dilatih sebelumnya (selama model tersebut mematuhi beberapa batasan), memberinya masukan webcam yang telah diproses, dan menampilkan keluaran model. Kebetulan model yang saya latih dan gunakan adalah pix2pix (detailnya di bawah).
Yaitu Langkah-langkahnya dapat diringkas sebagai:
Saya mengambil koleksi seni dari seluruh dunia dari Proyek Seni Google di wikimedia. Banyak gambar yang merupakan potret klasik pria kulit putih kaya, jadi saya hanya menggunakan sekitar 150 koleksi, berusaha menjaga datanya seberagam mungkin secara geografis dan budaya (daftar lengkap yang saya gunakan ada di sini). Namun datanya masih sangat euro-centric, karena mungkin terdapat ratusan atau ribuan pindaian dari satu museum Eropa, namun hanya 8 pindaian dari museum Arab.
Saya mengunduh gambar versi 300px, dan menjalankan proses batch ke:
Saya juga menjalankan proses batch untuk mengambil banyak potongan dari gambar (bukan mengubah ukuran yang tidak seragam) tetapi saya belum melatihnya. Alih-alih melakukan deteksi tepi yang cerdik, saya juga mulai mencari 'Deteksi Tepi Bersarang Holistik' (alias HED) yang jauh lebih baik oleh Xie dan Tu (seperti yang digunakan oleh makalah pix2pix asli), namun belum melatihnya juga.
Hal ini dilakukan oleh skrip preprocess.py (maaf tidak ada argumen baris perintah, edit skrip untuk mengubah jalur dan pengaturan, seharusnya cukup jelas).
Contoh kecil data pelatihan - termasuk prediksi model yang dilatih - dapat dilihat di sini. Kolom paling kanan adalah gambar asli, kolom paling kiri adalah versi praproses. Kedua gambar ini dimasukkan ke dalam jaringan pix2pix sebagai 'pasangan' untuk dilatih. Kolom tengah adalah kolom yang dipelajari model untuk dihasilkan hanya dengan kolom paling kiri saja . (Gambar menunjukkan setiap iterasi pelatihan - yaitu angka di sebelah kiri, yang berkisar dari 20.000 menjadi 58.000, sehingga secara bertahap akan semakin baik semakin jauh Anda menelusuri halaman).
Saya juga melatih GAN tanpa syarat (yaitu DCGAN normal pada data pelatihan yang sama. Contoh keluarannya dapat dilihat di bawah. (Ini menghasilkan gambar 'sepenuhnya acak' yang menyerupai data pelatihan).
Pelatihan dan arsitekturnya adalah ' Penerjemahan Gambar-ke-Gambar dengan Jaring Adversarial Bersyarat ' oleh Isola dkk (alias pix2pix). Saya berlatih dengan port tensorflow oleh @affinelayer (Christopher Hesse), yang juga mendukung demo 'sketch-to-cat'- yang menjadi viral baru-baru ini. Dia juga menulis tutorial bagus tentang cara kerja pix2pix. Terima kasih yang tak terhingga kepada penulis (dan semua orang yang mengembangkannya) karena telah membuat kode mereka menjadi sumber terbuka!
Saya hanya membuat satu perubahan kecil pada kode pelatihan tensorflow-pix2pix, yaitu menambahkan tf.Identity ke input dan output generator dengan nama yang dapat dibaca manusia, sehingga saya dapat memasukkan dan mengambil tensor dengan mudah. Jadi jika Anda ingin menggunakan model Anda sendiri dengan aplikasi ini, Anda perlu melakukan hal yang sama . (Atau catat nama tensor input/output, dan ubah json sesuai dengan itu, selengkapnya di bawah).
Anda dapat mengunduh model saya yang telah dilatih sebelumnya dari tab Rilis.
Apa yang dilakukan aplikasi khusus ini adalah memuat model yang telah dilatih sebelumnya, melakukan prapemrosesan langsung pada input webcam, dan memasukkannya ke model. Saya melakukan preprocessing dengan visi komputer dasar kuno, menggunakan opencv. Ini sangat minim dan mendasar. Anda dapat melihat GUI di bawah (GUI menggunakan pyqtgraph).
Adegan yang berbeda memerlukan pengaturan yang berbeda.
Misalnya untuk 'live action' menurut saya cerdik memberikan hasil (IMHO) yang lebih baik, dan itulah yang saya gunakan di video pertama di atas. Ambang batas (canny_t1, canny_t2) bergantung pada pemandangan, jumlah detail, dan tampilan yang diinginkan.
Jika Anda memiliki banyak noise pada gambar Anda, Anda mungkin ingin menambahkan sedikit pre_blur atau pre_median . Atau bermainlah dengan mereka untuk 'efek artistik'. Misalnya di video pertama, sekitar 1:05-1:40, saya menambahkan satu ton median (nilai sekitar 30-50).
Untuk menggambar adegan (misalnya video kedua) saya menemukan ambang adaptif memberikan hasil yang lebih menarik daripada canny (yaitu menonaktifkan canny dan mengaktifkan ambang adaptif), meskipun Anda mungkin tidak setuju.
Untuk masukan yang benar-benar statis (yaitu jika Anda menghentikan pengambilan gambar, menonaktifkan pembaruan kamera) keluarannya kemungkinan akan berkedip dalam jumlah yang sangat kecil karena model membuat prediksi yang berbeda untuk masukan yang sama - meskipun hal ini biasanya tidak terlalu kentara. Namun untuk umpan kamera langsung , noise pada input kemungkinan besar akan menghasilkan banyak kedipan pada output, terutama karena tingginya kerentanan ambang batas adaptif atau cerdik terhadap noise, sehingga beberapa keburaman sementara dapat membantu.
accum_w1 dan accum_w2 adalah untuk mengaburkan input sementara, sebelum masuk ke model: new_image = old_image * w1 + new_image * w2 (jadi idealnya jumlahnya harus sama - atau mendekati).
Prediction.pre_time_lerp dan post_time_lerp juga melakukan pemulusan temporal: new_image = old_image * xxx_lerp + new_image * (1 - xxx_lerp) pre_time_lerp sebelum masuk ke model, dan post_time_lerp setelah keluar dari model.
Nol untuk keburaman temporal mana pun akan menonaktifkannya. Nilainya tergantung selera Anda. Untuk kedua video di atas saya mengatur semua pre_model blur (yaitu accum_w1, accum_w2 dan pre_time_lerp) ke nol, dan memutar dengan pengaturan post_time_lerp yang berbeda mulai dari 0,0 (sangat berkedip dan berkedip) hingga 0,9 (sangat lambat dan pudar dan 'melamun' ). Biasanya sekitar 0,5-0,8 adalah kisaran favorit saya.
Jika Anda ingin menggunakan model lain, Anda perlu menyiapkan file JSON seperti di bawah ini. Motivasinya di sini adalah saya sebenarnya memiliki banyak JSON di folder aplikasi/model yang dapat saya pindai dan muat ulang secara dinamis, dan data model disimpan di tempat lain di disk lain, dan aplikasi dapat memuat dan bertukar antar model saat runtime dan skala input/output dll secara otomatis.
{
"name" : "gart_canny_256", # name of the model (for GUI)
"ckpt_path" : "./models/gart_canny_256", # path to saved model (meta + checkpoints). Loads latest if points to a folder, otherwise loads specific checkpoint
"input" : { # info for input tensor
"shape" : [256, 256, 3], # expected shape (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # expected range of values
"opname" : "generator/generator_inputs" # name of tensor (':0' is appended in code)
},
"output" : { # info for output tensor
"shape" : [256, 256, 3], # shape that is output (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # value range that is output
"opname" : "generator/generator_outputs" # name of tensor (':0' is appended in code)
}
}
Diuji hanya pada Ubuntu 16.04, tetapi dapat berfungsi pada platform lain.
Saya menggunakan distribusi python Anaconda yang dilengkapi dengan hampir semua yang Anda butuhkan, (mudah-mudahan) sesederhana:
Unduh dan instal anaconda dari https://www.continuum.io/downloads
Instal tensorflow https://www.tensorflow.org/install/ (Yang mana - jika Anda memiliki anaconda - seringkali cukup mudah karena sebagian besar dependensi disertakan)
Instal opencv dan pyqtgraph
conda install -c menpo opencv3 conda install pyqtgraph
Terima kasih yang tak terhingga sekali lagi kepada