Corrupt JPEG data: 2 extraneous bytes before marker 0xd9

news2024/11/23 21:27:12

场景

异常: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. 找不到答案,只能靠自己,不管是方法笨不笨,解决了问题总归是在进度!

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华翰传媒集团横店影视基地盛大开业,汇剧视界APP震撼发布

2024年6月1日上午,横店影视华翰传媒集团携手腾烨影视隆、明艺影视重举办了横店影视基地的开业庆典。这一盛事不仅标志着华翰传媒集团在影视行业发展的重要里程碑,更彰显了其深耕影视产业、致力于打造高质量影视内容的决心与目标。 活动盛况空前&#xff…

vivado PIP or SITE_PIP、PKGPIN_BYTEGROUP

PIP是Xilinx部件上用于路由连接或网络的设备对象。PIP 称为ARC的连接多路复用器可以编程为将一根电线连接到 另一个,从而将节点连接在一起,以形成中特定NET所需的路由 设计。 SITE_PIP,也称为路由BEL,是SITE内部的连接多路复用器&…

vcs覆盖率相关

查看覆盖率是由哪几个tc覆盖的 选择要查看的覆盖率点,右键选择 show xxx tests; 覆盖率的合并

最新开源:英伟达Nemotron-4 340B,哔哩哔哩Index-1.9B,谷歌RecurrentGemma-9B...

文章目录 1. 英伟达开源Nemotron-4 340B2. 哔哩哔哩开源轻量级模型 Index-1.9B3. 微软开源混合模型 Samba4. 谷歌开源 RecurrentGemma-9B,性能与Gemma相同5. Stable Diffusion 3 Medium:“最强文生图开源 AI 模型” 1. 英伟达开源Nemotron-4 340B 当地时…

【AI绘画】新手小白看这篇就够啦!国产PS AI插件超好入门!

随着人工智能技术的飞速发展,Photoshop作为设计师们不可或缺的工具,也在不断地融入AI技术,以提升设计效率和效果。最近米兔用了一款AI绘画软件StartAI,被其强大的功能和易用性经验到了,下面跟大家详细分享一下这款ps插…

010-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍几种相对基础的聚类算法,包括K-均值算法和均值漂移算法。 目录 10.1 聚类概述 10.1.1 聚类的种类 10.1.2 Sklearn聚类子模…

Pycharm的基础使用

Pycharm的基础使用 一、修改主题 第一步:点击file->settings 第二步:找到Appearance&Behavior->Appearance->Theme选择主题 有五种主题可以选 二、修改默认字体和大小 第一步:打开设置与上面修改主题第一步一样&#xff1b…

硕思logo设计师下载-2024官方最新版-logo制作软件安装包下载

硕思​​Logo设计​​师是一款操作灵活简单、功能强大的logo制作​​软件​​。可以通过简单的点击就可以为网站、博客、论坛和邮件创建专业的logo、条幅、按钮、标题、图标和签名等。 硕思logo设计师提供了很多精心设计的模板和丰富的资源,为更好的创建logo艺术作品…

GPT3.5的PPO目标函数怎么来的:From PPO to PPO-ptx

给定当前优化的大模型 π \pi π,以及SFT模型 π S F T \pi_{SFT} πSFT​ 原始优化目标为: max ⁡ E ( s , a ) ∼ R L [ π ( s , a ) π S F T ( s , a ) A π S F T ( s , a ) ] \max E_{(s,a)\sim RL}[\frac{\pi(s,a)}{\pi_{SFT}(s,a)}A^{\pi_{SFT}}(s,a)] m…

光纤通信基础(光纤的构造、工作原理、色散、工作频段、损耗、分类、不同标准及应用、接口类型、常见标示方法、熔接)

文章目录 光纤的构造:纤芯、包层、涂覆层光纤的工作原理:利用全反射来传输光信号光纤的色散光纤的工作频段光纤的损耗光纤的分类光纤的不同标准及应用光纤的接口类型(SC、LC、ST、FC)光纤的常见标示方法:如“FC/PC”&a…

JSP之原理剖析

什么是JSP: java Server Pages: java服务端页面,也和Servlet一样,用于动态Web技术? 最大特点: 写jsp就像在写HTML区别: HTML只给用户提供静态的数据JSP页面中可以嵌入Java代码,为用户提供动态数据 JSP原…

基于S32K144驱动NSD8308

文章目录 1.前言2.芯片介绍2.1 芯片简介2.2 硬件特性2.3 软件资源2.4 芯片资料 3.测试环境4.软件驱动4.1 SPI4.2 寄存器4.3 SPI ON/OFF控制4.4 PWM控制 5.测试情况 1.前言 最近有些客户在前期调试NSD8308时,软件上遇到一些问题,正好笔者手上有一套NSD83…

学校分体空调集控系统

学校分体空调集控系统是一种先进的温度控制解决方案,它主要针对学校等公共场所的空调管理需求而设计。该系统通过集中控制和管理多台分体空调设备,实现了更高的能效、更便捷的操作和更舒适的室内环境。 需求与挑战:学校教学楼、办公楼、实验楼…

CorelDRAW2024破解版序列号注册码激活码最新

CorelDRAW2024,一个让你的设计创意无限飞扬的利器!🎨✨ 你是否曾经为找不到合适的设计软件而苦恼?是否曾经为设计的局限性而感到束手无策?别担心,CorelDRAW2024将为你带来全新的设计体验!&#…

《软件定义安全》之七:SDN安全案例

第7章 SDN安全案例 1.DDoS缓解 1.1 Radware DefenseFlow/Defense4All Radware在开源的SDN控制器平台OpenDaylight(ODL)上集成了一套抗DDoS的模块和应用,称为Defense4ALL。其架构如下图,主要有两部分:控制器中的安全…

软件测试面试题:性能测试关注哪些指标?

问题 在工作中,使用JMeter做压力测试时,需要关注其中的哪些指标? 性能测试关注哪些指标? 考察点 面试官想了解: 是否用过 JMeter 指标进行分析 技术点 涉及的技术点: JMeter 结果分析 回答 性能指…

移植案例与原理 - utils子系统之KV存储部件 (3)

5、KV存储部件对应UtilsFile接口部分的代码 分析下KV存储部件对应UtilsFile接口部分的代码。我们知道对外接口有设置键值UtilsSetValue、获取键值UtilsGetValue、删除键值UtilsDeleteValue和清除缓存ClearKVCache。我们先看看内部接口,这些接口调用的全部是UtilsFi…

Vue3模拟国足18强赛抽签

Vue3国足18强赛抽签 国足遇到这个对阵&#xff0c;能顺利出现吗&#xff1f; 1、系统演示 Vue3模拟国足18强赛抽签 2、关键代码 开始抽签 <script setup> import FenDang from "/components/chouqian/FenDang.vue"; import {ref} from "vue";le…

如何将编译过的C++库迅速部署在Visual Studio新项目中

本文介绍在Visual Studio中&#xff0c;通过属性表&#xff0c;使得一个新建解决方案中的项目可以快速配置已有解决方案的项目中各类已编译好的C第三方库的方法。 例如&#xff0c;我们现有一个解决方案&#xff0c;其中的一个项目需要调用Armadillo、OpenCV等多个不同的C第三…

一文详解:什么是小程序SDK?

什么是小程序SDK&#xff1f; 首先来看看概念&#xff1a;小程序SDK&#xff08;Software Development Kit&#xff09;是用于开发和扩展小程序的工具集合。可以理解为一套工具箱&#xff0c;专门帮助开发者建立和定制小程序应用程序。这些工具包括了开发小程序所需的各种代码…