当前位置: 首页 > article >正文

CV图像处理小工具——语义分割json生成检测框json

语义分割json生成检测框json

import json
import os
from os import listdir, getcwd
from os.path import join
import os.path


rootdir = 'F:/dataset/'# 写自己存放图片的数据地址
input_dir = 'F:/dataset/labels_json/'
output_dir = 'F:/dataset/labels_box/'
def position(pos):
    # 该函数用来找出xmin,ymin,xmax,ymax即bbox包围框
    x = []
    y = []
    nums = len(pos)
    for i in range(nums):
        x.append(pos[i][0])
        y.append(pos[i][1])
    x_max = max(x)
    x_min = min(x)
    y_max = max(y)
    y_min = min(y)
    b = (float(x_min), float(x_max), float(y_min), float(y_max))
    return b




def convert_annotation(image_ids, input_dir, output_dir):
    for image_id in image_ids:
        print(image_id)
        input_file_path = os.path.join(input_dir, f"{image_id}.json")
        output_file_path = os.path.join(output_dir, f"{image_id}.json")

        try:
            with open(input_file_path, 'r') as load_f:
                load_dict = json.load(load_f)

            w = load_dict['imageWidth']
            h = load_dict['imageHeight']
            objects = load_dict['shapes']

            annotations = []  # 创建一个空列表来存储注解

            for obj in objects:
                # 去除可能的额外空格,并设置默认标签(如果需要)
                labels = obj['label'].strip()
                # 根据标签处理形状
                if labels in [
                    "class1", "class2",
                    "class3", "class4"
                ]:
                    pos = obj['points']
                    b = position(pos)
                    cls_id_mapping = {
                        "class1": 1,
                        "class2": 2,
                        "class3": 3,
                        "class4": 4,
                        
                    }
                    cls_id = cls_id_mapping[labels]
                    annotation = {
                        'label': labels,
                        'class_id': cls_id,
                        'bbox': b
                    }
                    annotations.append(annotation)

            output_dict = {
                "version": "5.0.2",
                "flags": {},
                "shapes": [],  # shapes数组为空,因为注解信息已经放在annotations中
                "imagePath": load_dict['imagePath'],
                "imageData": None,
                "imageHeight": h,
                "imageWidth": w,
                "annotations": annotations  # 添加注解列表
            }
            for shape in load_dict['shapes']:
                # 假设每个多边形都有四个点,我们可以直接取对角线上的两个点来定义矩形
                # 这里我们取第一个点和第三个点(或者您可以根据具体情况选择其他点对)
                objects = load_dict['shapes']
                for obj in objects:
                    # 去除可能的额外空格,并设置默认标签(如果需要)
                    labels = obj['label'].strip()
                    if labels in [
                       "class1", "class2",
                    "class3", "class4"
                    ]:
                        pos = obj['points']
                        b = position(pos)
                        rect_points = [
                            [b[0], b[3]],
                            [b[1], b[2]]
                            ]

                        new_shape = {
                        "label": labels,  # 保留原多边形的标签(或者您可以根据需要生成新的标签)
                        "points": rect_points,  # 使用调整后的点来表示矩形(但这里我们实际上只使用了两个点)
                        # 注意:由于我们简化了问题,并没有真正地使用四个点来定义一个完整的矩形
                        # 在实际应用中,您可能需要更精确地处理这个问题。
                        "group_id": None,  # 您可以根据需要设置这个字段的值
                        "shape_type": "rectangle",  # 指定形状类型为矩形
                        "flags": {}  # 保留空的flags字段(或者您可以根据需要填充它)
                    }
                        output_dict['shapes'].append(new_shape)

                # 写入新的JSON文件
            with open(output_file_path, 'w') as output_f:
                json.dump(output_dict, output_f, indent=4)

        except Exception as e:
            print(f"Error processing {input_file_path}: {e}")


def image_id(rootdir):
    a = []
    for parent, dirnames, filenames in os.walk(rootdir):
        for filename in filenames:
            # print(filename)
            if filename.endswith('.jpg'):
                filename = os.path.splitext(filename)[0]
            if filename.endswith('.jpeg'):
                filename = os.path.splitext(filename)[0]
            if filename.endswith('.JPG'):
                filename = os.path.splitext(filename)[0]
            if filename.endswith('.JPEG'):
                filename = os.path.splitext(filename)[0]
            a.append(filename)
    return a


names = image_id("F:/dataset/images/"),

for image_id in names:
    convert_annotation(image_id, input_dir, output_dir)

http://www.kler.cn/a/391669.html

相关文章:

  • Spring框架之观察者模式 (Observer Pattern)
  • AI 写作(五)核心技术之文本摘要:分类与应用(5/10)
  • C# 委托与匿名方法
  • springboot 之 整合springdoc2.6 (swagger 3)
  • 第三十六章 Vue之路由重定向/404页面设置/路径模式设置
  • 初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器
  • Windows 安装和配置虚拟机
  • python爬虫(二)爬取国家博物馆的信息
  • 使用nossl模式连接MySQL数据库详解
  • 2024 年 10 款替代 Postman 的工具,有免费有开源
  • 我来讲一下-Service Mesh.
  • 【Linux】网络编程3
  • 计算机网络之会话层
  • Ubuntu linux 命令总结
  • uniapp 设置安全区域
  • Hadoop(HDFS)
  • R语言机器学习与临床预测模型69--机器学习模型解释利器:SHAP
  • 《青牛科技 GC6150:驱动芯片的璀璨之星,重塑摇头机性能(可替代 TMI8150)》
  • Vue中如何构建组件,支持传参、插槽等功能。
  • 从经典到应用:探索 AlexNet 神经网络
  • C#画图板上色功能的详细示例代码
  • 将C++搭建的简单HTTP服务器升级为 HTTPS 服务器
  • RabbitMQ高效的消息队列中间件原理及实践
  • 【AliCloud】ack + ack-secret-manager + kms 敏感数据安全存储
  • Elasticsearch中什么是倒排索引?
  • 前端页面性能优化的常见问题与解决方案