多条件控制的AI图像生成与编辑工具
ControlNetPlus是一款支持多种控制条件的AI图像生成和编辑工具。该项目采用创新架构,可处理10多种控制条件并生成高分辨率图像,同时支持多条件输入而不增加计算负载。经SDXL全面实验,ControlNetPlus在控制能力和图像质量方面表现出色。ProMax版本还提供图块去模糊、变化和超分辨率等高级编辑功能。此外,ControlNetPlus可与其他开源SDXL模型和Lora模型兼容,为图像生成和编辑提供了灵活的解决方案。
我们设计了一种新的架构,可以在条件文本到图像生成中支持10多种控制类型,并能生成视觉上可与Midjourney相媲美的高分辨率图像。该网络基于原始ControlNet架构,我们提出了两个新模块:1. 扩展原始ControlNet以使用相同的网络参数支持不同的图像条件。2. 支持多条件输入而不增加计算负载,这对于想要详细编辑图像的设计师特别重要,不同条件使用相同的条件编码器,无需增加额外的计算或参数。我们在SDXL上进行了全面的实验,并在控制能力和美学评分方面都取得了出色的性能。我们向开源社区发布了该方法和模型,让每个人都能享受其中。
如果您觉得它有用,请给我一个星标,非常感谢!
SDXL ProMax版本已经发布!!!尽情享用吧!!!
很抱歉,由于项目的收支难以平衡,GPU资源被分配给了其他更有可能盈利的项目,SD3的训练已停止,直到我找到足够的GPU支持。我会尽最大努力寻找GPU继续训练。如果这给您带来不便,我真诚地为此道歉。我想感谢每一个喜欢这个项目的人,你们的支持是我前进的动力。
注意:我们将promax模型以promax后缀放在同一个huggingface模型仓库中,详细说明将稍后添加。
以下示例展示从1M分辨率 --> 9M分辨率
<div style="display: flex; justify-content: space-between;"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/cb5da264-7d5f-4611-895d-62d3c0692abc.webp" alt="图像1" style="width: 49%; margin: 1%;"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/4288aee4-da97-462f-a0f5-afe643480650.webp" alt="图像2" style="width: 49%; margin: 1%;"> </div> <div style="display: flex; justify-content: space-between;"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/d2171be7-8e37-4bb1-9309-856ae82ee42d.webp" alt="图像1" style="width: 49%; margin: 1%;"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/bf406a2d-ce85-4cc1-b4f5-06762463dd95.webp" alt="图像2" style="width: 49%; margin: 1%;"> </div>
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
ControlNet++
及预训练模型ProMax ControlNet++
这是最重要的controlnet模型之一,我们在训练这个模型时使用了多种技巧,效果与https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0相当,在姿势控制方面达到了最先进的水平。
为了使openpose模型发挥最佳性能,你应该替换controlnet_aux包中的draw_pose函数(comfyui有自己的controlnet_aux包),详情请参考推理脚本。
这是最重要的controlnet模型之一,canny模型与线条艺术、动漫线条艺术和mlsd进行了混合训练。在处理任何细线条时表现稳健,该模型是降低变形率的关键,建议使用细线条重绘手部/脚部。
这是最重要的controlnet模型之一,涂鸦模型可以支持任何线条宽度和类型。效果与https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0相当,让每个人都成为灵魂画师。
注意:使用姿势骨架控制人体姿势,用细线绘制手/脚细节以避免变形
注意:深度图包含详细信息,建议将深度用于背景,姿势骨架用于前景
注意:涂鸦是一种强线条模型,如果你想绘制轮廓不严格的东西,可以使用它。Openpose + 涂鸦给你更多自由来生成初始图像,然后你可以使用细线编辑细节。
我们收集了大量高质量图像。这些图像经过严格筛选和标注,涵盖广泛的主题,包括摄影、动漫、自然、midjourney等。
我们提出了ControlNet++中的两个新模块,分别名为条件转换器和控制编码器。我们稍微修改了一个旧模块以提高其表示能力。此外,我们提出了一个统一的训练策略,以在一个阶段实现单一和多重控制。
对于每个条件,我们分配一个控制类型ID,例如,openpose--(1, 0, 0, 0, 0, 0),深度--(0, 1, 0, 0, 0, 0),多条件将如(openpose, 深度)--(1, 1, 0, 0, 0, 0)。在控制编码器中,控制类型ID将转换为控制类型嵌入(使用正弦位置嵌入),然后我们使用单个线性层将控制类型嵌入投影到与时间嵌入相同的维度。控制类型特征被添加到时间嵌入中以指示不同的控制类型,这个简单的设置可以帮助ControlNet区分不同的控制类型,因为时间嵌入倾向于对整个网络产生全局影响。无论是单一条件还是多重条件,都有一个唯一的对应控制类型ID。
我们扩展了ControlNet以支持同时使用同一网络处理多个控制输入。条件转换器用于组合不同的图像条件特征。我们的方法有两个主要创新,首先,不同条件共享同一个条件编码器,使网络更简单轻量。这与其他主流方法如T2I或UniControlNet不同。其次,我们添加了一个transformer层来交换原始图像和条件图像的信息,而不是直接使用transformer的输出,我们用它来预测原始条件特征的条件偏差。这有点像ResNet,我们通过实验发现这种设置可以明显提高网络性能。
ControlNet的原始条件编码器是卷积层和Silu激活的堆叠。我们没有改变编码器架构,只是增加了卷积通道以获得一个"胖"编码器。这可以明显提高网络性能。原因是我们对所有图像条件共享同一编码器,因此要求编码器具有更高的表示能力。原始设置对单一条件可能表现良好,但对10多个条件则不太理想。注意,使用原始设置也可以,只是会在一定程度上牺牲图像生成质量。
仅用单一条件训练可能会受到数据多样性的限制。例如,openpose要求你用含有人物的图像训练,而mlsd则需要用含有线条的图像训练,这可能会影响生成未见过物体时的性能。此外,训练不同条件的难度不同,要让所有条件同时收敛并达到各自单一条件的最佳性能是很棘手的。最后,我们倾向于同时使用两个或更多条件,多条件训练将使不同条件的融合更加平滑,并提高网络的鲁棒性(因为单一条件学习的知识有限)。我们提出了一个统一的训练阶段,以同时实现单一条件的优化收敛和多条件融合。
ControlNet++需要向网络传递一个控制类型ID。我们将10多种控制合并为6种控制类型,每种类型的含义如下: 0 -- openpose 1 -- 深度 2 -- 粗线(涂鸦/hed/软边缘/ted-512) 3 -- 细线(canny/mlsd/线稿/动漫线稿/ted-1280) 4 -- 法线 5 -- 分割
我们推荐Python版本 >= 3.8,你可以使用以下命令设置虚拟环境:
conda create -n controlplus python=3.8 conda activate controlplus pip install -r requirements.txt
我们为每个控制条件提供了推理脚本。请参考它以获取更多详细信息。
存在一些预处理差异,为获得最佳openpose控制性能,请执行以下操作: 在controlnet_aux包中找到util.py,用以下代码替换draw_bodypose函数
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ 在给定画布上绘制表示身体姿势的关键点和肢体。 参数: canvas (np.ndarray):表示画布(图像)的3D numpy数组,用于绘制身体姿势。 keypoints (List[Keypoint]):表示要绘制的身体关键点的Keypoint对象列表。 返回: np.ndarray:表示绘制了身体姿势的修改后画布的3D numpy数组。 注意: 函数期望关键点的x和y坐标已归一化到0和1之间。 """ H, W, C = canvas.shape if max(W, H) < 500: ratio = 1.0 elif max(W, H) >= 500 and max(W, H) < 1000: ratio = 2.0 elif max(W, H) >= 1000 and max(W, H) < 2000: ratio = 3.0 elif max(W, H) >= 2000 and max(W, H) < 3000: ratio = 4.0 elif max(W, H) >= 3000 and max(W, H) < 4000: ratio = 5.0 elif max(W, H) >= 4000 and max(W, H) < 5000: ratio = 6.0 else: ratio = 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], ] colors = [[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]] for (k1_index, k2_index), color in zip(limbSeq, colors): keypoint1 = keypoints[k1_index - 1] keypoint2 = keypoints[k2_index - 1] if keypoint1 is None or keypoint2 is None: continue 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) length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) polygon = cv2.ellipse2Poly((int(mY), int(mX)), (int(length / 2), int(stickwidth * ratio)), int(angle), 0, 360, 1) cv2.fillConvexPoly(canvas, polygon, [int(float(c) * 0.6) for c in color]) for keypoint, color in zip(keypoints, colors): if keypoint is None: continue x, y = keypoint.x, keypoint.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * ratio), color, thickness=-1)
返回画布
对于单一条件推理,你应该提供一个提示和一个控制图像,在 Python 文件中修改相应的行。
```shell
python controlnet_union_test_openpose.py
对于多条件推理,你应确保你的输入 image_list 与你的 control_type 兼容,例如,如果你想使用 openpose 和深度控制,image_list --> [controlnet_img_pose, controlnet_img_depth, 0, 0, 0, 0],control_type --> [1, 1, 0, 0, 0, 0]。更多细节请参考 controlnet_union_test_multi_control.py。 理论上,你不需要为不同的条件设置条件比例,网络被设计和训练成自然融合不同的条件。默认设置是每个条件输入为 1.0,这与多条件训练相同。 然而,如果你想增加某些特定输入条件的影响,你可以在条件变换器模块中调整条件比例。在该模块中,输入条件将与偏差预测一起添加到源图像特征中。 将其乘以特定比例会产生很大影响(但可能会导致一些未知结果)。
python controlnet_union_test_multi_control.py
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号