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,

文章探讨了在使用预训练的VGG16模型时,如何处理灰度图像的问题。作者发现在读取JPEG图像时,通过tf.image.decode_jpeg将通道数设置为3,实际上是采用了复制灰度图通道的方法,而非改变像素值。通过实验验证,三个通道的像素值相同,确认了tf.image.decode_jpeg使用了方法3。
函数工作原理分析&spm=1001.2101.3001.5002&articleId=130755431&d=1&t=3&u=c96ed7eff4e74e8a838a07ca7e5002ac)
2943

被折叠的 条评论
为什么被折叠?



