DeOldify: program untuk mewarnai gambar hitam dan putih

Singkatnya, tugas proyek ini adalah mewarnai dan mengembalikan foto-foto lama. Saya akan membahas lebih detail, tetapi pertama-tama, mari kita lihat foto-fotonya! Ngomong-ngomong, sebagian besar sumber gambar diambil dari subreddit r / TheWayWeWere, saya berterima kasih kepada semua orang atas bidikan besar yang sangat tinggi.

Ini hanya beberapa contoh, dan mereka cukup khas!

Maria Anderson sebagai Peri Kecil dan Page Lyubov Ryabtsova di balet Sleeping Beauty di Imperial Theatre, St. Petersburg, Rusia, 1890



Seorang wanita bersantai di ruang tamunya (1920, Swedia)



Mahasiswa kedokteran berpose di dekat mayat, sekitar tahun 1890



Surfer di Hawaii, 1890



Spinning Horse, 1898



Interior bar Miller dan Shoemaker, 1899



Paris pada tahun 1880-an



Edinburgh menampilkan udara di tahun 1920-an



Wanita Texas pada tahun 1938



Orang-orang di Stasiun Waterloo menonton TV untuk pertama kalinya, London, 1936



Pelajaran geografi pada tahun 1850



Perokok opium Cina pada tahun 1880



Harap perhatikan bahwa foto yang benar-benar tua dan / atau buruk masih terlihat keren:

Deadwood, South Dakota, 1877



Saudara dan saudari pada tahun 1877 (Deadwood)



Portsmouth Square di San Francisco, 1851



Samurai, sekitar tahun 1860-an



Tentu saja, modelnya tidak sempurna. Tangan merah ini membuatku gila, tetapi selain itu ia bekerja dengan fantastis:

Seneca Iroquois Girl, 1908



Dia juga bisa mewarnai gambar hitam dan putih:



Rincian teknis


Ini adalah model pembelajaran yang mendalam. Secara khusus, saya menggabungkan pendekatan berikut:

  • Self-Attention GAN . Satu-satunya hal adalah Unet yang dilatih sebelumnya digunakan sebagai generator dan saya hanya mengubahnya untuk normalisasi spektral dan, pada kenyataannya, mekanisme Self-Attention. Ini adalah modifikasi yang cukup sederhana. Saya akan memberi tahu Anda bahwa perbedaannya mencolok dibandingkan dengan versi Wasserstein GAN sebelumnya, yang saya coba lakukan. Saya menyukai teori Wasserstein GAN, tetapi dalam praktiknya tidak berhasil. Tapi saya hanya jatuh cinta dengan jaringan Self-Attention GAN.
  • Struktur pembelajaran seperti pertumbuhan progresif GAN (tetapi tidak persis sama). Perbedaannya adalah bahwa jumlah layer tetap konstan: Saya baru saja mengubah ukuran data input dan menyesuaikan kecepatan belajar sehingga transisi antara ukuran berhasil. Tampaknya menghasilkan hasil akhir yang sama, tetapi belajar lebih cepat, lebih stabil dan melakukan generalisasi dengan lebih baik.
  • Aturan TTUR ( Aturan Perbaruan Dua Skala Waktu). Ini cukup jelas: iterasi satu-ke-satu dari generator / pembeda (kritik) dan kecepatan belajar pembeda yang lebih tinggi.
  • Fungsi kehilangan generator terdiri dari dua bagian: salah satunya adalah fungsi utama dari Perseptual Loss (atau Feature Loss) berdasarkan VGG16 - itu hanya mendorong model generator untuk mereplikasi gambar input. Bagian kedua adalah estimasi kerugian dari diskriminator (kritik). Untuk yang penasaran: hanya fungsi Perseptual Loss tidak cukup untuk hasil yang baik. Itu cenderung hanya mendorong sekelompok coklat / hijau / biru - Anda tahu, dengan menipu tes, apa yang benar-benar bagus di jaringan saraf! Poin utama adalah bahwa GAN sendiri pada dasarnya mempelajari fungsi kerugian untuk Anda, yang sebenarnya merupakan langkah besar menuju cita-cita yang kami perjuangkan dalam pembelajaran mesin. Dan tentu saja, hasilnya akan meningkat secara signifikan ketika mesin itu sendiri mempelajari apa yang sebelumnya Anda disandikan secara manual. Tentu saja, ini yang terjadi di sini.

Keindahan model ini adalah cukup baik dalam berbagai modifikasi gambar. Apa yang Anda lihat di atas adalah hasil dari model pewarnaan, tetapi ini hanya satu komponen dalam pipa yang ingin saya kembangkan dengan model yang sama.

Selanjutnya, saya akan mencoba untuk menyempurnakan gambar-gambar lama, dan item berikutnya dalam agenda adalah model untuk meningkatkan saturasi dan kekayaan (defade). Sekarang dia berada di tahap awal pelatihan. Ini pada dasarnya model yang sama, tetapi dengan beberapa pengaturan kontras / kecerahan sebagai simulasi foto pudar dan gambar yang diambil dengan peralatan tua / buruk. Saya sudah menerima beberapa hasil yang menggembirakan:



Detail Proyek


Apa inti dari proyek ini? Saya hanya ingin menerapkan GAN sehingga foto-foto lama terlihat sangat, sangat bagus. Dan yang lebih penting, itu akan membuat proyek bermanfaat . Dan ya, saya benar-benar tertarik untuk bekerja dengan video tersebut, tetapi pertama-tama saya harus mencari cara untuk mengendalikan model ini dari konsumsi memori (ini adalah binatang yang nyata). Akan lebih baik jika model tidak belajar dari dua hingga tiga hari pada 1080Ti (sayangnya, khas untuk GAN). Meskipun ini adalah anak saya dan saya akan secara aktif memperbarui dan meningkatkan kode di masa mendatang, tetapi saya akan mencoba membuat program semudah mungkin bagi pengguna, meskipun mungkin akan ada beberapa kesulitan dengan itu.

Dan saya bersumpah akan mendokumentasikan kode dengan benar ... suatu hari nanti. Diakui, saya adalah salah satu dari orang-orang yang percaya pada "kode dokumentasi diri" (LOL).

Model Peluncuran Diri


Proyek ini dibangun di perpustakaan Fast.AI. Sayangnya, ini adalah versi lama, dan masih harus diperbarui ke yang baru (ini jelas ada di agenda). Jadi, prasyarat, singkatnya:

  • Perpustakaan lama Fast.AI. Setelah mengubur diri saya di proyek selama dua bulan, saya sedikit merindukan apa yang terjadi padanya, karena yang sekarang ditandai sebagai "tua" tidak benar-benar terlihat seperti yang saya miliki. Semuanya telah berubah dalam dua bulan terakhir. Karena itu, jika tidak ada yang berfungsi dengan versi lain, saya bercabang di sini . Sekali lagi, memperbarui ke versi terbaru ada di agenda, saya minta maaf sebelumnya.
  • Semua dependensi Fast.AI : ada file requirement.txt dan environment.yml yang nyaman di sana.
  • Pytorch 0.4.1 (spectral_norm diperlukan, jadi Anda memerlukan rilis stabil terbaru).
  • JupyterLab .
  • Tensorboard (mis. Memasang Tensorflow) dan TensorboardX . Saya pikir ini tidak sepenuhnya diperlukan, tetapi jauh lebih mudah. Untuk kenyamanan Anda, saya telah memberikan semua kait / panggilan balik yang diperlukan di Tensorboard! Ada beberapa contoh penggunaannya. Patut dicatat bahwa secara default, gambar selama pemrosesan direkam dalam Tensorboard setiap 200 iterasi, sehingga Anda akan mendapatkan pandangan yang konstan dan nyaman tentang apa yang dilakukan model.
  • ImageNet : Kumpulan data yang sangat baik untuk pelatihan.
  • Kartu grafis yang kuat . Saya benar-benar ingin memiliki memori lebih dari 11 GB di GeForce 1080Ti saya. Jika Anda memiliki sesuatu yang lebih lemah, itu akan sulit. Unet dan Critic sangat luar biasa, tetapi semakin besar, semakin baik hasilnya.

Jika Anda ingin memulai pemrosesan gambar sendiri sekarang tanpa melatih modelnya, Anda dapat mengunduh bobot siap pakai di sini . Kemudian buka ColorizationVisualization.ipynb di JupyterLab. Pastikan ada garis dengan tautan ke bobot:

colorizer_path = Path('/path/to/colorizer_gen_192.h5') 

Maka Anda perlu memuat model colorizer setelah netG diinisialisasi:

 load_model(netG, colorizer_path) 

Kemudian cukup letakkan gambar apa saja di folder / test_images /, dari mana Anda memulai program. Anda dapat memvisualisasikan hasil di Jupyter Notebook dengan baris berikut:

 vis.plot_transformed_image("test_images/derp.jpg", netG, md.val_ds, tfms=x_tfms, sz=500) 

Saya akan menghemat ukuran sekitar 500px, plus atau minus, jika Anda menjalankan program pada GPU dengan banyak memori (misalnya, GeForce 1080Ti 11 GB). Jika memori kurang, maka Anda harus mengurangi ukuran gambar atau mencoba menjalankannya pada CPU. Saya benar-benar mencoba melakukan yang terakhir, tetapi karena suatu alasan model itu bekerja dengan sangat lambat, bukan kepalang, dan saya tidak punya waktu untuk menyelidiki masalahnya. Penikmat merekomendasikan membangun Pytorch dari sumber, maka peningkatan kinerja yang besar akan terjadi. Hmm ... Pada saat itu bukan sebelum itu.

Informasi tambahan


Visualisasi gambar yang dihasilkan seperti yang Anda pelajari juga dapat dilakukan di Jupyter: Anda hanya perlu mengaturnya menjadi true ketika membuat instance kait penglihatan ini:

GANVisualizationHook(TENSORBOARD_PATH, trainer, 'trainer', jupyter=True, visual_iters=100

Saya lebih suka meninggalkan false dan hanya menggunakan Tensorboard. Percayalah, Anda juga ingin melakukan hal itu. Juga, jika Anda membiarkannya bekerja terlalu lama, Jupyter akan memakan banyak memori dengan gambar seperti itu.

Bobot model juga disimpan secara otomatis selama pelatihan GANTrainer berjalan. Secara default, mereka disimpan setiap 1000 iterasi (ini adalah operasi yang mahal). Mereka disimpan di folder root yang Anda tentukan untuk pelatihan, dan namanya sesuai dengan save_base_name yang ditentukan dalam jadwal pelatihan. Bobot disimpan secara terpisah untuk setiap ukuran latihan.

Saya akan merekomendasikan menavigasi kode dari atas ke bawah, dimulai dengan Notebook Jupyter. Saya membuat catatan ini hanya sebagai antarmuka yang mudah digunakan untuk membuat prototipe dan visualisasi, semua yang lain akan menuju ke file .py segera setelah saya menemukan tempat untuk mereka. Saya sudah memiliki contoh visualisasi yang dapat Anda aktifkan dengan mudah dan lihat: cukup buka xVisualisasi di Notebook, itu menunjukkan gambar uji yang termasuk dalam proyek (mereka berada di test_images).

Jika Anda melihat Jadwal GAN, maka ini adalah hal yang paling jelek dalam proyek, hanya versi saya dari implementasi GAN pembelajaran progresif, cocok untuk generator Unet.

Bobot pra-dilatih untuk generator colorizer juga ada di sini . Proyek DeFade masih bekerja, saya akan mencoba mengeluarkan bobot yang baik dalam beberapa hari.

Biasanya selama pelatihan Anda akan melihat hasil baik pertama setengah, yaitu, dengan ukuran 192px (jika Anda menggunakan contoh pelatihan yang disediakan).

Saya yakin saya mengacau di suatu tempat, jadi tolong beri tahu saya jika ini benar.

Masalah yang Diketahui


  • Anda harus bermain sedikit dengan ukuran gambar untuk mendapatkan hasil terbaik. Model ini jelas menderita beberapa aspek rasio dan rasio aspek saat menghasilkan gambar. Dulu jauh lebih buruk, tetapi situasinya membaik secara signifikan dengan peningkatan pencahayaan / kontras dan pengenalan pembelajaran progresif. Saya ingin sepenuhnya menghilangkan masalah ini dan fokus pada hal itu, tetapi sejauh ini jangan putus asa jika gambar terlihat terlalu jenuh atau dengan gangguan aneh. Kemungkinan besar, semuanya akan menjadi normal setelah mengubah ukuran kecil. Sebagai aturan, untuk gambar yang terlalu jenuh Anda perlu memperbesar ukuran.
  • Selain hal di atas: mendapatkan gambar terbaik benar-benar turun ke seni memilih parameter yang optimal . Ya, hasilnya dipilih secara manual. Saya sangat senang dengan kualitasnya, dan modelnya bekerja dengan cukup andal, tetapi tidak sempurna. Proyek ini masih berlangsung! Saya pikir alat ini dapat digunakan sebagai "artis AI", tetapi belum siap untuk masyarakat umum. Hanya bukan waktunya.
  • Untuk memperumit situasi: saat ini model secara brutal memakan memori , jadi pada kartu 1080Ti saya ternyata memproses gambar dengan maksimum 500-600px. Saya yakin ada banyak opsi pengoptimalan di sini, tetapi saya belum melakukannya.
  • Saya menambahkan zero padding ke generator Unet untuk apa pun yang tidak sesuai dengan ukuran yang diharapkan (itulah cara saya dapat memuat gambar dengan ukuran sewenang-wenang). Itu peretasan yang sangat cepat, dan mengarah ke batas kanan dan bawah yang bodoh pada hasil gambar uji ukuran sewenang-wenang. Saya yakin ada cara yang lebih baik, tetapi belum menemukannya.
  • Model suka pakaian biru. Tidak yakin mengapa, solusinya ada dalam pencarian!

Ingin lebih?


Saya akan memposting hasil baru di Twitter .

Tambahan dari penerjemah.
Dari yang terakhir di Twitter:

Perwakilan kebangsaan sendiri di ruang istirahat mereka, 1880


( asli )

Pembangunan London Underground, 1860


( asli )

Daerah kumuh Baltimore, 1938



Gym di Titanic, 1912


( asli )

Source: https://habr.com/ru/post/id428818/


All Articles