第七届⼯程训练⽐赛之智能垃圾分类
2021第七届⼯程训练综合能⼒竞赛之智能垃圾分类
前⾔
写在前⾯:第⼀次写博客,想把这半年的备赛经历记录下来分享分享给⼤家,如有错误欢迎⼤家指正。
⽐赛成绩:1分23秒(播放宣传⽚到满载结束)
基本配置:
1.硬件:STM32  双直流电机驱动        OV5640摄像头  显⽰屏    996(995)舵机    稳压模块
2.软件:yolov3  maixpyIDE    (下载固件)山寨版范冰冰
3⼈员:⼤⼆本科⽣三⼈团队(两机械⼀电控)本⼈电控
⽐赛简介
省赛与4⽉26⽇开始,26⽇晚提交作品,27⽇上午9:30到11:30训练⼗种垃圾:⼩号矿泉⽔瓶,易拉
我的女孩主题曲罐,⼀号电池,⼆号电池,五号电池(全为南孚),棉签,烟头,碎瓷⽚,⼩西红柿,切割过的胡萝⼘(⽚状)。⽐赛现场,两组⼀起进场地⽐赛,我们组成绩为1分23秒(播放宣传⽚到满载结束),时间排名第⼀,⽂档17分综合排名第⼆。观看了很多学校的垃圾分类装置,开发板顶配是英伟达,⼤部分是树莓派或openmv,还有的正点原⼦精英板。我们的垃圾桶包装也很到位,没有线外露,贴了壁纸,视觉效果还可以。
⼼路历程
接到这个项⽬的时候,刚⽐完校内赛。那会已经熟练掌握STM32f103。看完赛题之后,就是⽹上查阅资料,机器视觉,图像分类这些字眼第⼀次飘进我的⼤脑。因为没接触过,更是⼀脸懵。不过还好有电控学长带着,最初确定了⽅案是openmv+stm32。于是开始研究,就此开启了python的学习之路。在花了两周左右搞出来垃圾识别的时候,发现openmv很烫⼿(烫⼿宝1号)⽽且引脚⼝很少,满⾜不了⽐赛要求。在四川省赛结束后,重新确定⽅案:(烫⼿宝2号)+ stm32。在确定树莓派这段时间,看到⼀篇,对我那会帮助很⼤。感谢这位博主,让我学会⽤opencv-python识别⾃定义物体。学会之后实践识别垃圾,发现根本达不到⽐赛要求,识别率特别低,基本识别不出来。所以接下来就去⽼⽼实实的学习tensorflow去了,顺便进⼊了树莓派安装各种依赖的时期。树莓派没搞多久,学校放假。带回家研究了⼏天,想着在树莓派上装pycharm运⾏代码识别垃圾,但是最终效果很卡很卡,在⽹上⼜查阅到⽤树莓派实现垃圾分类的,也很有帮助。但是因为时间太紧,还有其他原因,最终没能按照
这位博主所写的⾛下来就换了K210。亚博K210的资料很全⾯但是使⽤的是C语⾔,⽹上开源的关于图像识别的编程语⾔绝⼤部分都是python语⾔。某次不经意间看到B站上的,⽤的K210是maixpy,就想着把他这⼀套放在我都亚博的开发板上。感谢⽼天,我成功了!后来才知道两款K210芯⽚都⼀样所以可以使⽤。⽽且maix的开发板是基于openmv的,所有的资料教程以及maixIpyDE也是基于openmv的IDE。所以,在有之前的openmv基础,很快上⼿,每天都有⼤突破。⼀周左右就能识别⾃定义垃圾,识别率在80%左右。之后的事情就简单了,训练模型,提⾼识别率。
K210的使⽤相关参数
K210的摄像头
K210的板载摄像头是ov2640,200万像素,识别视野⼩,识别倒是可以,但是为了⽐赛,为了识别⼩的垃圾,得更换更⾼像素的摄像头。这⾥的坑:不要什么⼴⾓摄像头,个⼈觉得24P引脚的⼴⾓摄像头都有畸变,不建议使⽤,这⾥推荐使⽤ov5640摄像头,500万⾼像素,识别视野相⽐ov2640更⼤点。如图所⽰
ov2640
ov5640
K210数据采集
K210的本地训练
写的特别详细,⼤家都能看懂,主要阐述⼀下我踩过的坑:
⾸先,需要⼀台有 Linux 系统的电脑 如果你的主⼒系统是 Windows, 你可以⽤以下系统环境:使⽤虚拟机, virtual box 或者 vmware 都可以, 系统推荐安装Ubuntu20.04。
或者安装双系统,安装⽅法请⾃⾏搜索学习,或者看(博主写的很详细)
这⾥必须说⼀点,虚拟机不能使⽤GPU,只能通过双系统使⽤GPU
的⽅法很详细我在这⾥不做赘述。接下来的使⽤⽅法摘抄于仓库的 , 如果有出⼊, 以仓库的
CPU本地
如下是本地训练部分代码
import os
curr_dir = os.path.abspath(os.path.dirname(__file__))
# kmodel convert
# "/ncc/ncc"  # download from github/kendryte/nncase/releases/tag/v0.1.0-rc5 ncc_kmodel_v3 =  os.path.join(curr_dir, "..", "tools", "ncc", "ncc_v0.1/ncc")
sample_image_num = 20      # convert kmodel sample image (for quantizing)
一加一等于我爱你
# train
allow_cpu = True # True
# classifier
classifier_train_gpu_mem_require = 2*1024*1024*1024
classifier_train_epochs = 70
classifier_train_batch_size = 5
classifier_train_max_classes_num = 15
你就像那一把火
classifier_train_one_class_min_img_num = 40            # ⼀个类别中⾄少需要的样本数量
classifier_train_one_class_max_img_num = 2000          # ⼀个类别中最多需要的样本数量classifier_result_file_name_prefix = "maixhub_classifier_result"
# detector
detector_train_gpu_mem_require = 2*1024*1024*1024邓超
detector_train_epochs = 40
detector_train_batch_size = 5
detector_train_learn_rate = 1e-4
detector_train_max_classes_num = 15        # 最多能训练多少类
detector_train_one_class_min_img_num = 100            # ⼀个类别中⾄少需要的样本数量
本地训练的好处:classifier_train_epochs = 70(迭代次数可以修改,⽹站上模型训练默认迭代40次)数据集训练压缩包没有20MB限制!这就很⽜批,我最初担⼼的要是⽐赛⼗多种垃圾会不会因为数据集压缩包太⼤⽆法训练,如此看来是多余的。最主要的好处就是,不⽤排队,⽹站训练得排队等候服
务器,每次只能⼀个⽤户训练,少则半⼩时四⼗分钟,多则⼀两⼩时,排队多了甚⾄⼀天都有可能。本地训练随时可以,我的数据集2000左右基本上训练时间在四⼗分钟左右(vmware虚拟机训练),这也是我搞本地训练的初衷。
K210训练注意事项
1. 本地训练数据集虽然没有⽹站上那样要求⼩于20MB,但是数据集越多,训练时间越长。⽽且也不是训练时间久效果就越好,⼀般迭
代次数在60左右,当loss降到0.1左右,accuracy为0.9左右时模型效果还算可以。
2. 本地训练也要求每张数据集格式为224*224。
长安歌
3. ⾃定义物体识别本地训练时,要求各物体数据集差别明显,背景丰富,各物体数据集数量建议200+。
4. 同⼀数据集每次训练出来的模型效果都不⼀样。
5. 拍照采集数据集时,建议保证光亮环境。
K210的垃圾分类关键代码:
部分代码如下
if plist.index(pmax)==4:  #other      其他垃圾