开发者实战 | 在英特尔开发者套件上用 OpenVINO™ 处理 U2-Net 模型的图像分割和背景替换...

本文介绍了英特尔开发套件AIxBoard,一款专为入门级AI应用设计的嵌入式开发板,配备OpenVINO工具支持,展示了其配置、算力优势以及使用OpenVINO进行U2-Net模型图像分割和背景替换的实战过程,突出了GPU加速的潜力。
摘要由CSDN通过智能技术生成

点击蓝字

关注我们,让开发变得更有趣

作者:康瑶明 英特尔边缘计算创新大使

483eb9215fb0a0c4dab2e9185bf69aa5.png

英特尔开发套件 AIxBoard 介绍

01

背景

英特尔开发套件 AIxBoard(爱克斯板)由2023年蓝蛙智能推出的人工智能嵌入式开发板,是英特尔开发套件官方序列中的一员,专为支持入门级人工智能应用和边缘智能设备而设计。它体积小巧功能强大,是一款面向专业创客、开发者的功能强大的小型计算机,借助 OpenVINO 工具套件,CPU、iGPU 都具备强劲的 AI 推理能力,支持在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。

02

配置

c06a053acd10925cfad029334163130d.png

03

算力

借助 OpenVINO 工具套件,能够实现 CPU + iGPU 异构计算推理,IGPU 算力约为 0.6 TOPS。

1e04eb7ebdfb94a7e4d6f81f221df4c5.jpeg

04

优势

  • 开箱即用,不需要额外购买配件,不需要烧写系统,通电即用

  • 性价比高,板载 8G 内存,64GB 存储,Wi-Fi6 千兆无线网卡,CPU + iGPU 异构计算

  • 通用性好,流畅运行 Win10/Win11,桌面 Linux,软件兼容性好

  • 易用性佳,提供丰富的案例资源,学习门槛低

  • 官方认证,英特尔官方推荐开发套件,品质有保证

  • 个性定制,可更换开机 Logo,产品个性化定制

05

实物图

0d18592aa569999790c57f33e220a559.png

be0741966c6b13cec3eafe8ccfd3658c.gif

ecd4c4b981be6946b1862168c0493968.png

环境配置

01

下载安装 Anaconda

推荐使用国内清华源,可以加速下载(复制地址到浏览器打开)

https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

根据提示安装完成后,打开anaconda:

4e3f5bbeb0d086aaf9533abf2f227c99.png

点击命令行工具如下图:

b82fe5b251271f144d1335c514bdad4f.png

更新 conda

6acf27fd4cf62e11e1d54de55bf1d742.png

pip更换清华源:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

向右滑动查看完整代码

8cc07a279a0fd0fc1d632ba0471608e9.png

02

安装 OpenVINOpackage

详情可参见官网(复制地址到浏览器打开或点击阅读原文

https://www.intel.cn/content/www/cn/zh/developer/tools/openvino-toolkit/download.html?ENVIRONMENT=DEV_TOOLS&OP_SYSTEM=WINDOWS&VERSION=v_2023_0_1&DISTRIBUTION=PIP&FRAMEWORK=ONNX%2CPYTORCH%2CTENSORFLOW_2

pip install openvino-dev[ONNX,pytorch,tensorflow2]==2023.0.1

向右滑动查看完整代码

03

检查是否安装成功

使用以下命令可以查看到 OpenVINO 识别到支持的设备为 CPU 和 GPU。如下图所示,此时说明安装成功,可以找到推理设备。

benchmark_app --help

2910147de82041a79a9ff59273bde9e5.png

b1f3d6bd64d8a1507c4dc20440557f2c.png

U2-Net 模型的图像分割和背景替换演示

下载仓库:

git clone https://github.com/openvinotoolkit/openvino_notebooks.git

向右滑动查看完整代码

01

模型介绍

U2-Net 在 RSU 的基础上开发的,用于显著目标检测(SOD),解决了在保持高分辨率特征图的同时,以较低的内存和计算成本使网络变得更深。U2 网络是一个两层嵌套的U型结构,如下图所示。它的 top-level 是一个由11个阶段组成的大U型结构(图中的立方体)。每一阶段都由一个配置良好的残差 Ublock(RSU)(bottom level  U结构)填充。因此,嵌套 U 结构能够更有效地提取阶段内多尺度特征和聚合阶段间多级特征。

aa3d85b01e2de973b530dc1c893a524b.jpeg

02

模型下载

u2net_lite = model_config(
    name="u2net_lite",
    url="https://drive.google.com/uc?id=1rbSTGKAE-MTxBYHd-51l2hMOQPT_7EPy",
    model=U2NETP,
    model_args=(),
)
model_path = Path(MODEL_DIR) / u2net_model.name / Path(u2net_model.name).with_suffix(".pth")

向右滑动查看完整代码

执行上述代码,下载原模型文件。

4ce09adcdb0088adc31744cf7bc64605.png

03

导出 onnx

加载模型和预训练的权重文件,导出到 onnx 格式。Pytorch 把所有的模型参数用一个内部定义的 dict 进行保存,称为 state_dict。

# Load the model.
net = u2net_model.model(*u2net_model.model_args)
net.eval()


# Load the weights.
print(f"Loading model weights from: '{model_path}'")
net.load_state_dict(state_dict=torch.load(model_path, map_location="cpu"))


torch.onnx.export(net, torch.zeros((1,3,512,512)), "u2net.onnx")

向右滑动查看完整代码

4778e6ec79e7b2951417078518ea98da.png

04

转化为 IR 格式

使用模型优化器 Python API 将 Pytorch 模型转换为  OpenVINO IR 格式,精度为 FP16。将平均值添加到模型中,并使用带有 scale_values 参数的标准偏差缩放输入。使用这些选项,无需在通过网络传播输入数据之前对其进行规范化。平均值和标准偏差值可以在 U2-Net 存储库的 dataloader 文件中找到,并乘以255以支持像素值为0-255的图像。

model_ir = mo.convert_model(
    "u2net.onnx",
    mean_values=[123.675, 116.28 , 103.53],
    scale_values=[58.395, 57.12 , 57.375],
    compress_to_fp16=True

向右滑动查看完整代码

05

图片预处理

OpenVINO IR 模型需要 RGB 格式的图像。将图像转换为 RGB,将其大小调整为 512 x 512,并将尺寸转置为  OpenVINO IR 模型所需的格式。

IMAGE_URI = "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_hollywood.jpg"
image = cv2.cvtColor(
    src=load_image(IMAGE_URI),
    code=cv2.COLOR_BGR2RGB,
)
resized_image = cv2.resize(src=image, dsize=(512, 512))
input_image = np.expand_dims(np.transpose(resized_image, (2, 0, 1)), 0)

向右滑动查看完整代码

06

执行推理

加载模型网络到 OpenVINO Runtime,device_name 指定为 CPU 设备进行推理。

# Load the network to OpenVINO Runtime.
ie = Core()
compiled_model_ir = ie.compile_model(model=model_ir, device_name="CPU")
# Get the names of input and output layers.
input_layer_ir = compiled_model_ir.input(0)
output_layer_ir = compiled_model_ir.output(0)


# Do inference on the input image.
start_time = time.perf_counter()
result = compiled_model_ir([input_image])[output_layer_ir]
end_time = time.perf_counter()
print(
    f"Inference finished. Inference time: {end_time-start_time:.3f} seconds, "
    f"FPS: {1/(end_time-start_time):.2f}."
)

向右滑动查看完整代码

推理完成后,可以看到打印的执行时间和 FPS 值,如下图:

baacc7f436b72d2d965028749bb636dc.png

设备切换为 GPU 后可以看到推理时间缩短了近10倍, FPS 也提高了近10倍。然而看到任务管理器 GPU 利用率才50%左右,这说明 GPU 的加速效果还是很可观的。

1aa118e2a6d91ea2b35167cce6914027.png

07

结果可视化

经过 OpenCV 处理后,从左到右分别是原始图像、分割结果和去除背景的原始图像。

resized_result = np.rint(
    cv2.resize(src=np.squeeze(result), dsize=(image.shape[1], image.shape[0]))
).astype(np.uint8)


# Create a copy of the image and set all background values to 255 (white).
bg_removed_result = image.copy()
bg_removed_result[resized_result == 0] = 255


fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(20, 7))
ax[0].imshow(image)
ax[1].imshow(resized_result, cmap="gray")
ax[2].imshow(bg_removed_result)
for a in ax:
    a.axis("off")

向右滑动查看完整代码

5451aee1fb7129c26406de98aeb18d5e.png

08

添加背景

通过 cv2.cvtColor 方法,读取到新的长城背景图片,经过转置等操作,给狗狗替换了新的长城背景图片。

background_image = cv2.cvtColor(src=load_image(BACKGROUND_FILE), code=cv2.COLOR_BGR2RGB)
background_image = cv2.resize(src=background_image, dsize=(image.shape[1], image.shape[0]))


# Set all the foreground pixels from the result to 0
# in the background image and add the image with the background removed.
background_image[resized_result == 1] = 0
new_image = background_image + bg_removed_result


# Save the generated image.
new_image_path = Path(f"{OUTPUT_DIR}/{Path(IMAGE_URI).stem}-{Path(BACKGROUND_FILE).stem}.jpg")
cv2.imwrite(filename=str(new_image_path), img=cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR))


# Display the original image and the image with the new background side by side
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(18, 7))
ax[0].imshow(image)
ax[1].imshow(new_image)
for a in ax:
    a.axis("off")
plt.show()

向右滑动查看完整代码

e8adcfac28e28d216032b1d6ab89f5eb.png

d0da224f04f8e8689b615d93ff0a8006.png

结论

英特尔开发套件 AI 爱克斯开发板,板载 8G 内存, 64GB 存储,Wi-Fi6 千兆无线网卡,CPU + iGPU 异构计算,还有一个 M.2 插槽支持可扩展硬盘。搭载的 Intel Celeron N5105 是 Jaser Lake 系列的四核处理器,被定位为嵌入式 CPU,不管是性能,还是功耗,散热都做的非常不错。在测试中,内置的集成显卡可以在 U2-Net 模型的加速推理时间缩短近10倍,FPS 也提高了近10倍。然而 GPU 利用率才50%左右,这说明 GPU 的加速效果还是很可观的,还有潜力进一步释放算力,是 AI 开发者的趁手利器。

57290e3b44f3dd69971a19c9fbd21b27.gif

--END--

你也许想了解(点击蓝字查看)⬇️➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型➡️ 开发者实战系列资源包来啦!➡️ 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️ 还不知道如何用OpenVINO™作画?点击了解教程。➡️ 几行代码轻松实现对于PaddleOCR的实时推理,快来get!➡️ 使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理➡️ 图片提取文字很神奇?试试三步实现OCR!➡️【Notebook系列第六期】基于Pytorch预训练模型,实现语义分割任务➡️使用OpenVINO™ 预处理API进一步提升YOLOv5推理性能
扫描下方二维码立即体验 
OpenVINO™ 工具套件 2023.0

点击 阅读原文 立即体验OpenVINO 2023.0

959e653b949f00349464cf1a0d3af872.png

文章这么精彩,你有没有“在看”?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值