ที่เก็บนี้ให้รหัสการสอนที่ง่ายที่สุดสำหรับนักพัฒนาโดยใช้ ControlNet ด้วย basemodel ในเฟรมเวิร์ก diffuser แทน webui งานของเราสร้างขึ้นอย่างมากในผลงานที่ยอดเยี่ยมอื่น ๆ แม้ว่างานเหล่านี้จะพยายามทำบางอย่าง แต่ก็ไม่มีการสอนสำหรับการสนับสนุนการควบคุมที่หลากหลายใน diffusers

นอกจากนี้เรายังสนับสนุน t2i-adapter-for-diffusers, lora-for-diffusers อย่าตั้งใจจะให้ดาราแก่เราถ้ามันเป็นเรื่องที่ดีสำหรับคุณ
เป้าหมายของเราคือการแทนที่ basemodel ของ Controlnet และอนุมานในกรอบการกระจาย ControlNet ดั้งเดิมได้รับการฝึกฝนใน pytorch_lightning และน้ำหนักที่ปล่อยออกมามีเพียงความเสถียร diffusion-1.5 เป็น basemodel อย่างไรก็ตามมันมีความยืดหยุ่นมากขึ้นสำหรับผู้ใช้ที่จะนำ basemodel ของตัวเองมาใช้แทน SD-1.5 ตอนนี้ลองใช้อะไร -v3 เป็นตัวอย่าง เราจะแสดงวิธีการบรรลุเป้าหมายนี้ (Controlnet-anythingv3) ทีละขั้นตอน เราให้การสาธิต colab แต่ใช้ได้เฉพาะกับผู้ใช้ Colab Pro ที่มี RAM ขนาดใหญ่ขึ้นเท่านั้น
โชคดีที่ ControlNet ได้จัดทำแนวทางในการถ่ายโอน ControlNet ไปยังโมเดลชุมชนอื่น ๆ แล้ว ตรรกะที่อยู่ด้านหลังนั้นอยู่ด้านล่างซึ่งเรารักษาน้ำหนักการควบคุมที่เพิ่มขึ้นและแทนที่ basemodel เท่านั้น โปรดทราบว่าสิ่งนี้อาจไม่ได้ผลเสมอไปเนื่องจาก Controlnet อาจมีน้ำหนักรถไฟฟ้าใน Basemodel
NewBaseModel-ControlHint = NewBaseModel + OriginalBaseModel-ControlHint - OriginalBaseModelก่อนอื่นเราโคลน repo นี้จาก Controlnet
git clone https://github.com/lllyasviel/ControlNet.git
cd ControlNetจากนั้นเราต้องเตรียมน้ำหนักที่ต้องการสำหรับ OriginalBaseModel (PATH_SD15), OriginalBaseModel-Controlhint (PATH_SD15_WITH_CONTROL), NewBaseModel (PATH_INPUT) คุณจะต้องดาวน์โหลดน้ำหนักต่อไปนี้และเราใช้ Pose เป็น controlhint และสิ่งที่ V3 เป็น basemodel ใหม่ของเราเป็นต้น เราใส่น้ำหนักทั้งหมดไว้ใน./โมเดล
path_sd15 = ' ./models/v1-5-pruned.ckpt '
path_sd15_with_control = ' ./models/control_sd15_openpose.pth '
path_input = ' ./models/anything-v3-full.safetensors '
path_output = ' ./models/control_any3_openpose.pth 'ในที่สุดเราสามารถวิ่งได้โดยตรง
python tool_transfer_control.pyหากประสบความสำเร็จคุณจะได้รับรุ่นใหม่ โมเดลนี้สามารถใช้งานได้ใน controlnet codebase
models/control_any3_openpose.pthหากคุณต้องการลองกับรุ่นอื่น ๆ คุณสามารถกำหนด path_sd15_with_control ของคุณเองและ path_input หาก path_input ได้รับการฝึกฝนด้วย diffusers คุณสามารถใช้ convert_diffusers_to_original_stable_diffusion.py เพื่อแปลงเป็น safetensors ก่อน
ขอบคุณ Takuma Mori ได้ให้การสนับสนุนในการประชาสัมพันธ์ล่าสุดนี้เพื่อให้เราสามารถบรรลุเป้าหมายนี้ได้อย่างง่ายดาย เนื่องจากยังคงอยู่ภายใต้การตั้งค่าดังนั้นจึงอาจไม่เสถียรดังนั้นเราจึงต้องใช้เวอร์ชันการกระทำที่เฉพาะเจาะจง เราสังเกตเห็นว่า diffusers ได้รวม PR ใน 3/2/2023 เราจะฟอร์แมตการสอนของเราใหม่ในไม่ช้า
git clone https://github.com/takuma104/diffusers.git
cd diffusers
git checkout 9a37409663a53f775fa380db332d37d7ea75c915
pip install .กำหนดเส้นทางของโมเดลที่สร้างขึ้นในขั้นตอน (1) รัน
python ./scripts/convert_controlnet_to_diffusers.py --checkpoint_path control_any3_openpose.pth --dump_path control_any3_openpose --device cpuเรามีโมเดลที่บันทึกไว้ใน control_any3_openpose ตอนนี้เราสามารถทดสอบได้เป็นประจำ
from diffusers import StableDiffusionControlNetPipeline
from diffusers . utils import load_image
pose_image = load_image ( 'https://huggingface.co/takuma104/controlnet_dev/resolve/main/pose.png' )
pipe = StableDiffusionControlNetPipeline . from_pretrained ( "control_any3_openpose" ). to ( "cuda" )
pipe . safety_checker = lambda images , clip_input : ( images , False )
image = pipe ( prompt = "1gril,masterpiece,graden" , controlnet_hint = pose_image ). images [ 0 ]
image . save ( "generated.png" )ผลลัพธ์ที่สร้างขึ้นอาจไม่ดีพอเนื่องจากท่าทางนั้นยาก ดังนั้นเพื่อให้แน่ใจว่าทุกอย่างเป็นไปด้วยดีเราขอแนะนำให้สร้างท่าทางปกติผ่านทาง Posemaker หรือใช้ภาพท่าทางที่เราให้ไว้ใน ./images/pose.png


นี่คือการสนับสนุน ControlNet ที่มีความสามารถในการปรับเปลี่ยนเฉพาะภูมิภาคเป้าหมายแทนที่จะเป็นภาพเต็มรูปแบบเช่นเดียวกับการเปลี่ยนรูปแบบเสถียร สำหรับตอนนี้เราให้เงื่อนไข (ท่าทางแผนที่การแบ่งส่วน) ล่วงหน้า แต่คุณสามารถใช้เครื่องตรวจจับที่ผ่านการฝึกอบรมมาแล้วที่ใช้ใน ControlNet
เราได้จัดเตรียมท่อส่งที่จำเป็นสำหรับการใช้งาน แต่โปรดทราบว่าไฟล์นี้เปราะบางโดยไม่มีการทดสอบที่สมบูรณ์เราจะพิจารณาสนับสนุนในเฟรมเวิร์ก diffusers อย่างเป็นทางการในภายหลัง นอกจากนี้เรายังพบว่า ControlNet (อิง SD1.5) ไม่สามารถใช้งานได้กับความเสถียร--Diffusion-2-Inpainting เนื่องจากบางชั้นมีโมดูลและมิติที่แตกต่างกันหากคุณบังคับน้ำหนักและข้ามเลเยอร์ที่ไม่ตรงกัน
# assume you already know the absolute path of installed diffusers
cp pipeline_stable_diffusion_controlnet_inpaint.py PATH/pipelines/stable_diffusionจากนั้นคุณต้องนำเข้าท่อที่เพิ่มใหม่นี้ในไฟล์ที่เกี่ยวข้อง
PATH/pipelines/__init__.py
PATH/__init__.py
ตอนนี้เราสามารถวิ่งได้
import torch
from diffusers . utils import load_image
from diffusers import StableDiffusionInpaintPipeline , StableDiffusionControlNetInpaintPipeline
# we have downloaded models locally, you can also load from huggingface
# control_sd15_seg is converted from control_sd15_seg.safetensors using instructions above
pipe_control = StableDiffusionControlNetInpaintPipeline . from_pretrained ( "./diffusers/control_sd15_seg" , torch_dtype = torch . float16 ). to ( 'cuda' )
pipe_inpaint = StableDiffusionInpaintPipeline . from_pretrained ( "./diffusers/stable-diffusion-inpainting" , torch_dtype = torch . float16 ). to ( 'cuda' )
# yes, we can directly replace the UNet
pipe_control . unet = pipe_inpaint . unet
pipe_control . unet . in_channels = 4
# we also the same example as stable-diffusion-inpainting
image = load_image ( "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png" )
mask = load_image ( "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png" )
# the segmentation result is generated from https://huggingface.co/spaces/hysts/ControlNet
control_image = load_image ( 'tmptvkkr0tg.png' )
image = pipe_control ( prompt = "Face of a yellow cat, high resolution, sitting on a park bench" ,
negative_prompt = "lowres, bad anatomy, worst quality, low quality" ,
controlnet_hint = control_image ,
image = image ,
mask_image = mask ,
num_inference_steps = 100 ). images [ 0 ]
image . save ( "inpaint_seg.jpg" )ภาพต่อไปนี้เป็นภาพต้นฉบับภาพหน้ากากการแบ่งส่วน (คำแนะนำการควบคุม) และสร้างภาพใหม่


คุณยังสามารถใช้ท่าทางเป็นคำใบ้ควบคุม แต่โปรดทราบว่าขอแนะนำให้ใช้รูปแบบ OpenPose ซึ่งสอดคล้องกับกระบวนการฝึกอบรม หากคุณต้องการทดสอบภาพสองสามภาพโดยไม่ต้องติดตั้ง OpenPose ในเครื่องคุณสามารถใช้การสาธิตออนไลน์ของ ControlNet โดยตรงเพื่อสร้างภาพท่าทางที่ได้รับการป้อนข้อมูล 512x512 ที่ปรับขนาดได้
image = load_image ( "./images/pose_image.jpg" )
mask = load_image ( "./images/pose_mask.jpg" )
pose_image = load_image ( './images/pose_hint.png' )
image = pipe_control ( prompt = "Face of a young boy smiling" ,
negative_prompt = "lowres, bad anatomy, worst quality, low quality" ,
controlnet_hint = pose_image ,
image = image ,
mask_image = mask ,
num_inference_steps = 100 ). images [ 0 ]
image . save ( "inpaint_pos.jpg" )



เราได้อัปโหลด pipeline_stable_diffusion_controlnet_inpaint_img2img.py เพื่อรองรับ img2img คุณสามารถทำตามคำสั่งเดียวกันกับส่วนนี้
เช่นเดียวกับ T2I Adapter ControlNet ยังรองรับภาพควบคุมหลายภาพเป็นอินพุต แนวคิดเบื้องหลังนั้นง่ายเนื่องจากโมเดลพื้นฐานถูกแช่แข็งเราสามารถรวมเอาต์พุตจาก ControlNet1 และ ControlNet2 และใช้เป็นอินพุตเพื่อ UNET ที่นี่เราให้ pseudocode สำหรับการอ้างอิง คุณต้องปรับเปลี่ยนไปป์ไลน์ดังต่อไปนี้
control1 = controlnet1 ( latent_model_input , t , encoder_hidden_states = prompt_embeds , controlnet_hint = controlnet_hint1 )
control2 = controlnet2 ( latent_model_input , t , encoder_hidden_states = prompt_embeds , controlnet_hint = controlnet_hint2 )
# please note that the weights should be adjusted accordingly
control1_weight = 1.00 # control_any3_openpose
control2_weight = 0.50 # control_sd15_depth
merged_control = []
for i in range ( len ( control1 )):
merged_control . append ( control1_weight * control [ i ] + control2_weight * control_1 [ i ])
control = merged_control
noise_pred = unet ( latent_model_input , t , encoder_hidden_states = prompt_embeds , cross_attention_kwargs = cross_attention_kwargs , control = control ). sampleนี่คือตัวอย่างของ multi-controlnet ที่เราใช้ Pose Pose และ DEPTH MAP เป็นคำแนะนำการควบคุม ภาพทดสอบทั้งคู่ได้รับเครดิตไปยัง T2I Adapter



เพื่อหลีกเลี่ยง repo นี้จะป่องเกินไปเราให้การสอนเกี่ยวกับการฝึกอบรมเกี่ยวกับการควบคุมรถไฟ
ก่อนอื่นเราขอขอบคุณผู้เขียน Controlnet สำหรับการทำงานที่ยอดเยี่ยมรหัสแปลงของเราถูกยืมมาจากที่นี่ นอกจากนี้เรายังได้รับการชื่นชมจากการมีส่วนร่วมจากคำขอดึงนี้ใน diffusers เพื่อให้เราสามารถโหลด ControlNet เข้าสู่ diffusers
repo ยังอยู่ระหว่างการพัฒนาที่ใช้งานอยู่หากคุณมีปัญหาใด ๆ เมื่อใช้งานคุณสามารถเปิดปัญหาได้