带你动手做AI版的垃圾分类
本文分享自华为云社区《ModelBox社区案例 - 使用YOLOX做垃圾分类-云社区-华为云》,作者:HWCloudAI。
本案例将使用YOLOX模型,实现一个简单的垃圾分类应用,最终效果如下所示:
本案例所需资源(代码、模型、测试数据等)均可从garbage_det下载(https://pan.baidu.com/s/1zvHR3Q1jHonogKPTSmwEQg?pwd=iiuc)1.1 模型训练与转换
模型采用的是YOLOX网络结构,YOLOX是YOLO系列的优化版本,引入了解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展,拥有较好的精度表现,同时对工程部署友好。训练使用的是"华为云杯"生活垃圾图片分类数据集,该数据集包含一次性快餐盒、果皮果肉、旧衣服等44个类别,共14964张图片。其中,训练集与验证集划分比例为4/1,下图为模型迭代个300个Epoch取得的结果:
ModelArts提供了包括数据标注,训练环境,预置算法在内的丰富的功能,甚至可以通过订阅预置算法实现0代码的模型训练工作。当然你也可以在本地训练自己的模型。我们假设你现在已经拥有了训练好的模型,接下来我们需要将训练好的模型转换成为可以在开发板上运行的模型。我们发布了开发板模型转换案例,参见RK3568模型转换验证案例→AI Gallery_Notebook详情_开发者_华为云:
在这个案例中我们演示了从环境适配到模型的转换验证的全流程样例代码,开发者可以通过"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_posta. 修改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博客_云计算博客_开发者中心-华为云
#华为云开发者联盟#
走国道北京到成都沿途有什么风景或者小城值得停留?题主应该是想要从北京出发自驾游去成都,沿途亲子游观光游,并没有明确的行程规划和目标。那么,想必题主应该对北京到成都的自驾路线有个最基本的认识。北京到成都,比较便捷的自驾游方案可以分
吉林这6个地方不输张家界,你知道是哪儿吗?说到国内游,很多朋友想到的首先就是张家界九寨沟骊山等等其实就在咱们国内的吉林,也有很多景致同样让人流连忘返,不输张家界。今天就跟大家说一说,吉林好玩的这六个地方,不比张家界差。首先
有人说,孙颖莎没有主管教练才会输给王曼昱,你认同这个说法吗?沙沙的技木己达到项级了,人品更胜一筹己无遗憾,一个人在事业上有人往上拽也有人往上推才能达到顶峰,也就是说有人帮,教练呢认同,当过运动员的都清楚,大赛之际,主管教练是自己的主心骨,而
为什么作为刘国梁的河南老乡,邓亚萍没有进入国乒教练组任职呢?邓亚萍进入国乒教练队伍去领导刘国梁?还是刘国梁去领导邓亚萍呢?当时谁的名声最大,但刘国梁的教练是蔡振华?已是刘的上司?邓往那里放,再者邓亚萍当时是副部长,奥运村的领导!邓自己也不会
人民日报发文赞赏孙颖莎,是认可陈玘以后能正式当孙颖莎的教练吗陈玘现在还是马龙许昕的主管教练,世界杯期间只是临时客串一下孙颖莎的教练,虽然效果很好,两人配合也很默契,得到大多数真正的球迷认可(一小撮饭圈儿和莎黑除外)。马龙许昕还未退役,相信国
泰森那么厉害,奥运会成绩为什么那么差?泰森年轻的时候18岁,参加过奥运会的美国国内选拔赛。但是他被蒂尔曼两次击败。泰森的类型,是个子比较矮,只有1米82,他臂展也不是特别长,所以说在奥运会的这种规则中,像他这样矮粗的类
株洲出过哪些体育明星?18岁株洲伢子200米蛙泳破全国纪录夺冠2017年全国游泳冠军赛在青岛展开角逐。男子200米蛙泳决赛中,1999年出生的株洲伢子覃海洋上演精彩好戏,夺得冠军,并打破泳坛名将毛飞廉保
陈梦世界第一宝座不稳,奥运会后她为何连丢世乒赛和世界杯冠军?陈梦世界排名第一好几年了,宝座一直稳得很!她先得世界杯金牌,后夺东京奥运会冠军,同时总决赛四连冠,这在现役的世界女子选手中不愧第一人!从目前的积分看,陈梦13100分,孙颖莎125
初中作文能矫情到什么程度?哈哈哈哈,每周周考每月月考,每次考语文总要我们写一篇六百字!积极向上!真挚动人!感情充沛的记叙文!可是初中生真的没有故事啊!年纪轻轻,涉世未深,从小到大都是在家庭和学校两点奔波,哪
为什么现在那么多人犯直肠癌?不仅是直肠癌高发,应该说多种恶性肿瘤发病率都较前增加,原因主要是遗传因素和大的环境因素导致的。(0729)直肠癌的高危因素1遗传因素曾经讲到过,结直肠癌具有一定的遗传倾向。但是不是
有人说骨头汤不能补钙而且嘌呤多,还应该喝骨头汤吗?你好,非常高兴为你解答问题,骨头汤补钙以讹传讹已经好多年了,记得我小时候,母亲就经常逼我喝骨头汤,我天生怕油腻,一见骨头汤就饱了,可母亲总是淳淳诱导我,喝骨头汤补钙,能长大个子,一
39岁男人被体制内单位开除,失业心灰意冷,能做什么继续谋生呢?体制内要把一个人开除肯定是有原因的,很大概率就是触犯了刑法。我认识一个人嫖娼被抓了也只是年终考核最低档加扣发当年奖金。我也见过好几个被双开的体制内的人,现在他们都有工作,不说多好吧
助听器对小儿早起听觉干预重要吗?针对儿童听障患者,我们要遵守三早原则,早发现,早诊断,早干预。儿童在生长发育期,听觉和言语以及智力等等发育息息相关的,建议您到大型的医院或者专业的听力连锁机构咨询。正常孩子刚出生时
能不能分享一下你家花盆里养的花?当然愿意了,我特别喜欢花,也爱养花,大大小小几十盆花,有的夏天开花,有的冬天开花,看到自己精心培养的花从一个小叶片,慢慢的长成一棵花树,特别高兴。每天早晨睁开眼就去阳台看花,浇浇水
会不会取代微信?今曰头条是大众化和带有商业化的信息共享互相交流平台。微信是互相比较信任和了解比此用来交流沟通的一个软件,比如亲朋好友和合作伙伴和最亲的人才会加微信。今日头条是无法取代微信的!!微信
什么样的晚餐会有效节食且有饱腹感?主食以粗粮为主,菜品以青菜为主,肉食(一点蛋白质)为辅的晚餐,这样就会有饱腹感和有效节食。导读常言道一日三餐,早餐要吃好,中餐要吃饱,晚餐要吃少,这是人们在长期生活中总结出来的经验
尿毒症会遗传吗?基本上不会遗传。按照西医的说法,肾炎严重,反复法作,得不到治疗而恶化,就会出现尿血尿少,甚至无尿,而引发尿毒症昏迷。尿毒症的早期症状为浮肿大家好,我是一名肾内科医生,有很多人一直都
为何支付宝和微信转钱进去不给活期利息转钱出来却要1手续费?朋友们好,先更正一点,在支付宝和微信,转钱进去,是没有利息的,是一种投资理财收益。这个问题很严肃。实际上实际上涉及到,三个问题1,为什么会收费。2,巧妙选择支付宝和微信的产品,使用
有人觉得csgo越来越像cf你赞同吗?为什么?您好,我是波杰克我不赞同如果有玩家觉得csgo引导玩家消费的渠道越来越多,我觉得说得没错,着的确是v社正在做的。但如果是cago越来越像cf,笔者不敢苟同。原因分三个其一,要说相似
你认为谁才是国产单机最大的毒瘤?问题描述用蔡明宏,姚壮宪和徐昌隆来做例子,说他们的游戏越做越烂,是毒瘤,大多还是因为技术问题而非画面。(没人指望国产游戏的画面吧)做的差,我们不理就是了,买断制可是按照销量算钱的。
你如何看待休斯敦世乒赛抽签结果?男单包揽冠亚军不可能了?世锦赛抽签揭晓,球迷一片哗然,几乎是无人欢喜多家愁。女乒犹可,不管怎么抽,冠军不会旁落她手,甚至有包揽冠亚军乃至四强的可能。男乒则不然,偶然性增大,且有失冠的可能性。先说女乒,陈梦
你家孩子一年级时需要家长读题吗?现在学前班,绘本基本自己读了,早都不给读题了一年级需要家长读题的孩子都是在学龄前没有进行识字教育的,表面上看是孩子不认字,实际上,孩子在理解能力和表达能力上已经输给人家了,如果不加