分类网模型的实现主要是依靠Taurus(Hi3516DV300)套件实现。

数据集收集
本项目使用的数据集图片属性为(720,540,3),适用于有关垃圾分类相关场景的使用,覆盖了日常生活中绝大多数的垃圾类型,包含可回收垃圾、有害垃圾、厨余垃圾、其他垃圾四大垃圾。


环境搭建
(一)安装Anaconda
在 linux 命令端输入
1
| wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh
|
以及
1
| bash Anaconda3-5.2.0-Linux-x86_64.sh
|
(二)配置环境
修改bashrc文件,路径进行替换,随后创建 conda 虚拟环境,并激活,conda create -n open-mmlab python=3.6,同样修改bashrc,linux开启自动激活。

(三)安装torch 和 torchversion
先查看CUDA 版本,随后通过 pip命令下载torch 和 torchversion。
(四)下载代码并安装对应的库
进入github仓库下载代码,放到对应位置后,下载库pip install -e


模型训练
选用resnet18,分16类,训练参数如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| model = dict( type='ImageClassifier', backbone=dict( type='ResNet', depth=18, num_stages=4, out_indices=(3,) style='pytorch'), neck=dict(type='GlobalAveragePooling'), head=dict( type='LinearClsHead', num_classes=16, in_channels=512, loss=dict(type='CrossEntropyLoss',loss_weight=1.0), topk=(1,5), ))
|
1 2 3 4 5 6
| optimizer = dict(type='SGD',Ir=0.01,momentum=0.9,weight_decay=0.001) optimizer_config = dict(grad_clip=None)
Ir_config = dict(policy='step',step=[25,35,45]) runner = dict(type='EpochBasedRunner,max_epochs=50)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| dataset_type ='ImageNet' img_norm_cfg = dict( mean=[127.5,127.5,127.51,std=[127.5,127.5,127.51,to rgb=True) train_pipeline = [ dict(type='LoadlmageFromFile'), dict(type='Resize',size=(256,256)), dict(type='RandomFlip',flip_prob=0.5,direction='horizontal'), dict(type='Normalize',**img_norm_cfg), dict(type='ImageToTensor',keys=['img']), dict(type='ToTensor',keys=['gt_label']), dict(type='Collect',keys=['img','gt_label']) ] test_pipeline = [ dict(type='LoadlmageFromFile'), dict(type='Resize',size=(256,256)), dict(type='CenterCrop',crop_size=224), dict(type='Normalize',**img_norm_cfg), dict(type='ImageToTensor',keys=['img']), dict(type='Collect',keys=['img']) ]
data = dict( samples_per_gpu=32, workers_per_gpu=1, train=dict( type=dataset_type, data_prefix='/home/ubuntu/classify_dataset', pipeline=train_pipeline), val=dict( type=dataset_type,
|
调用以下语句使用1个GPU进行训练
1
| python ./tools/dist_train.sh configs/resnet/resnet18_b32x8_imagenet.py --work-dir ./ckpt3
|

网络模型转化
修改resnet_pytorch_2_caffe.py文件,并转换生成resnet18.caffemodel 和 resnet18.prototxt。修改.prototx 网络文件,并得到我们的网络模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import sys sys.path.insert(0,'.') import torch from torch.autograd import Variable from torchvision.models import resnet import pytorch to caffe
if name=='_main_': name='resnet18' resnet18=resnet.resnet18(num classes=16) checkpoint = torch.load("/home/ubuntu/mmclassification/ckpt3/latest.pth") new_sd = {} for k,v in checkpoint['state dict'].items(): if not k.endswith('num batches tracked'): if k.startswith(backbone): k_new = k.split('backbone.')[1] if k.startswith('head.'): k_new = k.split('head.')[1] new_sd[k new]=v resnet18.load_state_dict(new_sd) resnet18.eval() input=torch.ones([1,3,224,224]) pytorch_to_caffe.trans_net(resnet18,input,name) pytorch_to_caffe.save_prototxt('{}.prototxt'.format(name)) pytorch_to_caffe.save_caffemodel('{}.caffemodel'.format(name))
|

模型量化
利用RuyiStudio生成wk文件:
- mean.txt 制作
- imagelist.txt 制作
- 配置 Input_Setting
- Mapper Setting 配置
- Dynamic Parameters 配置

之后在板子上运行会出现下面错误:
[Level]:Error,[Func]:SAMPLE_COMM_SVP_NNIE_LoadModel [Line]:560
[Info]:Error,HI_MPI_SVP_NNIE_LoadModel failed!
[Level]:Error,[Func]:SAMPLE_SVP_NNIE_Yolov3 [Line]:3110
出现这个问题是因为仿真环境和板子上运行的环境不一样

识别控制
修改cnn_trash_classify.c文件,并且加入训练好的垃圾分类的wk文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| if(score < THRESH_MIN){ break; }
SAMPLE_PRT("---trash item flag---num:%d,score:%d\n",item->num,score); switch (item->num){ case 0u: case 1u: case 2u: case 3u: trashName ="Kitchen Waste"; SAMPLE_PRT("---trash name---:%s\n",trashName); break; case 4u: case 5u: case 6u: case 7u: trashName ="Hazardous Waste"; SAMPLE_PRT("---trash name---:%s\n",trashName); break; case 8u: case 9u: case 10u: case 11u: trashName ="Recyclable Waste"; SAMPLE_PRT("---trash name---:%s\n",trashName); break; case 12u: case 13u: case 14u: case 15u: trashName ="Other Waste"; SAMPLE_PRT("---trash name---:%s\n",trashName); break; default: trashName ="Unkown Waste"; SAMPLE_PRT("---trash name---:%s\n",trashName); break; } UartTestSample(item->num); return HI_SUCCESS:
|
板端部署与调试
- 执行 make clean && make,对 hispark_taurus_nnie_sample 进行编译;
- 将 sample_nnie_main 这个可执行文件,拷贝到/home/hispark/code/HiSpark_Hi3516DV300_SDK_SPC021/osdrv/pub/rootfs_glibc/rot/目录下;
- 接下来需要制作文件系统,命令为cd /home/ubuntu/code/HiSpark_Hi3516DV300_SDK_SPC021./build.sh ext4
- 使用 HiTool 工具进行烧录

模型验证
分类效果良好。
鸣谢:廉廉子、城城子、杰杰子、皓皓子