前言
最近入手了一块香橙派(Orange Ai Pro)的板子,他们的口号是:为AI而生,这让一个算法工程师按捺不住了, 之前主要是在RKNN和ESP32等设备上部署AI模型,看到官方介绍的强大AI算力,很想知道能否满足工作生活中的实时视频流模型部署,也为未来公司的战略部署多做一份准备。
AIpro是一款采用昇腾AI技术路线的强大开发板,配备4核64位处理器, 8GB的LPDDR4X内存,就足以满足大部分的AI推理应用场景,AI Pro 配备8TOPS-12TOPS的AI算力,相当于英伟达的RTX3080显卡,同时很多车企早期L2级自动驾驶的算力需求也才2-2.5TOPS,所以在AI 算力方面完全是充足的。
同时开发板支持外接eMMC模块,从32GB到256GB, 充足的存储空间能够满足日常开发所需。
AI Pro还支持外接4K的高清显示器,能够利用HDMI帮我们更好的可视化操作,大大提升了开发体验,只需要自带一个小的显示屏,便可以做一台便携mini电脑。
更多的开发板信息可以参考下面的这个硬件配置图
准备
-
一块Orange Ai Pro
相关的硬件资料可参考:Orange Ai Pro 介绍和应用
购买地址: 淘宝 、京东 -
一个USB 摄像头
主要用于实时检测素材 -
外接鼠标、键盘
-
显示器
用于可视化操作Orange Ai Pro
镜像烧录
需要下载官方的烧录工具, 将镜像烧录到存储卡内,官方镜像地址:下载地址
开机登录
接好设备后,就可以点击开机按钮, 我这边的设备主要是1个摄像头,1块32G的存储卡,系统这边用的是Ubuntu系统,比较适合个人的习惯
环境准备
配置编译依赖的头文件与库文件路径
export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
安装ACLLite库和ffmpeg
Tips: ACLLite是必备的库文件
apt-get install ffmpeg libavcodec-dev libswscale-dev libavdevice-dev
获取ACLLite 源码
git clone https://gitee.com/ascend/ACLLite.git
进入到项目目录进行编译, 会编译到上面设置的lib 目录
bash build_so.sh
到这里环境的基本配置已经完成了,接下来就是代码的准备和编译了
官方的Ai Demo项目
git clone https://gitee.com/ascend/EdgeAndRobotics.git
这是官方提供的sample demo ,里面有基础的图像检测,分类,人脸识别等demo,可以帮助我们快速上手,同时也适合在源码上根据需要进行二次修改。
模型转换
Orange Ai pro 需要的是.om的格式,我们需要把pt 的模型转成onnx 再利用平台的 Atc工具转成.om的格式
什么是ATC
昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是昇腾CANN架构体系下的模型转换工具,类似RKNN或hisi 都有自己处理器需要的模型格式,CANN架构也不例外。
-
它可以将开源框架的网络模型(例如TensorFlow、ONNX等)转换为昇腾AI处理器支持的模型文件(.om格式),用于后续的模型推理
-
它可以将基于Ascend IR定义的单算子描述文件(*.json格式)转换为昇腾AI处理器支持的模型文件(.om格式),后续在整网中验证算子功能
如何转换
atc --model=yolov5s.onnx --framework=5 --output=yolov5s --input_shape="images:1,3,640,640" --soc_version=Ascend310B4 --insert_op_conf=aipp.cfg
–framework:原始网络模型框架类型,5表示onnx。
–soc_version:模型转换时昇腾AI处理器的版本,例如Ascend310B1。
–model:原始网络模型文件,含扩展名。
–weight:原始网络模型权重文件路径,含文件名,仅当原始网络模型是Caffe时需要指定。
–output:转换后的*.om模型文件路径,含文件名,转换成功后,模型文件名自动以.om后缀结尾
–insert_op_conf: 模型相关的配置文件,包含图像大小,预处理等参数
tips: 内存小于8G最好将atc 的进程数减少,否则转换可能会报错
export TE_PARALLEL_COMPILER=1
export MAX_COMPILE_CORE_NUMBER=1
你也可以下载官方的yolov5 模型
#下载yolov5s的模型和转换模型
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/yolov5s.onnx --no-check-certificate
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/aipp.cfg --no-check-certificate
搭建Orange Ai Pro 垃圾检测项目
在源码demo中,进入到/ Samples / YOLOV5USBCamera / python/src中,可以看到核心的实现代码, 基本上官方已经很好的把模型的加载和推理等模块, 只需要稍加修改就能变成自己需要的。
class sampleYOLOV7(object):
'''load the model, and do preprocess, infer, postprocess'''
def __init__(self, model_path, model_width, model_height):
self.model_path = model_path
self.model_width = model_width
self.model_height = model_height
def init_resource(self):
# initial acl resource, create image processor, create model
self._resource = AclLiteResource()
self._resource.init()
self._dvpp = AclLiteImageProc(self._resource)
self._model = AclLiteModel(self.model_path)
def preprocess(self, frame):
# resize frame, keep original image
self.src_image = frame
self.resized_image = cv2.resize(frame, (self.model_width, self.model_height))
def infer(self):
# infer frame
image_info = np.array([640, 640,
640, 640],
dtype=np.float32)
self.result = self._model.execute([self.resized_image, image_info])
也可以参考这个官方项目: https://gitee.com/ascend/samples/tree/master/python/contrib/garbage_picture
模型准备
利用yolov5 代码训练出垃圾分类的模型, yolov5 源码可以在github 下载。
我这里是利用了之前公司做的垃圾分类数据集训练的垃圾分类模型,训练数据总共19000张,验证集3000张,准确率92%。
运行export导出onnx模型,拷贝到orange ai pro里。
转换模型
将我们的模型转成om的格式,参考上面的模型转换内容。
这里可以直接用官方的python版本进行修改
/home/HwHiAiUser/project/EdgeAndRobotics/Samples/YOLOV5USBCamera/python/
编写index.py, 加入自己的预处理和后处理逻辑
def preprocess_image(image, cfg, bgr2rgb=True):
"""图片预处理"""
img, scale_ratio, pad_size = letterbox(image, new_shape=cfg['input_shape'])
if bgr2rgb:
img = img[:, :, ::-1]
img = img.transpose(2, 0, 1) # HWC2CHW
img = np.ascontiguousarray(img, dtype=np.float32)
return img, scale_ratio, pad_size
def draw_bbox(bbox, img0, color, wt, names):
"""在图片上画预测框"""
det_result_str = ''
for idx, class_id in enumerate(bbox[:, 5]):
if float(bbox[idx][4] < float(0.05)):
continue
img0 = cv2.rectangle(img0, (int(bbox[idx][0]), int(bbox[idx][1])), (int(bbox[idx][2]), int(bbox[idx][3])),
color, wt)
img0 = cv2.putText(img0, str(idx) + ' ' + names[int(class_id)], (int(bbox[idx][0]), int(bbox[idx][1] + 16)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
img0 = cv2.putText(img0, '{:.4f}'.format(bbox[idx][4]), (int(bbox[idx][0]), int(bbox[idx][1] + 32)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
det_result_str += '{} {} {} {} {} {}\n'.format(
names[bbox[idx][5]], str(bbox[idx][4]), bbox[idx][0], bbox[idx][1], bbox[idx][2], bbox[idx][3])
return img0
在完成推理后,输出模型的推理结果同时保存推理图像
3
有害垃圾
1
厨余垃圾
2
其他垃圾
4
可回收垃圾
1
厨余垃圾
4
可回收垃圾
经过测试发现,推理一张图像耗费的时间大约为16-20ms之间,后续还有优化的空间
handler img 18.02ms
hanlder img 16.01ms
handler img 19.92ms
使用总结
1、开发流程和官方文档较为完善,整个流程还是比较顺畅的,降低了使用的学习成本。
2、同时在AI算力上,推理的速度也非常给力,npu的推理速度可以满足大部分的实时处理需求,能够满足我做一些diy的智能家居方向。
3、丰富的硬件功能,Orang ai pro 配备了丰富的硬件接口,给开发更复杂的AI应用提供了更多可能性。
总体来说,Orang AI Pro 强大的AI能力和便捷的使用体验,还是给我留下了美好的印象,未来我也希望能通过Orange AI Pro 创作出更多的AI应用。