首发地址:https://yq.aliyun.com/articles/288077

2017年已到最后一个月的尾巴,那圣诞节还会远吗?不知道各位对于圣诞节有什么安排或一些美好的回忆,我记得最清楚的还是每年圣诞节前一晚那些包装好的苹果,寓意平平安安。那谈到圣诞节,不可或缺的主角——“圣诞老人”会出现在各地的大街小巷、各种画册上,本文将带领读者使用Keras完成“圣诞老人”图像的分类,算是圣诞节前的预热活动吧。

在介绍正式内容前,读者可以先看这篇内容:

如何利用谷歌图片获得训练数据

在本教程的第一部分,将介绍本文使用的数据集;其次使用Python和Keras训练一个卷积神经网络模型,该模型能够检测一个图像中是否存在圣诞老人,

所选的网络结构类似于LeNet网络;最后,在一系列的图像上评估本文搭建的模型,然后讨论一下本文方法的局限性以及如何拓展等。

“圣诞老人”和“非圣诞老人”数据集

为了训练搭建的模型,本文需要两类图像集:

  • 图像含圣诞老人(“圣诞老人”);
  • 图像不包含圣诞老人(“不是圣诞老人”)

上周我们用谷歌图片迅速获取训练图像数据集,数据集中包含461张有圣诞老人的图像中,如图1(左)所示;此外从UKBench数据集中随机获取461张不包含圣诞老人,如图1(右)所示。

基于卷积神经网络和Keras搭建的第一个图像分类器

如图2所示,该图是一个典型的Lenet网络结构,最初被用来数字手写体的分类,现将其扩展到其他类型的图像。

本教程主要是介绍如何将深度学习应用于图像分类中,所以不会对Keras和Python语句介绍得非常详细,感兴趣的读者可以看下Deep Learning for Computer Vison with Python这本书。

首先先定义网络架构。创建一个新文件并命名为lenetpy,并插入以下代码:

第2-8行是需要导入的Python包,其中conv2d表示执行卷积,maxpooling2d表示执行最大池化,Activation表示特定的激活函数类型,Flatten层用来将输入“压平”,用于卷积层到全连接层的过渡,Dense表示全连接层。

真正创建Lenet网络结构是代码的第10-12行,每当定义了一个新的卷积神经网络结构时,我喜欢:

  • 把它放在自己的类中(为了命名空间及便于组织)
  • 创建一个静立建造函数,来完成整个模型的建立

建立的模型时需要大量的参数:

  • weight:输入图像的宽度
  • height:输入图像的高度
  • depth:输入图像的通道数(1表示单通道图像灰度,3表示标准的RGB图像)
  • claclasses:想要组织的层类别总数

第1第4行定义我们的模型,第15行初始化inputshape,第18-19行正常更新inputshape

现在我们已经初始化我们的模型,可以开始添加其它层,代码如下:

第21-25行创建第一个CONV->RELU->POOL层,卷积层使用20个大小5x5的滤波器,之后紧跟RELU激活函数,最后使用窗口大小为2x2的最大池化操作;

之后定义第二个CONV->RELU->POOL层:

这次卷积层使用50个滤波器,滤波器个数的增加加深整个网络体系结构。

最终的代码块是将数据“压平”以连接全连接层:

第33行能将maxpooling2d层的输出压扁成一个单向量;

第34行显示全连接层包含500个节点,然后紧跟一个ReLU激活函数;

第38行定义另一个全连接层,该层的节点数等于分类的类别数,Dense

层送入softmax分类器输出每类的概率值;

第42行返回模型的调用函数;

使用Keras训练卷积神经网络图像分类器

打开一个新的文件并命名为train_networkpy,并插入以下代码打开

第2 - 18行导入程序需要的数据包;

下面开始解析命令行参数:

这里有两个需要命令行参数,--dataset和--model,以及accuracy/loss图的路径选择。其中--dataset表示模型的训练集,--model表示训练分类器后保存的模型,如果--plot未指定,则默认为plot.PNG。

接下来,设置一些训练变量、初始化列表并设置图像路径:

第32-34行定义模型的训练次数、初始学习率以及批量大小;

第38和39行初始化数据和标签列表,这些列表对应存储图像以及类别标签;

第42-44行获取输入图像路径并将图像随机打乱;

现在对图像进行预处理:

该循环简单的将每个图像的尺寸重新调整为28×28大小(为LeNet所需要的空间尺寸)

能够提取标签是由于我们的数据目录结构如下所示:

因此,imagePath的一个例子为:

从ImagePath提取标签,结果为:

下一步,将数据集分为训练数据集和测试数据集:

第61行进一步预处理输入数据,按比例将数据点[ 0, 255 ]缩放到[ 0, 1 ]范围内;

然后第66-67行将75%数据作为训练集,25%数据作为测试集;第70-71行对标签进行独热编码;随后,通过以下操作增加数据量:

第74-76行创建一个图像发生器,对数据集图像进行随机旋转、移动、翻转、剪切等,通过这种操作允许我们能用一个较小的数据集实现好的结果。

继续深入学习Keras训练图像分类器:

第80-83行使用Adam优化器,由于本文是一个二分类问题,可以使用二进制交叉熵损失函数(binary cross-entropy)。但如果执行的分类任务多于两类,损失函数更换为类别交叉熵(categorical_crossentropy)

第87-89行调用model.fit_generator开始训练网络,第93行保存模型参数,最后画出图像分类器的性能结果:

为了训练网络模型,需要打开一个终端执行以下命令:

可以看到,当网络训练了25个回合后,模型的测试精度为97.40%,损失函数也很低,如下图所示:

评估卷积神经网络图像分类器

打开一个新的文件并命名为test_networkpy,然后开始进行评估:

第2-7行导入需要的数据包,另外注意导入的load_model是训练过程中保存的模型。

下一步,解析命令行参数:

需要两个命令行参数:--model和输入--image,然后加载图像预处理:

预处理与前面几乎一模一样,这里不做过多的解释,只是第25行通过np.expand_dims对数据额外添加了一个维度,如果忘记添加维度,它将导致调用model.predict时出现错误。现在加载图像分类器模型并进行预测:

第29行加载模型,第32行做出预测。最后画出头像以及预测标签:

第35行建立标签,第36行选择对应的概率值,第37行将标签文本显示在图像的左上角,第40-42行调整图像大小为标准的宽度以确保它适应电脑屏幕,最后,第45行显示输出图像,第46行表示当一个键被按下结束显示。

以下是包含圣诞老人图像的实验结果:

以下是不包含圣诞老人图像的实验结果:

本文图像分类模型的局限性

本文图像分类器有一些局限性:

第一个是输入图像尺寸28×28很小。一些示例图像(图像中圣诞老人本身已经很小)调整尺寸为28×28后大大降低圣诞老人的尺寸。

最优的卷积神经网络正常接受输入图像大小一般为200-300像素,因此一些较大尺寸的图像将帮助我们建立一个更强大的图像分类器。然而,使用更大的分辨率的图像会加深网络模型的深度和复杂度,这将意味着需要收集更多的训练数据,以及昂贵的计算训练过程。

因此,如果各位读者想提高本文模型的精度话,有以下四点建议:

  • 收集更多的训练数据(超过5000幅“圣诞老人”图像);
  • 利用高分辨率的图像在训练。 64×64、128×128像素的图像可能效果会更理想;
  • 在训练过程中使用一个更深层次的网络体系结构;
  • 阅读Deep Learning for Computer Vision with Python,里面有更多关于自定义数据集等内容的细节;

总结

  • 本文教你学会利用Keras和Pyhton训练LeNet模型,并用来完成是否含有圣诞老人形象的图像分类,最终目标可以是建立一个应用程序类似于Not Hotdog
  • “圣诞老人”图像数据集(460幅)是按照之前的教程——通过谷歌图片采集深度学习的图像获得,而“没有圣诞老人”的图像数据集是由从UKBench数据集中挑选得到;
  • 在一系列的测试图像上评估本文搭建的网络模型,在每一种情况下,本文模型都能对输入图像分类正确。

作者信息

Adrain Rosebrock,企业家、博士,专注于图像搜索引擎。

Linkedin: https://www.linkedin.com/in/adrian-rosebrock-59b8732a/

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Image classification with Keras and deep learning》,作者:Adrain Rosebrock,译者:海棠,审阅:董邵男。

文章为简译,更为详细的内容,请查看原文

翻译者: 海棠

Wechat:269970760
weibo:Uncle_LLD

Email:duanzhch@tju.edu.cn

微信公众号:AI科技时讯

Keras快速上手——打造个人的第一个“圣诞老人”图像分类模型相关推荐

  1. Keras快速上手:基于Python的深度学习

    Keras快速上手:基于Python的深度学习 谢梁,鲁颖,劳虹岚 著 ISBN:9787121318726 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2017-0 ...

  2. 利用Keras使用非常少的数据建立强大的图像分类模型

    博客原文 在本教程中,我们将介绍一些简单而有效的方法,您可以使用这些方法来构建强大的图像分类器,仅使用极少数的训练实例 - 只需从您想要识别的每个类别中挑选几百或几千张图片即可. 我们将会涵盖以下内容 ...

  3. GitChat · 人工智能 | 如何零基础用 Keras 快速搭建实用深度学习模型

    GitChat 作者:谢梁 原文: 如何零基础用 Keras 快速搭建实用深度学习模型 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 [不要错过文末活动] 前言 在这篇小文章中,我们将 ...

  4. 嵌入式SQL编程快速上手教程

    嵌入式SQL编程快速上手教程 声明:我这里标题虽是<嵌入式SQL编程快速上手教程>,但只是嵌入式SQL编程的冰山一角罢了,我会通过举一道简单例题来教小白快速上手嵌入式SQL编程 第一:题目 ...

  5. 快速上手UER-py

    快速上手UER-py 1.前言 2.书评分类(BERT模型) 1.前言 预训练已经成为自然语言处理任务的重要组成部分,为大量自然语言处理任务带来了显著提升. UER-py(Universal Enco ...

  6. 《Python编程快速上手——让繁琐工作自动化》——第一部分 Python编程基础 第1章 Python基础 1.1 在交互式环境中输入表达式...

    本节书摘来自异步社区<Python编程快速上手--让繁琐工作自动化>一书中的第1章,第1.1节,作者[美] Al Sweigart,王海鹏 译,更多章节内容可以访问云栖社区"异步 ...

  7. electron 渲染进程调用主进程_万物皆可快速上手之Electron(第一弹)

    (给前端大全加星标,提升前端技能) 作者: 前端森林 公号 /  前端森林 (本文来自作者投稿) 最近在开发一款桌面端应用,用到了Electron和React. React作为日常使用比较频繁的框架, ...

  8. 前端森林:万物皆可快速上手之Electron(第一弹)

    最近在开发一款桌面端应用,用到了Electron和React. React作为日常使用比较频繁的框架,这里就不详细说明了,这里主要是想通过几篇文章让大家快速上手Electron以及与React完美融合 ...

  9. 快速上手Ubuntu之安装常用软件篇——打造一个满足基本娱乐办公的Ubuntu

    该博客是紧接着上一篇的:快速上手Ubuntu之安装篇--安装win7,Ubuntu16.04双系统 在上一篇博客中,我们成功安装了Ubuntu,但只是个全新的系统,我们还需要安装一些常用软件来满足娱乐 ...

最新文章

  1. Angular - - ngHref、ngSrc、ngCopy/ngCut/ngPaste
  2. Java多线程学习(二)---线程创建方式
  3. Quartz1.X中CronTrigger第一次启动的问题
  4. golang修改结构体中的切片值
  5. 吴恩达深度学习一:神经网络
  6. pe下找不到ssd硬盘_【进入pe系统后认不到硬盘解决方法】进入pe系统看不到硬盘_pe系统不认硬盘...
  7. 任天堂 虚拟主机服务器,任天堂 虚拟主机服务器
  8. Java HttpURLConnection示例– Java HTTP请求GET,POST
  9. (22)Python-builtins-sorted()函数用法
  10. @Value注入static属性
  11. 年轻人的第一笔债,在双11的直播间里
  12. 量子计算和量子加密的基础问答
  13. ubuntu局域网服务器搭建网站,ubuntu搭建局域网dns服务器
  14. 浅谈几款软件的创新点
  15. vue大屏项目开发框架dataV
  16. 使用nuvoton976DK61Y BSP运行自己的demon
  17. Android 直播 直播播放器选型
  18. 二分图匹配Hopcroft-Carp算法介绍
  19. 借助 Play Commerce 实现购买优化、灵活订阅和收入增长
  20. android 音乐播放 启动方式 (3)服务通过发送广播来控制activity显示进度等

热门文章

  1. 合工大计算机研究生分数线,2020合肥工业大学研究生分数线汇总(含2016-2019历年复试)...
  2. printf函数 + scanf函数
  3. 微信卖保险,仅1%用户能看到
  4. HTML5期末大作业:网站——卡通漫画游戏官方网页 (萌王) 13个页面 HTML+CSS+JavaScript ~ 学生HTML个人网页作业作品下载 ~ web课程设计网页规划与设计...
  5. 笨方法学Python3 习题2
  6. Job for network.service failed because the control process exited with error code. See systemctl st
  7. 三态门有一个信号控制端en_三态门有哪三态_三态门有什么特点
  8. 三态输出的CMOS门电路(2021.3.5)
  9. 如何看待腾讯 2018 年的架构调整?为什么要将 OMG 等部门做整合?
  10. QML Component