深度学习框架Caffe图片分类教程
使用Caffe进行图片分类大致分为数据集准备,格式转换为LMDB或者LEBELDB,定义网络模型文件,定义求解器文件设置训练参数,部署预测,下边详细说下这几个步骤。PS:训练集图片共1907张,其中200张作为训练阶段测试,另外用于训练。图片分为5类,分别为bus,car,person,cat,train。该教程所说的根目录为Caffe主目录。
- 第一步:数据集准备
在data文件夹下新建imagenet1907
文件夹,这个新文件夹主要用于存放该实验的原始数据。在新文件下新建train
、val
目录分别用于存放训练时训练和测试的图片。另外在imagenet1907
下新建train.txt
、和val.txt
,这两个文本文件的作用就是存放图片路径以及标签。格式如下:
train.txt
000201.jpg 1
000202.jpg 3
000203.jpg 4
000204.jpg 4
000205.jpg 4
000206.jpg 1
...
val.txt
的格式和train.txt
是一样的,写好后(当然用程序生成…)保存。
开头所说的图片分为5类,这里标签用了1-5的连续数字表示,因此需要一个map文件来标识数字对应的类,还是在这个目录下写一个map.txt
文件,内容如下:
map.txt
0 bus
1 car
2 person
3 cat
4 train
这个文件在后边还有用~。
- 第二步:格式转换
在examples
文件夹下边同样新建imagenet1907
文件夹,caffe已经为我们提供了格式转换的工具convert_imageset
,该工具的cpp文件路径为caffe/examples/cpp_classification/classification.cpp
,该工具的具体使用方法可以参照caffe提供的说明文件caffe/examples/cpp_classification/readme.md
,我们通过编写脚本文件create_imagenet.sh来进行格式转换以及计算均值文件
caffe/examples/imagenet1907/create_imagenet.sh
#!/usr/bin/env sh
set -e
EXAMPLE=examples/imagenet1907
DATA=data/imagenet1907
TOOLS=build/tools
TRAIN_DATA_ROOT=data/imagenet1907/train/
VAL_DATA_ROOT=data/imagenet1907/val/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=128
RESIZE_WIDTH=128
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
# Set ENCODE=true to encode the images as compressed JPEGs stored in the LMDB.
# Leave as false for uncompressed (raw) images.
ENCODE=true
if $ENCODE; then
ENCODE_FLAG='--encoded=true'
ENCODE_TYPE_FLAG='--encode_type=jpg'
else
ENCODE_FLAG='--encoded=false'
ENCODE_TYPE_FLAG=''
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..."
rm -rf $EXAMPLE/imagenet1907_train_lmdb
rm -rf $EXAMPLE/imagenet1907_val_lmdb
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
$ENCODE_FLAG \
$ENCODE_TYPE_FLAG \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/imagenet1907_train_lmdb
echo "Creating val lmdb...