本文共享自华为云社区《ModelBox社区事例 – 运用YOLOX做废物分类》,作者:HWCloudAI。

本事例将运用YOLOX模型,实现一个简略的废物分类运用,终究效果如下所示:

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

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

1.1 模型练习与转化

模型采用的是YOLOX网络结构,YOLOX是YOLO系列的优化版别,引入了解耦头、数据增强、无锚点以及标签分类等目标检测范畴的优秀进展,具有较好的精度体现,一起对工程布置友爱。练习运用的是“华为云杯”生活废物图片分类数据集,该数据集包含一次性快餐盒、果皮果肉、旧衣服等44个类别,共14964张图片。其间,练习集与验证集划分份额为4/1,下图为模型迭代个300个Epoch取得的成果:

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

ModelArts供给了包括数据标注,练习环境,预置算法在内的丰富的功用,甚至能够经过订阅预置算法实现0代码的模型练习工作。当然你也能够在本地练习自己的模型。咱们假定你现在现已具有了练习好的模型,接下来咱们需求将练习好的模型转化成为能够在开发板上运转的模型。咱们发布了开发板模型转化事例,参见RK3568模型转化验证事例:

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

在这个事例中咱们演示了从环境适配到模型的转化验证的全流程样例代码,开发者能够经过“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为例):

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

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_demuxervideo_decoder对该文件进行解码,resizepacked_planar_transposenormalize对原始图像进行缩放、转码、归一化等预处理,然后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文件,能够打开检查:

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

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运转运用,将会主动弹出实时的废物分类检测画面:

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

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文件夹和打包好的运用:

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

1.3.2 布置

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

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

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

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

点击创立布置:

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

最终增加作业:

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

这样咱们就现已完成了一个AI运用,从模型练习到转化到开发到布置的全部流程。

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

关于ModelBox中心概念、功用单元和流程图开发的更多介绍,可检查ModelBox手册。

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