tf.image.decode_jpeg(别名tf.io.decode_jpeg)函数工作原理分析

文章探讨了在使用预训练的VGG16模型时,如何处理灰度图像的问题。作者发现在读取JPEG图像时,通过tf.image.decode_jpeg将通道数设置为3,实际上是采用了复制灰度图通道的方法,而非改变像素值。通过实验验证,三个通道的像素值相同,确认了tf.image.decode_jpeg使用了方法3。

1 问题提出

最近在阅读某个论文的源代码时, 发现作者在读取图像数据时没有使用PIL.Image或opencv库,而是使用了tf.image.decode_jpeg,代码节选如下:

# tf1中的函数, 用于读取文件
# tf2中该函数更改为了tf.io.read_file
image_contents = tf.read_file(img_path)

# tf.image.decode_jpeg别名tf.io.decode_jpeg, 用于将JPEG编码的图像解码为uint8张量
# channels参数设置返回的张量的通道数量
image = tf.image.decode_jpeg(image_contents, channels=3)

在这里加载的原始数据是灰度数据,即通道数为1。

然而作者为了使用预训练的VGG16模型,在加载数据时将通道数channels参数设置为了3。

因为预训练的VGG16模型在ImageNet数据集上进行的预训练,而ImageNet的单张图片数据是形状为[3, 224, 224]的矩阵,这意味着预训练的VGG16模型的结构要求输入数据的通道数为3。

所以在使用预训练的VGG16模型时,如果处理的数据是灰度数据,需要额外处理将通道数变换为3。

我了解到的做法有4种:

(1)使用一个卷积核为1的卷积(Conv 1X1)将灰度图像的通道数增大为3

(2)处理预训练的VGG16的第一个卷积的参数,将三通道的权重参数求和

例如第一个卷积是

Conv2d(3, 64, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))

那么权重矩阵就是64个[3, 4, 4]的矩阵,即形状为[64, 3, ,4, 4]的矩阵

将第2个维度的参数求和,则权重矩阵变换为形状为[64, 1, ,4, 4]的矩阵

(3)将灰度图在第一个维度复制三遍,则图像数据从[1, h, w]变换为[3, h,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值