Python移动未标注的图片数据集

Python移动未标注的图片数据集

  • 前言
  • 前提条件
  • 相关介绍
  • 实验环境
  • Python移动未标注的图片数据集
    • 情况一:有图,无标注文件
      • 代码实现
      • 输出结果
    • 情况二:有图,有标注文件,但标注信息为空
      • 代码实现
      • 输出结果
    • 情况一与情况二同时都考虑
      • 代码实现
      • 输出结果
    • 拓展:移动有标注文件却无对应图片的标注文件
      • 代码实现
      • 输出结果

在这里插入图片描述

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

前提条件

  • 熟悉Python

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • PyTorch 是一个深度学习框架,封装好了很多网络和深度学习相关的工具方便我们调用,而不用我们一个个去单独写了。它分为 CPU 和 GPU 版本,其他框架还有 TensorFlow、Caffe 等。PyTorch 是由 Facebook 人工智能研究院(FAIR)基于 Torch 推出的,它是一个基于 Python 的可续计算包,提供两个高级功能:1、具有强大的 GPU 加速的张量计算(如 NumPy);2、构建深度神经网络时的自动微分机制。
  • YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。它是一个在COCO数据集上预训练的物体检测架构和模型系列,代表了Ultralytics对未来视觉AI方法的开源研究,其中包含了经过数千小时的研究和开发而形成的经验教训和最佳实践。
  • Labelme是一款图像标注工具,由麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发。它是用Python和PyQT编写的,开源且免费。Labelme支持Windows、Linux和Mac等操作系统。
  • 这款工具提供了直观的图形界面,允许用户在图像上标注多种类型的目标,例如矩形框、多边形、线条等,甚至包括更复杂的形状。标注结果以JSON格式保存,便于后续处理和分析。这些标注信息可以用于目标检测、图像分割、图像分类等任务。
  • 总的来说,Labelme是一款强大且易用的图像标注工具,可以满足不同的图像处理需求。
  • Labelme标注json文件是一种用于存储标注信息的文件格式,它包含了以下几个主要的字段:
    • version: Labelme的版本号,例如"4.5.6"。
    • flags: 一些全局的标志,例如是否是分割任务,是否有多边形,等等。
    • shapes: 一个列表,每个元素是一个字典,表示一个标注对象。每个字典包含了以下几个字段:
      • label: 标注对象的类别名称,例如"dog"。
      • points: 一个列表,每个元素是一个坐标对,表示标注对象的边界点,例如[[10, 20], [30, 40]]。
      • group_id: 标注对象的分组编号,用于表示属于同一组的对象,例如1。
      • shape_type: 标注对象的形状类型,例如"polygon",“rectangle”,“circle”,等等。
      • flags: 一些针对该标注对象的标志,例如是否是难例,是否被遮挡,等等。
    • lineColor: 标注对象的边界线颜色,例如[0, 255, 0, 128]。
    • fillColor: 标注对象的填充颜色,例如[255, 0, 0, 128]。
    • imagePath: 图像文件的相对路径,例如"img_001.jpg"。
    • imageData: 图像文件的二进制数据,经过base64编码后的字符串,例如"iVBORw0KGgoAAAANSUhEUgAA…"。
    • imageHeight: 图像的高度,例如600。
    • imageWidth: 图像的宽度,例如800。

以下是一个Labelme标注json文件的示例:

{"version": "4.5.6","flags": {},"shapes": [{"label": "dog","points": [[121.0,233.0],[223.0,232.0],[246.0,334.0],[121.0,337.0]],"group_id": null,"shape_type": "polygon","flags": {}}],"lineColor": [0,255,0,128],"fillColor": [255,0,0,128],"imagePath": "img_001.jpg","imageData": "iVBORw0KGgoAAAANSUhEUgAA...","imageHeight": 600,"imageWidth": 800
}

实验环境

  • Python 3.x (面向对象的高级语言)

Python移动未标注的图片数据集

情况一:有图,无标注文件

在这里插入图片描述

代码实现

import os
import cv2
import json
import copy
import shutildef is_null_info_in_json(in_json_path):'''判断json文件的标注信息是否为空'''with open(in_json_path,'r') as f:json_data = json.load(f)# print(json_data)# 以查询label信息为例,比如输出'label' == "49"的标注信息json_data_shape =  copy.deepcopy(json_data['shapes'])if json_data_shape == []:return Truereturn Falsedef move_img_no_json(in_img_path,output_dir):'''情况一:有图,无标注文件,只移动图'''shutil.move(in_img_path,output_dir)def move_img_and_json(in_img_path,in_json_path,output_dir):'''情况二:有图,有标注文件,但标注信息为空,既移动图,也移动json文件'''shutil.move(in_img_path,output_dir)shutil.move(in_json_path,output_dir)if __name__=="__main__":in_img_dir = 'images/'in_json_dir = 'jsons/'output_dir = 'output/'if not os.path.exists(output_dir):os.mkdir(output_dir) img_name_list = [i for i in os.listdir(in_img_dir) if i.endswith('.png')]# print(img_name_list)json_name_list = [i for i in os.listdir(in_json_dir) if i.endswith('.json')]# print(json_name_list)for img_name in img_name_list:in_img_path = in_img_dir + img_namein_json_path = in_json_dir + img_name[:-4]+'.json'# 情况一:有图,无标注文件if not os.path.exists(in_json_path):move_img_no_json(in_img_path,output_dir)

输出结果

在这里插入图片描述

情况二:有图,有标注文件,但标注信息为空

在这里插入图片描述

{"version": "5.2.0.post4","flags": {},"shapes": [],"imagePath": "flower.png","imageData": null,"imageHeight": 394,"imageWidth": 850
}

代码实现

import os
import cv2
import json
import copy
import shutildef is_null_info_in_json(in_json_path):'''判断json文件的标注信息是否为空'''with open(in_json_path,'r') as f:json_data = json.load(f)# print(json_data)# 以查询label信息为例,比如输出'label' == "49"的标注信息json_data_shape =  copy.deepcopy(json_data['shapes'])if json_data_shape == []:return Truereturn Falsedef move_img_no_json(in_img_path,output_dir):'''情况一:有图,无标注文件,只移动图'''shutil.move(in_img_path,output_dir)def move_img_and_json(in_img_path,in_json_path,output_dir):'''情况二:有图,有标注文件,但标注信息为空,既移动图,也移动json文件'''shutil.move(in_img_path,output_dir)shutil.move(in_json_path,output_dir)if __name__=="__main__":in_img_dir = 'images/'in_json_dir = 'jsons/'output_dir = 'output/'if not os.path.exists(output_dir):os.mkdir(output_dir) img_name_list = [i for i in os.listdir(in_img_dir) if i.endswith('.png')]# print(img_name_list)json_name_list = [i for i in os.listdir(in_json_dir) if i.endswith('.json')]# print(json_name_list)for img_name in img_name_list:in_img_path = in_img_dir + img_namein_json_path = in_json_dir + img_name[:-4]+'.json'if not os.path.exists(in_json_path):passelse:# 情况二:有图,有标注文件,但标注信息为空if is_null_info_in_json(in_json_path):move_img_and_json(in_img_path,in_json_path,output_dir)

输出结果

在这里插入图片描述

情况一与情况二同时都考虑

在这里插入图片描述

代码实现

import os
import cv2
import json
import copy
import shutildef is_null_info_in_json(in_json_path):'''判断json文件的标注信息是否为空'''with open(in_json_path,'r') as f:json_data = json.load(f)# print(json_data)# 以查询label信息为例,比如输出'label' == "49"的标注信息json_data_shape =  copy.deepcopy(json_data['shapes'])if json_data_shape == []:return Truereturn Falsedef move_img_no_json(in_img_path,output_dir):'''情况一:有图,无标注文件,只移动图'''shutil.move(in_img_path,output_dir)def move_img_and_json(in_img_path,in_json_path,output_dir):'''情况二:有图,有标注文件,但标注信息为空,既移动图,也移动json文件'''shutil.move(in_img_path,output_dir)shutil.move(in_json_path,output_dir)if __name__=="__main__":in_img_dir = 'images/'in_json_dir = 'jsons/'output_dir = 'output/'if not os.path.exists(output_dir):os.mkdir(output_dir) img_name_list = [i for i in os.listdir(in_img_dir) if i.endswith('.png')]# print(img_name_list)json_name_list = [i for i in os.listdir(in_json_dir) if i.endswith('.json')]# print(json_name_list)for img_name in img_name_list:in_img_path = in_img_dir + img_namein_json_path = in_json_dir + img_name[:-4]+'.json'# 情况一:有图,无标注文件if not os.path.exists(in_json_path):move_img_no_json(in_img_path,output_dir)else:# 情况二:有图,有标注文件,但标注信息为空if is_null_info_in_json(in_json_path):move_img_and_json(in_img_path,in_json_path,output_dir)

输出结果

在这里插入图片描述

拓展:移动有标注文件却无对应图片的标注文件

在这里插入图片描述

代码实现

import os
import cv2
import json
import copy
import shutildef is_null_info_in_json(in_json_path):'''判断json文件的标注信息是否为空'''with open(in_json_path,'r') as f:json_data = json.load(f)# print(json_data)# 以查询label信息为例,比如输出'label' == "49"的标注信息json_data_shape =  copy.deepcopy(json_data['shapes'])if json_data_shape == []:return Truereturn Falsedef move_img_no_json(in_img_path,output_dir):'''情况一:有图,无标注文件,只移动图'''shutil.move(in_img_path,output_dir)def move_img_and_json(in_img_path,in_json_path,output_dir):'''情况二:有图,有标注文件,但标注信息为空,既移动图,也移动json文件'''shutil.move(in_img_path,output_dir)shutil.move(in_json_path,output_dir)def move_json_no_img(in_json_path,output_dir):'''移动有标注文件却无对应图片的标注文件'''shutil.move(in_json_path,output_dir)if __name__=="__main__":in_img_dir = 'images/'in_json_dir = 'jsons/'output_dir = 'output/'if not os.path.exists(output_dir):os.mkdir(output_dir) img_name_list = [i for i in os.listdir(in_img_dir) if i.endswith('.png')]# print(img_name_list)json_name_list = [i for i in os.listdir(in_json_dir) if i.endswith('.json')]# print(json_name_list)for json_name in json_name_list:in_img_path = in_img_dir + json_name[:-5] + '.png'in_json_path = in_json_dir + json_name# 移动有标注文件却无对应图片的标注文件if not os.path.exists(in_img_path):move_json_no_img(in_json_path,output_dir)

输出结果

在这里插入图片描述

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

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

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

相关文章

LabVIEW开发电能质量监测系统

LabVIEW开发电能质量监测系统 本研究基于LabVIEW开发了一个创新的电能质量监测系统,专注于暂态电能质量扰动信号的产生、分析与存储。该系统不仅模拟产生了电压骤降、电压波动、暂态振荡以及电压畸变等关键信号,还能够记录并存储这些扰动信号产生时的波…

Vmware Windows10安装Apache php

文章目录 一、下载必要的软件二、安装Apache三、安装php四、php连接Apache五、测试 一、下载必要的软件 Apache:https://www.apachelounge.com/download/ PHP:http://windows.php.net/download/ 二、安装Apache 将下载的压缩包解压,移动里…

使用 Java 获取电脑性能参数

Java内置的api 不能直接获取电脑的参数,需要借助第三方工具 oshi JavaSE 方式 所需要的 jar com.github.oshi:oshi-core:5.8.0、net.java.dev.jna:jna:5.9.0、net.java.dev.jna:jna-platform:5.9.0 org.slf4j:slf4j-api:1.7.21、org.slf4j:slf4j-simple:1.7.21 实…

MyBatis中的N+1问题,使用ResultSet来解决,需要存储过程【非常详细】

参考 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html https://mybatis.net.cn/sqlmap-xml.html#Result_Maps 基础表sql 订单表 CREATE TABLE test_order (order_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 订单id,order_name varchar(255) NOT NULL DEFAULT COMME…

KITTI数据集处理为COCO数据集格式

KITTI作为自动驾驶常用数据集,被广泛的应用于自动驾驶目标检测等过程中。 首先是数据集类别合并,原始的KITTI数据集有九个类别,分别是: Car Van Truck Pedestrian Person_sitting Cyclist Tram Misc而我们在使用过程中&#xff0…

HarmonyOS 应用开发 —— 常用装饰器整理

HarmonyOS 应用开发 —— 常用装饰器整理 当前版本:API9 纯 ArcTS 语言和 Stage模式 学习 HarmonyOS 时,我们会用到各种各样的装饰器。 我们使用 DevEco IDLE 进行 HarmonyOS 应用开发时,在任意 .ets 文件中,输入 时&#xff0c…

代码随想录算法训练营第二十六天(回溯算法篇)|39. 组合总和,40. 组合总和Ⅱ

39. 组合总和 题目链接:39. 组合总和 - 力扣(LeetCode) 题目内容:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0…

变量未声明,值是undefined吗?

先看下面的代码输出什么? var name; alert(typeof name); // undefined alert(title); //报错undefined是一个只有一个值的数据类型,这个值就是undefined,在使用var声明变量但并未对其值进行初始化时,这个变量的值就是undefined。…

GO并发编程综合应用

一.GO并发编程综合应用 1.生产者消费者模式 1.1需求分析 ​ 生产者每秒生产一个商品,并通过物流公司取货 ​ 物流公司将商品运输到商铺 ​ 消费者阻塞等待商铺到货,需要消费10次商品 1.2实现原理 1.3代码实现: package mainimport (&q…

Vue学习笔记-Vue3中的shallowReactive和shallowRef

shallowReactive 作用:与reactive作用类似,但只处理对象最外层属性的响应式(浅响应式)使用场景:如果有一个对象数据,结构比较深(内嵌多层对象),但只需要最外层的属性进行…

SpringCloud微服务 【实用篇】| Docker启示录

目录 一:Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

Python之random模块详解

python的random模块 random模块是python中一个生成随机数的模块。 random不是python解释器内置的模块。 导入random模块的方法是: import random 如果只使用random模块中的单个方法的话,也可以使用 from random import method_name 例如: …

蓝牙协议栈学习笔记

蓝牙协议栈学习笔记 蓝牙简介 蓝牙工作在全球通用的 2.4GHz ISM(即工业、科学、医学)频段,使用 IEEE802.11 协议 蓝牙 4.0 是迄今为止第一个蓝牙综合协议规范,将三种规格集成在一起。其中最重要的变化就是 BLE(Blue…

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码)

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码) 基本概念典型相关分析综合评价模型对应分析因子分析聚类分析 习题10.41. 题目要求2.解题过程3.程序 习题10.51. 题目要求2.解题过程3.程序 习题10.6(1&a…

用Excel绘制柱形图

在需要将数据用柱状图表示的时候,可以用Excel进行绘制。不单绘制柱形图,其他数据图也可以用Excel绘制。 接下来用绘制一个销售表的示例演示。 1.将数据输入Excel 数学书 语文书 英语书 一月 80 94 77 二月 95 86 84 三月 130 93 79 四月 …

实用干货:再见ElementPlus,我有更好的了

大家好,我是大澈! 本文约1200字,整篇阅读大约需要3分钟。 感谢关注微信公众号:“程序员大澈”,免费领取"面试大礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单&#xff…

任务调度系统就该这么设计(万能通用),稳的一批!

今天来扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 核心概念 这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有使用过的小伙伴更加容易接受文章的内容,快速讲一讲Xxl-Job中的概念和使用 如果你已经使用过了&#xf…

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。 步骤 1. 创建一个CSharp…

Java 8特性:Lambda表达式、函数式接口与Stream API的深度探索

一、引言 随着编程范式的不断演变,Java语言也在不断地发展和创新。Java 8的发布,为开发者们带来了诸多全新的特性,其中包括Lambda表达式、函数式接口以及Stream API。这些特性使得Java语言的编程更加简洁、优雅,同时也提高了代码…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …