[Tensorflow2.0] Horse or Human
文章目录
摘要: 本文利用马或人的图片数据来训练模型,让模型经过训练后具备识别新的图片中是含有马或者人,从而达到自动识别(recognition)。
训练背景
数据集
下载地址:https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip 说明:数据集包含了名为horse和human两个文件夹,包含了两种图片,分别是马和人的图片,每种图片大约500张,每个图片大小是300*300,每个像素的取值为3byte,即真彩色图片2的24次方的取值范围,图片如:
训练过程
通过使用马和人的图片来训练模型,让模型知道马是什么样子的,人是什么样子的,训练完成后,我们从晚上可以搜索新的马和人的照片,输入给模型,看看模型的预测结果。
数据准备过程
下载数据
可以使用wget 命令将数据下载至临时目录下 wget https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip /tmp/horse-or-human.zip
windows系统可以直接使用浏览器下载并保存合适的位置。
解压数据
因为数据集是zip格式的压缩包,需要对其进行解压,所以要用到访问系统文件系统和解压程序,因此需要导入os和zipfile两个库
|
|
组织数据
在上述的数据中在horse-or-human文件夹中包含了horse、human两个子文件夹,但是每个子文件夹分别包含数百张horse或者human的图片,但是并针对于单个图片而言,并没有label信息,这一点是和其他数据集有不同的地方,如在fashion mnist数据集中,28*28的图片数据是T桖还是靴子,都已经在数据集中标记了。
所以,我们需要为该数据集标记label。ImageGenerator可以帮我们完成这个动作,ImageGenerator通过读取单个图片的文件名来标记图片是horse还是human(文件名都是以horse或human开头的)。
|
|
#确认图片数据训练样本的文件名特性
[‘horse39-3.png’, ‘horse02-9.png’, ‘horse32-3.png’, ‘horse06-9.png’, ‘horse29-1.png’, ‘horse33-5.png’, ‘horse35-1.png’, ‘horse41-9.png’, ‘horse37-0.png’, ‘horse27-2.png’]
[‘human12-25.png’, ‘human15-10.png’, ‘human13-10.png’, ‘human16-26.png’, ‘human10-15.png’, ‘human08-14.png’, ‘human10-10.png’, ‘human04-13.png’, ‘human06-26.png’, ‘human16-09.png’]
|
|
#打印结果,可以看到horse 500张,human 527张
total training horse images: 500
total training human images: 527
检查数据
为了更好的做好训练,必须要懂数据,反复地考虑如何使用数据特性、数据特征。我们可以直接去文件夹查看数据,也可以通过画图来显示数据。
|
|
horse 和 human的样本数据如下图
训练
定义模型
|
|
模型配置
|
|
处理训练数据
给待训练的图片数据样本,使用上面介绍的ImageDataGenerator增加label,以便于模型进行训练。horse的label是0, human的label是1,并且为了便于计算,对图片数据进行归一化处理,也就是rescale。
|
|
训练
|
|
训练结果如下:
Epoch 1⁄15 9⁄9 [==============================] - 8s 938ms/step - loss: 0.9263 - acc: 0.4985 Epoch 2⁄15 9⁄9 [==============================] - 7s 769ms/step - loss: 0.7288 - acc: 0.5696 Epoch 3⁄15 9⁄9 [==============================] - 8s 840ms/step - loss: 0.6819 - acc: 0.8189 Epoch 4⁄15 9⁄9 [==============================] - 7s 725ms/step - loss: 0.3804 - acc: 0.8296 Epoch 5⁄15 9⁄9 [==============================] - 7s 734ms/step - loss: 0.6457 - acc: 0.8179 Epoch 6⁄15 9⁄9 [==============================] - 7s 745ms/step - loss: 0.2520 - acc: 0.8812 Epoch 7⁄15 9⁄9 [==============================] - 7s 733ms/step - loss: 0.4631 - acc: 0.8345 Epoch 8⁄15 9⁄9 [==============================] - 7s 730ms/step - loss: 0.1801 - acc: 0.9241 Epoch 9⁄15 9⁄9 [==============================] - 7s 748ms/step - loss: 1.0966 - acc: 0.8549 Epoch 10⁄15 9⁄9 [==============================] - 7s 729ms/step - loss: 0.3123 - acc: 0.8919 Epoch 11⁄15 9⁄9 [==============================] - 7s 730ms/step - loss: 0.3674 - acc: 0.8744 Epoch 12⁄15 9⁄9 [==============================] - 7s 747ms/step - loss: 0.1424 - acc: 0.9494 Epoch 13⁄15 9⁄9 [==============================] - 7s 732ms/step - loss: 0.4181 - acc: 0.9182 Epoch 14⁄15 9⁄9 [==============================] - 8s 834ms/step - loss: 0.2235 - acc: 0.9289 Epoch 15⁄15 9⁄9 [==============================] - 8s 835ms/step - loss: 0.0485 - acc: 0.9796
可以看出,单从loss和acc上来看,效果还是很不错
使用模型
我们试图从网上随便找几个图片中含有马或者人的图片,输入给模型,看看模型能否识别正确。
|
|
预测
我们使用上述的程序对以下来源于网络的五个图片进行预测,五个图片截图如下:
程序运行后,要求输入图片
分别看看分别输入五个图片时的预测结果,如下所示
结果: ma1.jpg is a horse
结果:ma2.jpg is a horse
结果:ren1.png is a human
结果: ren2.png is a human
结果: ren3.jpg is a horse
结果分析
可以看到总共预测了五个图片,前四个图片预测正确,第五个错误human预测成horse。
第五个图片错了,是因为该图片中有两个人,而训练数据里没有该类特性的数据,因为结果错误。
如果除去第五个不按套路出牌的图片,基本上全对了。
卷积神经网络对特征提取非常有用。
图片预测时的结果截图
文章作者 海萨
上次更新 2019-05-08
许可协议 MIT