Python等比例缩放图片并修改对应的Labelme标注文件(v2.0)

Python等比例缩放图片并修改对应的Labelme标注文件(v2.0)

  • 前言
  • 前提条件
  • 相关介绍
  • 实验环境
  • Python等比例缩放图片并修改对应的Labelme标注文件
    • Json文件
    • 代码实现
    • 输出结果

在这里插入图片描述

前言

  • 此版代码,相较于Python等比例缩放图片并修改对应的Labelme标注文件,将无标注文件的数据集处理方法(异常跳过),也考虑进去了。
  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入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),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • Python OS模块是负责程序与操作系统的交互,提供了访问操作系统底层的接口和非常丰富的方法用来处理文件和目录。
  • 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等比例缩放图片并修改对应的Labelme标注文件

Json文件

{
    "version":"5.0.1",
    "flags":{

    },
    "shapes":[
        {
            "label":"1",
            "points":[
                [
                    551.3333333333339,
                    17
                ],
                [
                    1144.666666666667,
                    843.6666666666667
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    206.48387096774195,
                    1022.5806451612904
                ],
                [
                    111,
                    0
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    2364.666666666667,
                    17
                ],
                [
                    2704.666666666667,
                    1823.666666666667
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    698.272727272727,
                    3475.818181818182
                ],
                [
                    1167.759862778731,
                    841.8233276157805
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    293.1515151515159,
                    4000.818181818181
                ],
                [
                    707.363636363636,
                    848.5454545454545
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"4",
            "points":[
                [
                    109.70967741935465,
                    1025.8064516129032
                ],
                [
                    193.58064516129025,
                    2103.2258064516127
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    1895.3243243243242,
                    13.513513513513514
                ],
                [
                    2360.189189189189,
                    1208.1081081081081
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    1654.7837837837842,
                    710.8108108108108
                ],
                [
                    2351.7692307692305,
                    3007.6923076923076
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        }
    ],
    "imagePath":"1.jpg",
    "imageData":null,
    "imageHeight":4000,
    "imageWidth":8320
}

代码实现

  • 此版代码,相较于Python等比例缩放图片并修改对应的Labelme标注文件,将无标注文件的数据集处理方法(异常跳过),也考虑进去了。
import os
import cv2
import json

def resize_img_equal_proportion(in_img_path,out_img_path,resized_pix):
    '''
    in_img_path:图片输入路径
    out_img_path:图片结果保存路径
    resized_pix: 缩放后分辨率
    '''
    ori_img = cv2.imread(in_img_path) # 读取图片
    print(ori_img.shape)
    height, width = ori_img.shape[:2] # 原始分辨率
    # 等比例缩放到pix=400
    scale = resized_pix / height
    # 缩放后分辨率
    resized_height = resized_pix 
    resized_width = int(width * scale)
    img = cv2.resize(ori_img, (resized_width, resized_height))
    print(img.shape)
    cv2.imwrite(out_img_path, img)
    return resized_height,resized_width,scale

def alter_json_equal_proportion(img_name,in_json_path,out_json_path,resized_height,resized_width,scale):
    '''
    in_json_path: json文件输入路径
    out_json_path: json文件保存路径
    resized_height: 缩放后的高
    resized_width: 缩放后的宽
    scale: 图片缩放比例
    '''
    file_in = open(in_json_path, "r", encoding='utf-8')
    # json.load数据到变量json_data
    json_data = json.load(file_in)
    # 修改json中的内容
    json_data["imageHeight"] = resized_height
    json_data["imageWidth"] = resized_width
    json_data["imagePath"] = img_name
    for LabelBox in json_data['shapes']:
        for point in LabelBox['points']:
            point[0] = point[0]*scale
            point[1] = point[1]*scale
        
    file_in.close()

    # 创建一个写文件
    file_out = open(out_json_path, "w", encoding='utf-8')
    # 将修改后的数据写入文件
    file_out.write(json.dumps(json_data))
    file_out.close()



if __name__ =="__main__":
    in_img_dir = 'images/'
    in_json_dir = 'jsons/'
    
    out_dir_name = 'output/'

    if not os.path.exists(out_dir_name):
        os.mkdir(out_dir_name)

    img_name_list = os.listdir(in_img_dir)
    # print(img_name_list)
    
    json_name_list = os.listdir(in_json_dir)
    # print(json_name_list)

    img_list  = [i for i in img_name_list if i.endswith('.jpg') or i.endswith('.bmp') or i.endswith('.png') ] 
    # print(img_list)

    json_list = [i for i in json_name_list if i.endswith('.json')]
    # print(json_list)


    for img_name in img_list:
        try:
            # print(img_name)
        
            in_img_path =in_img_dir +  img_name # 获取文件路径
            in_json_path = in_json_dir + img_name[:-4]+'.json'

            out_img_path = out_dir_name +  img_name
            out_json_path = out_dir_name + img_name[:-4]+'.json'
            print(out_img_path,out_json_path)
            
            if os.path.exists(in_json_path): # 输入图片所对应的json文件存在,则为True。
                resized_height,resized_width,scale = resize_img_equal_proportion(in_img_path,out_img_path,resized_pix=2048)
                alter_json_equal_proportion(img_name,in_json_path,out_json_path,resized_height,resized_width,scale)
        
        except Exception as e:
            print(e)

输出结果

{
    "version":"5.0.1",
    "flags":{

    },
    "shapes":[
        {
            "label":"1",
            "points":[
                [
                    141.14133333333348,
                    4.352
                ],
                [
                    293.03466666666674,
                    215.9786666666667
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    52.85987096774194,
                    261.78064516129035
                ],
                [
                    28.416,
                    0
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    605.3546666666667,
                    4.352
                ],
                [
                    692.3946666666668,
                    466.85866666666675
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    178.75781818181812,
                    889.8094545454546
                ],
                [
                    298.94652487135517,
                    215.5067718696398
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    75.04678787878808,
                    1024.2094545454543
                ],
                [
                    181.08509090909084,
                    217.22763636363635
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"4",
            "points":[
                [
                    28.08567741935479,
                    262.60645161290324
                ],
                [
                    49.556645161290305,
                    538.4258064516129
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    485.203027027027,
                    3.4594594594594597
                ],
                [
                    604.2084324324325,
                    309.2756756756757
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        },
        {
            "label":"1",
            "points":[
                [
                    423.62464864864876,
                    181.96756756756758
                ],
                [
                    602.052923076923,
                    769.9692307692308
                ]
            ],
            "group_id":null,
            "shape_type":"rectangle",
            "flags":{

            }
        }
    ],
    "imagePath":"1.jpg",
    "imageData":null,
    "imageHeight":1024,
    "imageWidth":841
}
  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入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开源项目

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

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

相关文章

原子学习笔记1——阻塞和非阻塞IO

阻塞式 I/O 顾名思义就是对文件的 I/O 操作(读写操作)是阻塞式的,非阻塞式 I/O 同理就是对文件的I/O 操作是非阻塞的。 当对文件进行读操作时,如果数据未准备好、文件当前无数据可读,那么读操作可能会使调用者阻塞&…

编程实际应用实例:洗车店会员管理系统操作教程

一、前言 洗车店在会员管理有时候需要一卡多用,基本也不需要做卡,直接报手机号或车牌号即可完成电子会员卡录入。 下面以 佳易王洗车店会员管理系统软件为例说明, 软件试用版下载或技术支持可以点击下方的官网卡片 如图:这个卡…

[HCTF 2018]WarmUp (代码审计)

打开题目: 好好好。 看看源码: ? source.php 让我看看! 发现还有个文件叫hint,php 看看: 得到目的文件是ffffllllaaaagggg 分析代码: $_REQUEST 变量 $_REQUEST用于收集HTML表单提交的数据&#x…

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest, ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…

RocketMQ系统性学习-RocketMQ领域模型及Linux下单机安装

MQ 之间的对比 三种常用的 MQ 对比,ActiveMQ、Kafka、RocketMQ 性能方面: 三种 MQ 吞吐量级别为:万,百万,十万消息发送时延:毫秒,毫秒,微秒可用性:主从,分…

【深度学习】机器学习概述(一)机器学习三要素——模型、学习准则、优化算法

​ 文章目录 一、基本概念二、机器学习的三要素1. 模型a. 线性模型b. 非线性模型 2. 学习准则a. 损失函数1. 0-1损失函数2. 平方损失函数(回归问题)3. 交叉熵损失函数(Cross-Entropy Loss)4. Hinge 损失函数 b. 风险最小化准则1.…

MQTT 介绍与学习 —— 筑梦之路

之前写过的相关文章: MQTT协议(转载)——筑梦之路_mqtt url-CSDN博客 k8s 部署mqtt —— 筑梦之路-CSDN博客 CentOS 7 搭建mqtt服务——筑梦之路_腾讯云宝塔搭 centos 7.9.2009 x86_64 建标准mqtt服务器-CSDN博客 mqtt简介 MQTT&#xff…

tcp/ip协议2实现的插图,数据结构5 (22 - 章)

(103) 103 二二1 协议控制块 结构 file, socket , rawcb , inpcb , tcpcb 之间的联系 (104) (105)

Python:如何将MCD12Q1\MOD11A2\MOD13A2原始数据集批量输出为TIFF文件(镶嵌/重投影/)?

博客已同步微信公众号:GIS茄子;若博客出现纰漏或有更多问题交流欢迎关注GIS茄子,或者邮箱联系(推荐-见主页). 00 前言 之前一段时间一直使用ENVI IDL处理遥感数据,但是确实对于一些比较新鲜的东西IDL并没有python那么好的及时性&…

【Linux】使用官方脚本自动安装 Docker(Ubuntu 22.04)

前言 Docker是一种开源平台,用于开发、交付和运行应用程序。它利用了容器化技术,使开发人员能够将应用程序及其依赖项打包到一个称为Docker容器的可移植容器中。这些容器可以在任何运行Docker的机器上快速、一致地运行,无论是开发环境、测试…

微服务架构之争:Quarkus VS Spring Boot

在容器时代(“Docker时代”),无论如何,Java仍然活着。Java在性能方面一直很有名,主要是因为代码和真实机器之间的抽象层,多平台的成本(一次编写,随处运行——还记得吗?&a…

Ubuntu虚拟机怎么设置静态IP

1 首先先ifconfig看一下使用的是哪个网络接口: 2 编辑 sudo vi /etc/netplan/00-installer-config.yamlnetwork:ethernets:ens33: # 根据您的网络接口进行修改,有的是eth0,有的是ens33,具体看第一步显示的是哪个网络接口addres…

【css】css实现文字两端对齐效果:

文章目录 一、方法1:二、方法2:三、注意: 一、方法1: 给元素设置 text-align: justify;text-align-last: justify;并且加上text-justify: distribute-all-line; 目的是兼容ie浏览器 p{width: 130px;text-align: justify;text-alig…

教育数字化转型 赋能家庭场景自主学习习惯养成

北京市气象台12月12日22时升级发布暴雪橙色预警信号,北京市教委决定自12月13日开始,全市中小学幼儿园采取学生临时居家学习措施。自疫情以来,家庭已经成为另一个学习中心,学校不再是教育的孤岛。 学习方式的变革,数字…

【️什么是分布式系统的一致性 ?】

😊引言 🎖️本篇博文约8000字,阅读大约30分钟,亲爱的读者,如果本博文对您有帮助,欢迎点赞关注!😊😊😊 🖥️什么是分布式系统的一致性 &#xff1f…

【C++】POCO学习总结(十七):日志系统(级别、通道、格式化、记录流)

【C】郭老二博文之:C目录 1、Poco::Message 日志消息 1.1 说明 所有日志消息都在Poco::Message对象中存储和传输。 头文件:#include “Poco/Message.h” 一条消息包含如下内容:优先级、来源、一个文本、一个时间戳、进程和线程标识符、可选…

MacOS下载配置OpenCV

主要参考的是OpenCV官方的这篇文章:OpenCV: Installation in MacOS 安装OpenCV需要下载一些安装包:CMake3.9、Git、Python这些我之前已经下载好,这里就不过多阐述了,自行百度安装即可 1.从Git库获取OpenCV: git clon…

Chrome安装Vue插件vue-devtools

1.下载 下载扩展文件,可以去官网下载 GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications. 可以在这里下载,比较方便 https://gitee.com/zhang_banglong/vue-devtools 2.解压 下载好之后解压文件 3.打开控制…

vue-实现高德地图-省级行政区地块显示+悬浮显示+标签显示

<template><div><div id"container" /><div click"showFn">显示</div><div click"removeFn">移除</div></div> </template><script> import AMapLoader from amap/amap-jsapi-load…

基于Nexus搭建Maven私服基础入门

什么是Nexus&#xff1f;它有什么优势&#xff1f; 要了解为什么需要nexus的存在&#xff0c;我们不妨从以下几个问题来简单了解一下: 为什么需要搭建私服&#xff1f;如果没有私服会出现什么问题&#xff1f; 对于企业开发而言&#xff0c;如果没有私服&#xff0c;我们所有…