热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python人脸识别项目之学习笔记(五):卷积神经网络

你要学到的知识点卷积神经网络1.卷积神经网络卷积神经网络(ConvolutionalNeuralNetwork)简称CNN,CNN是所有深度学习课程、书籍必教的模型,CNN在影

你要学到的知识点



  • 卷积神经网络


1. 卷积神经网络

卷积神经网络(Convolutional Neural Network)简称CNN,CNN是所有深度学
习课程、书籍必教的模型,CNN在影像识别方面的为例特别强大,许多影像识别
的模型也都是以CNN的架构为基础去做延伸。另外值得一提的是CNN模型也是
少数参考人的大脑视觉组织来建立的深度学习模型,学会CNN之后,对于学习其
他深度学习的模型也很有帮助,通过一个例子来讲解CNN的原理以及使用CNN
来达成99%正确度的手写字体识别。
在这里插入图片描述
在这里插入图片描述
从上面三张图片我们可以看出,CNN架构简单来说就是:图片经过各两次的
Convolution, Pooling, Fully Connected就是CNN的架构了,因此只要搞懂Convolution,
Pooling, Fully Connected三个部分的内容就可以完全掌握了CNN!


CNN在图像识别的案例:

假设给定一张图(可能是字母X或者字母O),通过CNN即可识别出是X还是O,
如下图所示,那怎么做到的呢
在这里插入图片描述
提取特征
如果字母X、字母O是固定不变的,那么最简单的方式就是图像之间的像素一一
比对就行,但在现实生活中,字体都有着各个形态上的变化(例如手写文字识
别),例如平移、缩放、旋转、微变形等等,如下图所示
在这里插入图片描述
我们的目标是对于各种形态变化的X和O,都能通过CNN准确地识别出来,这就涉
及到应该如何有效地提取特征,作为识别的关键因子。

对于CNN来说,它是一小块一小块地来进行比对,在两幅图像中大致相同的位置找到一些粗糙的特征(小块图像)进行匹配,相比起传统的整幅图逐一比对的方式,CNN的这种小块匹配方式能够更好的比较两幅图像之间的相似性。如下图:
在这里插入图片描述
以字母X为例,可以提取出三个重要特征(两个交叉线、一个对角线),
如下图所示:
在这里插入图片描述

假如以像素值"1"代表白色,像素值"-1"代表黑色,则字母X的三个重要特征如下:在这里插入图片描述


卷积

当给定一张新图时,CNN并不能准确地知道这些特征到底要匹配原图的哪些部分,所以它会在原图
中把每一个可能的位置都进行尝试,相当于把这个feature(特征)变成了一个过滤器。这个用来匹
配的过程就被称为卷积操作,这也是卷积神经网络名字的由来。
在这里插入图片描述
在本案例中,要计算一个feature(特征)和其在原图上对应的某一小块的结果,只需将两个
小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后
再除以小块内像素点总个数即可(注:也可不除以总个数的)。

如果两个像素点都是白色(值均为1),那么1 * 1 = 1,如果均为黑色 ,那么 (-1)*(-1) = 1,也就是说,每一对能够匹配上的像素,其相乘结果为1。类似地,任何不匹配的像素相乘结果为-1。具体过程如下(第一个、第二个……、最后一个像素的匹配结果):
在这里插入图片描述

根据卷积的计算方式,第一块特征匹配后的卷积计算如下,结果为1
在这里插入图片描述

对于其它位置的匹配,也是类似(例如中间部分的匹配)
在这里插入图片描述
计算之后的卷积如下
在这里插入图片描述

以此类推,对三个特征图像不断地重复着上述过程,通过每一个feature(特征)的卷积操作,
会得到一个新的二维数组,称之为feature map。其中的值,越接近1表示对应位置和feature
的匹配越完整,越是接近-1,表示对应位置和feature的反面匹配越完整,而值接近0的表示对
应位置没有任何匹配或者说没有什么关联。如下图所示:

在这里插入图片描述

在这里插入图片描述

代码实现


tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
'参数:
input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3
filter: 相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维;
卷积时在图像每一维的步长,这是一个一维的向量,长度4
padding: string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式
use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true结果返回一个Tensor,这个输出,就是我们常说的feature map


在这里插入图片描述
分析:



  1. 需要做卷积的图片是一个3*3的彩色图片

import tensorflow as tfinput = tf.constant([[[[100., 100., 100.],[100., 100., 100.],[100., 100., 100.]],[[100., 100., 100.],[100., 100., 100.],[100., 100., 100.]],[[100., 100., 100.],[100., 100., 100.],[100., 100., 100.],]]]
)filter = tf.constant([[[[0.5, 0.1],[0.5, 0.1],[0.5, 0.1]],[[0.5, 0.1],[0.5, 0.1],[0.5, 0.1]]],[[[0.5, 0.1],[0.5, 0.1],[0.5, 0.1]],[[0.5, 0.1],[0.5, 0.1],[0.5, 0.1]]],]
)result1 = tf.nn.convolution(input, filter, padding='VALID')
result2 = tf.nn.convolution(input, filter, padding='SAME')with tf.Session() as sess:print(sess.run([result1, result2]))

推荐阅读
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在Android开发中,BroadcastReceiver(广播接收器)是一个重要的组件,广泛应用于多种场景。本文将深入解析BroadcastReceiver的工作原理、应用场景及其具体实现方法,帮助开发者更好地理解和使用这一组件。通过实例分析,文章详细探讨了静态广播的注册方式、生命周期管理以及常见问题的解决策略,为开发者提供全面的技术指导。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
author-avatar
风暴工会
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有