首页 > 编程语言 >python直接调用InstantID进行图片生成

python直接调用InstantID进行图片生成

时间:2024-05-22 17:21:04浏览次数:28  
标签:调用 python image InstantID face input new side resize

项目地址 https://github.com/InstantID/InstantID

克隆到本地,根据要求pip安装依赖

模型文件上篇文章讲了如何下载 https://www.cnblogs.com/qcy-blog/p/18202276

我用的windows,所以改了一下示例infer.py源码,主要是修改了模型得绝对路径。

import cv2
import torch
import numpy as np
from PIL import Image
from diffusers.utils import load_image
from diffusers.models import ControlNetModel
from insightface.app import FaceAnalysis
from pipeline_stable_diffusion_xl_instantid import StableDiffusionXLInstantIDPipeline, draw_kps

def resize_img(input_image, max_side=1280, min_side=1024, size=None, 
               pad_to_max_side=False, mode=Image.BILINEAR, base_pixel_number=64):
    w, h = input_image.size
    if size is not None:
        w_resize_new, h_resize_new = size
    else:
        ratio = min_side / min(h, w)
        w, h = round(ratio*w), round(ratio*h)
        ratio = max_side / max(h, w)
        input_image = input_image.resize([round(ratio*w), round(ratio*h)], mode)
        w_resize_new = (round(ratio * w) // base_pixel_number) * base_pixel_number
        h_resize_new = (round(ratio * h) // base_pixel_number) * base_pixel_number
    input_image = input_image.resize([w_resize_new, h_resize_new], mode)

    if pad_to_max_side:
        res = np.ones([max_side, max_side, 3], dtype=np.uint8) * 255
        offset_x = (max_side - w_resize_new) // 2
        offset_y = (max_side - h_resize_new) // 2
        res[offset_y:offset_y+h_resize_new, offset_x:offset_x+w_resize_new] = np.array(input_image)
        input_image = Image.fromarray(res)
    return input_image

if __name__ == "__main__":
    # Load face encoder
    app = FaceAnalysis(name='antelopev2', root=f'F:\\code\\ComfyUI\\models\\insightface', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
    app.prepare(ctx_id=0, det_size=(640, 640))
    # Path to InstantID models
    face_adapter = f'F:\\code\\ComfyUI\\models\\checkpoints\\ip-adapter.bin'
    controlnet_path = f'F:\\code\\ComfyUI\\custom_nodes\\ComfyUI-InstantID\\checkpoints\controlnet'
    # Load pipeline
    controlnet = ControlNetModel.from_pretrained(controlnet_path, torch_dtype=torch.float16)
    # 模型根据自己需求下载,必须是SDXL
    #base_model_path = 'wangqixun/YamerMIX_v8'
    base_model_path = f'F:\\cache\\hub\\models--stabilityai--stable-diffusion-xl-base-1.0\\snapshots\\462165984030d82259a11f4367a4eed129e94a7b'

    pipe = StableDiffusionXLInstantIDPipeline.from_pretrained(
        base_model_path,
        controlnet=controlnet,
        torch_dtype=torch.float16,
    )
    pipe.cuda()
    pipe.load_ip_adapter_instantid(face_adapter)

    # Infer setting
    prompt = "analog film photo of a man. faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage, masterpiece, best quality"
    n_prompt = "(lowres, low quality, worst quality:1.2), (text:1.2), watermark, painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured (lowres, low quality, worst quality:1.2), (text:1.2), watermark, painting, drawing, illustration, glitch,deformed, mutated, cross-eyed, ugly, disfigured"

    face_image = load_image(f"F:\\code\\ComfyUI\\InstantID-main\\examples\\yann-lecun_resize.jpg")
    face_image = resize_img(face_image)

    face_info = app.get(cv2.cvtColor(np.array(face_image), cv2.COLOR_RGB2BGR))
    face_info = sorted(face_info, key=lambda x:(x['bbox'][2]-x['bbox'][0])*x['bbox'][3]-x['bbox'][1])[-1] # only use the maximum face
    face_emb = face_info['embedding']
    face_kps = draw_kps(face_image, face_info['kps'])

    image = pipe(
        prompt=prompt,
        negative_prompt=n_prompt,
        image_embeds=face_emb,
        image=face_kps,
        controlnet_conditioning_scale=0.8,
        ip_adapter_scale=0.8,
        num_inference_steps=30,
        guidance_scale=5,
    ).images[0]

    image.save('result.jpg')

标签:调用,python,image,InstantID,face,input,new,side,resize
From: https://www.cnblogs.com/qcy-blog/p/18206742

相关文章

  • Python使用Mypy进行静态变量审查
    python作为一个动态语言,可以对变量不进行类型定义就使用,这就导致随着项目的增大,我们很难回顾以前某些模块中每一个变量是什么类型(特别是在函数定义里,如果不进行类型检查,很可能对一个str类型进行了()调用等等),为了在编码时能够让编译器提醒我们,也防止在运行时出现问题,采用静态变......
  • python 自然语言处理模块
    Python中有几个流行的自然语言处理(NLP)模块,这些模块提供了广泛的工具和库,用于文本分析、处理和理解。以下是一些广泛使用的NLP模块:NLTK(NaturalLanguageToolkit)NLTK是Python中最著名的NLP库之一,它提供了文本处理的丰富工具,包括分词、词性标注、句法分析、语义推理等。网......
  • 微服务实践k8s&dapr开发部署实验(1)服务调用
    前置条件安装docker与dapr:手把手教你学Dapr-3.使用Dapr运行第一个.Net程序安装k8sdapr自托管模式运行新建一个webapi无权限项目launchSettings.json中applicationUrl端口改成5001,如下:"applicationUrl":"http://localhost:5001"//WeatherForecastController.......
  • 如何快速理清复杂Python代码? 转发
    复杂Python代码看不懂,分享两个工具,事半功倍!RyvenRyven是一个Python代码可视化工具!学习地址:https://github.com/leon-thomm/Ryven一些案例,Ryven可视化操作矩阵Ryven可视化冒泡排序算法Ryven可视化OpenCV图像处理Python导师Python导师,即PythonTutor,是一个代码......
  • Python读取YAML配置数据
    python编写的一些脚本需要一些简单配置时可以使用yaml文件进行设置。本文将介绍如何使用pyyaml进行读取配置数据。首先安装pyyamlpipinstallpyyaml简单使用下pyyaml,比较新的python版本记得要指定Loaderimportyamlcontent_='''typecho:  url:https://www.xtiger......
  • HttpURLConnection 调用soap 并且使用Dom4j解析多层级XML为Map对象
    1.引入dom4j的maven依赖包<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency>2.转map方法1importjava.io.BufferedReader;2importjava.io.InputStrea......
  • python获取华为云CDN日志
    1.安装模块pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplehuaweicloudsdkcdnpipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpledatetime2.获取前一天日志文件importosimportrequestsimportshutilimportgzipimportglobimportjs......
  • Python基础篇(函数)
    函数是实现某种特定的功能而组织的带名字的代码块,可以重复使用的,用来实现单一,或相关联功能的代码段,所以说函数是程序员规模化使用的基础。函数能提高应用的模块性,和代码的重复利用率。在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。善于利用函数,可以减少......
  • python环境安装
    python环境安装分三步,下载、安装、验证。一、python包下载python包下载地址python.org。本例程下载3.8.10版本,据说3.8版本较为稳定。最新版本点击黄色按钮可直接下载,如果想要下载历史版本则找到所想要选择的历史版本点击进入,在所进入页面的最下方存放有下载资源。位置如下图所......
  • 写给-Python-开发者的-JavaScript-实用指南-全-
    写给Python开发者的JavaScript实用指南(全)原文:zh.annas-archive.org/md5/3cb5d18379244d57e9ec1c0b43934446译者:飞龙协议:CCBY-NC-SA4.0前言在学习Python时,您通过学习Python的基础知识、其优雅和编程原则,迈出了软件工程职业生涯的第一步。在您职业生涯的下一个阶段......