kaggle dog breed identification基于Tensorflow迁移学习搭建图片分类器

基于Tensorflow的迁移学习应用 kaggle dog breed identification构建新图片分类器

本文所用数据来源于https://www.kaggle.com/c/dog-breed-identification, 将基于google tensorflow中的预训练的mobilenet模型和inception v3模型,对新dataset中10200张不同狗品种照片训练新的图片分类。

Why transfer learning here?

  1. 一个好的图片分类器,从scratch开始搭建,不仅构建cnn archtiecture会花费大量的时间精力,而且为了分类器的精准度,也需要大量的图片作为training data。
  2. 而实际应用中,针对不用需要而构建的分类器,通常只有小量的数据集,从scratch开始训练一个巨大的拥有百万甚至更多的parameters的cnn分类器很容导致过拟合,而使训练出的分类器在general set上表现不佳。
  3. 我们将使用的经过预训练的mobilenet模型和inception v3模型,是google基于 ImageNet , 一个计算机视觉系统识别项目,目前世界上图像识别最大的数据库,其包含了分成了数千个类型、数百万张有标注的图像, 训练出的两个分类器模型,其Top-1 accuracy 分别达到78.0%和70.7%,inception v3会有更好的accuray,而mobilenet因为其轻量,训练速度更快。
  4. 针对与原数据库相似但size较小的数据集,使用transfer learning,将已根据

基于MobileNet的新分类器搭建

准备阶段,get code
1
2
git clone https://github.com/googlecodelabs/tensorflow-for-poets-2
cd tensorflow-for-poets-2
准备阶段,get dataset

https://www.kaggle.com/c/dog-breed-identification, 下载training dataset, labels.csv和test dataset,

预处理数据集

我们直接下载得到的训练数据集中,只有所有的图片在同一个数据集,我们需要整理成模型需要的格式,即在同一个directory下,将每个label建一个subdirectory,将所有对应的图片放入当前subdirectory下,参考code可见:

https://github.com/LauraBowenHe/dog-breed-identification/blob/master/MobileNet/classify_pic_to_dir.py

配置MobileNet
1
2
IMAGE_SIZE=224
ARCHITECTURE="mobilenet_1.0_${IMAGE_SIZE}"

注意这里:

IMAGE_SIZE, 即image resolution配置的参数:128,160,192, or 224px。当然越高的resolution可以带来更高的accuray,同时也需要更多的训练时间。

相对模型size占最大largest MobileNet的比例: 1.0, 0.75, 0.50, or 0.25. 同样,所占比例越大,accuracy越高,也需要更多的训练时间。

在这个任务中,我们希望获得更可能高的accuray,所以采取以上配置。

用tensorboard监控训练过程
1
tensorboard --logdir tf_files/training_summaries &

在后台启用tensorboard,tensorboard可以用来监控训练过程,帮助我们更好判断是否过拟合等。

训练完成后,可以在浏览器输入

http://localhost:6006

or http://0.0.0.0:6006即可看到tensorboard为我们绘画的各种训练过程图像。

训练模型
1
2
3
4
5
6
7
8
9
10
python -m scripts.retrain \
--bottleneck_dir=tf_files/bottlenecks \
--how_many_training_steps=3000 \
--model_dir=tf_files/models/ \
--summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" \
--output_graph=tf_files/retrained_graph.pb \
--output_labels=tf_files/retrained_labels.txt \
--architecture="${ARCHITECTURE}" \
--image_dir=tf_files/dog_photos

注意:

  1. 在这里,把我们之前预处理过的数据集,让在tf_files directory下。

  2. optionally,我们可以添加更多的训练参数,详情可以参考

    1
    2
    3
    4
    python -m scripts.retrain -h
    我加入了以下的参数
    --training_rate=0.001 \
    --train_batch_size=64 \
调参

调节training steps, training rate, train batch size等等。

预测

对于单个图片,可以用source code中的label_image.py

1
2
3
python -m scripts.label_image \
--graph=tf_files/retrained_graph.pb \
--image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg

而针对这个狗品种分类器的任务,我们把从kaggle上下载的test dataset也放入tf_files directory下,修改了一下source中的label_image.py,增加新的文件generate_result.py, 对每个文件依次调用label_image.py,code可见

https://github.com/LauraBowenHe/dog-breed-identification/blob/master/MobileNet/scripts/label_image.py

https://github.com/LauraBowenHe/dog-breed-identification/tree/master/MobileNet

1
python generate_result.py

这一步预测时间会比较长,大概7-8小时,生成的文件会存在/tensorflow-poets-2/output/下,我们在训练前可先手动创建这个文件夹。

基于inception v3的新分类器搭建

inception v3的搭建和mobilenet很相似,只有在get code时有所不同。

准备阶段,get code
1
2
3
$ git clone https://github.com/tensorflow/tensorflow
$ cd tensorflow
$ git checkout
准备阶段, get dataset和预处理数据集

参考以上

训练模型

retrain的代码在/examples/image_retraining,我们可以直接用刚刚mobilenet模型中,/tensorflow-for-poet-2/tf_files,因为我们之前已经有把数据集都放在那里了,当然即使没有也没关系,新建一个tf_files就行

1
2
3
4
5
6
7
8
python retrain.py \
--bottleneck_dir=~/tensorflow-for-poets-2/tf_files/bottlenecks \
--how_many_training_steps=500 \
--model_dir=~/tensorflow-for-poets-2/tf_files/inception \
--summaries_dir=~/tensorflow-for-poets-2/tf_files/training_summaries/basic \
--output_graph=~/tensorflow-for-poets-2/tf_files/retrained_graph.pb \
--output_labels=~/tensorflow-for-poets-2/tf_files/retrained_labels.txt \
--image_dir=~/tensorflow-for-poets-2/tf_files/dog_photos

python -m retrain.py -h 可以查阅可以添加的参数

附一张训练结束的图,可见当前分类器的validation accuracy是90.3%。

Screen Shot 2017-11-04 at 3.59.56 PM

调参

调节training steps, training rate, train batch size等等。

预测

因为我们已将生成的模型放入tf_files。我们把从kaggle上下载的test dataset也放入tf_files directory下,创建了一份label_image_inceptionV3.py,增加新的文件generate_result_inceptionV3.py, 对每个文件依次调用label_image_inceptionV3.py,code可见

https://github.com/LauraBowenHe/dog-breed-identification/blob/master/InceptionV3/label_image_inceptionV3.py

https://github.com/LauraBowenHe/dog-breed-identification/blob/master/InceptionV3/generate_result_inceptionV3.py

1
python generate_result_inceptionV3.py

这一步预测时间会比较长,比MobileNet所用的时间更长,大概在十四个小时,生成的文件会存在/tensorflow-poets-2/output/下,我们在训练前可先手动创建这个文件夹。

Reference

http://cs231n.github.io/transfer-learning/

https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0

https://www.ouyangsong.com/2017/05/20/image-classification-retrained-based-on-inceptionv3/