行业报告 AI展会 数据标注 标注供求
数据标注数据集
主页 > 机器视觉 > 正文

使用 TensorFlow 构建计算机视觉模型

什么是计算机视觉?

计算机视觉 (CV) 是现代人工智能 (AI) 和机器学习 (ML) 系统的主要任务。它正在加速行业中的几乎每个领域,使组织能够彻底改变机器和业务系统的工作方式。

在学术上,它是计算机科学的一个成熟领域,数十年的研究工作已经进入该领域以使其丰富。深度神经网络的使用最近彻底改变了该领域并赋予它新的生命。

计算机视觉有多种应用领域,例如:

  • 自动驾驶
  • 医学影像分析与诊断
  • 检测制造缺陷
  • 监控录像的图像和视频分析
  • 安全系统的面部识别

当然,与 CV 系统相关的挑战很多。例如,自动驾驶不仅仅使用物体检测,还包括物体分类、分割、运动检测等。

最重要的是,这些系统有望在几分之一秒内处理 CV 信息并做出高概率决策。更高级别的监督控制系统必须做出决定,负责最终的驾驶任务。

此外, 多个CV 系统/算法通常在任何受人尊敬的自动驾驶系统中发挥作用。在这些情况下,对并行处理的需求很高,这会导致底层计算机器承受很高的压力。

如果同时使用多个神经网络,它们可能会共享公共系统存储并相互竞争公共资源池。

就医学成像而言,计算机视觉系统的性能由了解图像背后的病理学的 经验丰富的放射科医师和临床专业人员来判断。此外,在大多数情况下,任务涉及识别患病率非常低的罕见疾病。

这使得训练数据稀疏和稀疏,即找不到足够的训练图像。因此,深度学习 (DL) 架构必须通过添加智能处理和架构复杂性来弥补这一点。

为什么选择用于 CV 的 TensorFlow?

TensorFlow 是来自 Google 的一种广泛使用且备受推崇的开源 Python 包,它使构建计算机视觉深度学习模型变得简单直接。来自其官方网站:

“它拥有一个全面、灵活的工具、库和社区资源生态系统,使研究人员能够推动 ML 的最新技术发展,而开发人员则可以轻松构建和部署 ML 支持的应用程序。”

随着 TensorFlow 2.0 的发布和作为高级 API 的 Keras 库集成,可以轻松堆叠神经元层并构建和训练足够复杂的深度学习架构。

EXX-Blog-CV-using-TF-1.jpg

轻松
构建模型 使用 Keras 等直观的高级 API 轻松构建和训练 ML 模型,以实现即时模型迭代和轻松调试

强大的 ML Production Anywhere
无论您使用何种编程语言,都可以轻松地在云端、本地、设备上训练和部署模型。 

强大的研究
功能简单灵活的架构可将新想法从概念转化为代码。自信地发布最先进的模型

现在,当然,TensorFlow 可用于为各种应用程序构建深度学习模型,包括,

  • 物体检测
  • 场景分割
  • 合成图像的生成对抗网络
  • 用于图像压缩的自动编码器
  • 推荐系统

但是,在本文中,我们重点关注使用 TensorFlow 使用卷积神经网络 (CNN) 构建简单对象分类任务的代码和实践示例。

这涵盖了 TensorFlow 的所有基本组件,例如层、优化器、误差函数、训练选项、超参数调整等。

对象分类任务的实践示例

深度学习任务和模型训练广泛受益于游戏处理单元 (GPU) 等专用硬件。

通用 CPU 在处理大量数据时会遇到困难,例如,对具有数万或数十万浮点数的 矩阵执行线性代数运算。

在引擎盖下,深度神经网络主要由矩阵乘法和向量加法等操作组成。开发 GPU(主要迎合视频游戏行业)是为了使用数千个微型计算核心处理大规模并行计算。

它们还具有大内存带宽,以处理神经网络训练数百个时期时这些计算所需的快速数据流(处理单元缓存到较慢的主内存并返回)。这使它们成为处理计算机视觉任务计算负载的理想商品硬件。

使用和检查 GPU

有多种途径可以将 GPU 用于深度学习任务。购买裸机服务器或工作站对于那些寻求最高可定制性的人来说可能是有益的。从 AWS 或 GCP 租用云上的 GPU 计算资源非常适合那些运行数据有限的短会话的人。或者使用免费(但有限)的资源,例如Google Colaboratory。数据集越大,模型越好,但在这个例子中,我们使用最后一个选项 Google Colab。

我们首先测试是否有 GPU 用于训练,

 
import tensorflow as tf
device_name = tf.test.gpu_device_name()

if device_name != '/device:GPU:0':
  raise SystemError('GPU device not found')

print('Found GPU at: {}'.format(device_name))

 

获取数据集

我们使用以下代码直接将数据集下载到本地环境(Google Colab)中。如果您在本地机器上工作(并且已经保存了文件),则相应地修改代码。

!wget --no-check-certificate https: //存储。谷歌 API 。com / laurencemoroney-博客。_ 应用点。com /马或人。压缩

-O / tmp /马-或-人。压缩

访问压缩文件内容

以下 python 代码将使用 OS 库来使用操作系统库,使您可以访问文件系统和 zipfile 库,从而可以解压缩数据。

 
import os
import zipfile

local_zip = '/tmp/horse-or-human.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')

zip_ref.extractall('/tmp/horse-or-human')
zip_ref.close()

 

.zip 的内容被提取到基本目录/tmp/horse-or-human,其中又分别包含马和人的子目录。简而言之,训练集是用来告诉神经网络模型“这是马的样子”、“这是人的样子”等的数据。

请注意,我们没有明确将图像标记为马或人。稍后我们将看到使用了一种称为 ImageGenerator 的东西——它被编码为从子目录中读取图像并自动从该子目录的名称中标记它们。因此,例如,我们将有一个“训练”目录,其中包含一个“马”目录和一个“人”目录。ImageGenerator 将为您适当地标记图像,从而减少编码步骤。

让我们定义这些目录中的每一个。

 
# Directory with our training horse pictures
train_horse_dir = os.path.join('/tmp/horse-or-human/horses')

# Directory with our training human pictures
train_human_dir = os.path.join('/tmp/horse-or-human/humans')

 

下面的代码将让我们看到马匹和人类训练目录中的文件名是什么样的。

 
train_horse_names = os.listdir(train_horse_dir)
print(train_horse_names[:10])

train_human_names = os.listdir(train_human_dir)
print(train_human_names[:10])

 

我们可以找出目录中马和人图像的总数。

 
print('total training horse images:', len(os.listdir(train_horse_dir)))
print('total training human images:', len(os.listdir(train_human_dir)))

 

现在让我们看几张照片,以更好地了解它们的外观。我们首先配置matplot参数,

 
<a data-re-name="format" data-dropdown="true" href="https://app.contentstack.com/#" alt="Format" rel="format" role="button" aria-label="Format" tabindex="-1" data-re-icon="true"></a>
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# Parameters for our graph; we'll output images in a 4x4 configuration
nrows = 4
ncols = 4

# Index for iterating over images
pic_index = 0

 

现在,显示一批 8 匹马和 8 个人的图片。我们可以在 Jupyter notebook 单元格中重新运行以下代码,每次都能看到一个新的批次。

 
# Set up matplotlib fig, and size it to fit 4x4 pics
fig = plt.gcf()

fig.set_size_inches(ncols * 4, nrows * 4)

pic_index += 8
next_horse_pix = [os.path.join(train_horse_dir, fname) 
                for fname in train_horse_names[pic_index-8:pic_index]]

next_human_pix = [os.path.join(train_human_dir, fname) 
                for fname in train_human_names[pic_index-8:pic_index]]

for i, img_path in enumerate(next_horse_pix+next_human_pix):
  # Set up subplot; subplot indices start at 1
  sp = plt.subplot(nrows, ncols, i + 1)
  sp.axis('Off') # Don't show axes (or gridlines)

  img = mpimg.imread(img_path)
  plt.imshow(img)

plt.show()

 

从头开始构建架构

首先导入TensorFlow库,

 
import tensorflow as tf

 

然后我们添加卷积层并将最终结果展平以馈入密集连接层。最后,我们添加密集连接层。

注: 我们面临的是一个二分类问题,即二分类问题;我们将以sigmoid激活结束我们的网络,这样我们网络的输出将是 0 和 1 之间的单个标量,编码当前图像是类别 1(相对于类别 0)的概率。

 
model = tf.keras.models.Sequential([
# Note the input shape is the desired size of the image 300x300 with 3 bytes color

# This is the first convolution
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)),
tf.keras.layers.MaxPooling2D(2, 2),

# The second convolution
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# The third convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# The fourth convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# The fifth convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

# Flatten the results to feed into a DNN
tf.keras.layers.Flatten(),

# 512 neuron hidden layer
tf.keras.layers.Dense(512, activation='relu'),

# Only 1 output neuron. It will contain a value from 0-1 where 0 for 1 class ('horses') and 1 for the other ('humans')
tf.keras.layers.Dense(1, activation='sigmoid')
])

 

请注意使用tf.kerasAPI 来构建模型。方法调用打印神经网络的model.summary()摘要。

“输出形状”列显示特征图的大小在每个连续层中如何演变。由于填充,卷积层将特征图的大小减少了一点,每个池化层将维度减半。

接下来,我们将配置模型训练的规范。我们将使用 训练我们的模型,binary_crossentropy loss因为它是一个二元分类问题,我们的最终激活是一个 sigmoid。我们将使用学习率为 0.001rmsprop的优化器。

在训练期间,我们需要监控分类准确性。注意:在这种情况下,使用RMSprop 优化算法比随机梯度下降(SGD) 更可取,因为它rmsprop可以为我们自动调整学习率。

其他优化器,如Adam和Adagrad,也会在训练期间自动调整学习率,并且在这里也同样有效。

 
from tensorflow.keras.optimizers import RMSprop

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(lr=0.001),
              metrics=['acc'])

 

数据预处理

让我们设置数据生成器来读取源文件夹中的图片,将它们转换为 float32 张量,并将它们(连同它们的标签)提供给我们的网络。我们将有一个用于训练图像的生成器和一个用于验证图像的生成器。我们的生成器将生成大小为 300x300 的图像及其标签(二进制)的批次。

您可能已经知道,进入神经网络的数据通常应该以某种方式进行归一化,以使其更易于网络处理。(将原始像素送入修道院并不常见。)

在我们的例子中,我们将通过将像素值归一化到 [0, 1] 范围内(最初所有值都在 [0, 255] 范围内)来预处理我们的图像。

在 Keras 中,这可以使用 rescale 参数来完成:

 
keras.preprocessing.image.ImageDataGenerator 

 

.flow(data, labels)此 ImageDataGenerator 类允许您通过或)实例化增强图像批次(及其标签)的生成器.flow_from_directory(directory。

然后,这些生成器可以与接受数据生成器作为输入的 Keras 模型方法一起使用:fit_generator, evaluate_generator和predict_generator。

 
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1/255)

# Flow training images in batches of 128 using train_datagen generator
train_generator = train_datagen.flow_from_directory(
        '/tmp/horse-or-human/', # This is the source directory for training images
        target_size=(300, 300), # All images will be resized to 300x300
        batch_size=128,
        # Since we use binary_crossentropy loss, we need binary labels
        class_mode='binary')

 

训练和准确度图

让我们训练 15 个时期——这可能需要几分钟才能在典型的 Google Colab 硬件上运行。Loss 和 Accuracy 是训练进度的重要指标。它对训练数据的分类进行猜测,然后根据已知标签进行测量,计算结果。准确性是正确预测的分数/百分比。

 
history = model.fit_generator(
      train_generator,
      steps_per_epoch=8,  
      epochs=15,
      verbose=2)

 

以下代码将帮助我们绘制精度图,即精度如何随着重复训练(通过网络来回传递图像)时期而提高。

 
plt.plot(history.history['acc'],c='k',lw=2)
plt.grid(True)
plt.title("Training accuracy with epochs
",fontsize=18)
plt.xlabel("Training epochs",fontsize=15)
plt.ylabel("Training accuracy",fontsize=15)
plt.show()

 

预言

现在让我们看一下使用模型实际运行预测。此代码将允许您从文件系统中选择 1 个或多个文件,然后上传它们并通过模型运行它们,指示对象是马还是人。为此,我们使用类中files.upload()的方法google.colab。

注意:请从互联网上下载一些马和人的图像,并将它们保存在您的本地硬盘上,因为您需要上传它们来测试模型。您可以一次上传多张图片。

 
import numpy as np
from google.colab import files
from keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys():
  # predicting images
  path = '/content/' + fn
  img = image.load_img(path, target_size=(300, 300))
  plt.imshow(img)
  plt.show()
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)

images = np.vstack([x])
  classes = model.predict(images, batch_size=10)
  if classes[0]>0.5:
    print(fn + " shows a human image")
  else:
    print(fn + " shows a horse image")

 

以下是一些示例测试图像。如果训练得当,网络将为第一个预测“人类”类别,为其他三个预测“马”类别。

 

该模型有些正确,但有些错误。该模型在最后一张图像中出错的可能性很高。我们鼓励您使用您的图像进行测试并检查模型的性能。

使用 TensorFlow 的计算机视觉

本文介绍了使用 TensorFlow 和 Keras 框架为对象分类任务构建具有卷积神经网络架构的计算机视觉模型。

提供了动手代码,TensorFlow 的所有重要组件——层、模型编译、优化器、损失函数,甚至图像生成器类——都包含在这个示例中。以此为起点,探索更多使用 TensorFlow 的 CV 任务,例如对象检测、语义分割等。

微信公众号

声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

相关文章:

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
SEM推广服务

Copyright©2005-2026 Sykv.com 可思数据 版权所有    京ICP备14056871号

关于我们   免责声明   广告合作   版权声明   联系我们   原创投稿   网站地图  

可思数据 数据标注行业联盟

扫码入群
扫码关注

微信公众号

返回顶部