Repositori ini berisi implementasi resmi untuk makalah "InsertDiffusion: Visualisasi Objek Pelestarian Identitas melalui Arsitektur Difusi Bebas Pelatihan".
Implementasinya mendukung dua mode lari yang berbeda:
Selain itu, implementasinya menawarkan opsi untuk mewarnai gambar yang sudah ada atau yang dihasilkan. Jika tidak menggunakan gambar yang sudah diwarnai, hal ini secara drastis meningkatkan realisme.
Selanjutnya, lingkungan baru dapat dibuat dari awal (mode penggantian latar belakang) atau gambar yang sudah ada dapat digunakan dan diadaptasi.
Semua fitur tersedia dari main.py
CLI dan juga dapat diintegrasikan ke dalam proyek Anda sendiri. Untuk menggunakan CLI atau kode, diperlukan lingkungan dengan obor, Bantal, panda, transformator, dan diffuser.
Untuk menyisipkan gambar ke latar belakang yang baru dibuat, jalankan:
python main.py --image " <path to your image> " --background_prompt " <your prompt> "
Jadi misalnya:
python main.py --image " ./test_images/bikes/166.png " --background_prompt " a bicycle centered in frame in munich, 8k, red gemini, 50mm, f2.8, cinematic "
Daripada memberikan prompt secara langsung Anda dapat menggunakan fitur auto-prompting dengan memberikan informasi yang diperlukan. Untuk sepeda, Anda perlu memberikan lokasi yang diinginkan, indeks sepeda, dan jalur ke lembar data. Untuk mobil, Anda harus memberikan lokasi baru yang diinginkan, pabrikan mobil, dan jenis mobil. Untuk produk hanya diperlukan lokasi baru dan jenis produk.
Untuk opsi lebih lanjut dan penyisipan ke latar belakang tertentu, lihat dokumentasi CLI lengkap di bawah.
Daripada menggunakan CLI, Anda dapat mengintegrasikan prosedur ke dalam kode Anda dengan fungsi python ini (sekali lagi pastikan semua dependensi telah diinstal dan salin modul utils ke proyek Anda):
from utils import get_mask_from_image , sd_inpainting , sd_img2img , paste_image
def insert_diffusion ( image : Image , mask_threshold : int , prompt : str , negative_prompt : str , img2img_model : str , inpainting_model : str , img2img_strength : float , inpainting_steps : int , inpainting_guidance : float , img2img_guidance : float , background_image : Image = None , composition_strength : float = 1 ) -> Image :
mask = get_mask_from_image ( image , mask_threshold )
if background_image is not None :
image = paste_image ( image , background_image )
inpainted = sd_inpainting ( inpainting_model , image , mask , prompt , negative_prompt , inpainting_guidance , inpainting_steps , inpainting_strength = composition_strength )
result = sd_img2img ( img2img_model , inpainted , prompt , negative_prompt , img2img_strength , img2img_guidance )
return result
Kami menerapkan metode tambahan untuk menghasilkan gambar Bersepeda dari titik awan dan kemudian menyisipkannya ke latar belakang. Namun, metode ini tidak berfungsi dengan baik, dan oleh karena itu, tidak penting dalam penelitian kami . Pembangkitan dari point cloud diimplementasikan oleh Ioan-Daniel Craciun dan didasarkan pada DDPM/DDIM yang diterapkan dan dilatih oleh Jiajae Fan .
Untuk membuat gambar dari point cloud, hapus argumen --image
dari panggilan CLI Anda. Dalam mode titik Anda harus menyediakan jalur lembar data melalui --datasheet_path
. Dengan demikian, perintah CLI minimal menjadi:
python main.py --point --datasheet_path " <path to datasheet> " --background_prompt " <your prompt> "
Anda juga dapat menggunakan perintah otomatis dalam mode titik.
Untuk mengintegrasikan pembuatan sepeda dari point cloud ke dalam proyek Anda, salin folder utils dan gunakan fungsi berikut:
from utils import get_mask_and_background
from utils import inpaint as bike_inpainting
def bike_diffusion ( parameter_csv_path : str , device : torch . device , ckpt_id : str = '29000' , mask_dilation : int = 5 , mask_fill_holes : bool = True , bike_idx : int = 0 , wheel_design_type : int = 0 , width : int = 256 , height : int = 256 ):
assert wheel_design_type == 0 or wheel_design_type == 1
mask , background = get_mask_and_background ( parameter_csv_path , bike_idx , wheel_design_type , width , height )
bike_img = bike_inpainting ( background , mask , device , 50 , ckpt_id , mask_dilation , mask_fill_holes )
return bike_img . convert ( 'RGB' )
Gambar yang dikembalikan oleh fungsi ini siap digunakan untuk pewarnaan atau penyisipan.
Jika Anda menggunakan gambar yang tidak berwarna, tambahkan --colorize
ke salah satu panggilan CLI sebelumnya. Selain itu, Anda perlu memberikan perintah pewarnaan melalui --colorization_prompt
atau menggunakan perintah otomatis dengan memberikan warna melalui --color
.
Contoh panggilan CLI dapat berupa:
python main.py --image " ./test_images/bike_outline/168.png " --colorize --datasheet_path " ./csv/df_parameters_final.csv " --place " beach at sunset " --color " purple " --bike_idx 5 "
Alternatifnya, untuk mengintegrasikan pewarnaan ke dalam proyek Anda, salin modul utils dan gunakan:
from utils import sd_colorization
def colorization ( image : Image , colorization_model : str , upscaling_model : str , colorization_prompt : str , colorization_negative_prompt : str , fill_holes : bool , dilation : int , strength : float , prompt_guidance : float ):
colorized = sd_colorization ( colorization_model , upscaling_model , image , colorization_prompt , negative_prompt = colorization_negative_prompt , fill_holes = fill_holes , dilation_iterations = dilation , colorization_strength = strength , prompt_guidance = prompt_guidance )
return colorized
Catatan : CLI masih dalam pembangunan dan mungkin dapat berubah.
Catatan : Jika berlaku, nilai default mewakili parameter yang ditentukan dalam eksperimen kami. Namun nilai yang berbeda mungkin optimal tergantung pada kasus penggunaan spesifik.
argumen | jenis | keterangan |
---|---|---|
--gambar | rangkaian | jalur ke gambar untuk memulai, saling eksklusif dengan --points |
--poin | ketika poin digunakan, algoritme berjalan dalam mode point cloud dan menghasilkan garis besar sepeda dari point cloud terlebih dahulu, saling eksklusif dengan --image | |
--mask_ambang batas | ke dalam | untuk melukis, ambang batas untuk membedakan latar belakang putih dari latar depan berwarna |
--latar belakang_prompt | rangkaian | prompt untuk pembuatan latar belakang |
--negatif_prompt | rangkaian | prompt negatif untuk pembuatan latar belakang |
--latar belakang_gambar | rangkaian | string ke gambar latar belakang untuk digunakan sebagai titik awal, hanya relevan jika --kekuatan komposisi diatur ke nilai yang lebih kecil dari 1 |
--kekuatan_komposisi | mengambang | menentukan seberapa besar perubahan gambar latar titik awal, yang digunakan hanya --background_image yang disetel, rentang 0-1 |
--auto_bike_prompt | jika perintah yang disetel akan dibuat secara otomatis menggunakan templat untuk sepeda, memerlukan --place, --datasheet_path, dan --bike_idx untuk disetel | |
--auto_car_prompt | jika perintah yang disetel akan dibuat secara otomatis menggunakan templat untuk mobil, memerlukan --place, --car_manufacturer, dan --car_type untuk disetel | |
--produk_otomatis | jika perintah yang disetel akan secara otomatis dibuat menggunakan templat untuk produk, memerlukan --place, dan --product_type untuk disetel | |
--tempat | rangkaian | deskripsi lokasi dimana objek akan disisipkan, hanya digunakan jika salah satu template auto prompt digunakan |
--warna | rangkaian | jika menggunakan autoprompting, warna sepedanya apa |
--lembar data_jalur | rangkaian | jika menggunakan autoprompting untuk sepeda, jalur ke lembar data untuk pencarian jenis sepeda |
--bike_idx | ke dalam | jika menggunakan autoprompting untuk sepeda, indeks di lembar data untuk pencarian jenis sepeda |
--produsen_mobil | rangkaian | jika menggunakan autoprompting untuk mobil, pabrikan mobil tersebut misalnya BMW |
--tipe_mobil | rangkaian | jika menggunakan autoprompting untuk mobil, tipe mobil misal SUV atau X5 |
--tipe_produk | rangkaian | jika menggunakan autoprompting untuk produk, jenis produk misalnya lampu |
--inpainting_model | rangkaian | model mana yang akan digunakan untuk pembuatan latar belakang (huggingface id) |
--img2img_model | rangkaian | model mana yang akan digunakan untuk langkah redifusi (huggingface id) |
--img2img_kekuatan | mengambang | berapa banyak gambar asli yang terkena noise dalam rediffusi |
--inpainting_steps | ke dalam | berapa banyak langkah difusi yang harus dilakukan untuk pengecatan |
--inpainting_guidance | mengambang | berapa banyak panduan bebas pengklasifikasi untuk diterapkan dalam pengecatan |
--img2img_panduan | mengambang | berapa banyak panduan bebas pengklasifikasi untuk diterapkan dalam rediffusi |
--folder_keluaran | rangkaian | jalur ke folder tempat gambar keluaran harus disimpan |
--mewarnai | apakah akan mewarnai gambar sebelum melukis | |
--pewarnaan_model | rangkaian | model mana yang akan digunakan untuk pewarnaan (huggingface id) |
--peningkatan_model | rangkaian | model mana yang akan digunakan untuk peningkatan, diperlukan untuk pewarnaan (huggingface id) |
--pewarnaan_prompt | rangkaian | Prompt untuk pewarnaan, tidak perlu datasheet_path dan warna disediakan |
--pewarnaan_negatif_prompt | rangkaian | prompt negatif untuk pewarnaan |
--do_not_fill_holes | ganti pengisian lubang untuk masker pewarnaan, hanya relevan saat mewarnai | |
--pelebaran | ke dalam | berapa banyak untuk memperluas topeng untuk pewarnaan, hanya relevan saat mewarnai |
--pewarnaan_kekuatan | mengambang | berapa banyak difusi yang diterapkan untuk pewarnaan, hanya relevan saat mewarnai |
--pewarnaan_prompt_panduan | mengambang | berapa banyak panduan bebas pengklasifikasi yang harus diterapkan selama pewarnaan, hanya relevan saat mewarnai |
--skala | mengambang | berapa banyak untuk menurunkan atau meningkatkan sepeda, nilai yang lebih tinggi mengakibatkan sepeda mengambil lebih banyak ruang dalam bingkai, defaultnya adalah 1. |
--fraksi_turun | mengambang | posisi relatif y dari sepeda (tengah), nilai yang lebih tinggi menempatkan sepeda lebih dekat ke tepi bawah gambar, defaultnya adalah 0,5 (tengah) |
--fraksi_kanan | mengambang | posisi x relatif dari sepeda (tengah), nilai yang lebih tinggi menempatkan sepeda lebih dekat ke tepi kanan gambar, defaultnya adalah 0,5 (tengah) |
--ckpt_id | rangkaian | id pos pemeriksaan yang akan digunakan untuk pembuatan garis besar sepeda dari titik awan, hanya relevan dalam mode titik |
--bike_mask_dilatasi | ke dalam | berapa banyak untuk memperluas topeng yang dihasilkan dari titik awan, hanya relevan dalam mode titik |
--do_not_fill_bike_holes | apakah akan menerapkan pengisian lubang pada masker sepeda, hanya relevan dalam mode titik | |
--roda_desain | ke dalam | desain roda mana yang akan digunakan untuk pembuatan garis besar sepeda, saat ini hanya 0 dan 1 yang diterapkan, hanya relevan dalam mode titik |
Skrip tambahan interactive.py
menyediakan implementasi untuk menghasilkan gambar secara interaktif dengan cara Human-in-the-Loop. Artinya, pada setiap langkah, lima opsi dihasilkan secara paralel dan pengguna diminta untuk memilih opsi terbaik. Kemudian, hanya gambar terpilih saja yang digunakan untuk langkah selanjutnya.
Tidak ada argumen CLI tambahan yang diterima oleh skrip, pengguna akan diminta untuk membuat semua keputusan.
Untuk menjalankan dalam mode interaktif, jalankan:
python interactive.py
Kode evaluasi yang digunakan atau makalah kami dapat ditemukan di bawah ./evaluation
. Perhatikan bahwa metrik kuantitatif dihitung menggunakan perintah CLI berikut:
python evaluate.py --exp_name " <experiment name> " --gen_file_path " <path to generated images> " --ref_file_path " <path to reference files> " --masks_path " <only used for composition, path to masks> "
Metrik Evaluasi Manusia dan statistik inferensial dihitung menggunakan buku catatan yang disediakan.
Jika merasa karya kami bermanfaat dan ingin menggunakannya untuk penelitian atau proyek Anda, silakan mengutip makalah sebagai berikut:
@misc { 2407.10592 ,
Author = { Phillip Mueller and Jannik Wiese and Ioan Craciun and Lars Mikelsons } ,
Title = { InsertDiffusion: Identity Preserving Visualization of Objects through a Training-Free Diffusion Architecture } ,
Year = { 2024 } ,
Eprint = { arXiv:2407.10592 } ,
}