1. 简介
Orangepi AIPRO 是一款采用昇腾AI技术路线,集成4核64位处理器+AI处理器的单板计算机,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接eMMC模块,支持双4K高清输出。
Orange Pi AIpro拥有丰富的扩展接口,包括两个HDMI输出、GPIO接口、支持SATA/NVMe SSD 2280的M.2插槽(PCIe 4Lane)、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口,
Orange Pi AIpro已支持Ubuntu、openEuler操作系统,可以满足大多数AI算法原型验证、推理应用开发的需求。
2. 主要特性
- 处理器:昇腾AI处理器(Ascend310B4)64bit 四核处理器,主频可达 1.5GHz
- 内存:8GB LPDDR4X 内存
- 显示:支持 HDMI 2.0 最大分辨率可达 4K
- 网络:支持千兆以太网接口,Wi-Fi 5,蓝牙 4.2
- 接口:USB 3.0,USB 2.0,SATA 2.0,PCIe 2.0,I2C,SPI,GPIO 等
- 扩展:支持扩展多种 USB 和 PCIe 设备
3.使用方法
准备工作
- 下载针对 Orangepi AIPRO 的操作系统镜像文件(Ubuntu、openEuler),并将其烧录到 SD 卡中。
Ubuntu镜像
openEuler
- 将 SD 卡插入 Orangepi AIPRO 的 SD 卡槽,并开启电源。
- 系统将自动完成启动。
3.1连接串口及网络
根据Orangepi AIPRO 提供的接口,我们可以很轻易的完成串口终端的登录和网络的配置,主要有一下几种方法:
- 通过HDMI线缆将开发板的HDMI0接口连接到我们的屏幕上,在熟悉的图形界面上配置wifi密码和设置以太网固定IP;
- 将开发板的microUSB调试串口通过USB线缆连接到电脑,可以使用串口终端登录 Linux 系统;(波特率:115200 数据位:8 停止位:1 None Flow Ctrl);
- 如果没有屏幕,我们可以通过在串口终端中使用nmtui工具来完成网络配置;
接下来主要通过第三种方式介绍一下WIFI和千兆网络配置:
1.在串口终端输入下面的命令开始搜索WIFI,ctrl+c退出搜索
nmcli dev wifi
2.配置WIFI名称与密码 wifi_name 需要替换为自己的WIFI名称 wifi_passwd 替换为WIFI密码
sudo nmcli dev wifi connect wifi_name password wifi_passwd
3.千兆网口的配置
- 通过命令查看网络连接状态,Wired connection 1就是千兆有线网络
nmcli con show
- 输入下列命令完成千兆有线网络配置(可根据自己需要设置IP和网关地址)
sudo nmcli con mod "Wired connection 1" ipv4.addresses "192.168.1.110" ipv4.gateway "192.168.1.1" ipv4.dns "8.8.8.8" ipv4.method "manual"
- 配置完成后 需要reboot生效
-
在千兆网络端口没有连接网线时,无法查看端口详细的配置,此时我们将开发板连接到电脑通过下面的命令就可以查看固定IP是否配置成功
-
ip addr show eth0
-
4. USB深度摄像头初步测试
由于Orangepi AIPRO板卡上提供了两个USB3.0接口可以很方便的连接USB相机,外置的深度相机可以节约AI处理器算力,让芯片专注于控制场景中的决策工作,手头刚好有OPENCV AI KIT的深度相机可以在Orangepi AIPRO测试一下。
得益于Ubuntu系统强大的兼容性,我们可以通过简单的指令完成环境搭建;
# 安装依赖项
sudo wget -qO- https://docs.luxonis.com/install_depthai.sh | bash
# 安装显控软件
python3 -m pip install depthai-viewer
# 运行DepthAI Viewer
python3 -m depthai_viewer
5.AI应用样例体验
在Orangepi AIPRO板卡系统中还内置了多个有趣的AI处理案例,大大降低了学习门槛。
在人像分割场景中,Orangepi AIPRO可以通过训练好的模型轻松实现深度学习神经网络PortraitNet,(PortraitNet是实时人像分割模型,该模型可以在移动设备上有效且高效地运行,基于轻量级的 U 形架构,在训练阶段有两个辅助损失,而在测试阶段不需要额外的成本进行肖像推理。两个辅助损失是边界损失和一致性约束损失。前者提高了边界像素的精度,后者增强了复杂光照环境下的鲁棒性)。
5.1. 打开内置Jupyter Notebook AI样例的操作很便捷,只需要下面两条命令;
cd samples/notebooks/
./start_notebook.sh
5.2. 运行Jupyter Notebook AI样例
5.3. 输出对比图像
输入图像 | 背景图像 | 输出图像 |
内置的AI样例中有很清晰的注释,在调试过程中很容易理解 各个代码模块对应的功能,可以很方便的修改,做到有的放矢。
class Seg(object):
"""人像分割模型推理"""
def __init__(self, model_path, model_width, model_height):
self._model_path = model_path
self._model_width = model_width
self._model_height = model_height
self.device_id = 0
self._dvpp = None
self._model = None
def init(self):
"""初始化相关资源"""
# Initialize dvpp
self._dvpp = AclLiteImageProc()
# Load model
self._model = AclLiteModel(self._model_path)
return const.SUCCESS
@utils.display_time
def pre_process(self, image):
"""图片预处理"""
image_dvpp = image.copy_to_dvpp()
yuv_image = self._dvpp.jpegd(image_dvpp)
resized_image = self._dvpp.resize(yuv_image,
self._model_width, self._model_height)
return resized_image
@utils.display_time
def inference(self, input_data):
"""模型推理"""
return self._model.execute(input_data)
@utils.display_time
def post_process(self, infer_output, image_name):
"""获取分割结果"""
data = infer_output[0]
vals = data.flatten()
mask = np.clip((vals * 255), 0, 255)
mask = mask.reshape(224, 224, 2)
cv2.imwrite(os.path.join(MASK_DIR, image_name), mask[:, :, 0])
return mask
@utils.display_time
def background_replace(bg_path, ori_path, mask_path):
"""将人像分割结果与背景图片结合"""
background = cv2.imread(bg_path)
height, width = background.shape[:2]
ori_img = cv2.imread(ori_path)
mask = cv2.imread(mask_path, 0)
mask = mask / 255
mask_resize = cv2.resize(mask, (width, height))
ori_img = cv2.resize(ori_img, (width, height))
mask_bg = np.repeat(mask_resize[..., np.newaxis], 3, 2)
result = np.uint8(background * mask_bg + ori_img * (1 - mask_bg))
cv2.imwrite(os.path.join(OUTPUT_DIR, os.path.basename(mask_path)), result)
def main():
"""推理主函数"""
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(MASK_DIR, exist_ok=True)
acl_resource = AclLiteResource()
acl_resource.init()
seg = Seg(MODEL_PATH, MODEL_WIDTH, MODEL_HEIGHT)
ret = seg.init()
utils.check_ret("seg.init ", ret)
images_list = [os.path.join(IMAGE_DIR, img)
for img in os.listdir(IMAGE_DIR)
if os.path.splitext(img)[1] in const.IMG_EXT]
for image_file in images_list:
image_name = os.path.basename(image_file)
if image_name != 'background.jpg':
print('====' + image_name + '====')
# read image
image = AclLiteImage(image_file)
# Preprocess the picture
resized_image = seg.pre_process(image)
# Inference
result = seg.inference([resized_image, ])
# Post-processing
mask = seg.post_process(result, image_name)
# Fusion of segmented portrait and background image
background_replace(os.path.join(IMAGE_DIR, 'background.jpg'), \
image_file, os.path.join(MASK_DIR, image_name))
6. 总结
- 开箱测试外设功能并完成了Orangepi AIPRO的网络配置,体验了流畅的桌面系统;
- 测试了 OPENCV AI KIT USB3.0相机在Orangepi AIPRO的使用;
- 体验了Orangepi AIPRO内置的丰富AI样例。
7. 使用体验
通过这次体验Orangepi AIPRO板卡,我了解到了华为昇腾在AI领域深耕多年的强大实力,AI的未来不仅是好用的,更是易用的。
Orangepi AIPRO搭载的昇腾AI处理器(Ascend310B4)配合华为完整的开发工具,让开发者可以高效的实现AI应用程序的开发。
Orangepi AIPRO丰富的IO接口特别灵活,极大的丰富了AI的应用场景,既能很好的完成图像处理,也能实现控制功能。
8. 注意事项
- 在使用 Orangepi AIPRO 时,需要确认供电输入符合要求,以确保系统的稳定性和安全性。
- 开发板终端账号及密码 账号:root 密码: Mind@123 ; 账号:HwHiAiUser 密码:Mind@123
9. 参考资料
- Orangepi AIPRO 官方网站
- Orangepi AIPRO Wiki
- Orangepi AIPRO 硬件文档
- OrangePI AIPRO 用户手册