使用 tiff 图像重新训练 Inception

Posted

技术标签:

【中文标题】使用 tiff 图像重新训练 Inception【英文标题】:Retraining Inception with tiff images 【发布时间】:2017-11-26 03:15:30 【问题描述】:

我想在 tiff 图像上重新训练 inception 模块。我已按照https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0 中的步骤进行操作。但是,inception 模块似乎不支持 tiff 图像,因为我收到了以下错误

2017-06-22 16:52:56.712653: W tensorflow/core/platform    /cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1     instructions, but these are available on your machine and could speed up CPU     computations.
Looking for images in 'Type 1'
No files found
Looking for images in 'Type 2'
No files found
No valid folders of images found at Myfolder

有没有办法处理这个问题?

【问题讨论】:

截至 2019 年 2 月,一些(有限的和实验性的)TIFF 支持已作为 Tensorflow I/O 库的一部分添加;见***.com/a/67186083/4685471 【参考方案1】:

你说得对,TensorFlow 不支持 TIFF 图像。

请看这里:No Tensorflow decoder for TIFF images?

如果您想使用 TIFF 图像,您可以使用像 PILPillow 这样的库,它们可以读取 TIFF 图像并将它们转换为 numpy 数组以输入 TensorFlow。

有关示例,请参阅 Working with TIFFs (import, export) in Python using numpy。

如果您有大量 TIFF 文件,上述方法会使训练变慢,因为您将花费更多时间读取和解码 TIFF 文件,从而导致 GPU 数据不足。

在这种情况下,请查看https://www.tensorflow.org/extend/new_data_formats,了解如何支持自定义文件格式。

【讨论】:

自 2019 年 2 月起添加了一些有限的支持;见***.com/a/67186083/4685471【参考方案2】:

如果您想采用转换路线,我对 Lipin Yang's website 稍作修改后改编的这段代码可以很好地将 TIFF 转换为 JPEG,用于最近的 TensorFlow 项目。

import os
from PIL import Image

current_path = os.getcwd()
for root, dirs, files in os.walk(current_path, topdown=False):
    for name in files:
        print(os.path.join(root, name))
        #if os.path.splitext(os.path.join(root, name))[1].lower() == ".tiff":
        if os.path.splitext(os.path.join(root, name))[1].lower() == ".tif":
            if os.path.isfile(os.path.splitext(os.path.join(root, name))[0] + ".jpg"):
                print ("A jpeg file already exists for %s" % name)
            # If a jpeg with the name does *NOT* exist, convert one from the tif.
            else:
                outputfile = os.path.splitext(os.path.join(root, name))[0] + ".jpg"
                try:
                    im = Image.open(os.path.join(root, name))
                    print ("Converting jpeg for %s" % name)
                    im.thumbnail(im.size)
                    im.save(outputfile, "JPEG", quality=100)
                except Exception as e: 
                  print(e)

【讨论】:

【参考方案3】:

将 .jpg 文件保存在另一个目录中(扩展 Beau Hilton 的答案)

main_path = "your/main/path"
data_folder = os.path.join(main_path, "Images_tiff")
data_folder_jpg = os.path.join(main_path, "Images_jpg")

if not os.path.isdir(data_folder_jpg):
  os.mkdir(data_folder_jpg)

for root, dirs, files in os.walk(data_folder, topdown=False):
    new_folder = os.path.join(data_folder_jpg,os.path.split(root)[1])
    if (not os.path.exists(new_folder)) and files:
      os.mkdir(new_folder)
    for name in files:
        print(os.path.join(root, name))
        #if os.path.splitext(os.path.join(root, name))[1].lower() == ".tiff":
        if os.path.splitext(os.path.join(root, name))[1].lower() == ".tif":
            if os.path.isfile(os.path.splitext(os.path.join(new_folder, name))[0] + ".jpg"):
                print ("A jpeg file already exists for %s" % name)
            # If a jpeg with the name does *NOT* exist, convert one from the tif.
            else:
                outputfile = os.path.splitext(os.path.join(new_folder, name))[0] + ".jpg"
                try:
                    im = Image.open(os.path.join(root, name))
                    print ("Converting jpeg for %s" % name)
                    im.thumbnail(im.size)
                    im.save(outputfile, "JPEG", quality=100)
                except Exception as e: 
                    print(e)

【讨论】:

以上是关于使用 tiff 图像重新训练 Inception的主要内容,如果未能解决你的问题,请参考以下文章

正方体 - 训练

在python中从PDF中提取图像而不重新采样?

使用 gdal 重新投影 .tiff 文件

使用 MobileNet 重新训练图像检测

无法使用 Java ImageIO 标准库读写 TIFF 图像文件

为啥 FindMimeFromData 可以识别一台主机上的图像/tiff,但不能识别另一台主机上的图像/tiff?