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

2023/08/01 17:00
阅读数 177
AI总结

点击蓝字

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

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


英特尔开发套件 AIxBoard 介绍


01

背景

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


02

配置



03

算力


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



04

优势


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

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

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

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

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

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


05

实物图



环境配置


01

下载安装 Anaconda


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

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


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

 


点击命令行工具如下图:



更新 conda

 


pip更换清华源:

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

向右滑动查看完整代码


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


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 结构能够更有效地提取阶段内多尺度特征和聚合阶段间多级特征。



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")

向右滑动查看完整代码

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



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")

向右滑动查看完整代码



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 值,如下图:



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



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")

向右滑动查看完整代码


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] = 0new_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 sidefig, 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()

向右滑动查看完整代码


结论


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

--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
文章这么精彩,你有没有“在看”?

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
AI总结
返回顶部
顶部