解决Corrupt JPEG data: premature end of data segment
本文不生产技术,只做技术的搬运工!!!
前言
最近在训练yolo的过程中发现大批量警告Corrupt JPEG data: premature end of data segment,之前也出现过,但一直没当回事,但这次数量较大,已经严重影响到模型指标,因此决心解决它。
解决过程
1. 这个问题其实是由于jpg图像损坏导致的,网上有人通过jpg图像的16进制文件来进行分析。判断文件头和文件尾的特征,但是在我这里没有用
2.通过询问大模型,给出的代码都是获取警告等途径,但是该问题并不属于python警告或者错误,而是c++代码中的警告,因此无法抓取
3.使用PIL也无法校验
解决思路
通过pycharm的打印结果来定位图像
1.在pycharm里新建test.py文件,编写代码
import os
import cv2
import time
def getFileList(dir, Filelist, ext=None):
"""
获取文件夹及其子文件夹中文件列表
输入 dir:文件夹根目录
输入 ext: 扩展名
返回: 文件路径列表
"""
newDir = dir
if os.path.isfile(dir):
if ext is None:
Filelist.append(dir)
else:
if ext in dir:
Filelist.append(dir)
elif os.path.isdir(dir):
for s in os.listdir(dir):
newDir = os.path.join(dir, s)
getFileList(newDir, Filelist, ext)
return Filelist
path = r'/home/workspace/temp/images'
img_list = []
img_list = getFileList(path,img_list,ext='.jpg')
corrupted_images = []
with open('/home/workspace/temp/images/break/test.log','r') as f:
lines = f.readlines()
count_lines_old = len(lines)
old_img_path = ""
for img_path in img_list:
img = cv2.imread(img_path)
time.sleep(0.01) #这段代码的灵魂在这里,不要删除,不然拿到的图像路径不对
with open('/home/workspace/temp/images/break/test.log', 'r') as f:
lines = f.readlines()
count_lines = len(lines)
if count_lines != count_lines_old:
count_lines_old=count_lines
corrupted_images.append(img_path)
print(corrupted_images)
2.点击右上角,切换文件至test
3.点击菜单栏运行(run),找到编辑配置
4.点击日志,勾选保存到文件,填写日志路径,注意,这个路径一定要和代码里的路径保持一致
设置完成后右键执行,日志文件里就可以拿到所有的问题图像路径了,然后大家就可以编写脚本根据这些图像路径将问题图像剔除出去。