1.1 车标图像分类

1.1 车标图像分类

BlackWalnutLabs     2019年04月08日 08:00:00  60min分钟

  使用机器学习七步走的方式完成车标分类任务

开始尝试

分类:

TensorFlowBoost

 TensorFlow

介绍

什么是车标识别?

  在学习 TensorFlow 的过程中,我们在开源社区中找到了一个名为 MobileNet 的模型,该模型能对图像进行分类。Google 发布的 tensorflow-for-poets 项目正好支持这个模型,我们希望能结合 TensorFlow 与 MobileNet,将其应用于分类不同车标的图片。同时以此作为基础,体验 ML/TF 中不同超参数对训练的影响。

我们要创造什么?

  在这个 Codelab 中,你将要使用 5 种车标图像训练一个 TensorFlow 模型。你将学会以下技能:

  • 收集并分类车标图像
  • 使用 MobileNet_v1_128 模型
  • 训练模型并测试效果
  • 分别测试 Learning Rate 为 0.1、0.001、0.0001、0.00001 时的训练效果
  • 测试将预训练模型替换为 MobileNet_v1_224 后的训练效果
  • 选择最好的训练超参数,执行预测
  1. 收集并分类车标图像

   Codelab 采用图像分类的方式来进行车标识别,因此需要收集的数据集很简单,只需要拍摄各种的车标图片即可。本 Codelab 提供了已拍摄完毕的演示用数据集,可以搭配自己拍摄的数据集使用。

  在拍摄数据集时,需要注意以下几点。

  • 拍摄的照片的分辨率最好为 1:1
  • 拍摄的车标占拍摄图片的大多数区域
  • 每种车标拍摄相同数量的图片,且每种不少于 200 
  • 不要逆光拍摄

  新建名为 Codelab 的目录,并在该目录下新建名为 data 的目录。新建 Terminal 界面,进入 Codelab 目录,将 Tools/datasets目录下的图片复制到该目录下。

cp -r ../Tools/datasets/* data

   Codelab/data 目录下上传自己拍摄的图片并解压。(以 image.zip 为例)

unzip image.zip

rm image.zip

  在图像分类模型的训练过程中,模型需要知道训练的标签以及每个标签所对应的图片,因此需要将上一步中拍摄的图片按照车标种类分类。

   Codelab 所采用的训练程序基于 tensorflow-for-poets 项目,该项目的训练程序只需要将相同的车标归类到一个目录下即可,即在训练时传入的标签名即为归类的目录名。

   Codelab 提供的数据集已经按照名称归类,在 Codelab/data 目录下分别新建名为 BUICKCHANGANBMWNISSANGM 的目录,切换到 Terminal 界面并进入 Codelab/data 目录,将对应名称段的图片分别移动到这些目录中。

  • BUICK:    1521121626331.jpg ~ 1521121911843.jpg
  • CHANGAN:  1521171197033.jpg ~ 1521171332105.jpg
  • BMW:    1521187291619.jpg ~ 1521187912599.jpg
  • NISSAN:   1521189204685.jpg ~ 1521189316223.jpg
  • GM:     1521257197105.jpg ~ 1521257469684.jpg

mv 1521121* BUICK

mv 1521171* CHANGAN

mv 1521187* BMW

mv 1521189* NISSAN

mv 1521257* GM

  1. 使用 MobileNet_v1_128模型

  能实现图像分类的模型有很多,比如 MobileNetInceptionGoogleNet等等,每种模型都有各自的特点,下图为 Google  Codelab 提供的各图像分类模型对比图,本 Codelab 中选择的是 MobileNet 模型。

https://handbook-carlogorecognition.blackwalnut.tech/assets/image/70170cbb89d318b1.png

  MobileNet V1 模型目前支持 2 种分辨率的图像,分别为 128*128  224*224,不过提供的训练程序会自动将传入的图片转换成指定的分辨率。

   Terminal 界面下声明环境变量,即训练时所要用到的模型以及图像参数。在当前步骤中,我们选择使用 MobileNet 模型,训练图像分辨率为 128*128

IMAGE_SIZE=128

ARCHITECTURE="MobileNet_1.0_${IMAGE_SIZE}"

  1. 训练模型并评估结果

  车标识别的训练基于 Google 提供的 tensorflow-for-poets 项目,切换到 Terminal 界面,在 Codelab 目录下新建名为 scripts 的目录,进入 Codelab 目录,将 Tools/project 目录下提供的程序复制到该目录下。

cp -r ../Tools/project/* .

   Terminal 界面下进入 Codelab目录,参照下面的做法执行训练,该项目在训练时会自动把数据集分类成三种数据集,一种是训练集,一种是测试集,一种是验证集,在默认情况下,这三种数据集的比例分别为 80%10%10%

  • bottleneck_dir 表示训练集转换后的文件存放的目录
  • how_many_training_steps 表示总训练的步数
  • model_dir 表示模型文件存放的目录,如果目录下不存在模型则会自动下载
  • summaries_dir 表示训练的中间结果存放的目录
  • output_graph  output_labels表示训练结果输出的目录
  • architecture 就是我们前面设置的训练参数;image_dir表示数据集存放的目录。
  • testing_percentage 测试集的比例,默认值为 10
  • validation_percentage 验证集的比例,默认为 10

python3 -m scripts.retrain \

--bottleneck_dir=tmp/bottlenecks \

--how_many_training_steps=5000 \

--model_dir=model \

--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \

--output_graph=output/retrained_graph_128_0_01.pb \

--output_labels=output/retrained_labels_128_0_01.txt \

--architecture="${ARCHITECTURE}" \

--testing_percentage=10 \

--validation_percentage=10 \

--image_dir=data \

--learning_rate=0.001

  在执行训练后,程序会自动下载模型文件并进行训练,并且训练结束后在 output_graph 目录下生成 retrained_graph_128_0_01.pb 文件,在 output_labels 目录下生成 retrained_labels_128_0_01.txt 文件。

  有两种评估训练结果的方式,一种是通过 Tensorboard 查看训练过程中各个参数的值,一种是执行评估程序直接查看识别准确率。

  切换到 jupyter 界面,进入 Codelab/tmp/training_summaries 目录,选择在当前目录下进入 Tensorboard 界面。

  Tensorboard 中的 accuracy_1 的曲线图即为识别的准确率随着训练步数的增加的变化情况。

  如果想直接查看最终的准确率,先编辑 Codelab/scripts/evaluate.py 文件,根据下面的提示找到并修改程序。

# 找到这段代码

with load_graph(graph_file_name).as_default() as graph:

    ground_truth_input = tf.placeholder(

        tf.float32, [None, 5], name='GroundTruthInput')

 

# 修改为这段代码

with load_graph(graph_file_name).as_default() as graph:

    ground_truth_input = tf.placeholder(

        tf.float32, [None, ('替换为训练用标签的种类数')], name='GroundTruthInput')

 

# --------------------------------------------------------------------

 

# 找到这段代码

 

image_dir = 'tf_files/flower_photos'

 

# 修改为这段代码

 

image_dir = 'data'

 

# --------------------------------------------------------------------

 

# 找到这段代码

with tf.Session(graph=graph) as sess:

    for filename, ground_truth in zip(filenames, ground_truths):   

        image = Image.open(filename).resize((224,224),Image.ANTIALIAS)

 

# 修改为这段代码

with tf.Session(graph=graph) as sess:

    for filename, ground_truth in zip(filenames, ground_truths):   

        image = Image.open(filename).resize((128,128),Image.ANTIALIAS)

  切换到 Terminal 界面,进入 Codelab 目录,执行评估程序。

python3 -m scripts.evaluate output/retrained_graph_128_0_01.pb

  输出值中 Accuracy 即为训练的准确率。

  1.  

调整 Learning Rate

  决定最终识别率的因素有三种,一种是训练的模型,一种是数据集的完整性和干净性,另一种是训练的超参数的合理性。

  超参数即不会在训练过程中随着训练的进行而发生变化的训练参数,在本 Codelab 中,选择 learning_rate 为超参数并将其调整为 0.10.0010.00010.00001 再次训练。切换到 Terminal 界面,进入 Codelab 目录,选择不同的 Learning Rate 开始训练。

  Learning Rate  0.1 时:

python3 -m scripts.retrain \
    --bottleneck_dir=tmp/bottlenecks \
    --how_many_training_steps=5000 \
    --model_dir=model \
    --summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
    --output_graph=output/retrained_graph_128_0_1.pb \
    --output_labels=output/retrained_labels_128_0_1.txt \
    --architecture="${ARCHITECTURE}" \
    --testing_percentage=10 \
    --validation_percentage=10 \
    --image_dir=data \
    --learning_rate=0.1

  Learning Rate  0.001 时:

python3 -m scripts.retrain \
    --bottleneck_dir=tmp/bottlenecks \
    --how_many_training_steps=5000 \
    --model_dir=model \
    --summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
    --output_graph=output/retrained_graph_128_0_001.pb \
    --output_labels=output/retrained_labels_128_0_001.txt \
    --architecture="${ARCHITECTURE}" \
    --testing_percentage=10 \
    --validation_percentage=10 \
    --image_dir=data \
    --learning_rate=0.001

  Learning Rate  0.0001 时:

python3 -m scripts.retrain \
    --bottleneck_dir=tmp/bottlenecks \
    --how_many_training_steps=5000 \
    --model_dir=model \
    --summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
    --output_graph=output/retrained_graph_128_0_0001.pb \
    --output_labels=output/retrained_labels_128_0_0001.txt \
    --architecture="${ARCHITECTURE}" \
    --testing_percentage=10 \
    --validation_percentage=10 \
    --image_dir=data \
    --learning_rate=0.0001

  Learning Rate  0.00001 时:

python3 -m scripts.retrain \
    --bottleneck_dir=tmp/bottlenecks \
    --how_many_training_steps=5000 \
    --model_dir=model \
    --summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
    --output_graph=output/retrained_graph_128_0_00001.pb \
    --output_labels=output/retrained_labels_128_0_00001.txt \
    --architecture="${ARCHITECTURE}" \
    --testing_percentage=10 \
    --validation_percentage=10 \
    --image_dir=data \
    --learning_rate=0.00001

  切换到 Terminal 界面,进入 Codelab 目录,执行评估程序。

python3 -m scripts.evaluate output/retrained_graph_128_0_1.pb
 
python3 -m scripts.evaluate output/retrained_graph_128_0_001.pb
 
python3 -m scripts.evaluate output/retrained_graph_128_0_0001.pb
 
python3 -m scripts.evaluate output/retrained_graph_128_0_00001.pb

  输出值中 Accuracy 即为训练的准确率。

  1. 调整训练分辨率

  训练时所使用的图像分辨率也是训练的超参数之一,不同的分辨率同样会影响模型的训练结果。在 Learning Rate  0.01 的情况下,测试训练图像分辨率为 224*224 时的结果。

  测试图像分辨率为 224*224*

IMAGE_SIZE=224
ARCHITECTURE="MobileNet_1.0_${IMAGE_SIZE}"
 
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_224_0_01.pb \
--output_labels=output/retrained_labels_224_0_01.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.001

  编辑 Codelab/scripts/evaluate.py 文件,根据下面的提示找到并修改程序。

# 找到这段代码
with tf.Session(graph=graph) as sess:
    for filename, ground_truth in zip(filenames, ground_truths):    
        image = Image.open(filename).resize((128,128),Image.ANTIALIAS)
 
# 修改为这段代码
with tf.Session(graph=graph) as sess:
    for filename, ground_truth in zip(filenames, ground_truths):    
        image = Image.open(filename).resize((224,224),Image.ANTIALIAS)

Terminal 界面,进入 Codelab 目录,执行评估程序。

python3 -m scripts.evaluate output/retrained_graph_224_0_01.pb

  输出值中 Accuracy 即为训练的准确率。

  1. 执行预测

  在训练完成之后,可能结果会显示准确率 100% ,貌似不太可信啊,我们可以使用另外的交通标志图片进行测试。

  切换到 jupyter 项目树界面,在 Codelab 目录下新建名为 test 的目录。从网上寻找对应的车标图片,放在 test 目录下,这里寻找的照片不需要特别注意分辨率,测试程序中内置了统一分辨率的功能。

  参考下面的程序执行在线测试,测试结果会显示在输出中,每次执行会选择目录中的一张图片预测。

  • graph 表示训练后生成的 PB 文件所在的路径
  • image 表示要预测的图片所在的路径
python3 -m scripts.label_image \
--graph=output/retrained_graph_224_0_01.pb  \
--labels=output/retrained_labels_224_0_01.txt  \
--input_height=224 \
--input_width=224 \
--image=test/image.jpg

 

 

第一尝试使用tensorflow 但是出了点小问题,导致没有写完并且没有预测成功,先把具体的命令记录下来等以后安装好tensorflow的环境后本地跑一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值