COCO数据集缺失文件补全方法

COCO2017数据集图片文件缺失自动补全方法

一、前言

本文代码是以目标检测(object detection)和实例分割(instance segmentation)任务的标签文件为例,即instances_train/val/test2017.json文件。

其他任务的标签文件内容略有不同,但是图片来源表示字段完全相同,因此代码可通用。另外如果是非2017版本COCO应该也通用。

1.1 杂谈

本人计算机视觉科研狗一条,生活在在威名赫赫的 汪汪星球球立大学。

某日,本汪以Featurized-QueryRCNN框架为基础,结合自己的模块形成一个新的目标检测模型。当我按下训练的命令,训练了一段时间后,出现了如下报错(因为刚好训练到的那个batch中有缺失的图片):

  ······此处省略一万字File "/liushuai2/PCP/FeatEnHancer-main/detectron2/detectron2/data/detection_utils.py", line 182, in read_imagewith PathManager.open(file_name, "rb") as f:File "/root/anaconda3/envs/FEHR/lib/python3.9/site-packages/iopath/common/file_io.py", line 1012, in openbret = handler._open(path, mode, buffering=buffering, **kwargs)  # type: ignoreFile "/root/anaconda3/envs/FEHR/lib/python3.9/site-packages/iopath/common/file_io.py", line 604, in _openreturn open(  # type: ignore
FileNotFoundError: [Errno 2] No such file or directory: '/liushuai2/PCP/datasets/COCO2017/train2017/000000581831.jpg'

当看到这个我都震惊了,因为数据集我是直接从COCO官方网站下载下来的,竟然有图片缺失!!!

只能想办法解决了,找了半天网络上没啥好用的办法,而且有也是COCO2014而不是COCO2017的。对此我决定自己写一个缺失文件补全代码。

1.2 部分代码逻辑说明

我的代码如果大家细看会发现你没有看到下载链接。这是因为标准COCO数据集的标签文件中对每一张图片都包含了下载链接,如下所示:

{"license": 4,"file_name": "000000060623.jpg","coco_url": "http://images.cocodataset.org/train2017/000000060623.jpg","height": 427,"width": 640,"date_captured": "2013-11-14 17:24:15","flickr_url": "http://farm7.staticflickr.com/6080/6113512699_37b4c98473_z.jpg","id": 60623}

可以看到,在该字典中 coco_url 键的值为图像下载地址。故我在代码中提取了该键值对,并将其值作为下载命令的参数。

另外大家觉得不懂我的代码是怎么解析标签文件(json)的,其实我把COCO数据集的标准格式摆出来大家再去看代码就明白了:

{"info": {"description": "This is stable 1.0 version of the 2014 MS COCO dataset.","url": "http://mscoco.org","version": "1.0","year": 2014,"contributor": "Microsoft COCO group","date_created": "2015-01-27 09:11:52.357475"},"licenses": [{"url": "http://creativecommons.org/licenses/by-nc-sa/2.0/","id": 1,"name": "Attribution-NonCommercial-ShareAlike License"}],"images": [{"license": 3,"file_name": "COCO_val2014_000000391895.jpg","coco_url": "http://mscoco.org/images/391895","height": 360,"width": 640,"date_captured": "2013-11-14 11:18:45","flickr_url": "http://farm9.staticflickr.com/8186/8119368305_4e622c8349_z.jpg","id": 391895}],"annotations": [{"id": 1768,"image_id": 289343,"category_id": 18,"segmentation": [[510.66, 423.01, 511.72, 420.03, 510.45, ...]],"area": 702.1057499999998,"bbox": [473.07, 395.93, 38.65, 28.67],"iscrowd": 0}],"categories": [{"id": 18,"name": "dog","supercategory": "animal"}]
}

上面是一个标签文件的标准格式,不过为了简便每个数字我都只写了一个示例。我们关注的是字典中的images键,这个键所对应的值是一个数组,这个数组包含了数据集中每一张图片的基本信息。

二、实现代码

以下三种方法均可在 Windows 或 Linux 操作系统上运行,已做系统适配,兼容性好。唯一的缺点就是有两种方法需要二外安装依赖包,不过这不是很大的问题啦。

下面三个代码块均需要用到的非标准库是 tqdm 。我用该库来制作好看的进度条,因此需要提前安装:

pip install tqdm

2.1 使用msgspec库(极快 + 操作稍稍麻烦)

2.1.1 食用指南

安装 msgspec

pip install msgspec

拷贝【2.1.2】的代码,并修改 annotations_file_pathimage_directory 为你的COCO数据集相关路径

2.1.2 代码
import os
import subprocess
from tqdm import tqdm
import sys
import platform
import time
import msgspecclass Image(msgspec.Struct):file_name: strcoco_url: strclass ImagesInfo(msgspec.Struct):images: list[Image]def get_missing_files(annotation_file_path, image_directory):# 读取标注文件start_time = time.time()with open(annotation_file_path, 'rb') as f:images_info = msgspec.json.decode(f.read(), type=ImagesInfo)annotation_time = time.time() - start_time# 获取图像列表start_time = time.time()annotation_images_list = images_info.imagesdirectory_images_set = set(os.listdir(image_directory))directory_time = time.time() - start_time# 存放缺失的文件名missing_files = []# 遍历字典,检查每个文件是否存在start_time = time.time()for image in annotation_images_list:# 获取 文件名file_name = image.file_name# 检查文件是否存在if file_name not in directory_images_set:print(f"文件 {file_name} 不存在")download_url = image.coco_urlmissing_files.append({'file_name': file_name,'download_url': download_url})check_time = time.time() - start_timeprint(f"缺失文件数量: {len(missing_files)}")print(f"读取标注文件耗时: {annotation_time:.4f} 秒")print(f"获取图像列表耗时: {directory_time:.4f} 秒")print(f"检查缺失文件耗时: {check_time:.4f} 秒")return missing_filesdef download_Missing_files(missing_files, image_directory):# 检测操作系统类型system = platform.system().lower()# 遍历缺失文件列表并下载with tqdm(missing_files) as pbar:for file in pbar:# 实时更新进度条的描述为当前正在下载的文件名pbar.set_description(f"Downloading {file['file_name']}")if system == "windows":# 构建 curl 命令download_command = f"curl -o {image_directory}\\{file['file_name']} {file['download_url']}"else:# 构建 wget 命令download_command = f"wget -P {image_directory} {file['download_url']}"# 执行 wget 命令,并将输出重定向到DEVNULL以隐藏输出subprocess.run(download_command, shell=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)if __name__ == '__main__':# 读取标注文件和图像目录路径annotations_file_path = r'/liushuai2/PCP/datasets/COCO2017/annotations/instances_train2017.json'image_directory = r'/liushuai2/PCP/datasets/COCO2017/train2017'# 获取缺失的文件列表missing_files = get_missing_files(annotations_file_path, image_directory)if len(missing_files) == 0:print("没有缺失的文件, Over")sys.exit()# 下载缺失的文件download_Missing_files(missing_files, image_directory)

2.2 使用orjson库(慢 + 操作简单)

2.2.1 食用指南

安装 msgspec

pip install orjson

拷贝【2.2.2】的代码,并修改 annotations_file_pathimage_directory 为你的COCO数据集相关路径

2.2.2 代码
import json
import os
import subprocess
from tqdm import tqdm
import sys
import platform
import time
import orjsondef get_missing_files(annotation_file_path, image_directory):# 读取标注文件start_time = time.time()with open(annotation_file_path, 'rb') as f:images_info = orjson.loads(f.read())annotation_time = time.time() - start_time# 获取图像列表start_time = time.time()annotation_images_list = images_info['images']directory_images_set = set(os.listdir(image_directory))directory_time = time.time() - start_time# 存放缺失的文件名missing_files = []# 遍历字典,检查每个文件是否存在start_time = time.time()for image in annotation_images_list:file_name = image['file_name']if file_name not in directory_images_set:print(f"文件 {file_name} 不存在")download_url = image['coco_url']missing_files.append({'file_name': file_name,'download_url': download_url})check_time = time.time() - start_timeprint(f"缺失文件数量: {len(missing_files)}")print(f"读取标注文件耗时: {annotation_time:.4f} 秒")print(f"获取图像列表耗时: {directory_time:.4f} 秒")print(f"检查缺失文件耗时: {check_time:.4f} 秒")return missing_filesdef download_Missing_files(missing_files, image_directory):# 检测操作系统类型system = platform.system().lower()# 遍历缺失文件列表并下载with tqdm(missing_files) as pbar:for file in pbar:# 实时更新进度条的描述为当前正在下载的文件名pbar.set_description(f"Downloading {file['file_name']}")if system == "windows":# 构建 curl 命令download_command = f"curl -o {image_directory}\\{file['file_name']} {file['download_url']}"else:# 构建 wget 命令download_command = f"wget -P {image_directory} {file['download_url']}"# 执行 wget 命令,并将输出重定向到DEVNULL以隐藏输出subprocess.run(download_command, shell=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)if __name__ == '__main__':# 读取标注文件和图像目录路径annotations_file_path = r'/liushuai2/PCP/datasets/COCO2017/annotations/instances_train2017.json'image_directory = r'/liushuai2/PCP/datasets/COCO2017/train2017'# 获取缺失的文件列表missing_files = get_missing_files(annotations_file_path, image_directory)if len(missing_files) == 0:print("没有缺失的文件, Over")sys.exit()# 下载缺失的文件download_Missing_files(missing_files, image_directory)

2.3 使用json库(极慢 + 操作最简单)

修改 annotations_file_pathimage_directory 为你的COCO数据集相关路径即可直接食用

import json
import os
import subprocess
from tqdm import tqdm
import sys
import platform
import timedef get_missing_files(annotation_file_path, image_directory):# 读取标注文件start_time = time.time()with open(annotation_file_path, 'r') as f:images_info = json.load(f)annotation_time = time.time() - start_time# 获取图像列表start_time = time.time()annotation_images_list = images_info['images']directory_images_set = set(os.listdir(image_directory))directory_time = time.time() - start_time# 存放缺失的文件名missing_files = []# 遍历字典,检查每个文件是否存在start_time = time.time()for image in annotation_images_list:# 获取文件名file_name = image['file_name']# 将不存在的文件添加到缺失列表if file_name not in directory_images_set:print(f"文件 {file_name} 不存在")download_url = image['coco_url']missing_files.append({'file_name': file_name,'download_url': download_url})check_time = time.time() - start_timeprint(f"缺失文件数量: {len(missing_files)}")print(f"读取标注文件耗时: {annotation_time:.4f} 秒")print(f"获取图像列表耗时: {directory_time:.4f} 秒")print(f"检查缺失文件耗时: {check_time:.4f} 秒")return missing_filesdef download_Missing_files(missing_files, image_directory):# 检测操作系统类型system = platform.system().lower()# 遍历缺失文件列表并下载with tqdm(missing_files) as pbar:for file in pbar:# 实时更新进度条的描述为当前正在下载的文件名pbar.set_description(f"Downloading {file['file_name']}")if system == "windows":# 构建 curl 命令download_command = f"curl -o {image_directory}\\{file['file_name']} {file['download_url']}"else:# 构建 wget 命令download_command = f"wget -P {image_directory} {file['download_url']}"# 执行 wget 命令,并将输出重定向到DEVNULL以隐藏输出subprocess.run(download_command, shell=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)if __name__ == '__main__':# 读取标注文件和图像目录路径annotations_file_path = r'/liushuai2/PCP/datasets/COCO2017/annotations/instances_train2017.json'image_directory = r'/liushuai2/PCP/datasets/COCO2017/train2017'# 获取缺失的文件列表missing_files = get_missing_files(annotations_file_path, image_directory)if len(missing_files) == 0:print("没有缺失的文件, Over")sys.exit()# 下载缺失的文件download_Missing_files(missing_files, image_directory)

三、用到的库的简单介绍

3.1 基本介绍

3.1.1 msgspec

msgspec 是一个高性能的序列化和验证库,支持 JSON、MessagePack、YAML 和 TOML 等多种格式。它的特点包括:

  • 高性能:在常见协议的编码/解码中表现出色,通常比其他库快10-80倍。
  • 零成本的模式验证:使用 Python 类型注解进行模式验证。
  • 轻量级:没有依赖项,适合需要高效处理数据的场景。
  • 结构化数据支持:提供类似 dataclassesStruct 类型,但性能更高。
3.1.2 orjson

orjson 是一个快速且正确的 JSON 库,专为 Python 设计。它的特点包括:

  • 极高的性能:在序列化和反序列化方面表现优异,特别是在处理大型数据结构时。
  • 原生支持多种类型:包括 dataclassdatetimenumpyUUID 实例。
  • 严格的 JSON 和 UTF-8 规范:确保数据的正确性和兼容性。
  • 高效的内存使用:在处理 numpy.ndarray 时,内存使用率仅为其他库的0.3倍。
3.1.3 json

json 是 Python 标准库中的 JSON 编码和解码模块。它的特点包括:

  • 易用性:作为标准库的一部分,无需额外安装。
  • 基本功能:支持将 Python 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Python 对象。
  • 扩展性:可以通过自定义编码器和解码器来处理复杂类型。

3.2 对比总结

  • 性能
    • msgspec:在编码/解码方面表现出色,通常比其他库快10-80倍。

    • orjson:在序列化和反序列化方面表现优异,特别是在处理大型数据结构时。

    • json:性能较为一般,适合处理小型数据。

  • 功能
    • msgspec:支持 JSON、MessagePack、YAML 和 TOML,多格式支持;零成本的模式验证;提供类似 dataclassesStruct 类型。

    • orjson:原生支持 dataclassdatetimenumpyUUID 实例;严格的 JSON 和 UTF-8 规范。

    • json:基本的 JSON 编码和解码功能;可以通过自定义编码器和解码器来处理复杂类型。

  • 易用性
    • msgspec:需要额外安装,但没有依赖项,轻量级。

    • orjson:需要额外安装,但提供了丰富的功能和高性能。

    • json:作为 Python 标准库的一部分,无需额外安装,使用方便。

  • 内存使用
    • msgspec:高效的内存使用,适合需要高效处理数据的场景。

    • orjson:在处理 numpy.ndarray 时,内存使用率仅为其他库的0.3倍。

    • json:内存使用较为一般。

  • 适用场景
    • msgspec:适合需要高性能和多格式支持的场景,如实时数据处理和大规模数据传输。

    • orjson:适合需要高性能 JSON 处理的场景,特别是涉及大型数据结构和多种数据类型的应用。

    • json:适合一般的 JSON 编码和解码需求,特别是小型项目或不需要高性能的场景。

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

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

相关文章

原生冻结进程分析(U)

一、概要 1.定义: 当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。这项功能可以减少活跃缓存应用在后台存在时所消耗的 CPU 资源,从…

armv8 memory model概述

概述 在armv8 架构中,它引入了更多的维度来描述内存模型,从而在此基础上进行硬件优化(但其中一些并未被主流的软件所接受),在此做一些简单的整理,更多信息请参考 Arm spec 以及 AMBA 协议。下文主要是对Memory 和 Device 两大类的…

getopts(1) builtin command

文章目录 0.背景1.简介2.格式3.选项4.返回值5.特殊变量6.示例参考文献 0.背景 在执行 Shell 脚本时,可以像运行应用程序一样传入相应的参数,在脚本内部根据传入的参数内容执行对应的操作。 Shell 脚本中可以通过$1...$N形式的符号来引用传入的参数&…

基于nodejs+vue+uniapp的摄影竞赛小程序

开发语言:Nodejs框架:expressuniapp数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:VS Code 系统展示 管理员登录 管理员主界面 用户管理 书籍分类管理 书籍信息管理 系统管理…

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

在Ubuntu 20.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MySQL 是一个开源的数据库管理系统&#xff0c;通常作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xf…

Cmake之1.0版本重要特性及用法实例(八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

GoodSync Business - 企业级服务器同步与备份工具

现在越来越多公司会搭建服务器&#xff0c;或自建文件共享中心。那么如何才能实现对这些终端的高效管理、安全备份&#xff0c;以保障企业数据的安全呢&#xff1f; GoodSync Business 就是一款企业服务器同步与备份工具&#xff0c;适用于 Win / Mac 工作站&#xff0c;以及 …

Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解

【1】概述 Apache Kafka 是一个分布式流处理平台&#xff0c;它允许你发布和订阅记录流&#xff0c;存储记录流&#xff0c;并且可以对这些记录流进行处理。在 Kafka 中&#xff0c;消息被发布到特定的主题&#xff08;topic&#xff09;&#xff0c;然后由消费者&#xff08;…

57-java csrf防御方案

CSRF&#xff08;跨站请求伪造&#xff09;是一种攻击手段&#xff0c;它迫使已登录用户的web应用在没有用户知情的情况下&#xff0c;发送未经授权的请求。在Java中&#xff0c;有多种方法可以用来防御CSRF攻击。 使用同步令牌&#xff08;Token&#xff09;&#xff1a; 同…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

C++可调用对象

C11中有一个重要的概念&#xff0c;叫可调用对象&#xff0c; 可调用对象用途广泛&#xff0c;比如作为线程的执行对象&#xff0c;或者在使用一些基于范围的模版函数时&#xff08; sort()、all_of()、find_if()&#xff09;&#xff0c;常常需要我们传入一个可调用对象&…

算法基础-位运算

>> &#xff08;右移运算&#xff09; x >> y&#xff1a;表示将x的二进制值右移y位。 正数是直接右移y位&#xff0c;则高位&#xff08;最左边&#xff09;补y个0。 负数是求补码&#xff0c;然后右移y位&#xff0c;最高位补y个1&#xff0c;再求反码&#xff…

Gamma基线估算

在使用Gamma软件处理DInSAR数据时&#xff0c;基线估算是一个非常关键的步骤。Gamma软件提供了一系列工具来计算和处理基线信息&#xff0c;以确保干涉图像的准确性和后续形变分析的精度。以下是Gamma软件中基线估算的详细步骤&#xff1a; 1. 初始化基线计算 (base_init) 首…

更适合编写股票盯盘软件或者量化交易平台的语言是Python还是C

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

集成电路学习:什么是DAC数模转换器

DAC&#xff1a;数模转换器 DAC&#xff0c;全称Digital-to-Analog Converter&#xff0c;即数模转换器&#xff0c;是一种电子设备或电路&#xff0c;用于将数字信号转换为相应的模拟信号。在现代电子系统中&#xff0c;DAC扮演着至关重要的角色&#xff0c;它实现了数字电路与…

如何在UE5.4中重新定位动画?

动画在游戏和电影制作中扮演着至关重要的角色&#xff0c;而在虚幻引擎5.4&#xff08;UE5.4&#xff09;这一强大的实时3D创作平台中&#xff0c;重新定位动画的能力更是将创意表达推向了新的高度。本文将引导您探索UE5.4中重新定位动画的技巧&#xff0c;确保您的动画作品不仅…

Unity | 基础知识

装箱和拆箱&#xff1a; 获取对方的类型&#xff1a; GetType通过打点调用 as进行类型转换 运用Convert进行类型转换&#xff1a; 二维数组的定义 结构体类型 不同名称空间来调用&#xff1a;

Auto-Unit-Test-Case-Generator -- java项目自动测试生成

0.Pre-预备知识&#xff1a; 0.1.Maven是什么&#xff1f; [by Maven是什么&#xff1f;有什么作用&#xff1f;Maven的核心内容简述_maven是干什么用-CSDN博客 ] 是Java 领域中最流行的自动化构建工具之一&#xff0c;Maven 作为 Java 项目管理工具&#xff0c;具有: 包管…