当前位置: 首页 > 知识库问答 >
问题:

如何使keras ImageGenerator正确加载16位图像?

凤高澹
2023-03-14

我搜索过类似的问题,但没有找到解决方案。我有16位灰度图像,我正在尝试将它们放入keras ImageDataGenerator中。当使用诸如:flow_from_dataframe之类的函数时,它会生成所有具有相同像素值的图像(不正确)。

我尝试使用keras preprocess_输入,通过自定义预处理函数将其重新缩放到[0,1],再缩放到[-1,1],但这些都不起作用。我还在ImageDataGenerator中设置了color_mode='grayscale'。

我进一步测试了转换为8位的过程,结果成功了。我将通道的数量增加了三倍,这不是问题所在,因为它仍然使用8位。我已经读到keras在本例中使用PIL库读取图像,由于它没有正确处理16位,所以返回该错误。我看到我们可以设置一个不同的库来加载图像,但我不知道怎么做。

有人知道使用16位图像的替代方案吗?在最后一个例子中,我会尝试一个定制的生成器,但我真的很想从已经为此构建和测试的函数中获益。

我的目标是使用这些图像来微调预先训练的网络,所以我想标准化我使用的输入类型。

谢谢

共有2个答案

潘英豪
2023-03-14

这是keras_预处理版本中的一个bug

pip install git+git://github.com/keras-team/keras-preprocessing.git --upgrade --no-deps

并且,使用color_mode='grayscale',您的ImageDataGenerator将正确加载16位灰度图像。

这个bug由Rodrigo Agundez修复(更多细节请参见他的帖子和pull请求),应该在下一个版本中发布。问题来自加载图像时的keras_预处理:

# PIL library
img = pil_image.open(io.BytesIO(f.read()))

# This was the bug: converting with L mode will truncate all images to 8-bit.
# All values > 255 will be set to 255
if color_mode == 'grayscale':
    img = img.convert('L')

# This is the fix
if color_mode == 'grayscale':
    # if image is not already an 8-bit, 16-bit or 32-bit grayscale image
    # convert it to an 8-bit grayscale image.
    if img.mode not in ('L', 'I;16', 'I'):
        img = img.convert('L')

请注意,如果加载带有color_mode='rgb'的16位灰度图像(例如,如果要将单个灰度通道转换为3通道图像),它将无法工作,因为16位灰度图像将转换为8位。

李宁
2023-03-14

您可能想要编写自己的ImageDataGenerator并覆盖一些方法来按预期加载数据。

有一些很棒的博客文章可以解释你需要的一切。

然后,您必须确保覆盖的数据生成方法加载。tiff将图像正确地转换为numpy数组,或者您可以事先将其转换并加载。

测试生成器也非常简单(做吧!)并检查它是否产生您期望的输出。

 类似资料:
  • 问题内容: 我的应用程序具有以下结构: 我有一个包含一些脚本的功能文件夹,以及一个在ui.py文件上包含PyQt生成的代码的ui文件夹。 还有一个main.py文件,该文件加载ui.py以显示界面,并且ui.py从根目录的“ images”文件夹中加载一些图像。 如果我直接在python上执行脚本(main.py文件中为double clic),则图像不会显示。 但是,如果将终端与“ python

  • 我想在Javascript中加载一个16位灰度PNG(其中每个像素代表一个数字/深度值。TUM使用这种文件格式来存储深度信息) 然而,opencv读取的图像。js是RGBA 8位(——我想得到CV。CV_16UC1),这似乎是因为图像是由浏览器本身解码的,如文件所示。因此,我们得到的不是一个像素,而是一个介于0和65535(2^8-1)之间的值,而是一个介于0和255(2^8-1)之间的数字,R=

  • react项目为了做性能优化减小包体积在项目中用了大量的React.lazy加载组件进行代码分割,效果也挺明显,包大小从1.4M缩小到110KB但是到生产后监控到通过React.Lazy这种方式加载组件会有失败的场景(走到了代码的catch)。请问下这种场景页面是不是会报错白屏(复现不出来不知道现象是怎么样的) 请问各位大佬这种情况该怎么处理啊?添加重试功能? 还是像官方的处理一样添加ErrorB

  • 问题内容: 当有人通过我的应用程序工作时,我正在尝试在后台加载图像。我写的逻辑是这样的: 但是,当我尝试启动这样的新线程时: 但是在程序中我得到错误Looper.prepare必须被调用,随后是逻辑looper.quit() 但是,当我添加Looper.prepare()时,似乎中断了程序,并且没有要调用的looper.quit()。 我是否正确创建任务? 编辑: 这是我尝试运行时的错误日志: 我

  • 我正在尝试转换这个Word文档,它的标题在右边显示了一个图像 http://www.filesnack.com/files/cduiejc7 使用以下示例代码转换为PDF: https://github.com/plutext/docx4j/blob/master/src/samples/docx4j/org/docx4j/samples/convertoutpdf.java Word文档的头部图

  • 问题内容: 好的,所以我一直在尝试使用以下代码加载BufferedImage: 但是,这在运行时给了我一个类型转换错误,那么如何正确加载BufferedImage? 问题答案: 使用来代替: