virtualinlineconstchar*type()const { return"SPP"; }
virtual LayerParameter GetPoolingParam(constint pyramid_level,constint bottom_h, constint bottom_w, const SPPParameter spp_param);
int pyramid_height_;
int bottom_h_, bottom_w_;
int num_;
int channels_;
int kernel_h_, kernel_w_;
int pad_h_, pad_w_;
bool reshaped_first_time_;
构建时需要考虑的参数值
1.准备数据,在examples路径下新建一个目录 spp_net,将n03791053摩托车、n03895866客车、n04285008跑车、n04467665大货车、n04487081无轨电车这5类的图片放入到该目录下,每种车型一个目录。
>>ll /root/deep/gjj/caffe-master/examples/spp_net
drwxr-xr-x 2 root root 73728 Mar 30 15:24 n03791053
drwxr-xr-x 2 root root 77824 Mar 30 15:25 n03895866
drwxr-xr-x 2 root root 73728 Mar 30 15:25 n04285008
drwxr-xr-x 2 root root 73728 Mar 30 15:25 n04467665
drwxr-xr-x 2 root root 73728 Mar 30 15:25 n04487081
2.准备标签文件,训练和测试的输入是用train.txt
和val.txt来描述的。里面的格式都是路径加文件名 空格 类别号。如下:
train.txt中 n03791053/n03791053_10013.JPEG 670
val.txt中 val/ILSVRC2012_val_00027580.JPEG 705
3.将examples/imagenet/create_imagenet.sh复制到spp_net目录下,并修改里面的内容,在spp_net下生成lmdb格式的图像信息。
EXAMPLE=examples/spp_net
DATA=examples/spp_net/
TOOLS=build/tools
TRAIN_DATA_ROOT=examples/spp_net/
VAL_DATA_ROOT=examples/spp_net/
此外,我把图片的大小改成了224*224
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=224
RESIZE_WIDTH=224
4.没有去做均值,直接构建spp_solver.prototxt和Zeiler_spp_scale224.prototxt
spp_solver.prototxt中设置 solver_mode: CPU
Zeiler_spp_scale224.prototxt将卷积第五层之后的池化改为spp池化,根据caffe.proto中的定义来改
layer {
name: "pool5_spp"
type: "SPP"
bottom: "conv5"
top: "pool5_spp"
spp_param{
pyramid_height:3
pool: MAX
}
}
5.把下面的命令写到spp_train_caffenet.sh中或直接运行:
/root/deep/gjj/caffe-master/build/tools/caffe train --solver=spp_solver.prototxt