Corrupt JPEG data: 2 extraneous bytes before marker 0xd9

场景

异常:Corrupt JPEG data: 2 extraneous bytes before marker 0xd9

python语言,CV2读图像数据集,训练目标检测模型。在数据集分批送入模型训练过程中,出现大片图片异常情况。
在这里插入图片描述

(建议直接去看修复图像方法二,简单直接)

原因分析

在 python 中导入python-opencv库,读图难以检测到这个问题

  1. 产生图像读取异常的主要原因:图像数据在读取时,因为图像格式问题,解析含有data[0]数据段时,若data[0]后面还有其他字段,需要加上data[0]的实际长度才能赋值后面的字段,否则会覆盖data[0]中相关字段。
    在这里插入图片描述

  2. 由于数据集中图像损坏或不完整的 jpeg 图像引起的低级 C 错误,opencv报的warning,在 python 中难以检测到。

3.可能是图像截取或微信下载的时候,命名导致,或重命名图像造成格式上的不对应。

解决办法

使用yolov训练数据集时,出现该错误,不影响训练流程,程序会自动跳过错误的数据。所以,会中断异常的batch,跳过后正常训练。但是,毕竟缺太多关键数据,感觉对不起标注时的付出。所以,想到一个笨办法来解决这个问题,修复图像。

解决步骤:
1)复现异常,找出问题图像。
因为训练数据集图像很多,几千张,要找出来不容易。它在python里面是一个警告,需要用CV2读图的时候才会爆出这个异常。我这里有个笨办法:用手动二分法和cv2.imread读图来定位图像。

def checkImg(dirPath):
    for fileName in os.listdir(dirPath):
        filePath = Path(os.path.join(dirPath, fileName))
        if filePath.suffix.lower() in [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"]:  # 图片扩展名
            try:
                img = cv2.imread(os.path.join(dirPath, fileName))
            except cv2.error as e:
                print("图片损坏,图片名称:", fileName, e)

a. 输入图像数据集所在路径path1,运行checkImg。问题图像有多少,就会打印到多少个异常警告。
在这里插入图片描述
因为,图像有这个问题,不会终止,会pass,继续下一个。所以需要手动分数据,手动二分法找数据。如果有1000张图,有一张有问题,则需要分10次(2的10次方=1024)。
b. 然后,另外建立一个文件夹path2。分一半数据过去。
再运行checkImg(路径不变)。
在这里插入图片描述
如图,证明剩下的文件path1里面还有一张问题图像。
c. 再建一个文件夹path3,分一半数据出去。
再运行checkImg(路径不变)。
在这里插入图片描述
如图,证明该路径path1的图片都是正常的,可以设置文件夹名称为ok。有异常的那一张图在刚分出去的路径path3里面。将path3里的数据分一半到path4。
d.再运行checkImg(path3)

一直循环,直到找出问题图像。(1000张图,找10次;2000张,要重复找11次)

将所有有问题的图像归集到bug文件夹。
在这里插入图片描述

2)修复图像。
修复图像方法有两种。
方法一:利用photoshop另存图像数据,达到修复的目的。
a. 打开Photoshop(简称ps),选中所有问题图像,全部拉到ps窗口。
在这里插入图片描述
b. 选中一个目标,导航菜单处,点击文件,存储为(A),存储替换图像。
在这里插入图片描述
c. 保存,替换。
在这里插入图片描述
d.确定。
在这里插入图片描述
e. 所有的问题图都重新存储一遍。
f. 然后,执行checkImg(bug),检查所有图像是否修复。
在这里插入图片描述

修复完毕。完美。

方法二、用py-opencv直接批量另存问题图像。可以直接用代码,好的坏的全部另存,不用手动查找问题图像。

def convertImg(dirPath):
    # 修复图像另存地址。没有该文件夹就创建。
    saveDir = r"D:\...\Datasets\HeightBuildingUnderConstruction2023\measureBuildingHeightwith3mRuler\testImage\checkImg\xiufu"
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    # 遍历有问题的数据文件夹,中找到所有的图片。
    for fileName in os.listdir(dirPath):
        filePath = Path(os.path.join(dirPath, fileName))
        if filePath.suffix.lower() in [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"]:  # 图片扩展名
            try:
                img = cv2.imread(os.path.join(dirPath, fileName))  # 读图像数据
                new_path = os.path.join(saveDir, fileName)
                cv2.imwrite(new_path, img)  # 另存同名,同扩展名图像。不破坏数据集
            except cv2.error as e:
                print("图片损坏,图片名称:", fileName, e)
    print("全部图像已另存!")

a. 运行convertImg(bug),将问题图像所在文件夹地址作为输入。
在这里插入图片描述
图像表示,该文件夹有四个问题图像。且修复后的图像保存与xiufu文件夹了。
b.验证是否修复。
执行,checkImg(xiufu)
在这里插入图片描述
证明,修复完成。

小结

做人工智能计算机视觉算法工程师几年了,每每出现Corrupt JPEG data: 2 extraneous bytes before marker 0xd9,我都选择飘过,今天终于把问题解决了

  1. 遇到问题,简单分析,不熟悉的bug直接找百度,看看各大博主是怎么做的。
  2. 找不到答案,只能靠自己,不管是方法笨不笨,解决了问题总归是在进度!

感谢点赞收藏+关注的朋友!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/721872.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

做一个30点的四面体结构

这个结构有7层,每层有1,1,3,3,6,6,10个点,共30个点。 30个点的坐标是 {0.0,0.0,6.12372435695795}, {0.0,0.0,0.0}, {-2.8868,-5.0,-2.04124145231931}, {-2.8868,5.0,-2.0412414…

设计神器创作利器矢量图形编辑软件CorelDRAW2024重磅发布啦!

CorelDRAW2024,一款让你的创作无限可能的神器!🎨✨ 你是否曾经在寻找一款功能强大、操作简便的设计软件?那么,让我来为你种草一款神奇的产品——CorelDRAW2024!🎉🤩 CorelDRAW全系列…

客户为先,自研为基 | YashanDB产品进化之旅

作为一款全自研的数据库产品,崖山数据库致力于构建自主可控的全栈数据库产品体系,以满足行业用户多元化的需求。 从第一行代码到完整的数据库产品体系,我们为何选择从0到1自研数据库?我们经历了哪些关键的产品节点?每个…

等保2.0对于物联网设备的漏洞管理还有哪些规定?

等保2.0针对物联网设备的漏洞管理,主要规定了以下几个方面: 1. 漏洞发现与识别:要求定期进行漏洞扫描和评估,利用专业的漏洞扫描工具和安全服务,及时发现物联网设备及其软件中的安全漏洞。这包括但不限于操作系统、应…

langchain教程-(1)Prompt模板

LangChain 的核心组件 模型 I/O 封装 LLMs:大语言模型Chat Models:一般基于 LLMs,但按对话结构重新封装PromptTemple:提示词模板OutputParser:解析输出 数据连接封装 Document Loaders:各种格式文件的加载…

扭蛋机小程序:深度探索虚拟寻宝之旅的乐趣

引言 扭蛋机小程序,这个融合了传统与创新的虚拟寻宝乐园,已经吸引了无数玩家的目光。在这个充满惊喜和挑战的虚拟世界里,每一个扭蛋都可能蕴藏着无尽的宝藏。本文将带您深入探索扭蛋机小程序的魅力所在,体验一场别开生面的虚拟寻…

查看服务器端口,如何查看服务器端口是多少并修改

查看服务器端口并修改内容是一个涉及网络管理和系统配置的专业任务。以下是一个详细的步骤说明,用于查看和修改服务器端口。 一、查看服务器端口 1. 使用命令行工具: - 对于Linux或Unix系统,可以使用netstat、lsof或ss等命令来查看端口状…

反馈型振荡器

目录 反馈型振荡器分类 基本工作原理 启动过程 “心脏”LC振荡 起振条件 平衡条件 稳定条件 互感耦合振荡器 电感三端LC振荡器 电容三端LC振荡器 串联改进电容三端式振荡器 并联改进电容三端式振荡器 相位平衡条件的判断准则 反馈型振荡器分类 基本工作原理 启动过…

【ajax基础02】URL详解

一:什么是URL 统一资源定位符(Uniform Resource Locator,缩写:URL),简称网址 二:URL组成 https://baidu.com/index.html 协议 https协议:超文本传输协议,规定了浏览器和服务第之间传输数据的格式 域名(在…

JS 实现树形结构的各种操作(2)

一 数据源 以下所有操作,都使用本数据做测试。 const oraData [{id: "1",name: "动物",children: [{id: "1-1",name: "哺乳类",children: [{id: "1-1-1",name: "小猫",children: []},{id: "1-1…

2023年中国数据库市场440亿,云数据库四强(阿里、腾讯、亚马逊、华为),本地数据库四强(Oracle、华为、微软、达梦)

近期IDC公布了中国关系型数据库市场的数据,整体市场276亿人民币(38亿美元),其中公有云数据库市场175亿人民币(24.1亿美元),备注:汇率按7.26计算。 关系型数据库是数据库整体市场最大…

2024年阿里巴巴全球数学竞赛首次向人工智能(AI)开放

大家好,我是微学AI,最近大家突然开始关注阿里巴巴全球数学竞赛了,在这个人工智能爆发的时代,2024年阿里巴巴全球数学竞赛首次向人工智能(AI)开放,要求参赛的AI模型在比赛前提交源代码&#xff0…

[Qt的学习日常]--常用控件3

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、显示类控…

Python武器库开发-武器库篇之SQL注入扫描器(五十九)

Python武器库开发-武器库篇之SQL注入扫描器(五十九) SQL注入漏洞简介以及危害 SQL注入漏洞是一种常见的Web应用程序漏洞,攻击者可以利用该漏洞在应用程序的数据库中执行恶意的SQL查询或指令。这可能导致数据泄露、数据损坏、应用程序崩溃或未经授权的访问。 SQL注…

L51--- 144. 二叉树的前序遍历(深搜)---Java版

1.题目描述 2.思路 二叉树的前序遍历遵循 根左右 (1)方法 preorderTraversal 输入参数: TreeNode root root是二叉树的根节点。 返回值: List 返回一个包含二叉树节点值的列表,这些值按照前序遍历的顺序排列。 功能: 这个方法是前序遍历的…

剖析 Kafka 消息丢失的原因

文章目录 前言一、生产者导致的消息丢失的场景场景1:消息太大解决方案 :1、减少生产者发送消息体体积2、调整参数max.request.size 场景2:异步发送机制解决方案 :1、使用带回调函数的发送方法 场景3:网络问题和配置不当…

React 中的 ErrorBoundary

在 React 中,如果不做任何控制,当组件出现异常时,React 渲染就会停止,页面出现白屏,这种体验很不好。例如当用户输入某些非法数据,而前端都没有进行校验,页面出现白屏。这种情况下,最…

如何训练AI大模型?熬夜爆肝整理大全

随着人工智能技术的快速发展,大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练,能够捕捉到丰富的特征信息,为各种下游任务提供强大的支持。然而,训练AI大模型面临着…

20240616日志:大模型压缩方法DMS

Location: Beijing 1 大模型剪枝 Fig. 1.1大模型压缩-剪枝 剪枝的理论来源基于彩票假设(Lottery Ticket Hypothesis),指在神经网络中存在一种稀疏连接模式,即仅利用网络的一小部分连接(彩票)就足以实现与整…

npm语义化版本和版本运算符

版本号组成 一个完整的版本号,由三部分组成:主版本号(major)、次版本号(minor)、修订版本号(patch),简称X.Y.Z,具体含义: 主版本号(major):项目&#xff08…