利用inception v3进行物体分类

前言

本文将利用tensorflow官方提供的inception v3模型(基于ImageNet训练)进行迁移学习。目前了解到的模型有两套(推测应该有许多版本),本文采用的这套结构稍显复杂,retrain.py多达1000多行,但是使用起来效率更高,提取完特征之后训练200个周期仅需数秒。

1. 训练和预测流程

1.1 准备初始工作目录

利用inception v3进行物体分类
利用inception v3进行物体分类

  • 如图所示,我们需要的核心文件是retrain.pydata中存放需要训练的数据集,本文将训练5个分类,每个类别500张.jpg图片;.bat.sh文件分别是windows和linux环境下运行retrain.py的脚本文件;最后,predict.py是训练好模型后预测图片分类的程序。文件下载:

链接: https://pan.baidu.com/s/1NfcV1DZkoybtl0L5LujIcg
提取码: gdkx
本地:E:\软件打包\模型和数据集\01.inception v3 迁移学习

1.2 运行启动脚本

特别说明: 本机器(GPU: RTX 2060)运行retrain.py提取特征时一直报错:
InternalError: Blas SGEMM launch failed
google该错误,均认为是GPU的问题,找到数种解决措施都无法解决,索性增加两行代码禁用GPU:

import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1"

其实不用GPU速度也挺快的,接下来,我们就可以双击retrain.bat运行了!
retrain.py的运行过程主要分两步:一是提取图片特征,该过程耗时数分钟;二是训练,该过程仅需数秒。我们可以看看程序运行过程中的反馈:

  • 提取特征并保存到.txt文件里:
    利用inception v3进行物体分类
  • 训练和测试结果:
    利用inception v3进行物体分类

1.3 预测

在工作目录下增加一个images文件夹,存放要预测的图片,然后运行predict.py即可完成预测,让我们来看看运行结果:
利用inception v3进行物体分类
预测成功!

2. 文件说明

本节将重点解释一下各个文件

2.1 初始目录

首先我们从最开始的目录说起:

  • retrain.py:
    这是整个迁移学习的核心,如上文所述,该程序主要做了两件事,现在我们结合inception v3的结构来看一下:
    每张图片从input输入到网络,到AveragePool(bottleneck)就不再往下走了,这里得到的输出被保存到新建的bottleneck文件夹里作为每张图片的特征,所有图片都生成相应的特征文件之后第一步就完成了。接下来,由于原来的模型有1000个分类,和我们的分类也不一样,所以第二步我们需要修改全连接层,让他只输出5个分类,所以第二步的主要工作是训练新全连接层的参数。由于只需要训练一层,这一步会很快完成,只要几秒而已。
    利用inception v3进行物体分类
    完整的inception v3结构 点击这里

  • retrain.bat和retrain.sh:
    我们先看一下这里面写的什么

    python retrain.py ^
    –bottleneck_dir bottleneck ^
    –how_many_training_steps 200 ^
    –model_dir inception_model ^
    –output_graph output_graph.pb ^
    –output_labels output_labels.txt ^
    –image_dir data
    pause

    其实就是一句带参数运行retrain.py的命令,^是换行,pause的作用是运行完之后不关闭CMD窗口,便于观察结果,接下来看看每个参数的作用:

    • bottleneck_dir bottleneck 存放特征文件的地址,不需要手动新建
    • how_many_training_steps 200 训练200个周期
    • model_dir inception_model 下载模型后存放的地址
    • output_graph output_graph.pb 重新训练后输出的模型
    • output_labels output_labels.txt 输出的标签,程序会通过data文件夹下的文件夹来确定有多少个分类以及它们的名称
    • image_dir data 图片存放地址

2.2 训练后的目录

接下来我们看看retrain.py运行完之后,工作目录有什么变化
利用inception v3进行物体分类

  • bottleneckinception_modeloutput_graph.pboutput_labels.txt上面已经解释过了,image则是手动添加的待预测的图片。我们可以打开看看:
    利用inception v3进行物体分类
    利用inception v3进行物体分类
    利用inception v3进行物体分类