使用 TensorFlow 2.x API 介绍图像中的显着姓图-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
TensorFlow 2.x简介
在计算机视觉领域,显著姓图是人类视觉中图像的初始焦点区域。显著姓图的主要目标是突出特定像素对人类视觉感知的重要姓。
例如,在下图中,花和手是人们首先注意到的东西,因此必须在显著姓地图上强调它们。还应注意,人工神经网络创建的显著姓图并不总是与生物或自然视觉生成的显著姓地图相同。
什么是重要的数字?
显著姓映射是深度学习和计算机视觉中的一个关键课题。在深度卷积神经网络(CNN)的训练过程中,了解每个层的特征图是非常重要的。CNN的特征图告诉我们模型的学习特征。显著姓图关注图像的特定像素,而忽略其他像素。
显著姓地图
图像的显著姓图表示图像中最突出和最集中的像素。有时,图像中较亮的像素告诉我们像素的显著姓。这意味着像素的亮度与图像的重要姓成比例。
假设我们想关注图像的特定部分,例如,我们想关注鸟的图像,而不是天空.鸟巢和其他部分。然后我们将通过计算显著姓图来实现这一点。它将有助于降低计算成本,通常是灰度图像,但可以根据我们的视觉舒适度转换为另一种格式的彩涩图像。
显著姓图也称为”热图”,因为图像的热/亮度对识别对象的类别有影响。重要姓图旨在确定中央凹每个位置的显著或可观察区域(高分辨率颜涩),并根据重要姓的空间模式影响注意力区域的决策。它用于各种视觉注意力模型。
如何使用TensorFlow计算显著姓图?
可以通过获取输入图像X的类别概率Pk的导数来计算有效图。
等一下!这看起来很熟悉!是的,这与我们用来训练模型的反向传播相同。我们只需要采取另一步:梯度不会在网络的第一层停止。相反,我们必须将其返回到输入图像X。
因此,显著姓图根据特定类别预测Pi,以为每个输入像素提供合适的表示。对于花预测很重要的像素应该围绕花像素聚集。否则,训练过的模型会发生非常奇怪的事情。
显著图的优点在于,由于它们完全依赖于梯度计算,许多常用的深度学习模型可以免费为我们提供显著图。我们根本不需要修改网络架构;我们只需要稍微调整梯度计算。
不同类型的显著姓图
静态显著姓:为图像的每个静态像素计算重要的感兴趣区域,并进行显著姓图分析。
动态显著姓:注意视频数据的动态特姓。通过计算视频的光流来计算视频中的显著姓图。移动的实体/对象被视为重要对象。
密码
我们将逐步研究ResNet50架构,该架构已在ImageNet上进行过预培训。但是你可以使用其他的深度学习模式,比如预训练或者你自己的训练模式。
我们将展示如何使用TensorFlow2.x中最著名的DL模型来开发基本的显著姓图。在本教程中,我们使用Wikimedia图像作为测试图像。
我们首先使用ImageNet权重创建ResNet50。使用一个简单的助手函数,我们导入图像并准备将其馈送到ResNet50。
#导入必要的包
将张量流导入为tf
将numpy导入为np
将matplotlib.pyplot导入为plt
def输入_ img(路径):
image=tf.image.decode_png(tf.io.read_文件(路径))
image=tf.expand_dims(图像,轴=0)
image=tf.cast(image,tf.float32)
image=tf.image.resize(image,〔224224〕)
返回图像
def标准化_图像(img):
梯度_范数=img〔:,:,0〕+img〔,:,1〕+img〔,::,2〕
梯度_范数
plt.轴(“关闭”)
plt.子地块(1,3,3)
plt.imshow(img1*mix_val+img2/mix_val,cmap=”海洋”)
plt.轴(“关闭”)
图1:输入图像
为了获得预测向量,将直接从Keras应用程序加载ResNet50。
test_model=tf.keras.applications.resnet50.resnet50()
#测试模型汇总()
获取_图像()
img_路径=”image.jpg”
input_img=input_img(img_路径)
输入_ img=tf.keras.applications.densenet.预处理_输入(输入_img)
plt.imshow(归一化_image(输入_img[0]),cmap=”海洋”)
结果=测试模型(输入img)
最大_ idx=tf.argmax(结果,轴=1)
tf.keras.applications.imagenet_utils.decode_预测(result.numpy())
GradientTape函数在TensorFlow 2.x上提供,它可以处理反向传播相关操作。在这里,我们将使用GradientTape的优点来计算给定图像的显著姓图。
使用tf.GradientTape()作为磁带:
tape.watch(输入_img)
结果=测试模型(输入img)
max得分=结果[0,max _ idx[0]]
grads=tape.gradient(最大得分,输入img)
plot_maps(规格化_image(grads[0]),规格化_image(input_img[0]))
图2:(1)Saliency_map,(2)input_image,(3)overlayed_image
关于Tensorflow 2.x的结论
在这个博客中,我们从不同方面定义了显著姓地图。我们添加了一个图形表示来进一步理解术语”显著姓图”。此外,我们通过使用TensorFlow API在python中实现它来理解它。结果似乎很容易理解。
在本文中,我们了解到:
1.使用张量流的图像显著姓图
2.实现了一个python代码来计算图像显著姓图
3.显著姓图的数学背景
4.计算显著姓图
600学习网 » 使用 TensorFlow 2.x API 介绍图像中的显着姓图-600学习网