前情提要:在网上找了一类验证码图片,对验证码进行处理后分割得到其上的汉字。在此基础上用alexnet对分割得到的汉字训练识别,测试识别的准确率。由于找的验证码数量不够,所以仿照原验证码类型生成了一波验证码数据。
(先把整个流程纲要和代码部分贴出来,后续的所有截图等我这两天整理好再补充上来。) ----2018.3.19
本文结构:
1.数据准备、制作lmdb数据集 2.计算均值
3.编写网络结构文件 4.编写solver求解文件
5.训练 6.编写deploy文件进行测试
7.可能出现的问题
1. 数据准备、制作lmdb数据集
保留一部分原图作为测试集,剩下的图按照训练集:验证集=5:1的数量分在两个文件夹内。生成两个标签文件train.txt和val.txt。标签文件内容编写格式为:图片名称.jpg 类别
训练集和验证集可以用原图掺杂自己生成的图,测试集要用原图。
复制并修改caffe中自带的文件(.../caffe-master/examples/imagenet/create_imagenet.sh)将图片数据转换为lmdb格式的数据:
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
EXAMPLE=examples/imagenet #EXAMPLE改成生成的lmdb文件要存放的路径
DATA=data/ilsvrc12 #DATA改成标签文件存放的路径
TOOLS=build/tools #工具目录最好写绝对路径,我的是/home/hp/software/caffe-master/build/tools
TRAIN_DATA_ROOT=/path/to/imagenet/train/ #改成训练集路径
VAL_DATA_ROOT=/path/to/imagenet/val/ #改成测试集路径
#一定要将图片归一化,否则计算均值时会报错
# 如果图片已经被归一化成相同大小,则RESIZE写false。如果没有,则把RESIZE写true。
RESIZE=false
if $RESIZE; then
RESIZE_HEIGHT=256 #resize的高度和宽度可自己修改
RESIZE_WIDTH=256
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi
echo "Creating train lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/ilsvrc12_train_lmdb #lmdb数据命名可修改
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/ilsvrc12_val_lmdb
echo "Done."
进入改好的create文件目录,在ubuntu终端总敲入sh create_imagenet.sh,然后就可以静等格式转换完成啦。
2.生成均值文件
复制并修改caffe中自带的文件(.../caffe-master/examples/imagenet/make_imagenet_mean.sh),主要是更改路径
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=examples/imagenet #改为训练集lmdb所在路径
DATA=data/ilsvrc12 #改为均值文件生成路径
TOOLS=build/tools #最好改为绝对路径,我的是/home/hp/software/caffe-master/build/tools
$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
$DATA/imagenet_mean.binaryproto
echo "Done."
进入改好的文件所在目录,在终端敲入sh make_imagenet_mean.sh,显示“Done”就发现均值文件已经生成啦
生成的均值文件是二进制格式,如果要转换为python格式:复制如下代码,新建convert_mean.py文件,按标亮的Usage方法进行使用就好啦~
#!/usr/bin/env python
import numpy as np
import os
import sys
import glob
import time,datetime
import scipy.io as scio
caffe_root='/home/data/caffe/'
import sys
sys.path.insert(0,caffe_root+'python')
import caffe
if len(sys.argv)!=3:
print "Usage: python convert_mean.py mean.binaryproto mean.npy"
sys.exit()
#python convert_mean.py mean.binaryproto mean.npy
blob = caf