10分钟搞定图形图像识别

Posted 网易云课堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10分钟搞定图形图像识别相关的知识,希望对你有一定的参考价值。

01


人工智能简历史


机器学习与深度学习 是一门多领域交叉学科,涉及概率论、统计学、算法复杂度理论等多门学科。

专门研究计算机怎样模拟或实现人类的学习行为,以获得新的知识或者技能。

人工智能: 流水线机器其实就是人工智能。
机器学习: 垃圾邮箱机器学习,需要自动过滤算法、今日头条数据推荐
深度学习: 2010 至今,机器学习包含深度学习 (可以理解为高级的机器学习),例如:图形图像识别、自然语言处理
  10分钟搞定图形图像识别 
TensorFlow框架介绍

2016年3月份,Google的围棋人工智能程序AlphaGo以4比1的大比分,战胜人类选手李世石,在全球成功引起广泛关注,引起了一波人工智能的热潮。

从智能手机的语音助手,到相机的人脸识别,人工智能技术已经进入到我们生活的方方面面,在未来将深刻的影响我们的生活。

为了加速深度学习领域的发展,2015年11月9日,Google发布深度学习框架TensorFlow并宣布开源。

在短短的一年时间内,在GitHub上,TensorFlow就成为了最流行的深度学习项目。

TensorFlow在图形分类、音频处理、推荐系统和自然语言处理等场景下都有丰富的应用。

虽然Tenforflow开源时间刚满一年,但是它正在以迅猛的速度渗入到我们的寻常生活中。

Mnist手写数字获取

MNIST是在机器学习领域中的一个经典问题。该问题解决的是把28x28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9, Yann LeCun’s MNIST page提供了训练集与测试集数据的下载
  10分钟搞定图形图像识别 

02


MNIST深度学习入门

神经网络语法

  • 输入向量的维度和输入神经元的个数相同

  • 每个连接都有权重

  • 同一层神经元之间没有连接

  • 神经元由:输入、隐藏、输出层组成


MNIST结构介绍
正如前面提到的一样,每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。

我们把这些图片设为“xs”,把这些标签设为“ys”。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是 mnist.train.images ,训练数据集的标签是 mnist.train.labels。
  10分钟搞定图形图像识别 
我们把这个数组展开成一个向量,长度是 28x28 = 784。如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开。

从这个角度来看,MNIST数据集的图片就是在784维向量空间里面的点, 并且拥有比较复杂的结构 (提醒: 此类数据的可视化是计算密集型的)。


展平图片的数字数组会丢失图片的二维结构信息。这显然是不理想的,最优秀的计算机视觉方法会挖掘并利用这些结构信息,我们会在后续教程中介绍。

但是在这个教程中我们忽略这些结构,所介绍的简单数学模型,softmax回归(softmax regression),不会利用这些结构信息。

因此,在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。

在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。
  10分钟搞定图形图像识别 

加载训练集图片

from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf

# 这些图片并不是传统意义上的png或者jpg格式的图片,因为png或者jpg的图片格式,片会被处理成很简易的二维数组mnist = input_data.read_data_sets("./input_data/",one_hot=True)# 获取训练集 images.shape (55000, 784) 28*28=784,每行都是一张图片特征值print(mnist.train.images)# 打印第一张图,784个特征值的矩阵print(mnist.train.images[0])# 获取目标值矩阵 labels.shape (55000, 10) 10个权重print(mnist.train.labels)# 获取指定的n张图的特征值与目标值print(mnist.train.next_batch(10))

03


MNIST识别 案例

TensorFlow图像识别

import tensorflow as tffrom tensorflow.examples.tutorials.mnist.input_data import read_data_sets

mnist = read_data_sets("../data/input_data", one_hot=True)

X = tf.placeholder(tf.float32, [None, 784],name="X")y = tf.placeholder(tf.float32, [None, 10],name="y_true")

# 建立模型,初始化权重与偏置weight =tf.Variable(tf.random.normal(shape=[784,10]),name="w")# 如果设置为常量,则在训练模型时候bias不会改变# bias = tf.constant(value=0.0,shape=[10],name="bias")# 输出有10个连接点,因此需要设置10个偏置bias = tf.Variable(tf.random.normal(shape=[10]),name="bias")# 预测值None个样本输出的结果 [None,784] ==> [784,10] ==> [None,10] + [10]y_predict = tf.matmul(X,weight) + bias# 打印结果发现此公式可以取代上面的softmax + 交叉熵的计算loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_predict))# 设置梯度下降的步长,一般0,1之间,步长越小则需要更多额训练次数,但是错过最小值机率也小gdo = tf.train.GradientDescentOptimizer(0.5) # 0.05 0.1 0.5train_op = gdo.minimize(loss)print('求解模型的正确率')arg1 = tf.argmax(y_predict,axis=1)arg2 = tf.argmax(y,axis=1)accuracy = tf.reduce_mean(tf.cast(tf.equal(arg1,arg2),tf.float16))

with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(2000): mnist_x,mnist_y = mnist.train.next_batch(55) d = {X:mnist_x,y:mnist_y} # 每个样本返回1个预测值 sess.run(train_op,feed_dict=d) print(f'训练第{i}次的正确率为{sess.run(accuracy,feed_dict=d)}') else: import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'] guess = sess.run(y_predict, feed_dict=d) # 把特征值,目标值,预测值封装到了一个list中 images_and_labels_and_guess = list(zip(mnist_x, mnist_y, guess)) # figsize:指定总图片的宽和高,单位为英寸, dpi缺省为80 plt.figure(figsize=(20, 18), dpi=200) # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列, # index作为第一个参数,后面的值作为第二个参数,如果参数中有多个元组,会自动封装成一个元组 for index, (image, label, preidct) in enumerate(images_and_labels_and_guess): # 每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域 plt.subplot(5, 11, index + 1) # MNIST图片是一个784维的向量,我们重新把它还原为28x28维的图像 image = image.reshape(28, 28) # plt.cm.gray_r 代表逆转的意思 plt.imshow(image, cmap=plt.cm.gray_r) if index == 1: print(label, preidct) val_t, val_p = tf.argmax(label).eval(), tf.argmax(preidct).eval() if val_t != val_p: color = "#ff0000" else: color = "#000000" plt.title(f'真:{val_t},预:{val_p}', fontsize=20, color=color) plt.savefig("mnist.png") plt.show()


图像识别效果演示


点击阅读原文, 了解课程详情

以上是关于10分钟搞定图形图像识别的主要内容,如果未能解决你的问题,请参考以下文章

独家 | 10分钟搭建你的第一个图像识别模型(附步骤代码)

10分钟搭建你的第一个图像识别模型 | 附完整代码

两行代码轻松搞定图像识别!

一行代码快速图像识别~一排代码搞定视频识别

图像识别学习项目-python搭配opencv搞定阴阳师集市闹市999次活动

百度AI开放平台,两行代码也能搞定图像识别!