点击蓝字
关注我们,让开发变得更有趣
作者:卢雨畋 英特尔边缘计算创新大使
首先,我们需要通电启动爱克斯板并进行系统的重装(默认是 Windows 系统,在本篇教程中我将引导您安装 ubuntu 系统进行开发)
在开箱后,我们能看到如图所示的板子和铜柱螺丝,我们首先要做的是是把他旋到爱克斯板的四个角上,螺丝从风扇的那面向下插入四个最边角的孔,然后在底部(如图面)把铜柱与螺丝旋在一起即可,如图所示:
接下来,我们就可以通电开机了;你只需要把电插上,观察到风扇转动后过一会儿就可以在显示屏上看到 Windows 系统启动了!如果没有启动,你可以找到电源插口处同一侧的另一头的黑色小圆点,按下后就可以正常启动。
再接下来,你就可以进行 Windows 下的正常操作,和你使用自己的电脑一样即可(你可以直接连接 Wi-Fi,如果连接失败可以尝试重启或者是轻轻的摆弄一下天线);但我比较爱折腾,接下来我会为你演示如何将他重新安装成 ubuntu 系统,并开始 ubuntu 系统下的深度学习程序推理。
遇事不决看文档,我们注意到(复制网址到浏览器打开):
https://www.xzsteam.com/docs/osinstallation.html#toc-1,
决定使用 Canonical 为 英特尔优化的版本。
这里我根据 CPU 选择的是:
选择镜像下载后,你可以选择制作成启动盘,或者使用一个开源软件 ventory 将他放置到 U 盘中,随后重启电脑不断单击 F2 键即可进入 BIOS,然后按照文档步骤操作进入安装界面即可。
安装完毕后重启即可成功进入系统:
当然,在最后别忘了安装 GPU 驱动支持,安装后才可以在 OpenVINO™ 上使用 GPU。
mkdir neo && cd neo
wget https://ghproxy.com/https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.11702.1/intel-igc-core_1.0.11702.1_amd64.1.deb
wget https://ghproxy.com/https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.11702.1/intel-igc-opencl_1.0.11702.1_amd64.deb
wget https://ghproxy.com/https://github.com/intel/compute-runtime/releases/download/22.35.24055/intel-level-zero-gpu-dbgsym_1.3.24055_amd64.ddeb
wget https://ghproxy.com/https://github.com/intel/compute-runtime/releases/download/22.35.24055/intel-level-zero-gpu_1.3.24055_amd64.deb
wget https://ghproxy.com/https://github.com/intel/compute-runtime/releases/download/22.35.24055/intel-opencl-icd_22.35.24055_amd64.deb
wget https://ghproxy.com/https://github.com/intel/compute-runtime/releases/download/22.35.24055/libigdgmm12_22.1.3_amd64.deb
sudo dpkg -i *.deb
向右滑动查看完整代码
安装完毕后重启即可。
为了方便操作,你可以在此时安装远程控制工具进行操作或者查看对应的 IP 接 SSH(记得安装 openssh),但这里还有一个很棒的方法推荐;你可以安装 Vscode,然后使用它的 Tunnel 插件进行远程隧道连接(模拟内网穿透),你只需要安装所需插件,然后在爱克斯板中打开 Vscode ,点击左下角的小人,选择“打开远程隧道访问”,然后在你的电脑上同时打开 Vscode,安装 remote ssh 插件后找到远程中的 Tunnnels 访问对应的电脑就可以成功进入爱克斯板的环境当中。
如果你想要用远程工具访问 ubuntu 版本的爱克斯板,请记得按照如下方式安装工具:
sudo apt-get install lightdm选择 lightdm
随后 sudo dpkg-reconfigure gdm3 选择 lightdm,紧接着重启即可。
接下来让我们进入正式的开发环节,首先我们可以先通过 OpenVINO™ 的 benchmark_app 查看爱克斯板的性能,首先安装 OpenVINO™ ,
pip install openvino-dev -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install openvino -i https://pypi.tuna.tsinghua.edu.cn/simple
向右滑动查看完整代码
安装完毕后,我们可以在命令行输入 benchmark_app -h ,若出现下列输出则代表 OpenVINO™ 安装成功。
接下来我们将以 Paddle PicoDet 来简单展示在爱克斯板上使用 OpenVINO™ 的过程,首先我们先来看一下 Paddle PicoDet,作为适合部署在边缘开发板上的模型, PicoDet 能保证在一定的 mAP 精度上最大化运行速度:
我们可以结合 benchmark app 工具来简单估计模型的大致最后运行速度,首先需要下载对应的模型(复制网址到浏览器打开):
https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.6/configs/picodet
值得提醒的是,很多后处理过程涉及到的算子都不被推理框架天然支持,所以我们需要在 modelzoo 中找到导出后不带后处理的模型,你可以点击下列地址直接下载(复制网址到浏览器打开):
https://paddledet.bj.bcebos.com/deploy/Inference/picodet_xs_320_coco_lcnet_non_postprocess.tar
打开后可以看到如下文件,这是 picodet 导出后的静态图模型,得益于 Paddle 和 OpenVINO™ 的良好兼容,我们可以直接对 Paddle 静态图模型进行加载使用,并不需要转换成 OpenVINO™ 模型(OpenVINO™ IR)。
我们可以输入如下测试代码,即得到在 GPU 上的实际 FPS 测试结果,这将为我们提供良好的性能初始信息,具体的参数信息你可以在 benchmark_app -h 中找到,或者前往官网获取相关信息。
benchmark_app -m picodet_xs_320_coco_lcnet_non_postprocess/model.pdmodel -d GPU -api async -t 15
向右滑动查看完整代码
若成功运行,你将看到下列结果:(如果运行失败出现找不到显卡等错误,你需要重新安装文中开头提到的 GPU 驱动并重新启动爱克斯板,由于网络波动,你需要确认驱动都完全下载好并安装完毕)。
可以看到,在完全异步利用 GPU 推理的情况下,我们理论上可以至少支持两个视频或摄像头的实时推理(320x320)。有的朋友可能觉得 PicoDet-XS 模型的 mA P只有23.5显得太小,那我们可以使用 PicoDet-S 模型,29.1mAP 可以满足基本需求,且速度也相对可接受:
在性能测试通过后,我们可以直接来运行对应检测程序了,在
https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.6/deploy/third_engine/demo_openvino/python
中你可以获取所有需要的运行代码。我们可以直接把这个三个文件下载或者复制粘贴到爱克斯板上的工作文件夹即可。
值得注意的是,在上面我们使用的:
picodet_xs_320_coco_lcnet_non_postprocess/model.pdmodel
模型属于不包含任何后处理的网络,需要使用 openvino_benchmark.py 文件方可运行。而对于网络包含后处理,但不包含 NMS 的模型,则需要使用 openvino_infer.py 文件运行,且还需下载对应的 onnx 模型(w/ 后处理;w/o NMS),如(复制网址到浏览器打开):
https://paddledet.bj.bcebos.com/deploy/third_engine/picodet_xs_320_lcnet_postproccesed_woNMS.onnx
我们可以随便把一个待检测图片放在目录下,按照下列方式修改配置即可一键运行:
openvino_benchmark.py 需要修改的部分:
openvino_infer.py 需要修改的部分:
修改后直接运行对应 Python 文件即可看到检测结果,且结果保存在目录下的 res.jpg 文件。
最后,为了展示视频流实时检测的效果,我们可以随便下载一个视频,然后运行下列代码启动视频流检测(你也可以将视频流读取改为0,即读取本地摄像头进行检测):
import cv2
import numpy as np
import time
import argparse
from scipy.special import softmax
from openvino.runtime import Core
from openvino_benchmark import PicoDetPostProcess,draw_box
def image_preprocess(image, re_shape):
img = cv2.resize(
image, (re_shape, re_shape), interpolation=cv2.INTER_LANCZOS4)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.transpose(img, [2, 0, 1]) / 255
img = np.expand_dims(img, 0)
img_mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1))
img_std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1))
img -= img_mean
img /= img_std
return img.astype(np.float32)
def infer(src_img,input_img):
output = compiled_model.infer_new_request({0: input_img})
result_ie = list(output.values())
test_im_shape = np.array([[320, 320]]).astype('float32')
test_scale_factor = np.array([[1, 1]]).astype('float32')
np_score_list = []
np_boxes_list = []
num_outs = int(len(result_ie) / 2)
for out_idx in range(num_outs):
np_score_list.append(result_ie[out_idx])
np_boxes_list.append(result_ie[out_idx + num_outs])
postprocess = PicoDetPostProcess(input_img.shape[2:], test_im_shape,
test_scale_factor)
np_boxes, _ = postprocess(np_score_list, np_boxes_list)
scale_x = src_img.shape[1] / input_img.shape[3]
scale_y = src_img.shape[0] / input_img.shape[2]
res_image = draw_box(src_img, np_boxes, class_label, scale_x, scale_y)
res_image = src_img
return res_image
MODEL_PATH = "picodet_xs_320_coco_lcnet_non_postprocess/model.pdmodel"
class_label= "coco_label.txt"
if __name__ == "__main__":
ie = Core()
net = ie.read_model(MODEL_PATJ)
compiled_model = ie.compile_model(net, 'CPU')
cap = cv2.VideoCapture("行人.mp4")
if not cap.isOpened():
print("无法打开视频流")
exit()
frame_count = 0
start_time = time.time()
while True:
ret, frame = cap.read()
input_img = image_preprocess(frame, 320)
res_img = infer(frame,input_img)
frame_count += 1
elapsed_time = time.time() - start_time
if elapsed_time > 1:
fps = frame_count / elapsed_time
print("实时帧速率 (FPS): {:.2f}".format(fps))
start_time = time.time()
frame_count = 0
if not ret:
break
cv2.imshow("Video Stream", res_img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
向右滑动查看完整代码
从中我们可以观察到帧率可以基本保持在 15~20FPS 间,但这时候有朋友可能想问,之前在性能测试中我们不是测得结果比这高得多吗?是的,其实真正意义上的检测性能远比此高得多,因为此时瓶颈并不在检测本身,很有可能后处理和视频解码花费了更多时间。你可以采取更深入的技术来解决这些技术瓶颈(比如更换硬解码或者用 c++ api 实现推理过程,换用 OpenVINO™ 异步推理等等),相信在使用这些操作后,你的检测性能表现一定会更上一层楼。
--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 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。