在Ubuntu上利用caffe进行食物图像识别

如何搭建caffe环境已经在之前的文章中介绍了,有需要的可以自行回顾。


一、准备数据集

首先是准备好要用到的图片数据集,目前随机选用了五类水果:苹果、草莓、香蕉、火龙果、猕猴桃来作为图像识别的测试案例(事实证明,这个看似随机的选择在后续暴露出了caffe使用会遇到的问题,有点巧了)。图片是我从百度图片中随机挑选下载的,总共250张,其中每类50张,分割为10张测试集和40张训练集。

选择完图片集后先对其进行预处理。这里使用了美图秀秀的图片裁剪工具,将每张图都变为256*256的大小。其实我也不想用这么奇怪又笨拙的操作的,主要是因为在使用caffe的图像转换工具convert_imageset时发现:如果图片的长宽都大于256,那么可以顺利转换;如果其中之一小于256,则会报错。对于这个问题暂时还没找到解决方法,所以为了保证达到预期目标只能先强行迈过这一关了。。。

在使用caffe处理图片之前,要先对其进行规则编号。编号分别以1,2,3,4,5开头,各为一类。这里推荐一个便捷的批量处理工具Advanced Renamer,可以快速将图片分批编号。编号完成后将图片存入caffe根目录下的data文件夹中,其中训练图片的目录为data/re/train/,测试图片的目录为data/re/test/。

二、转换为lmdb格式

首先在examples下创建新的文件夹myfile,

sudo mkdir examples/myfile/

用于存放配置文件和脚本文件。

然后运行

sudo vi examples/myfile/create_filelist.sh

 用于生成图片的txt清单文件。

编辑create_filelist.sh,写入以下代码并保存:

#!/usr/bin/env sh
    DATA=data/re/
    MY=examples/myfile


    echo "Create train.txt..."
    rm -rf $MY/train.txt
    for i in 1 2 3 4 5 
    do
    find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt
    done
    echo "Create test.txt..."
    rm -rf $MY/test.txt
    for i in 1 2 3 4 5
    do
    find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt
    done
    echo "All done"

然后运行此脚本

sudo sh examples/myfile/create_filelist.sh

成功后会在examples/myfile/下生成train.txt和test.txt两个文件,里面是图片的清单列表。

然后再编写一个脚本文件,用于将图像转换为lmdb格式

sudo vi examples/myfile/create_lmdb.sh

在文件中写入:


  #!/usr/bin/env sh

    MY=examples/myfile


    echo "Create train lmdb.."

    rm -rf $MY/img_train_lmdb

    build/tools/convert_imageset \

    --shuffle \

    /home/xxx/caffe/data/re/ \

    $MY/train.txt \

    $MY/img_train_lmdb


    echo "Create test lmdb.."

    rm -rf $MY/img_test_lmdb

    build/tools/convert_imageset \

    --shuffle \

    /home/xxx/caffe/data/re/ \

    $MY/test.txt \

    $MY/img_test_lmdb


    echo "All Done.."

最后,运行这个脚本

sudo sh examples/myfile/create_lmdb.sh

三、计算均值并保存

将图片减去均值后再训练能提高训练速度和精度,caffe程序提供了一个计算均值的文件compute_image_mean.cpp,我们直接使用就可以了

sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto

四、创建模型并编写配置文件

将位于models/bvlc_reference_caffenet/文件夹下的两个文件复制到myfile文件夹下

sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/

对solver.prototxt进行修改

sudo vi examples/myfile/solver.prototxt

将其内容改为:

     net: "examples/myfile/train_val.prototxt"

     test_iter: 25

     test_interval: 100

     base_lr: 0.0001

     lr_policy: "step"

    gamma: 0.1

    stepsize: 200

    display: 1000

    max_iter: 10000

    momentum: 0.9

    weight_decay: 0.005

    solver_mode: CPU

然后修改train_val.prototxt

 name: "CaffeNet"

    layer {

        name: "data"

        type: "Data"

        top: "data"

        top: "label"

    include {

        phase: TRAIN

    }

    transform_param {

        mirror: true

        crop_size: 256

        mean_file: "examples/myfile/mean.binaryproto"

     }

    data_param {

        source: "examples/myfile/img_train_lmdb"

        batch_size: 256

        backend: LMDB

     }

    }

     layer {

         name: "data"

         type: "Data"

         top: "data"

         top: "label"

     include {

         phase: TEST

     }

     transform_param {

         mirror: false

         crop_size: 256

         mean_file: "examples/myfile/mean.binaryproto"

     }

     data_param {

         source: "examples/myfile/img_test_lmdb"

         batch_size: 50

         backend: LMDB

    }

   }

主要是修改两个data layer的mean_file、source以及crop_size。

五、训练

运行指令

sudo build/tools/caffe train -solver examples/myfile/solver.prototxt



版权声明:本文为qq_26807507原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。