带你动手做AI版的垃圾分类

动手做,ai,垃圾,分类 · 浏览次数 : 72

小编点评

**AI垃圾分类流程图** **步骤1:数据源解析** - 使用ModelBox手册中的model_loader接口从obs桶中读取数据。 **步骤2:模型训练** - 使用ModelBox手册中的model_loader接口从数据中训练模型。 **步骤3:模型转换** - 使用ModelBox手册中的model_loader接口从训练模型中提取模型转换参数。 **步骤4:流程图开发** - 使用ModelBox手册中的流程图模块从模型转换参数中构建流程图。 **步骤5:模型部署** - 使用ModelBox手册中的模型_loader接口从训练模型中提取模型部署参数。 - 将模型部署到华为云账号下的obs桶中。 **步骤6:应用部署** - 使用ModelBox手册中的模型_loader接口从模型部署参数中加载模型和配置。 - 启动应用并进行垃圾分类检测。

正文

摘要:本案例将使用YOLOX模型,实现一个简单的垃圾分类应用。

本文分享自华为云社区《ModelBox社区案例 - 使用YOLOX做垃圾分类》,作者:HWCloudAI。

1 ModelBox社区案例 - 使用YOLOX做垃圾分类

本案例将使用YOLOX模型,实现一个简单的垃圾分类应用,最终效果如下所示:

本案例所需资源(代码、模型、测试数据等)均可从garbage_det下载

1.1 模型训练与转换

模型采用的是YOLOX网络结构,YOLOX是YOLO系列的优化版本,引入了解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展,拥有较好的精度表现,同时对工程部署友好。训练使用的是“华为云杯”生活垃圾图片分类数据集,该数据集包含一次性快餐盒、果皮果肉、旧衣服等44个类别,共14964张图片。其中,训练集与验证集划分比例为4/1,下图为模型迭代个300个Epoch取得的结果:

ModelArts提供了包括数据标注,训练环境,预置算法在内的丰富的功能,甚至可以通过订阅预置算法实现0代码的模型训练工作。当然你也可以在本地训练自己的模型。我们假设你现在已经拥有了训练好的模型,接下来我们需要将训练好的模型转换成为可以在开发板上运行的模型。我们发布了开发板模型转换案例,参见RK3568模型转换验证案例

在这个案例中我们演示了从环境适配到模型的转换验证的全流程样例代码,开发者可以通过“Run in ModelArts”一键将Notebook案例在ModelArts控制台快速打开、运行以及进行二次开发等操作。

1.2 应用开发

打开VS Code,连接到ModelBox sdk所在目录或者远程开发板,开始进行垃圾分类应用的开发。下面以RK3568版本为例进行说明,其他版本与之类似。

1.2.1 1)下载模板

执行python solution.py -l可看到当前公开的技能模板:

███ $ python solution.py -l

...

Solutions name:

mask_det_yolo3

…

hand_det_yolox

hand_tracking_yolox

single_hand_pose_yolox_mbv2

multi_hand_pose_yolox_mbv2

结果中的hand_det_yolox即为手部检测应用模板,可使用如下命令下载模板:

███ $ python solution.py -s hand_det_yolox

...

solution.py工具的参数中,-l 代表list,即列出当前已有的模板名称;-s 代表solution-name,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox核心库的solution目录下。

1.2.2 2)创建工程

ModelBox sdk目录下使用create.py创建garbage_det工程,末尾-s参数,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。

███/modelbox$ python create.py -t server -n garbage_det -s hand_det_yolox

sdk version is modelbox-xxx

success: create garbage_det in ███/modelbox/workspace
workspace目录下将创建出garbage_det工程,工程内容如下所示:


garbage_det

|--bin

│  |--main.bat:应用执行入口

│  |--mock_task.toml:应用在本地执行时的输入输出配置,此应用默认使用本地视频文件为输入源,最终结果输出到另一本地视频文件,可根据需要修改

|--CMake:存放一些自定义CMake函数

|--data:存放应用运行所需要的图片、视频、文本、配置等数据

│  |--hand.mp4:手部检测测试用视频文件—>替换为自己的视频

|--dependence

│  |--modelbox_requirements.txt:应用运行依赖的外部库在此文件定义

|--etc

│  |--flowunit:应用所需的功能单元存放在此目录

│  │  |--cpp:存放C++功能单元编译后的动态链接库,此应用没有C++功能单元

│  │  |--yolox_post:手部检测使用的是YOLOX模型,此处即为后处理功能单元(修改toml文件的类别参数和py文件的draw函数)

|--flowunit_cpp:存放C++功能单元的源代码,此应用没有C++功能单元

|--graph:存放流程图

│  |--garbage_det.toml:默认流程图,使用本地视频文件作为输入源

│  |--garbage_det_camera.toml:摄像头输入对应的流程图

│  |--modelbox.conf:modelbox相关配置

|--hilens_data_dir:存放应用输出的结果文件、日志、性能统计信息

|--model:推理功能单元目录

│  |--detect_hand:手部检测推理功能单元

│  │  |--detect_hand.toml:手部检测推理功能单元的配置文件

│  │  |--yolox_hand.onnx:手部检测onnx模型—>更改为自己的模型

|--build_project.sh:应用构建脚本

|--CMakeLists.txt

|--rpm:打包rpm时生成的目录,将存放rpm包所需数据

|--rpm_copyothers.sh:rpm打包时的辅助脚本

1.2.3 3)修改后处理功能单元 yolox_post

a. 修改yolox_post.toml流程图,将其内容修改为(以Windows版ModelBox为例):

b. 修改yolox_post.py的draw函数实现如下:

def draw(self, img, bboxes):

        h, w, c = img.shape

        thickness = 2

        font_scale = 1

        text_font = cv2.FONT_HERSHEY_SIMPLEX

        clss_to_text = {

        0: "Disposable snack box",

        1: "Books and papers",

        2: "Power bank",

        3: "Leftovers",

        4: "Package",

        5: "Trash can",

        6: "Plastic utensils",

        7: "Plastic toys",

        8: "Plastic coat hanger",

        9: "Big Bones",

        10: "Dry battery",

        11: "Express paper bag",

        12: "Plug wire",

        13: "Old clothes",

        14: "The can",

        15: "Pillow",

        16: "Skin and pulp",

        17: "Stuffed animal",

        18: "Defacing plastic",

        19: "Soiled paper",

        20: "Toiletries",

        21: "Cigarette butts",

        22: "Toothpick",

        23: "Glassware",

        24: "Block",

        25: "Chopsticks",

        26: "Carton carton",

        27: "Pot",

        27: "Tea residue",

        29: "Vegetable help vegetable leaf",

        30: "Shell",

        31: "The spice bottle",

        32: "Paste",

        33: "Expired drugs",

        34: "Bottle",

        35: "Metal kitchenware",

        36: "Metal ware",

        37: "Metal food cans",

        38: "Pot",

        39: "Ceramic vessels",

        40: "Shoes",

        41: "Edible oil drum",

        42: "Beverage bottle",

        43: "Bones"

        }

        for box in bboxes:

            x1, y1, x2, y2, score, clss = box

            cv2.putText(img, clss_to_text[int(clss)]+': '+"{:.3}".format(score*100)+'%', (int(x1 * w)+10, int(y1 * h)+30),text_font, font_scale, (0, int(clss+1)*5, 0), thickness)

            cv2.rectangle(img, (int(x1 * w), int(y1 * h)), (int(x2 * w), int(y2 * h)), (0, int(clss+1)*5, 0), 3)

1.2.4 4)修改输入输出配置

我们需要准备一个mp4文件拷贝到data文件夹下,我们使用测试视频garbage.mp4,然后打开工程目录下bin/mock_task.toml文件,修改其中的任务输入和任务输出配置为如下内容:

[input]

type = "url"

url = "../data/garbage.mp4"

[output]

type = “local”

url = “…/hilens_data_dir/garbage_detection_result.mp4”

该流程图在本地运行时的逻辑过程是:data_source_parser解析bin/mock_task.toml文件中输入配置的data/garbage.mp4文件,video_demuxer和video_decoder对该文件进行解码,resize、packed_planar_transpose、normalize对原始图像进行缩放、转码、归一化等预处理,然后detect_garbage在预处理后的图像上进行垃圾检测,yolox_post从推理结果中解码出检测框,并把检测框画到原始图像上,最后video_out将图像输出到bin/mock_task.toml文件中输出配置的hilens_data_dir/garbage_detection_result.mp4文件中。

1.2.5 5)用启动脚本执行应用

启动应用前执行build_project.sh进行工程构建,该脚本将编译自定义的C++功能单元(本应用不涉及)、将应用运行时会用到的配置文件转码为Unix格式(防止执行过程中的格式错误):

███$ ./build_project.sh

dos2unix: converting file xxx.toml to Unix format...

...

build success: you can run main.bat in ./bin folder

Press ‘p’ to pause…, any key to exit
然后执行bin/main.bat运行应用:

███$ ./bin/main.bat

…

运行结束后在hilens_data_dir目录下生成了garbage_detection_result.mp4文件,可以打开查看:

1.2.6 6)用摄像头检测

打开工程目录下bin/mock_task.toml文件,修改其中的任务输入和任务输出配置为如下内容:

[input]

type = "url"

url = "0"  # 表示0号摄像头,即PC自带摄像头,若PC无摄像头需外接USB摄像头

[output]

type = “local”

url = “0:garbage_det” # 表示名为garbage_det的本地窗口

即使用编号为0的摄像头(默认为PC自带的摄像头),输出画面显示到名为garbage_det的本地屏幕窗口中。

1.2.7 7)运行应用

执行bin/main.bat camera运行应用,将会自动弹出实时的垃圾分类检测画面:

1.3 打包部署

1.3.1 打包

调试完成后,同样可以通过create.py脚本将应用打包发布:

python ./create.py -t rpm -n garbage_det

控制台中输出:

sdk version is modelbox-win10-x64-1.1.0.5

call mb-pkg-tool pack [folder] > [rpm file] to building rpm, waiting...

success: create garbage_det.rpm in D:\modelbox-win10-x64-1.1.0.5/workspace/garbage_det

等待稍许,可以看到项目工程下已经生成了rpm文件夹和打包好的应用:

1.3.2 部署

将打包好的应用上传至华为云账号下的obs桶中:

在专业版设备管理中选择一个开发板,

点击创建部署:

最后添加作业:

这样我们就已经完成了一个AI应用,从模型训练到转换到开发到部署的全部流程。

关于ModelBox核心概念、功能单元和流程图开发的更多介绍,可查看ModelBox手册

 

点击关注,第一时间了解华为云新鲜技术~

与带你动手做AI版的垃圾分类相似的内容:

带你动手做AI版的垃圾分类

摘要:本案例将使用YOLOX模型,实现一个简单的垃圾分类应用。 本文分享自华为云社区《ModelBox社区案例 - 使用YOLOX做垃圾分类》,作者:HWCloudAI。 1 ModelBox社区案例 - 使用YOLOX做垃圾分类 本案例将使用YOLOX模型,实现一个简单的垃圾分类应用,最终效果如下

身未动心已远,AI带你流浪地球

摘要:我们提供了一键运行的notebook AI作画 Dreambooth 生成自定义主体,可以在ModelArts平台上调试开发自己的文生图模型。 本文分享自华为云社区《DreamBooth+LoRA微调生成主体》,作者: 杜甫盖房子 。 DreamBooth+LoRA微调生成主体 文生图风靡一时

带你动手设计一个高速公路多节点温度采集系统

摘要:本篇文章主要介绍设备上云的详细流程,介绍华为云物联网云端产品、设备创建流程,数据转存方式,应用侧开发接口等等。 本文分享自华为云社区《采用华为云IOT平台设计的高速公路多节点温度采集系统(STM32+NBIOT)》,作者:DS小龙哥。 一、前言 当前的场景是,在高速公路上部署温度采集设备,在高

从零开始带你上手体验Sermant自定义插件开发

本文对Sermant的自定义插件开发的流程进行了体验和探索,包括项目编译、运行、动态配置验证、插件拦截原理等内容,希望对初次体验Sermant高效开发插件的开发者有所帮助。

5种GaussDB ETCD服务异常实例分析处理

摘要:一文带你细数几种ETCD服务异常实例状态。 本文分享自华为云社区《【实例状态】GaussDB ETCD服务异常》,作者:酷哥 。 首先确认是否是虚拟机、网络故障 虚拟机故障导致ETCD服务异常告警 问题现象 管控面上报etcd服务异常告警,虚拟机发生重启,热迁移、冷迁移,HA等动作。 问题分析

过亿云资源运维管控难?华为云CloudMap带你喝着咖啡做运维

摘要:华为云站点数字化平台CloudMap携手华为云图引擎GES打造云服务全栈拓扑,网络流量路径和云服务动态依赖等空间关系数据,支撑现网运行态风险识别和分钟级定位定界,构建业界领先的数字化能力。 本文分享自华为云社区《构建站点数字孪生,支撑确定性运维:华为云九洲云图CloudMap》,作者:HWCl

带你彻底搞懂递归时间复杂度的Master公式

网上找到的Master公式推导过程都太过于复杂了,为此我特地找到一种小白也能看懂的推导过程。看完这篇文章后,你会对递归的时间复杂度深谙于心,打死都不会忘记。

带你读AI论文丨针对文字识别的多模态半监督方法

摘要:本文提出了一种针对文字识别的多模态半监督方法,具体来说,作者首先使用teacher-student网络进行半监督学习,然后在视觉、语义以及视觉和语义的融合特征上,都进行了一致性约束。 本文分享自华为云社区《一种针对文字识别的多模态半监督方法》,作者: Hint 。 摘要 直到最近,公开的真实场

带你认识JDK8中超nice的Native Memory Tracking

摘要:从 OpenJDK8 起有了一个很 nice 的虚拟机内部功能: Native Memory Tracking (NMT)。 本文分享自华为云社区《Native Memory Tracking 详解(1):基础介绍》,作者:毕昇小助手。 0.引言 我们经常会好奇,我启动了一个 JVM,他到底会

带你从0到1开发AI图像分类应用

摘要:通过一个垃圾分类应用的开发示例,介绍AI Gallery在AI应用开发流程中的作用。 本文分享自华为云社区《AI Gallery:从0到1开发AI图像分类应用》,作者: yd_269359708 。 现如今,人工智能(AI)技术在计算机领域内,得到了越来越广泛的重视,并在各行各业中得到应用。然