前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于深度学习的图像目标识别预测 | CV | Tensorflow | Keras

基于深度学习的图像目标识别预测 | CV | Tensorflow | Keras

作者头像
用户7623498
发布2020-08-04 15:14:04
1.3K0
发布2020-08-04 15:14:04
举报

在人工智能研究的大潮中,如何模拟人类对于静态或动态目标的有效识别预测一直是研究热点,通过智能技术实现对于目标特征的学习并对特定目标进行快速识别,预测得出目标识别概率,实现基于深度学习模型在复杂背景、不确定外部干扰下的高精度、实时识别目标,能够保持或者优于有丰富经验人员的识别效果。

基础操作

首先,安装Keras、TensorFlow,将TensorFlow作为后端,先去安装TensorFlow。一旦,安装完成了 TensorFlow,只需要使用 pip 很容易的安装 Keras。

安装 h5py,用于模型的保存和载入:

pip install h5py

pip install numpy scipy

pip install pillow

sudo pip install keras

使用以下命令来查看 Keras 版本。

>>> import kerasUsing TensorFlow backend.

>>> keras.__version__'2.0.4'

一旦,Keras 被安装完成,需要去修改后端文件,也就是去确定,需要 TensorFlow 作为后端,还是 Theano 作为后端,修改的配置文件位于 ~/.keras/keras.json 。具体配置如下:

{

"floatx": "float32",

"epsilon": 1e-07,

"backend": "tensorflow",

"image_data_format": "channels_last"

}

请注意,参数 image_data_format 是 channels_last ,也就是说这个后端是 TensorFlow。因为,在TensorFlow中图像的存储方式是[height, width, channels],但是在Theano中是完全不同的,也就是 [channels, height, width]。因此,如果没有正确的设置这个参数,那么你模型的中间结果将是非常奇怪的。对于Theano来说,这个参数就是channels_first。

在Keras中主要的数据结构是 model ,该结构定义了一个完整的图。可以向已经存在的图中加入任何的网络结构。

import keras

Keras 有两种不同的建模方式:

1. Sequential models:这种方法用于实现一些简单的模型。你只需要向一些存在的模型中添加层就行了。

2. Functional API:Keras的API是非常强大的,你可以利用这些API来构造更加复杂的模型,比如多输出模型,有向无环图等等。

序列模型

将解决一个简单的线性回归问题进行建模示例,以下代码是如何开始导入和构建序列模型。

from keras.models import Sequential

models = Sequential()

接下来可以向模型中添加 Dense(full connected layer),Activation,Conv2D,MaxPooling2D函数。

from keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten, Dropout

model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32)))

# This ads a Convolutional layer with 64 filters of size 3 * 3 to the graph

以下是如何将一些最流行的图层添加到网络中。

1. 卷积层

这里使用一个卷积层,64个卷积核,维度是33的,之后采用 relu 激活函数进行激活,输入数据的维度是 `100100*32`。注意,如果是第一个卷积层,那么必须加上输入数据的维度,后面几个这个参数可以省略。

model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32)))

2. MaxPooling 层

指定图层的类型,并且指定赤的大小,然后自动完成赤化操作,酷毙了!

model.add(MaxPooling2D(pool_size=(2,2)))

3. 全连接层

这个层在 Keras 中称为被称之为 Dense 层,只需要设置输出层的维度,然后Keras就会帮助自动完成了。

model.add(Dense(256, activation='relu'))

4. Dropout

model.add(Dropout(0.5))

5. 扁平层

model.add(Flatten())

6. 数据输入

网络的第一层需要读入训练数据。因此我们需要去制定输入数据的维度。因此,input_shape 参数被用于制定输入数据的维度大小。

model.add(Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)))

在这个例子中,数据输入的第一层是一个卷积层,输入数据的大小是 224*224*3 。

以上操作利用序列模型构建了一个模型。一旦指定了一个网络架构,还需要指定优化器和损失函数。在Keras中使用compile函数来达到这个功能。比如,在下面的代码中,使用 rmsprop 来作为优化器,binary_crossentropy 来作为损失函数值。

model.compile(loss='binary_crossentropy', optimizer='rmsprop')

如果想要使用随机梯度下降,那么需要选择合适的初始值和超参数:

from keras.optimizers import SGD

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss='categorical_crossentropy', optimizer=sgd)

现在,已经构建完了模型。接下来,让向模型中输入数据,在Keras中是通过 fit 函数来实现的。也可以在该函数中指定 batch_size 和 epochs 来训练。

model.fit(x_train, y_train, batch_size = 32, epochs = 10, validation_data(x_val, y_val))

最后,使用 evaluate 函数来测试模型的性能。

score = model.evaluate(x_test, y_test, batch_size = 32)

这些就是使用序列模型在Keras中构建神经网络的具体操作步骤。

线性回归

在线性回归问题中,可以得到很多的数据点,然后需要使用一条直线去拟合这些离散点。在这个例子中,创建了100个离散点,然后用一条直线去拟合它们。

a) 创建训练数据

TrainX 的数据范围是 -1 到 1,TrainY 与 TrainX 的关系是3倍,并且加入了一些噪声点。

import keras

from keras.models import Sequential

from keras.layers import Dense

import numpy as np

trX = np.linspace(-1, 1, 101)

trY = 3 * trX + np.random.randn(*trX.shape) * 0.33

b) 构建模型

首先需要构建一个序列模型。需要的只是一个简单的链接,因此只需要使用一个 Dense 层就够了,然后用线性函数进行激活。

model = Sequential()

model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear'))

下面的代码将设置输入数据 x,权重 w 和偏置项 b。具体的初始化工作如下:

weights = model.layers[0].get_weights()

w_init = weights[0][0][0]

b_init = weights[1][0]

print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init))

## Linear regression model is initialized with weight w: -0.03, b: 0.00

现在,可以l利用自己构造的数据 trX 和 trY 来训练这个线性模型,其中 trY 是 trX 的3倍。因此,权重 w 的值应该是 3。

使用简单的梯度下降来作为优化器,均方误差(MSE)作为损失值。如下:

model.compile(optimizer='sgd', loss='mse')

最后,使用 fit 函数来输入数据。

model.fit(trX, trY, nb_epoch=200, verbose=1)

在经过训练之后,再次打印权重:

weights = model.layers[0].get_weights()

w_final = weights[0][0][0]

b_final = weights[1][0]

print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))

##Linear regression model is trained to have weight w: 2.94, b: 0.08

在运行 200 轮之后,现在权重非常接近于 3。可以将运行的轮数修改为区间 [100, 300] 之间,然后观察输出结构有什么变化。

一旦利用Keras完成了训练,就可以将的网络保存在HDF5里面。当然,你需要先安装 h5py。HDF5 格式非常适合存储大量的数字,并从 numpy 处理这些数据。比如,可以轻松的将存储在磁盘上的多TB数据集进行切片,就好像他们是真正的 numpy 数组一样。还可以将多个数据集存储在单个文件中,遍历他们或者查看 .shape 和 .dtype 属性。

如果要保存训练好的权重,那么可以直接使用 save_weights 函数。

model.save_weights("my_model.h5")

载入预训练权重,如果想要载入以前训练好的模型,那么可以使用 load_weights 函数。

model.load_weights('my_model_weights.h5')

应用级复杂神经网络举例

如果对于简单的模型和问题,那么序列模型是非常好的方式。但是如果要构建一个现实世界中复杂的网络,那么就需要知道一些功能性的API,在很多流行的神经网络中都有一个最小的网络结构,完整的模型是根据这些最小的模型进行叠加完成的。这些基础的API可以让一层一层的构建模型。因此,只需要很少的代码就可以来构建一个完整的复杂神经网络。

首先,需要导入一些包。

from keras.models import Model

现在,需要去指定输入数据,而不是在顺序模型中,在最后的 fit 函数中输入数据。这是序列模型和这些功能性的API之间最显著的区别之一。使用 input() 函数来申明一个 1*28*28 的张量。

from keras.layers import Input

## First, define the vision modules

digit_input = Input(shape=(1, 28, 28))

现在,让来利用API设计一个卷积层,需要指定要在在哪个层使用卷积网络,具体代码这样操作:

x = Conv2D(64, (3, 3))(digit_input)

x = Conv2D(64, (3, 3))(x)

x = MaxPooling2D((2, 2))(x)

out = Flatten()(x)

最后,对于指定的输入和输出数据来构建一个模型。

vision_model = Model(digit_input, out)

当然,还需要指定损失函数,优化器等等。

在进行图像目标识别时可以使用的模型有很多,但是通常图像目标识别对于计算资源要求很高,而equeezeNet 是一个非常了不起的网络架构,它的显著点不在于对正确性有多少的提高,而是减少了计算量。当SequeezeNet的正确性和AlexNet接近时,但是ImageNet上面的预训练模型的存储量小于5 MB,这对于在现实世界中使用CNN是非常有利的。SqueezeNet模型引入了一个 Fire模型,它由交替的 Squeeze 和 Expand 模块组成。

SqueezeNet fire module

对 fire 模型进行多次复制,从而来构建完整的网络模型,具体如下:

为了去构建这个网络,将利用Keras API的功能来构建一个单独的 fire 模块,当构建完模型后即可对一幅图识别概率预测。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决策智能与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档