东哥教你如何用Orange Ai pro为家里做一个垃圾分类检测机器

前言

最近入手了一块香橙派(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电脑。

更多的开发板信息可以参考下面的这个硬件配置图

准备

  1. 一块Orange Ai Pro
    相关的硬件资料可参考:Orange Ai Pro 介绍和应用
    购买地址: 淘宝 、京东

  2. 一个USB 摄像头
    主要用于实时检测素材

  3. 外接鼠标、键盘

  4. 显示器
    用于可视化操作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应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/773147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

how to use Xcode

Xcode IDE概览 Xcode 页面主要分为以下四个部分&#xff1a; 工具栏&#xff08;ToolBar area&#xff09;&#xff1a;主要负责程序运行调试&#xff0c;编辑器功能区域的显示 / 隐藏&#xff1b;编辑区&#xff08;Editor area&#xff09;&#xff1a;代码编写区域&#xf…

前端面试题(CSS篇二)

一、请解释一下 CSS3 的 Flex box&#xff08;弹性盒布局模型&#xff09;&#xff0c;以及适用场景 相关知识点: Flex是FlexibleBox的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为Flex布局。行内元素也可…

Unity之VS脚本自动添加头部注释Package包开发

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之VS脚本自动添加头部注释Package包开发 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&…

Swift 中的方法调用机制

Swift 方法调用详解&#xff1a;与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中&#xff0c;Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序&#xff0c;但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…

CD4017 – 带解码输出的十进制计数器

CD4017 IC 是一个十进制计数器&#xff0c;它有 10 个输出&#xff0c;分别代表 0 到 9 的数字。计数器在&#xff08;14号引脚&#xff09;每个时钟脉冲上升时增加 1。计数器达到 9 后&#xff0c;它会在下一个时钟脉冲时从 0 重新开始。 引脚名称管脚 &#xff03;类型描述VD…

【常用工具】Linux命令行Restful接口调试神器——curl脚本

最近的工作经常要涉及到在Linux服务器端和外部系统联调接口&#xff0c;由于Postman无法在命令行使用&#xff0c;这里浅记一个curl脚本模板&#xff1a; #!/bin/bash # 请求标题 TITLE # token信息 TOKEN # url信息 URL # 请求方式 METHODPOST # Restful请求报文 BODYecho -e…

暑假学习DevEco Studio第2天

学习目标&#xff1a; 掌握页面跳转 学习内容&#xff1a; 跳转页面 创建页面&#xff1a; 在“project”窗口。打开“entry>src>main>ets”,右击“pages”&#xff0c;选择“New>ArkTS File”,命名“Second”&#xff0c;点击回车键。 在页面的路由&#xff0…

Go语言--函数类型、匿名函数和闭包

在Go语言中&#xff0c;函数也是一种数据类型&#xff0c;我们可以通过 type 来定义它&#xff0c;它的类型就是所有拥有相同的参数&#xff0c;相同的返回值的一种类型。 语法 通过type给函数类型起名&#xff0c;然后通过名字进行函数的调用 好处&#xff1a;多态 通过统…

【营销策划模型大全】私域运营必备

营销策划模型大全&#xff1a;战略屋品牌屋、电商运营模型、营销战略、新媒体运营模型、品牌模型、私域运营模型…… 该文档是一份策划总监工作模型的汇总&#xff0c;包括战略屋/品牌屋模型、营销战略模型、品牌相关模型、电商运营模型、新媒体运营模型和私域运营模型等&…

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…

C++ | Leetcode C++题解之第216题组合总和III

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<vector<int>> res;void backtracking(int k, int n, vector<int> ans){if(k 0 || n < 0){if(k 0 && n 0){res.emplace_back(ans);}return;}int start (ans.size() 0 ?…

恒创科技:HTTP错误码403禁止意味着什么,怎么修复它?

HTTP错误码403禁止意味着客户端无权访问特定网页或服务器。403 错误表示客户端存在问题&#xff0c;无论用户使用的是哪种网络浏览器&#xff0c;都可能发生这种情况。幸运的是&#xff0c;阻止服务器允许访问特定页面的问题通常可以修复。以下是一些常见原因和相应的解决方案。…

【Android源码】Gerrit安装

前言 如果你打开 https://android.googlesource.com/platform/manifest&#xff0c;就会发现&#xff0c;google官方管理Android源码&#xff0c;使用的是Gerrit。Android系统源码是非常大的&#xff0c;用Git肯定是不适合。对于大型项目&#xff0c;得用Gerrit&#xff0c;今…

背包问题(一)

一.P3985 不开心的金明(01背包变式) 解析: 一开始没有看数据范围,直接当01背包直接写了,结果最后4个测试点RE,一看到数据范围就老实了,1e9的数据,数组直接炸,所以不能直接使用一维的01背包.看了一下题解,部分人是通过极差对数据进行分类,按照300进行分开,使用贪心和dp一起做. …

7_1_SVPWM概述

1、SPWM 正弦脉宽调制法&#xff08;SPWM&#xff09;是将每一正弦周期内的多个脉冲作自然或规则的宽度调制&#xff0c;使其依次调制出相当于正弦函数值的相位角和面积等效于正弦波的脉冲序列&#xff0c;形成等幅不等宽的正弦化电流输出。 通过调整占空比使等效电流近似为正弦…

DT浏览器很好用

DT浏览器是一款简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;软件使用流畅。DT浏览器的网址收藏&#xff0c;人工智能写作&#xff0c;书法笔记等功能与众不同。DT浏览器的图文识别功能和笔记本搭配使用&#xff0c;可以对内容编辑修改和保存…

时序模型综述论文

时序模型综述论文&#xff1a; A Survey of Time Series Foundation Models: Generalizing Time Series Representation with Large Language Model

c++ String

1.string类 还记得我们数据结构学的串吗&#xff0c;现在在c中&#xff0c;我们有了c提供的标准库&#xff0c;它是一个写好的类&#xff0c;非常方便使用 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作strin…

学习笔记——动态路由——OSPF工作原理(SPF算法)

3、SPF算法 SPF算法(最短路径优先算法&#xff0c;也称Dijkstra算法)由荷兰科学家狄克斯特拉于1959年提出的。 SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离&#xff0c;每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图&#xff0c;该…