本文将介绍结合HuggingFace的diffusers包和ControlNet调整生成文字转图,可以更好的控制文字转图的生成。ControlNet是一种神经网络结构,通过添加附加条件来控制扩散模型。.它提供了一种在文本到图像生成过程中使用条件输入(例如涂鸦、边缘图、分割图、姿势关键点等)来增强稳定扩散的方法。生成的图像会更接近输入图像,相对于传统的图像到图像的生成方法是一个很大的改进。可以在小型数据集上训练ControlNet模型。然后集成任何预训练的稳定扩散模型以增强模型以达到微调的目的。ControNet的初始版本带有以下预训练权重:Cannyedge——黑色背景上带有白色边缘的单色图像。Depth/Shallowareas—灰度图像,黑色代表黑暗区域,白色代表浅区域。法线贴图——法线贴图图像。Semanticsegmentationmap-ADE20K的分割图像。HED边缘—黑色背景上带有白色软边缘的单色图像。涂鸦-手绘单色涂鸦图像,黑色背景上有白色轮廓。OpenPose(姿势键)—OpenPose骨骼图像。M-LSD—仅由黑色背景上的白色直线组成的单色图像。这里我们从集成开始:安装程序建议在安装包之前创建一个新的虚拟环境。在diffusers上激活虚拟环境,执行以下命令:pipinstalldiffusersControlNetrequiresdiffusers>=0.14.0acceleratepipinstallaccelerate本教程包含一些对accelerate>=0.17.0的依赖,需要使用以下命令安装最新版本:pipinstallgit+https://github.com/huggingface/accelerateopencv-python为简单起见,我们使用cannyedgeprocessor,所以它需要opencv-python包。Opencv-python有4个不同的包。官方文档建议使用opencv-contrib-python包,但也可以使用以下任何包来完成:opencv-python主包opencv-contrib-python-完整包(带有contrib/额外模块)headless-mainwithoutGUIPackageopencv-contrib-python-headless-没有GUI的完整包所以我们在这里使用完整包:pipinstallopencv-contrib-pythoncontrolnet-auxOpenPose处理器需要controlnet-aux包。执行以下命令安装:pipinstallcontrolnet-auxxformers(可选)xformers包可以提高推理速度。最新版本为PyTorch1.13.1提供了pipwheels支持。pipinstall-Uxformersconda可以安装到支持torch1.12.1或者torch1.13.1condainstallxformers好了,这里的环境就搭建好Canny边缘图像生成下面是使用cannyedgeControlNet进行图像生成。它以精细边缘图像作为输入。创建一个名为canny_inference.py的新文件并添加以下导入语句:importcv2importnumpyasnpfromPILimportImage然后,继续并添加以下代码片段以从现有图像创建canny边缘图像来自PILimportImageimage=Image.open('input.png')image=np.array(image)low_threshold=100high_threshold=200image=cv2.Canny(image,low_threshold,high_threshold)image=image[:,:,None]image=np.concatenate([image,image,image],axis=2)canny_image=Image.fromarray(image)canny_image.save('canny.png')保存文件后,执行以下命令转换图像到精明的边缘图像。pythoncanny_inference.py看下面的示例:下一步是使用刚刚生成的canny图像作为条件输入来执行推理。importcv2importtorchimportnumpyasnpfromPILimportImagefromdiffusersimportStableDiffusionControlNetPipeline,ControlNetModel,DPMSolverMultistepScheduler初始化ControlNet和StableDiffusion管道canny_image=Image.fromarray(image)#canny_image.save('canny.png')#fordeterministicgenerationgenerator=torch.Generator(device='cuda').manual_seed(12345)controlnet=ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny",torch_dtype=torch.float16)pipe=StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-扩散-v1-5",controlnet=controlnet,torch_dtype=torch.float16)#更改调度程序pipe.scheduler=DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)#启用xformers(可选),需要安装xformerspipe.enable_xformers_memory_efficient_attention()#cpu卸载以节省内存,需要加速>=0.17.0pipe.enable_model_cpu_offload()运行推理并保存结果图像:#cpuoffload以节省内存,需要加速>=0.17.0pipe.enable_model_cpu_offload()image=pipe("一位美女,名人,红色连衣裙,单反相机,彩色照片,realistic,highquality",negative_prompt="cropped,outofframe,worstquality,lowquality,jpegartifacts,ugly,blurry,badanatomy,badproportion",num_inference_steps=20,generator=generator,image=canny_image,controlnet_conditioning.5scale=).images[0]image.save('output.png')StableDiffusionControlNetPipeline接受以下参数:controlnet_conditioning_scale-在将controlnet的输出添加到原始unet的其余部分之前,它们乘以controlnet_conditioning_scale默认为1.0,接受0.0-1.0之间的任何值。运行脚本,您应该得到类似于以下内容的输出:让我们使用不同的输入图像和设置重新运行脚本:image=pipe(“一位穿着蓝色瑜伽裤的漂亮女士在海滩上锻炼,逼真,高质量”,negative_prompt=“裁剪、帧外、质量最差、质量低、jpeg伪影、丑陋、模糊、解剖结构不良、比例不良”,num_inference_steps=20,generator=generator,image=canny_image,controlnet_conditioning_scale=1.0).images[0]图像。save('tmp/output.png')结果如下:OpenPose接下来可以尝试使用OpenPose图像作为条件输入:controlnet-aux模块支持将图像转换为OpenPose骨骼图像。我们创建一个名为pose_inference.py的新Python文件并添加以下导入:从PIL导入火炬从controlnet_aux导入图像从扩散器导入OpenposeDetector)openpose=OpenposeDetector.from_pretrained('lllyasviel/ControlNet')pose_image=openpose(image)pose_image.save('pose.png')执行以下图像转换为OpenPose图像:pythonpose_inference.py结果如下现在我们开始根据OpenPose生成图像#确定性生成generator=torch.Generator(device='cuda').manual_seed(12345)controlnet=ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose",torch_dtype=torch.float16)pipe=StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",controlnet=controlnet,torch_dtype=torch.float16)#改变调度器pipe.scheduler=DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)#enablexformers(可选),需要安装xformerspipe.enable_xformers_memory_efficient_attention()#cpu卸载以节省内存,需要加速>=0.17.0pipe.enable_model_cpu_offload()#cpu卸载以节省内存,需要accelerated_pipeload_cpuenable>=0.17。()image=pipe("一位穿着黑色礼服参加获奖活动的美丽好莱坞女演员,背景是红地毯楼梯",negative_prompt="裁剪、画框外、最差质量、低质量、jpeg伪像、丑陋、模糊、解剖学不良,badproportions",num_inference_steps=20,generator=generator,image=pose_image,controlnet_conditioning_scale=1.0).images[0]image.save('output.png')结果如下:综上,我们可以看出ControlNet是一种非常强大的神经网络网络结构,通过添加额外的条件来控制扩散模型,目前还不支持Multi-ControlNet,开源社区有消息称正在积极开发中。这一新功能提供了使用多个控制网络并将它们的输出一起用于图像生成的可能性,从而可以更好地控制整体图像。https://avoid.overfit.cn/post/0663779d52484d0da5cc946b8f429f36作者:NgWaiFoong
