带你动手做AI版的垃圾分类
本文分享自华为云社区《ModelBox社区案例使用YOLOX做垃圾分类云社区华为云》,作者:HWCloudAI。
本案例将使用YOLOX模型,实现一个简单的垃圾分类应用,最终效果如下所示:
本案例所需资源(代码、模型、测试数据等)均可从garbagedet下载(https:pan。baidu。coms1zvHR3Q1jHonogKPTSmwEQg?pwdiiuc)1。1模型训练与转换
模型采用的是YOLOX网络结构,YOLOX是YOLO系列的优化版本,引入了解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展,拥有较好的精度表现,同时对工程部署友好。训练使用的是华为云杯生活垃圾图片分类数据集,该数据集包含一次性快餐盒、果皮果肉、旧衣服等44个类别,共14964张图片。其中,训练集与验证集划分比例为41,下图为模型迭代个300个Epoch取得的结果:
ModelArts提供了包括数据标注,训练环境,预置算法在内的丰富的功能,甚至可以通过订阅预置算法实现0代码的模型训练工作。当然你也可以在本地训练自己的模型。我们假设你现在已经拥有了训练好的模型,接下来我们需要将训练好的模型转换成为可以在开发板上运行的模型。我们发布了开发板模型转换案例,参见RK3568模型转换验证案例AIGalleryNotebook详情开发者华为云:
在这个案例中我们演示了从环境适配到模型的转换验证的全流程样例代码,开发者可以通过RuninModelArts一键将Notebook案例在ModelArts控制台快速打开、运行以及进行二次开发等操作。1。2应用开发
打开VSCode,连接到ModelBoxsdk所在目录或者远程开发板,开始进行垃圾分类应用的开发。下面以RK3568版本为例进行说明,其他版本与之类似。1。2。11)下载模板
执行pythonsolution。pyl可看到当前公开的技能模板:pythonsolution。pyl。。。Solutionsname:maskdetyolo3handdetyoloxhandtrackingyoloxsinglehandposeyoloxmbv2multihandposeyoloxmbv2
结果中的handdetyolox即为手部检测应用模板,可使用如下命令下载模板:pythonsolution。pyshanddetyolox。。。
solution。py工具的参数中,l代表list,即列出当前已有的模板名称;s代表solutionname,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox核心库的solution目录下。1。2。22)创建工程
在ModelBoxsdk目录下使用create。py创建garbagedet工程,末尾s参数,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。modelboxpythoncreate。pytserverngarbagedetshanddetyoloxsdkversionismodelboxxxxsuccess:creategarbagedetinmodelboxworkspace
workspace目录下将创建出garbagedet工程,工程内容如下所示:garbagedetbinmain。bat:应用执行入口mocktask。toml:应用在本地执行时的输入输出配置,此应用默认使用本地视频文件为输入源,最终结果输出到另一本地视频文件,可根据需要修改CMake:存放一些自定义CMake函数data:存放应用运行所需要的图片、视频、文本、配置等数据hand。mp4:手部检测测试用视频文件替换为自己的视频dependencemodelboxrequirements。txt:应用运行依赖的外部库在此文件定义etcflowunit:应用所需的功能单元存放在此目录cpp:存放C功能单元编译后的动态链接库,此应用没有C功能单元yoloxpost:手部检测使用的是YOLOX模型,此处即为后处理功能单元(修改toml文件的类别参数和py文件的draw函数)flowunitcpp:存放C功能单元的源代码,此应用没有C功能单元graph:存放流程图garbagedet。toml:默认流程图,使用本地视频文件作为输入源garbagedetcamera。toml:摄像头输入对应的流程图modelbox。conf:modelbox相关配置hilensdatadir:存放应用输出的结果文件、日志、性能统计信息model:推理功能单元目录detecthand:手部检测推理功能单元detecthand。toml:手部检测推理功能单元的配置文件yoloxhand。onnx:手部检测onnx模型更改为自己的模型buildproject。sh:应用构建脚本CMakeLists。txtrpm:打包rpm时生成的目录,将存放rpm包所需数据rpmcopyothers。sh:rpm打包时的辅助脚本1。2。33)修改后处理功能单元yoloxposta。修改yoloxpost。toml流程图,将其内容修改为(以Windows版ModelBox为例):
b。修改yoloxpost。py的draw函数实现如下:defdraw(self,img,bboxes):h,w,cimg。shapethickness2fontscale1textfontcv2。FONTHERSHEYSIMPLEXclsstotext{0:Disposablesnackbox,1:Booksandpapers,2:Powerbank,3:Leftovers,4:Package,5:Trashcan,6:Plasticutensils,7:Plastictoys,8:Plasticcoathanger,9:BigBones,10:Drybattery,11:Expresspaperbag,12:Plugwire,13:Oldclothes,14:Thecan,15:Pillow,16:Skinandpulp,17:Stuffedanimal,18:Defacingplastic,19:Soiledpaper,20:Toiletries,21:Cigarettebutts,22:Toothpick,23:Glassware,24:Block,25:Chopsticks,26:Cartoncarton,27:Pot,27:Tearesidue,29:Vegetablehelpvegetableleaf,30:Shell,31:Thespicebottle,32:Paste,33:Expireddrugs,34:Bottle,35:Metalkitchenware,36:Metalware,37:Metalfoodcans,38:Pot,39:Ceramicvessels,40:Shoes,41:Edibleoildrum,42:Beveragebottle,43:Bones}forboxinbboxes:x1,y1,x2,y2,score,clssboxcv2。putText(img,clsstotext〔int(clss)〕:{:。3}。format(score100),(int(x1w)10,int(y1h)30),textfont,fontscale,(0,int(clss1)5,0),thickness)cv2。rectangle(img,(int(x1w),int(y1h)),(int(x2w),int(y2h)),(0,int(clss1)5,0),3)1。2。44)修改输入输出配置
我们需要准备一个mp4文件拷贝到data文件夹下,我们使用测试视频garbage。mp4,然后打开工程目录下binmocktask。toml文件,修改其中的任务输入和任务输出配置为如下内容:〔input〕typeurlurl。。datagarbage。mp4〔output〕typelocalurlhilensdatadirgarbagedetectionresult。mp4
该流程图在本地运行时的逻辑过程是:datasourceparser解析binmocktask。toml文件中输入配置的datagarbage。mp4文件,videodemuxer和videodecoder对该文件进行解码,resize、packedplanartranspose、normalize对原始图像进行缩放、转码、归一化等预处理,然后detectgarbage在预处理后的图像上进行垃圾检测,yoloxpost从推理结果中解码出检测框,并把检测框画到原始图像上,最后videoout将图像输出到binmocktask。toml文件中输出配置的hilensdatadirgarbagedetectionresult。mp4文件中。1。2。55)用启动脚本执行应用
启动应用前执行buildproject。sh进行工程构建,该脚本将编译自定义的C功能单元(本应用不涉及)、将应用运行时会用到的配置文件转码为Unix格式(防止执行过程中的格式错误):。buildproject。shdos2unix:convertingfilexxx。tomltoUnixformat。。。。。。buildsuccess:youcanrunmain。batin。binfolderPress‘p’topause,anykeytoexit
然后执行binmain。bat运行应用:。binmain。bat
运行结束后在hilensdatadir目录下生成了garbagedetectionresult。mp4文件,可以打开查看:
1。2。66)用摄像头检测
打开工程目录下binmocktask。toml文件,修改其中的任务输入和任务输出配置为如下内容:〔input〕typeurlurl0表示0号摄像头,即PC自带摄像头,若PC无摄像头需外接USB摄像头〔output〕typelocalurl0:garbagedet表示名为garbagedet的本地窗口
即使用编号为0的摄像头(默认为PC自带的摄像头),输出画面显示到名为garbagedet的本地屏幕窗口中。1。2。77)运行应用
执行binmain。batcamera运行应用,将会自动弹出实时的垃圾分类检测画面:
1。3打包部署1。3。1打包
调试完成后,同样可以通过create。py脚本将应用打包发布:python。create。pytrpmngarbagedet
控制台中输出:sdkversionismodelboxwin10x641。1。0。5callmbpkgtoolpack〔folder〕〔rpmfile〕tobuildingrpm,waiting。。。success:creategarbagedet。rpminD:modelboxwin10x641。1。0。5workspacegarbagedet
等待稍许,可以看到项目工程下已经生成了rpm文件夹和打包好的应用:
1。3。2部署
将打包好的应用上传至华为云账号下的obs桶中:
在专业版设备管理中选择一个开发板,
点击创建部署:
最后添加作业:
这样我们就已经完成了一个AI应用,从模型训练到转换到开发到部署的全部流程。
关于ModelBox核心概念、功能单元和流程图开发的更多介绍,可查看ModelBox手册。
点击下方,第一时间了解华为云新鲜技术
华为云博客大数据博客AI博客云计算博客开发者中心华为云
华为云开发者联盟