Kami merancang arsitektur baru yang dapat mendukung 10+ jenis kontrol dalam kondisi pembuatan teks-ke-gambar dan dapat menghasilkan gambar beresolusi tinggi yang secara visual sebanding dengan perjalanan tengah hari . Jaringan ini didasarkan pada arsitektur ControlNet asli, kami mengusulkan dua modul baru untuk: 1 Memperluas ControlNet asli untuk mendukung kondisi gambar yang berbeda menggunakan parameter jaringan yang sama. 2 Mendukung input beberapa kondisi tanpa meningkatkan beban komputasi, yang sangat penting bagi desainer yang ingin mengedit gambar secara detail, kondisi berbeda menggunakan encoder kondisi yang sama, tanpa menambahkan komputasi atau parameter tambahan. Kami melakukan eksperimen menyeluruh pada SDXL dan mencapai kinerja unggul baik dalam kemampuan kontrol dan skor estetika. Kami merilis metode dan modelnya ke komunitas open source agar semua orang dapat menikmatinya.
Jika dirasa bermanfaat, tolong beri saya bintang, Terima kasih banyak!!
Versi SDXL ProMax telah dirilis!!!, Selamat menikmati!!!
Saya mohon maaf karena pendapatan dan pengeluaran proyek sulit untuk diseimbangkan, sumber daya GPU dialihkan ke proyek lain yang lebih mungkin menguntungkan, pelatihan SD3 dihentikan sampai saya menemukan dukungan GPU yang cukup, saya akan berusaha sebaik mungkin untuk temukan GPU untuk melanjutkan pelatihan. Jika hal ini membuat Anda tidak nyaman, saya dengan tulus meminta maaf atas hal tersebut. Saya ingin mengucapkan terima kasih kepada semua orang yang menyukai proyek ini, dukungan Andalah yang membuat saya terus maju
Catatan: kami menempatkan model promax dengan akhiran promax di repo model pelukan yang sama, instruksi rinci akan ditambahkan nanti.
Contoh berikut menunjukkan dari resolusi 1M --> resolusi 9M
Gunakan pelatihan ember seperti novelai, dapat menghasilkan gambar resolusi tinggi dengan rasio aspek apa pun
Gunakan data berkualitas tinggi dalam jumlah besar (lebih dari 10.000.000 gambar), kumpulan data mencakup beragam situasi
Gunakan prompt yang diberi teks ulang seperti DALLE.3, gunakan CogVLM untuk menghasilkan deskripsi terperinci, kemampuan mengikuti prompt yang bagus
Gunakan banyak trik berguna selama pelatihan. Termasuk namun tidak terbatas pada augmentasi tanggal, kehilangan mutiple, multi resolusi
Gunakan parameter yang hampir sama dibandingkan dengan ControlNet asli. Tidak ada peningkatan nyata dalam parameter atau komputasi jaringan.
Mendukung 10+ kondisi kontrol, tidak ada penurunan kinerja yang jelas pada kondisi apa pun dibandingkan dengan pelatihan mandiri
Mendukung pembangkitan multi kondisi, fusi kondisi dipelajari selama pelatihan. Tidak perlu mengatur hyperparameter atau perintah desain.
Kompatibel dengan model SDXL sumber terbuka lainnya, seperti BluePencilXL, CounterfeitXL. Kompatibel dengan model Lora lainnya.
https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0
https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0
https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0
[07/06/2024] Rilis ControlNet++
dan model terlatih.
[07/06/2024] Rilis kode inferensi (kondisi tunggal & kondisi multi).
[13/07/2024] Rilis ProMax ControlNet++
dengan fungsi pengeditan lanjutan.
ControlNet++ untuk gradio
ControlNet++ untuk Comfyui
merilis kode pelatihan dan panduan pelatihan.
lepaskan kertas arxiv.
Salah satu model jaringan kontrol yang paling penting, kami menggunakan banyak trik dalam melatih model ini, sama baiknya dengan https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0, kinerja SOTA dalam kontrol pose. Untuk membuat model openpose mencapai performa terbaiknya, Anda harus mengganti fungsi draw_pose di paket controlnet_aux (comfyui memiliki paket controlnet_aux sendiri), lihat Skrip Inferensi untuk detailnya.
Salah satu model jaringan kontrol yang paling penting, canny adalah pelatihan campuran dengan lineart, anime lineart, mlsd. Kinerja yang kuat dalam menghadapi garis tipis apa pun, model adalah kunci untuk mengurangi tingkat deformitas, disarankan menggunakan garis tipis untuk menggambar ulang tangan/kaki.
Salah satu model jaringan kontrol yang paling penting, model coretan dapat mendukung lebar garis apa pun dan jenis garis apa pun. sama bagusnya dengan https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0, jadikan semua orang pelukis jiwa.
Catatan: gunakan kerangka pose untuk mengontrol pose manusia, gunakan garis tipis untuk menggambar detail tangan/kaki untuk menghindari kelainan bentuk
Catatan: gambar kedalaman berisi info detail, disarankan menggunakan kedalaman untuk latar belakang dan menggunakan kerangka pose untuk latar depan
Catatan: Coretan adalah model garis yang kuat, jika Anda ingin menggambar sesuatu dengan garis luar yang tidak tegas, Anda bisa menggunakannya. Openpose + Scribble memberi Anda lebih banyak kebebasan untuk menghasilkan gambar awal, lalu Anda dapat menggunakan garis tipis untuk mengedit detailnya.
Kami mengumpulkan sejumlah besar gambar berkualitas tinggi. Gambar-gambar tersebut disaring dan diberi anotasi secara serius, gambar-gambar tersebut mencakup berbagai subjek, termasuk fotografi, anime, alam, perjalanan tengah hari, dan sebagainya.
Kami mengusulkan dua modul baru di ControlNet++, masing-masing diberi nama Condition Transformer dan Control Encoder. Kami sedikit memodifikasi modul lama untuk meningkatkan kemampuan representasinya. Selain itu, kami mengusulkan strategi pelatihan terpadu untuk mewujudkan kontrol tunggal & multi dalam satu tahap.
Untuk setiap kondisi, kita tetapkan dengan id tipe kontrol, misalnya openpose--(1, 0, 0, 0, 0, 0), depth--(0, 1, 0, 0, 0, 0), kondisi multi akan seperti (openpose, depth) --(1, 1, 0, 0, 0, 0). Dalam Control Encoder, id tipe kontrol akan diubah menjadi embeddings tipe kontrol (menggunakan embeddings posisi sinusoidal), kemudian kita menggunakan satu lapisan linier untuk memproyeksikan embeddings tipe kontrol agar memiliki redup yang sama seiring waktu penyematan. Fitur jenis kontrol ditambahkan ke penyematan waktu untuk menunjukkan jenis kontrol yang berbeda, pengaturan sederhana ini dapat membantu ControlNet membedakan jenis kontrol yang berbeda karena penyematan waktu cenderung memiliki efek global pada seluruh jaringan. Tidak peduli kondisi tunggal atau multi kondisi, ada id tipe kontrol unik yang sesuai dengannya.
Kami memperluas ControlNet untuk mendukung beberapa input kontrol secara bersamaan menggunakan jaringan yang sama. Transformator kondisi digunakan untuk menggabungkan fitur kondisi gambar yang berbeda. Ada dua inovasi besar pada metode kami, pertama, kondisi berbeda berbagi encoder kondisi yang sama, yang menjadikan jaringan lebih sederhana dan ringan. ini berbeda dengan metode mainstream lainnya seperti T2I atau UniControlNet. Kedua, kita menambahkan lapisan trafo untuk menukar informasi gambar asli dan gambar kondisi, daripada menggunakan keluaran trafo secara langsung, kita menggunakannya untuk memprediksi bias kondisi terhadap fitur kondisi asli. Ini mirip dengan ResNet, dan secara eksperimental kami menemukan bahwa pengaturan ini jelas dapat meningkatkan kinerja jaringan.
Encoder kondisi asli ControlNet adalah tumpukan lapisan konv dan aktivasi Silu. Kami tidak mengubah arsitektur encoder, kami hanya meningkatkan saluran konv untuk mendapatkan encoder yang "gemuk". Hal ini jelas dapat meningkatkan kinerja jaringan. Alasannya adalah kami berbagi encoder yang sama untuk semua kondisi gambar, sehingga mengharuskan encoder tersebut memiliki kemampuan representasi yang lebih tinggi. Pengaturan asli akan baik untuk kondisi tunggal tetapi tidak sebaik untuk kondisi 10+. Perhatikan bahwa menggunakan pengaturan asli juga OK, hanya dengan sedikit mengorbankan kualitas gambar yang dihasilkan.
Pelatihan dengan Kondisi tunggal mungkin dibatasi oleh keragaman data. Misalnya, openpose mengharuskan Anda berlatih dengan gambar bersama orang dan mlsd mengharuskan Anda berlatih dengan gambar dengan garis, sehingga dapat memengaruhi performa saat menghasilkan objek tak terlihat. Selain itu, tingkat kesulitan dalam melatih kondisi yang berbeda juga berbeda-beda, sulit untuk menyatukan semua kondisi pada saat yang sama dan mencapai performa terbaik dari setiap kondisi. Terakhir, kita akan cenderung menggunakan dua atau lebih kondisi secara bersamaan, pelatihan multi kondisi akan membuat penggabungan kondisi yang berbeda menjadi lebih lancar dan meningkatkan ketahanan jaringan (karena kondisi tunggal mempelajari pengetahuan yang terbatas). Kami mengusulkan tahap pelatihan terpadu untuk mewujudkan konvergensi optimal kondisi tunggal dan fusi multi kondisi pada saat yang bersamaan.
ControlNet++ perlu meneruskan id tipe kontrol ke jaringan. Kontrol 10+ tersebut kita gabungkan menjadi 6 tipe kontrol, arti dari masing-masing tipe adalah sebagai berikut:
0 -- posisi terbuka
1 -- kedalaman
2 -- garis tebal (coretan/hed/softedge/ted-512)
3 -- garis tipis (cerdik/mlsd/lineart/animelineart/ted-1280)
4 -- biasa
5 -- segmen
Kami merekomendasikan versi python >= 3.8, Anda dapat mengatur lingkungan virtual menggunakan perintah berikut:
conda buat -n controlplus python=3.8 conda aktifkan controlplus instalasi pip -r persyaratan.txt
Anda mengunduh bobot model di https://huggingface.co/xinsir/controlnet-union-sdxl-1.0. Setiap rilis model baru akan dipasang di Huggingface, Anda dapat mengikuti https://huggingface.co/xinsir untuk mendapatkan info model terbaru.
Kami menyediakan skrip inferensi untuk setiap kondisi kontrol. Silakan merujuknya untuk lebih detail.
Terdapat beberapa perbedaan praproses, untuk mendapatkan performa kontrol openpose terbaik, lakukan hal berikut: Temukan util.py di paket controlnet_aux, ganti fungsi draw_bodypose dengan kode berikut
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ Menggambar keypoint dan anggota badan yang mewakili pose tubuh pada kanvas tertentu. Args: canvas (np.ndarray): Array numpy 3D mewakili kanvas (gambar) untuk menggambar titik kunci tubuh (Daftar[Titik Kunci]): Daftar objek Titik Kunci yang mewakili titik kunci tubuh yang akan digambar. np.ndarray: Array numpy 3D yang mewakili kanvas yang dimodifikasi dengan pose tubuh yang digambar. Catatan: Fungsi ini mengharapkan koordinat x dan y dari titik kunci dinormalisasi antara 0 dan 1. """ H, W, C = kanvas. membentuk jika maks(W, H) < 500: rasio = 1,0 elif maks(W, H) >= 500 dan maks(W, H) < 1000: rasio = 2,0 elif maks(W, H) >= 1000 dan maks(W , H) < 2000: rasio = 3,0 elif max(W, H) >= 2000 dan max(W, H) < 3000: rasio = 4.0 elif max(W, H) >= 3000 dan max(W, H) < 4000: rasio = 5.0 elif max(W, H) >= 4000 dan max(W, H) < 5000: rasio = 6.0 lain: rasio = 7.0 stickwidth = 4 limbSeq = [ [2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], [1, 16], [16, 18], ] warna = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0 ], [0, 255, 0], [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85 , 0, 255], [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] untuk (k1_index, k2_index), warna dalam zip(limbSeq, warna): keypoint1 = titik kunci[k1_index - 1] titik kunci2 = titik kunci[k2_index - 1] jika keypoint1 Tidak Ada atau keypoint2 Tidak Ada: lanjutkan Y = np.array([keypoint1.x, keypoint2.x]) * float(W) X = np.array([keypoint1.y, keypoint2.y]) * float(H ) mX = np.mean(X) mY = np.mean(Y) panjang = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0,5 sudut = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) poligon = cv2.ellipse2Poly((int(mY), int(mX)), (int(panjang / 2), int(stickwidth * rasio)), int(sudut), 0, 360, 1) cv2.fillConvexPoly(kanvas, poligon, [int(float(c) * 0.6) untuk c dalam warna]) untuk titik kunci, warna dalam zip(titik kunci, warna): jika titik kunci adalah Tidak Ada: lanjutkan x, y = keypoint.x, keypoint.y x = int( x * W) y = int(y * H) cv2.circle(kanvas, (int(x), int(y)), int(4 * rasio), warna, ketebalan=-1) kembalikan kanvas
Untuk inferensi kondisi tunggal, Anda harus memberikan prompt dan gambar kontrol, mengubah baris yang sesuai dalam file python.
python controlnet_union_test_openpose.py
Untuk inferensi multi kondisi, Anda harus memastikan input image_list Anda kompatibel dengan control_type Anda, misalnya, jika Anda ingin menggunakan openpose dan kontrol kedalaman, image_list --> [controlnet_img_pose, controlnet_img_ depth, 0, 0, 0, 0], control_type -- > [1, 1, 0, 0, 0, 0]. Lihat controlnet_union_test_multi_control.py untuk detail lebih lanjut.
Secara teori, Anda tidak perlu mengatur skala kondisi untuk kondisi yang berbeda, jaringan dirancang dan dilatih untuk menggabungkan kondisi yang berbeda secara alami. Pengaturan default adalah 1.0 untuk setiap input kondisi, dan sama dengan pelatihan multi kondisi. Namun, jika Anda ingin meningkatkan pengaruh untuk beberapa kondisi masukan tertentu, Anda dapat menyesuaikan skala kondisi di Modul Transformator Kondisi. Dalam modul tersebut, kondisi masukan akan ditambahkan pada fitur gambar sumber beserta prediksi biasnya. mengalikannya dengan skala tertentu akan berdampak banyak (tetapi mungkin menimbulkan hasil yang tidak diketahui).
python controlnet_union_test_multi_control.py