所以我有 600,000 多张图像。我估计其中大约 5-10% 已损坏。我正在生成一个日志,准确记录与该图像相关的图像。
使用Python,到目前为止我的方法是这样的:
def img_validator(source):
files = get_paths(source) # A list of complete paths to each image
invalid_files = []
for img in files:
try:
im = Image.open(img)
im.verify()
im.close()
except (IOError, OSError, Image.DecompressionBombError):
invalid_files.append(img)
# Write invalid_files to file
前 200-250K 图像的处理速度相当快,大约只需要 1-2 小时。我让该进程运行一夜(当时为 230K),8 小时后它仅为 310K,但仍在进行中。
有人知道这是为什么吗?起初我以为这可能是由于图像存储在 HDD 上,但这并没有真正意义,因为前 200-250k 速度非常快。
如果您有那么多图像,我建议您使用多重处理。我创建了 100,000 个文件,其中 5% 已损坏,并按如下方式检查它们:
#!/usr/bin/env python3
import glob
from multiprocessing import Pool
from PIL import Image
def CheckOne(f):
try:
im = Image.open(f)
im.verify()
im.close()
# DEBUG: print(f"OK: {f}")
return
except (IOError, OSError, Image.DecompressionBombError):
# DEBUG: print(f"Fail: {f}")
return f
if __name__ == '__main__':
# Create a pool of processes to check files
p = Pool()
# Create a list of files to process
files = [f for f in glob.glob("*.jpg")]
print(f"Files to be checked: {len(files)}")
# Map the list of files to check onto the Pool
result = p.map(CheckOne, files)
# Filter out None values representing files that are ok, leaving just corrupt ones
result = list(filter(None, result))
print(f"Num corrupt files: {len(result)}")
样本输出
Files to be checked: 100002
Num corrupt files: 5001
在我的带有 NVME 磁盘的 12 核 CPU 上,这需要 1.6 秒,但对您来说应该仍然明显更快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)