Labelme标注数据的一些操作

1、删除没有标注的图片

有些图片没有标注,只有图片没有json文件,需要将多余的图片删除,代码如下:

import glob
import  os
imagelist=glob.glob('../images/*.jpg')for i in range(len(imagelist)):if not os.path.exists(imagelist[i].replace("jpg","json")):os.remove(imagelist[i])

或者

import glob
import os
import time
# 获取所有JPEG图片文件
jpg_images = glob.glob('./data/*.jpg')
timestr = int(time.time())
# 遍历所有JPEG图片文件
for jpg_img in jpg_images:# 获取图片文件名(不包括扩展名)img_name = os.path.splitext(os.path.basename(jpg_img))[0]# 构造对应的JSON文件路径json_file_path = os.path.join('./data', img_name + '.json')# 检查JSON文件是否存在if os.path.exists(json_file_path):# 如果存在,则保留图片(实际上这里不需要做任何操作,因为图片没有被删除)print(f"保留图片: {jpg_img}, 因为存在对应的JSON文件: {json_file_path}")else:os.remove(jpg_img)print(f"删除图片: {jpg_img}, 因为不存在对应的JSON文件")print("处理完成。")

2、对图片重新命名

标注前,图片名字杂乱,需要对图片重新命名,我使用时间戳对图片重新命名,防止图片的名字重复,代码如下:

import glob
import os
import shutil
import time
import randomimaglist=glob.glob('data/*.jpg')
random.shuffle(imaglist)
print(imaglist)
os.makedirs('image_new',exist_ok=True
)
i=0
timesp=int(time.time())
for image_path in imaglist:print(image_path)shutil.copy(image_path,'image_new/'+str(timesp+i)+".jpg")i=i+1

3、对标注后的数据重新命名

数据标注完成后,对标注的数据统一命名,我这里使用时间戳命名,代码如下:


import glob
import os
import time
import jsonimag_dir = "../image_new2/"
# 获取所有JPEG图片文件
jpg_images = glob.glob(os.path.join(imag_dir, '*.jpg'))timestamp = int(time.time())# 将时间戳转换为字符串,以便在文件名中使用# 遍历所有JPEG图片文件
for jpg_img in jpg_images:timestamp=timestamp+1timestamp_str = str(timestamp)# 获取图片文件名(包括路径,但不包括扩展名)img_path, img_name_ext = os.path.split(jpg_img)img_name, img_ext = os.path.splitext(img_name_ext)print(img_ext)# 构造新的图片和JSON文件路径new_img_name = f"{timestamp_str}{img_ext}"new_img_path = os.path.join(img_path, new_img_name)new_json_name = f"{timestamp_str}.json"new_json_path = os.path.join(img_path, new_json_name)# 重命名图片文件os.rename(jpg_img, new_img_path)# 检查JSON文件是否存在,如果存在则更新它json_path = os.path.join(img_path, f"{img_name}.json")if os.path.exists(json_path):try:with open(json_path, 'r', encoding='utf-8') as json_file:json_data = json.load(json_file)# 更新JSON文件中的imagePath字段(假设它是相对于imag_dir的路径)if 'imagePath' in json_data:# 注意:这里需要处理imagePath是完整路径还是相对路径的情况# 如果imagePath是完整路径,则可能需要更复杂的逻辑来更新它# 这里假设imagePath只是文件名(不包括目录),因此直接替换json_data['imagePath'] = new_img_name# 将更新后的JSON数据写回文件with open(new_json_path, 'w', encoding='utf-8') as json_file:json.dump(json_data, json_file, ensure_ascii=False, indent=4)# 可选:删除旧的JSON文件(如果不需要保留的话)os.remove(json_path)except json.JSONDecodeError:print(f"Error decoding JSON file: {json_path}")except Exception as e:print(f"An error occurred while processing {json_path}: {e}")else:print(f"No JSON file found for image: {jpg_img}")print("Renaming completed.")

4、两个Labelme数据文件夹合并

图片由两个人共同标注,每个人关注不同的类别,这时候就需要对数据做合并,两个标注好的数据图片存在重叠,但是类别不存在重叠,需要将同一张图片的两个json文件合并,代码如下:

import os
import json
import shutildef merge_json_annotations(json_obj1, json_obj2, image_id):# 假设每个JSON对象都有一个'shapes'字段,包含所有的标注形状shapes1 = json_obj1.get('shapes', [])shapes2 = json_obj2.get('shapes', [])# 合并shapes数组merged_shapes = shapes1 + shapes2# 创建一个新的JSON对象,将合并后的shapes放入其中merged_json = {'version': json_obj1.get('version', '4.5.13'),  # 假设版本号是相同的,或者你可以根据需要选择'flags': {},  # 这个字段可能为空,根据你的JSON结构来决定是否保留或合并'shapes': merged_shapes,'imagePath': json_obj1.get('imagePath', json_obj2.get('imagePath', '')),  # 保留一个有效的imagePath'imageData': json_obj1['imageData'],  # 这个字段通常包含图像的Base64编码,但在合并时可能不需要'imageHeight': json_obj1.get('imageHeight', json_obj2.get('imageHeight', 0)),'imageWidth': json_obj1.get('imageWidth', json_obj2.get('imageWidth', 0)),'lineColor':json_obj1.get('lineColor'),'fillColor':json_obj1.get('fillColor'),# 可能还有其他字段需要合并,比如'type'(通常是'annotation'),这里省略了}# 如果JSON对象中有额外的字段需要合并,可以在这里添加逻辑# 比如合并'region_shape_attributes'等自定义字段# 为了确保唯一性,可以根据需要修改shape的ID或其他唯一标识符# 这个例子中没有处理ID冲突,因为具体的处理逻辑取决于你的需求return merged_jsondef copy_or_merge_files(src_dir1, src_dir2, dst_dir, image_extension='.jpg', json_extension='.json'):if not os.path.exists(dst_dir):os.makedirs(dst_dir)# 使用一个集合来跟踪已经处理的图片文件名,以避免重复处理processed_images = set()for src_dir in [src_dir1, src_dir2]:print(src_dir)for root, dirs, files in os.walk(src_dir):for file in files:print(file)file_extension = os.path.splitext(file)[1]if file_extension == json_extension:base_name = os.path.splitext(file)[0]image_file = os.path.join(root, base_name + image_extension)# 确保图片文件存在,因为JSON文件是基于图片文件的if os.path.exists(image_file):# 读取JSON文件with open(os.path.join(root, file), 'r', encoding='utf-8') as f:json_obj = json.load(f)# 在目标目录中查找同名的图片和JSON文件dst_image_file = os.path.join(dst_dir, base_name + image_extension)dst_json_file = os.path.join(dst_dir, base_name + json_extension)# 如果目标目录中已经有同名的图片文件if os.path.exists(dst_image_file):# 检查是否存在同名的JSON文件,并合并内容if os.path.exists(dst_json_file):with open(dst_json_file, 'r', encoding='utf-8') as f:existing_json_obj = json.load(f)# 合并JSON对象merged_json_obj = merge_json_annotations(existing_json_obj, json_obj, base_name)# 写入合并后的JSON文件with open(dst_json_file, 'w', encoding='utf-8') as f:json.dump(merged_json_obj, f, ensure_ascii=False, indent=4)print(f"Merged JSON file: {dst_json_file}")else:# 如果目标目录中没有同名的JSON文件,则直接复制新的JSON文件shutil.copy2(os.path.join(root, file), dst_json_file)print(f"Copied JSON file: {os.path.join(root, file)} to {dst_json_file}")else:# 如果目标目录中没有同名的图片文件,则复制图片和JSON文件shutil.copy2(image_file, dst_image_file)shutil.copy2(os.path.join(root, file), dst_json_file)print(f"Copied image and JSON files: {image_file} and {os.path.join(root, file)} to {dst_dir}")elif file_extension == image_extension:# 如果只遇到图片文件而没有对应的JSON文件,可以选择跳过或根据需要处理print(f"Skipped image file without corresponding JSON: {file}")def main():src_dir1 = 'image_new1'src_dir2 = 'image_new'dst_dir = 'image_new2'copy_or_merge_files(src_dir1, src_dir2, dst_dir)if __name__ == "__main__":main()

5、其他格式的图片转jpg

文件夹中存到多种图片,将其他格式的图片转为jpg,如果转换失败则删除,代码如下:

# 将其他格式的图片转为jpg格式的图片,如果不能转换则删除。
import os
from PIL import Imagedef convert_images_to_jpg(directory):# 遍历目录中的所有文件for root, dirs, files in os.walk(directory):for file in files:# 获取文件的完整路径file_path = os.path.join(root, file)# 获取文件的扩展名_, file_extension = os.path.splitext(file)file_extension = file_extension.lower()  # 转换为小写进行比较# 判断文件是否为非 JPG 图像文件if file_extension in ['.png', '.bmp', '.gif', '.tiff', '.jpeg'] and file_extension != '.jpg':try:# 打开图像文件with Image.open(file_path) as img:# 构造新的 JPG 文件路径(将原文件的扩展名替换为 .jpg)jpg_file_path = os.path.splitext(file_path)[0] + '.jpg'# 保存为 JPG 格式img.save(jpg_file_path, 'JPEG')print(f"Converted {file_path} to {jpg_file_path}")os.remove(file_path)except Exception as e:os.remove(file_path)print(f"Failed to convert {file_path}: {e}")# 指定要处理的目录路径
directory_path = 'data'
convert_images_to_jpg(directory_path)

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

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

相关文章

如何使用IDEA创建Maven/SSM工程?

鉴于很多学校还在教授SSMJSP,很多同学不会使用IDEA创建Maven工程,这里进行说明 windows下安装jdk并配置环境 添加链接描述Windows下安装Maven并配置环境 首先你要本地安装jdk,Maven并配置基础环境变量,然后对IDEA进行jdk、Mave…

大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

从0开始机器学习--Day23--支持向量机

经过前面的学习,我们已经知道在解决问题时,重要的不仅仅是要在算法A或算法B中选择更优的,而是考虑怎么选择用于学习算法的特征和正则化参数,相比神经网络和逻辑回归,支持向量机在这两个方面做得更好。 优化目标(Optimi…

macOS 设置固定IP

文章目录 以太网Wifi![请添加图片描述](https://i-blog.csdnimg.cn/direct/65546e966cae4b2fa93ec9f0f87009d8.png) 基于 macOS 15.1 以太网 Wifi

Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法

类型转换 传统方法astype使用value_counts统计通过apply替换并使用astype转换 pd.to_numericx对连续变量进行转化⭐参数:返回值:示例代码: isnull不会检查空字符串 数据准备 有一组数据信息如下,其中主要将TotalCharges、MonthlyC…

HarmonyOS Next 实战卡片开发 02

HarmonyOS Next 实战卡片开发 02 卡片开发中,还有一个难点是显示图片。其中分为显示本地图片和显示网络图片 显示本地图片 卡片可以显示本地图片,如存放在应用临时目录下的图片。路径比如 /data/app/el2/100/base/你的项目boundleName/temp/123.png 以…

双十一云服务器抢购后,用SD-WAN连通多云网络

双十一个个云厂商都有一定的优惠,我在阿里云和腾讯云都购买了服务器,原本主要是使用的阿里云,一堆乱七八糟的东西都是部署在阿里云的,现在买了一台腾讯云之后就在思考一个问题,怎么在腾讯云使用阿里云原本部署的服务。…

从0开始学docker (每日更新 24-11-7)

docker网络基础 docker容器网络模型 容器网络项目libnetwork:docker网络架构基于一套称为容器网络模型(CNM)的接口 CNM高层架构 包括: 沙箱(Sandbox):又称沙盒,包含容器的网络栈…

Linux学习笔记之组管理和权限管理

组管理 文件/目录 所有者 一般文件所有者是文件的创建者,谁创建了该文件,就自然成为该文件的所有者 ls -ahl (查看文件的所有者) chown 用户名 文件名 (修改文件所有者) 文件/目录 所在组 当某个用户…

MySQL 中的索引下推功能

看到索引,应该大家都可以联想到这个是和查询效率有关系的,既然有这个功能,那么那句古话说的好啊:存在即合理。那么这个就是说有了这个功能,可以提升查询效率。 什么是索引下推 我们先有一个大概的理解:在…

CSP/信奥赛C++语法基础刷题训练(1):洛谷P5715 :三位数排序

CSP/信奥赛C语法基础刷题训练(1):洛谷P5715 :三位数排序 题目描述 给出三个整数 a , b , c ( 0 ≤ a , b , c ≤ 100 ) a,b,c(0\le a,b,c \le 100) a,b,c(0≤a,b,c≤100),要求把这三位整数从小到大排序。 输入格式 …

准确--FastDFS快速单节点部署

FastDFS单节点部署 1. 系统准备 # 查看操作系统信息(适用于麒麟V10) cat /etc/os-release# 安装必要的软件包 yum -y install gcc gcc-c perl zlib-devel unzip2. 准备 FastDFS 环境 cd /usr/local/fastdfs# 下载必要包(若有访问限制&…

国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?

EasyCVR视频融合云平台,是TSINGSEE青犀视频“云边端”架构体系中的“云平台”系列之一,是一款针对大中型项目设计的跨区域、网络化、视频监控综合管理系统平台,通过接入视频监控设备及视频平台,实现视频数据的集中汇聚、融合管理、…

【智谱开放平台-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

计算机新手练级攻略——如何搜索问题

目录 计算机学生新手练级攻略——如何搜索问题1.明确搜索意图2.使用精确关键词3.使用专业引擎搜索4.利用好技术社区1. Stack Overflow2. GitHub3. IEEE Xplore4. DBLP 5.使用代码搜索工具1. GitHub 代码搜索2. Stack Overflow 代码搜索3. Papers with Code4. IEEE Xplore 6.查阅…

【C++】详细介绍模版进阶,细节满满

目录 一、非类型模版参数: 1、介绍: 2、使用: 3、注意: 4、应用 二、模版特化 (一)、概念 (二)、函数模版特化 1、步骤: 2、举例: 3、不建议使用函…

动态规划---解决多段图问题

ok 小伙伴们,我现在有点小小的红温,有点毛躁。 怎么解决多段图问题呢?求取最短路径有多种方法可取。 家人们,毫无思绪可言……………………………… 要实现动态规划,条件:子问题重叠度较高,并…

JMeter基础篇

目录 总目录: 一、JMeter简介: -用途: -优缺点: 二、JMeter安装: 三、项目简介: -学生管理系统: -API接口清单: 查询: 新增: 更新: 删…

Elasticsearch中什么是倒排索引?

倒排索引(Inverted Index)是一种索引数据结构,它在信息检索系统中被广泛使用,特别是在全文搜索引擎中。倒排索引允许系统快速检索包含给定单词的文档列表。它是文档内容(如文本)与其存储位置之间的映射&…

【Python特征工程系列】利用SHAP进行特征重要性分析-XGB模型为例(案例+源码)

这是我的第374篇原创文章。 一、引言 SHAP有多种实现方式,每种方式都适用于特定的模型类型,可以实现更快的逼近。 TreeExplainer :TreeExplainer专为树集合方法开发,如XGBoost,LightGBM或CatBoost。 DeepExplainer :DeepExplain…