Tensorflow移除JFIF

问题描述 投票:1回答:1

我对tensorflow还是很陌生,我想清楚地知道以下命令的作用是什么?

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import os

num_skipped = 0
for folder_name in ("Cat", "Dog"):
    print("folder_name:",folder_name) #folder_name: Cat
    folder_path = os.path.join("Dataset/PetImages", folder_name)
    print("folder_path:",folder_path) #folder_path: Dataset/PetImages/Cat
    for fname in os.listdir(folder_path):
        print("fname:",fname) #fname: 5961.jpg
        fpath = os.path.join(folder_path, fname)
        print("fpath:", fpath) #fpath: Dataset/PetImages/Cat/10591.jpg
        try:
            fobj = open(fpath, "rb")
            is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)
        finally:
            fobj.close()

        if not is_jfif:
            num_skipped += 1
            # Delete corrupted image
            os.remove(fpath)

print("Deleted %d images" % num_skipped)

Keras网站对以上代码的评论:

当处理大量真实世界的图像数据时,损坏的图像是经常发生的情况。让我们过滤掉标题中不包含字符串“ JFIF”的错误编码的图像。

我想特别知道下面的命令做什么,怎么做?

 is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)

我检查了API,但显然不能理解它。

更好的解释将有很大帮助。

谢谢

python tensorflow keras deep-learning classification
1个回答
0
投票

该命令将给定的字符串(JFIF)转换为字节,并检查它是否存在于文件对象的字节10处。快速验证标题的内容。

不是处理“损坏的数据”的首选,通常您将其留给对图像处理了解更多的模块。虽然这是一个教程,所以重点是简洁和突出问题,而不是提供全面的解决方案。


0
投票

[Wikipedia说明JPG文件在文件的开头包含字符串“ JFIF”,以字节编码:]

JFIF header

所以:

  • tf.compat.as_bytes("JFIF")将字符串“ JFIF”转换为字节。您也可以只使用b"JFIF",尽管也许TensorFlow实现具有一些我不知道的优化。
  • fobj.peek(10)理论上返回文件的前10个字节,但实际上,它通常返回entire file
  • [is_jfif然后仅检查转换后的“ JFIF”字符串是否在fobj.peek的结果中。
© www.soinside.com 2019 - 2024. All rights reserved.