如何使用OpenVINO进行AIGC开发——英特尔人工智能创新应用大赛回顾总结

开发背景

今年1月,在好友的怂恿下报名参加了英特尔人工智能创新应用大赛。经过初赛/半决赛/总决赛三个环节,最终很幸运的拿到了优胜奖。今天把整个开发历程回顾总结一下,也希望能帮助到对人工智能感兴趣的朋友。因为是企业赛道参赛,代码部分是公司商业资产,所以本文以理论讲解为主,不涉及具体代码。喜欢OpenVINO和Stable Diffusion的朋友可以根据本文原理自己动手实践。
企业赛道优胜奖

开发环境

硬件环境

联想ThinkBook14 2024款AI全能本,具体配置如下

  1. CPU:英特尔酷睿 Ultra7 155H 1.40GHZ
  2. 内存:32G
  3. 硬盘:1T
  4. 显卡:英特尔核显Arc GPU

这款电脑采用了英特尔最新的酷睿Ultra人工智能芯片,采用CPU+NPU+GPU架构,其中NPU是专门用于人工智能的神经网络处理器。本子薄,功耗低,续航时间长,非常适合办公+开发的程序员。
thinkbook14

软件环境

操作系统:Windows11(Windows11是开发笔记本自带的系统,用Windows10同样可以开发)
基础开发环境:miniConda+Python3.10+OpenVINO
miniconda是用于配置python虚拟环境的,经常做AI开发的同学应该熟悉,这里就不介绍了。我重点介绍一下OpenVINO.

OpenVINO介绍

OpenVINO 是英特尔开发的跨平台深度学习工具包,该名称代表“开放式视觉推理和神经网络优化”。OpenVINO 专注于通过面向英特尔硬件平台的一次写入、随处部署的方法优化神经网络推理。OpenVINO每个季度发版一次,我开发时最新版是2024.0,目前最新版已升级到2024.1。经过多年发展,OpenVINO非常稳定且易用。

不理解的同学可以简单的把他类比成英伟达CUDA。不同于Nvida CUDA的是,OpenVINO开源,且可以跨平台。
使用OpenVINO开发的好处是:

  1. 可在各种硬件上部署,包括英特尔或者AMD
  2. 有效减少资源消耗,比如推理过程中的内存使用
  3. 可快速进行模型优化和压缩,减少模型体积。

在这次开发过程中,我全程使用的是OpenVINO。其实我也是从0开始学习OpenVINO,不过上手很快。想学习OpenVINO的同学重点关注以下两份学习资料:

这两份资料是神资料,官方文档适合了解一些基本用法和API,Notebooks适合学习各种模型的具体开发方法。

作品介绍

我们这次参赛的作品是AIGC在电商领域的应用。
电商购物过程中,消费者希望能获得更好的购物体验,卖家则希望能减少运营成本提高利润。
我们的作品通过生成式人工智能,提供以下四大应用场景:

1.模特换脸换肤色换背景,帮助中小卖家规避版权风险,解放拍摄场地限制
2.模特换装,帮助设计师设计不同服装元素,快速验证设计效果
3.假人模特变真人模特,帮助服装工厂减少拍摄成本,提高展示效果
4.虚拟试穿,帮助消费者查看服饰上身效果,提高购物体验。

我们的作品专注于服饰电商领域,既能通过虚拟试穿提高消费者购物体验,也能帮助卖家实现一图多用、解放拍摄场地和类型、增加设计人员灵感创意,自动化生成电商广告素材,大大降低卖家资金成本。

以下是四个场景的Demo截图:

一.模特换脸,规避版权纠纷

在这里插入图片描述

二.模特换装,帮助设计师寻找设计灵感

在这里插入图片描述
该场景需要设计师输入不同提示词,设计不同的服饰元素,测试在不同脸型/身材/姿势下的服饰元素效果。

三.假人模特变真人,节省拍摄成本,效果更生动

在这里插入图片描述
假人变真人这个场景很多朋友很喜欢,觉得很有创意,比较适合服装工厂批量出货时制作模特效果图。

四.虚拟试穿,提升消费者购物体验

在这里插入图片描述
虚拟试穿这个场景有很大的应用前景,我们阅读了大量的相关论文,并学习了部分开源模型,最后在OpenVINO环境下实现了相关功能。

开发过程

技术原理

基础的技术原理并不复杂,本文中我只介绍基础的技术原理,希望深入研究的同学可以自行探索。

模特换脸首先要识别人脸并切割出来生成蒙版图,然后对蒙版部分重新生成人脸。喜欢玩SD WebUI的同学可能已经想到了WebUI里的蒙版重绘功能。是的,原理是一样的。但是此次代表公司参赛,我们开发的目标是商业化运用,要部署在服务器上通过API或者SDK提供服务,并且要基于OpenVINO开发,所以要对代码进行改造并且进行工程化优化。

Grounded SAM+Stable Diffusion Inpaint

进行人脸识别和切割,Grouned SAM绝对是个好模型,然后使用StableDiffusionInpaint进行局部重绘。将Grounded SAM和Stable Diffusion Inpaint都移植到OpenVINO平台。
因为涉及到很多工程化优化工作,我们移植的时候花了大量精力。如果仅仅是开发体验,GroundedSAM的转换可以参考OpenVINO Notebooks里模型转换技巧,Stable Diffusion可以直接使用HuggingFace Optimum库,用这个库转换Stable Diffusion模型,快速简单,不用动脑。大家可以自行尝试。
给大家列出Stable Diffusion和Optimum的学习资料:

代码示例

在这里给大家展示部分涉及OpenVINO的代码。在理解技术原理的基础上,再研究这部分代码示例,在AIPC上运行,能跑出很好的效果。

切割蒙版图

在上面的技术原理部分提到,脸部或服饰蒙版图都是通过GroundedSAM模型完成的。GroundedSAM由GroundingDINO和SegmentAnything两部分组成。在OpenVINO环境下,需要将两部分模型分别转换成IR格式。这个过程需要借助openVINO的APIov.convert_model完成。转换部分代码量较大,在这里我以GroundingDINO为例进行说明,SAM部分同理可以理解。

将GroundingDINO转换成OpenVINO IR格式

在转换之前,需要先下载好模型

import openvino as ov
core=ov.Core()
# 定义转换后的模型文件名和路径
ov_dino_path = IRS_PATH / f"{ov_dino_name}.xml"
# 开始转换
if not ov_dino_path.exists():
    tokenized = pt_grounding_dino_model.tokenizer(["the running dog ."], return_tensors="pt")
    input_ids = tokenized["input_ids"]
    token_type_ids = tokenized["token_type_ids"]
    attention_mask = tokenized["attention_mask"]
    position_ids = torch.arange(input_ids.shape[1]).reshape(1, -1)
    text_token_mask = torch.randint(0, 2, (1, input_ids.shape[1], input_ids.shape[1]), dtype=torch.bool)
    img = torch.randn(1, 3, *ground_dino_img_size)
	# 转换时需要一个参数类型,dummy_inputs就这这个参数类型
    dummpy_inputs = (
        img,
        input_ids,
        attention_mask,
        position_ids,
        token_type_ids,
        text_token_mask,
    )
    for par in pt_grounding_dino_model.parameters():
        par.requires_grad = False
   
    traced_model = torch.jit.trace(
        pt_grounding_dino_model,
        example_inputs=dummpy_inputs,
        strict=False,
        check_trace=False,
    )
	# 调用ov.convert_model开始转换模型格式
    ov_dino_model = ov.convert_model(traced_model, example_input=dummpy_inputs)
    # 调用ov.save_model保存已经转换好的模型
    ov.save_model(ov_dino_model, ov_dino_path)
else:
    ov_dino_model = core.read_model(ov_dino_path)

模型转换过程中,有两个重难点:

  1. 了解GroundingDINO的基本用法,顺利导入模型
  2. 理解如何使用ov.convert_model,根据GroundingDINO准备输入参数
读取转换后的模型并推理

OpenVINO的中间格式模型推理前需要编译一下,非常简单,使用compile_model一行代码即可搞定

ov_compiled_grounded_dino = core.compile_model(ov_dino_model, device.value)

上面步骤是转换和推理过程中,涉及OpenVINO的核心部分,我写了一些代码注释,更详细的代码大家可以参考OpenVINO GroundedSAM使用方法

SD局部重绘

StableDiffusion对显卡显存要求比较高,普通笔记本电脑是跑不起来的。如果使用OpenVINO进行优化,第一步也是需要对模型进行转换,不过好在有Optimum库,我们就不需要手动转换了.
以下是一段示例代码:

from optimum.intel import OVStableDiffusionPipeline, OVStableDiffusionInpaintPipeline
from diffusers.utils import load_image, make_image_grid

model_id = "stablediffusionapi/realistic-inpaintt"
# 此处会自动进行模型转换并导出保存
pipeline = OVStableDiffusionInpaintPipeline.from_pretrained(model_id,export=True)
pipeline.to("gpu")
pipeline.compile()
image1 = load_image(img)
image2 = load_image(mask_img)
prompt="a beautiful young girl"
negative_prompt = "twisted,low quality,lowres,bad hands,muted hands,error,missing fingeewer,blurry,out of focus,glowing eyes,(worst quality, low quality, large head, extra digits:1.4), EasyNegativeV2, ((wrong hand)), nsfw, bad anatomy, disformed hands, mutated hands, text, error, missing fingers, extra digit, fewer digits, cropped, normal quality, signature, watermark, username, blurry, artist name, out of focus, ((bad proportions)), ((multiple legs)), (multiple arms), 3D, bad_prompt, (worst quality:2.0), (low quality:2.0), inaccurate limb, lowres, bad eye, bad lips, multiple views, nsfw, tantacle, bad_anatomy, pray hands, multiple arms, multiple legs, multiple hands"
images = pipeline(
        prompt=prompt,
        negative_prompt=negative_prompt,
        image=image1,
        mask_image=image2,
        height=512,
        width=384,
    ).images
images

另外,给大家推荐一个HuggingFace的国内镜像站,希望能帮助到科学上网有困难的开发同学

模特换脸和模特换装,其实是一样的技术原理,只不过切割和重绘的是服饰部分。

产品测试和部署

开发测试

在本地开发阶段,如果只用命令行,体验感有些差,推荐大家使用Gradio进行生成UI界面进行测试。Gradio用起来很简单,不过界面比较粗糙,也只适合开发测试阶段或者DEMO使用.关于Gradio的使用方法可以参考官方文档:

正式部署

因为使用的是OpenVINO,所以部署起来非常简单。OpenVINO提供了Docker的部署方式,只需要将开发好的代码制作成Docker镜像,然后在具备硬件资源的服务器下拉取镜像并启动即可成功。
大家可参看OpenVINO官方文档中的部署方式:

最后

通过这次参赛,我对OpenVINO的了解和使用应该算是非常熟悉了,欢迎开发同学加我进行技术交流探讨。也给自家公司产品打个广告,需要相关AI产品的老板们随时来聊
企业微信

  • 33
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明志刘明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值