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

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 settings
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
optimizer = dict(type='SGD',Ir=0.01,momentum=0.9,weight_decay=0.001)
optimizer_config = dict(grad_clip=None)
#learning policy
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 settings
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='RandomResizedCrop',size=224),
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])
#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文件:

  1. mean.txt 制作
  2. imagelist.txt 制作
  3. 配置 Input_Setting
  4. Mapper Setting 配置
  5. 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:

板端部署与调试

  1. 执行 make clean && make,对 hispark_taurus_nnie_sample 进行编译;
  2. 将 sample_nnie_main 这个可执行文件,拷贝到/home/hispark/code/HiSpark_Hi3516DV300_SDK_SPC021/osdrv/pub/rootfs_glibc/rot/目录下;
  3. 接下来需要制作文件系统,命令为cd /home/ubuntu/code/HiSpark_Hi3516DV300_SDK_SPC021./build.sh ext4
  4. 使用 HiTool 工具进行烧录

HiTool烧录

模型验证

分类效果良好。


鸣谢:廉廉子、城城子、杰杰子、皓皓子