第一章中我们谈到,我们可以借助OPenMV的源码来进一步学习OPenMV神经网络的训练方法
我们打开OPenMV源码的文件夹(没有下载的小伙伴请点击 这里)
cd openmv-master\ml\cmsisnn\models\lenet
进入lenet文件夹,可以看到该文件夹下有五个文件,分别为:
lenet.network (适用于OPenMV的神经网络,是一个二进制文件)
lenet_solver.prototxt (供Caffe使用的配置训练参数的文件)
lenet_train_test.prototxt (网络各层训练和测试的参数)
test.sh (Linux脚本文件,用于测试模型)
train.sh(Linux脚本文件,用于训练模型)
我们把后四个文件拷贝到要网络的根目录下备用
步骤说明:
1、进入网络的根目录下
2、打开lenet_solver.prototxt文件
修改红圈的几处地方:
第一处:net: "[lenet_train_test.prototxt文件的存放路径]"
第二处:test_iter: [该数值表示测试每次数据的量]=测试数据总量/batch_size
比如我们有150个测试数据,每次测试10个就只需要测试15次,修改test_iter:15
第三处:最大迭代次数(根据数据集大小设定) 过小精度低,过大会导致震荡
第四处:快照次数,根据训练数据集大小设定
第五处:快照保存的地址
3、打开lenet_train_test.prototxt文件
下面有注释的地方为应修改处,prototxt文件在执行前删除注释
name: "LeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
mean_file: "mean.binaryproto" //没有均值文件的删除该行
}
data_param {
source: "train_lmdb" //训练用lmdb文件夹的相对地址
batch_size: 32 //训练间隔,一般为64,我的数据集小,使用32
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
mean_file: "mean.binaryproto" //没有均值文件的删除该行
}
data_param {
source: "test_lmdb" //测试用lmdb文件夹的相对地址
batch_size: 10 //测试间隔,与前一个文件中的test_iter有对应关系 10*15=150(测试数量)
backend: LMDB //数据集存储结构
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20
kernel_size: 5 //如果图片规格小,可以适当减小卷积核的大小
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5 //如果图片规格小,可以适当减小卷积核的大小
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 100
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
*****.sh 是Linux下的批处理文件,我们首先需要将它修改为windows下的批处理文件:
编写 train.bat :
caffe train --solver=lenet_solver.prototxt
pause
参数说明:
- -solver= 训练配置文件
编写 test.bat:
caffe test --model=D:/OPenMV_Network/lenet_train_test.prototxt --weights=D:/OPenMV_Network/print_numbers_iter_1000.caffemodel
pause
参数说明:
- - model= 指定模型的描述文件
- -weight= 模型训练好的权制文件
然后可以运行train.bat对网络进行训练了,训练结果如下:
最后我们生成了四个输出文件:
得到 ******.model 模型文件后,我们就能对图片进行识别和预测了
运行test.bat :
可以看到,所训练模型的准确率有81.8%,因为我们的数据集较小,准确率有所折损
下一章,我们进行神经网络的量化和转换工作,最终要得到兼容OPenMV使用的 ***.network 二进制文件
参考资料:
Caffe学习系列(12):训练和测试自己的图片