利用inception v3进行物体分类
前言
本文将利用tensorflow官方提供的inception v3模型(基于ImageNet训练)进行迁移学习。目前了解到的模型有两套(推测应该有许多版本),本文采用的这套结构稍显复杂,retrain.py
多达1000多行,但是使用起来效率更高,提取完特征之后训练200个周期仅需数秒。
1. 训练和预测流程
1.1 准备初始工作目录
- 如图所示,我们需要的核心文件是
retrain.py
;data
中存放需要训练的数据集,本文将训练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文件里:
- 训练和测试结果:
1.3 预测
在工作目录下增加一个images
文件夹,存放要预测的图片,然后运行predict.py
即可完成预测,让我们来看看运行结果:
预测成功!
2. 文件说明
本节将重点解释一下各个文件
2.1 初始目录
首先我们从最开始的目录说起:
-
retrain.py:
这是整个迁移学习的核心,如上文所述,该程序主要做了两件事,现在我们结合inception v3的结构来看一下:
每张图片从input
输入到网络,到AveragePool
(bottleneck)就不再往下走了,这里得到的输出被保存到新建的bottleneck文件夹里作为每张图片的特征,所有图片都生成相应的特征文件之后第一步就完成了。接下来,由于原来的模型有1000个分类,和我们的分类也不一样,所以第二步我们需要修改全连接层,让他只输出5个分类,所以第二步的主要工作是训练新全连接层的参数。由于只需要训练一层,这一步会很快完成,只要几秒而已。
完整的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
运行完之后,工作目录有什么变化
-
bottleneck
、inception_model
、output_graph.pb
、output_labels.txt
上面已经解释过了,image
则是手动添加的待预测的图片。我们可以打开看看: