实例分割模型的数据集格式转换

在对生物医学图像进行处理时,不像自然图像有以前固定的数据集格式,比如coco的json格式,voc格式等等,而生物图像样式有点多且不标准,图片格式,npz格式等等。网上转换教程很多,但是其中不乏转换错误的代码,特此来记录,以下代码保证可以正常运行

1. coco格式

1.1 Yolo格式转COCO格式

参考博客:https://blog.csdn.net/ericdiii/article/details/137775872
下方代码来自上方博客(如有侵权立即删除),结合自己数据集需要修改的地方:
(1)图片后缀:默认是tif,根据自己是png,进行替换
(2)图片,标签,存储ann的路径

import json
import glob
import os
import cv2
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from PIL import Image, ImageDraw, ImageFont
import numpy as npdef calculate_polygon_area(polygon):x = polygon[:, 0]y = polygon[:, 1]return 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))def calculate_bounding_box(polygon):x_min = np.min(polygon[:, 0])y_min = np.min(polygon[:, 1])x_max = np.max(polygon[:, 0])y_max = np.max(polygon[:, 1])width = x_max - x_minheight = y_max - y_minreturn [x_min, y_min, width, height]def text_to_json_segmentation(in_labels, in_images, out_json):"""Convert instance segmentation dataset from text files generated by the function 'json_to_text_segmentation'(for YOLO) to a JSON file (for MMdet). This can be applied for Level 0/1/2 (must modify the last code):param in_labels: input folder containing the label text files:param in_images: input folder containing the image files (just for getting the image size):param out_json: output JSON file"""# Initialize the output JSON filedata = dict()data['annotations'] = []data['images'] = []# Initial the number of annotationsnum_annotations = 1  # index starts from 1# Process the text filestxt_files = glob.glob(in_labels + '/*.txt')for k in range(len(txt_files)):# Read the image to get image width and heightimg = Image.open(in_images + '/' + os.path.basename(txt_files[k]).replace('txt', 'tif'))image_width, image_height = img.size# Creates annotation items of the image and append them to the listwith open(txt_files[k]) as f:for line in f:# Get annotation information of each line in the text fileline = [float(x) for x in line.strip().split()]class_id = int(line[0]) + 1  # index starts from 1coordinates = line[1:]polygon = np.array(coordinates).reshape(-1, 2)polygon[:, 0] = polygon[:, 0] * image_widthpolygon[:, 1] = polygon[:, 1] * image_heightarea = calculate_polygon_area(polygon)bbox = calculate_bounding_box(polygon)# Create a new annotation itemann_item = dict()ann_item['segmentation'] = [polygon.flatten().tolist()]ann_item['area'] = areaann_item['iscrowd'] = 0ann_item['image_id'] = k + 1  # index starts from 1ann_item['bbox'] = bboxann_item['category_id'] = class_idann_item['id'] = num_annotationsdata['annotations'].append(ann_item)num_annotations += 1# Create a new image item and append it to the listimg_item = dict()img_item['id'] = k + 1  # index starts from 1img_item['file_name'] = os.path.basename(txt_files[k]).replace('txt', 'tif')img_item['height'] = image_heightimg_item['width'] = image_widthdata['images'].append(img_item)print(os.path.basename(txt_files[k]) + ' done')data['categories'] = [{'supercategory': 'point', 'id': 1, 'name': 'point'}]# Write the dictionary to a JSON fileprint('Writing the data to a JSON file')with open(out_json, 'w') as f:# json.dump(data, f, cls=NpEncoder)# f.write(json.dumps(data, cls=NpEncoder, indent=4))f.write(json.dumps(data, default=int, indent=4))if __name__ == '__main__':# Convert the segmentation text files to JSONtext_to_json_segmentation(in_labels='/home/liuhuan/pointseg/datasetsNormal/receptor/labels/valid',in_images='/home/liuhuan/pointseg/datasetsNormal/receptor/images/valid',out_json='/home/liuhuan/pointseg/datasetsNormal/receptor/annotations/instances_val2017.json')

如何对json标注文件进行检查:

生成的json文件不一定是对的,例如轮廓小于4个像素这种,需要检查,如果有错误,则会报错并打印错误图片的序号,结合自己数据集需要修改的是:
(1)json文件路径

import json
import numpy as np
from tqdm import tqdmdef frPyObjects(i, pyobj):# encode rle from a list of python objectsif type(pyobj) == np.ndarray:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))elif type(pyobj) == list and len(pyobj[0]) == 4:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))elif type(pyobj) == list and len(pyobj[0]) > 4:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))elif type(pyobj) == list and type(pyobj) == dict and 'counts' in pyobj[0] and 'size' in pyobj[0]:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))# encode rle from single python objectelif type(pyobj) == list and len(pyobj[0]) == 4:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))elif type(pyobj) == list and len(pyobj[0]) > 4:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj:print("{}, {}, {}".format(i, type(pyobj), len(pyobj[0])))else:print("{}, {}, {},  ERROR".format(i, type(pyobj), len(pyobj[0])))raise Exception('input type is not supported.')def check(pathJson):jsonfile = open(pathJson, "r")jsonObj = json.load(jsonfile)jsonfile.close()for i, instance in tqdm(enumerate(jsonObj["annotations"])):frPyObjects(i, instance["segmentation"])if __name__ == "__main__":pathTrainJson = "/home/liuhuan/pointseg/datasetsNormal/receptor/annotations/instances_train2017.json"pathValJson = "/home/liuhuan/pointseg/datasetsNormal/receptor/annotations/instances_val2017.json"pathTestJson = "/home/liuhuan/pointseg/datasetsNormal/receptor/annotations/instances_test2017.json"check(pathTrainJson)check(pathValJson)check(pathTestJson)# 之后,可以根据上述print()打印出来的不符合条件对象的id,来修改对应的segmentation列表(手动修改即可,不符合条件的数量一般很少)
#json_object["annotations"][1510]["segmentation"] = [[230.83333333333331, 773.8888888888889, 231.83333333333331, 773.8888888888889, 237.22222222222223, 770.5555555555555]]# 将修改后的json文件重新写回到coco_instancestrain.json/coco_instancesval.json中即可
# val_json = open(JSON_LOC, "w")
# json.dump(json_object, val_json)
# val_json.close()

如何对json标注文件结合图片显示,进一步检查正确性

会根据图像和标注对某张图片显示,结合自己数据集需要修改的地方:
(1)图像文件所在文件夹
(2)json标注文件路径
(3)要查看图像文件的名称

import os.path
import numpy as np
import cv2
import json
from tqdm import tqdmdef get_bbox_segs(pathJson, img_name):jsonfile = open(pathJson, "r")jsonObj = json.load(jsonfile)jsonfile.close()# find img_id base img_namejsonImage = jsonObj["images"]i = 0while (jsonImage[i]["file_name"] != img_name):i = i + 1img_id = jsonImage[i]["id"]# find ann base img_idjsonAnn = jsonObj["annotations"]segs = []bboxes = []for i, instance in tqdm(enumerate(jsonAnn)):if instance["image_id"] == img_id:bboxes.append(instance["bbox"])segs.append(instance["segmentation"])return bboxes, segsif __name__ == "__main__":pathImg = "/home/liuhuan/pointseg/datasetsNormal/receptor/images/train"pathJson = "/home/liuhuan/pointseg/datasetsNormal/receptor/annotations/instances_train2017.json"img_name = "0.tif"bboxes, segs = get_bbox_segs(pathJson, img_name)img = cv2.imread(os.path.join(pathImg, img_name))# show bboxes'''for bbox in bboxes:x, y, w, h = bboxcv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)'''# show masksmasks = []for seg in segs:mask = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)polygon = np.array(seg).reshape((-1, 2)).astype(np.int32)cv2.fillPoly(mask, [polygon], 1)masks.append(mask)for mask in masks:mask_colored = cv2.cvtColor(mask*255, cv2.COLOR_GRAY2BGR)img = cv2.addWeighted(img, 1, mask_colored, 0.5, 0)cv2.imshow('Image', img)cv2.waitKey(0)cv2.destroyAllWindows()

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

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

相关文章

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代,音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者,还是在专业音频工作中精雕细琢的人士,亦或是在游戏世界里渴望极致音效沉浸的玩家,都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

git查看本地库对应的远端库的地址

git查看本地库对应的远端库的地址 git remote -v 如果想要查看特定的远端库的url地址,可以使用如下命令,其中origin是默认的远端库的名称,可以使用其他远端库的名称 get remote get-url origin

深入解析级联操作与SQL完整性约束异常的解决方法

目录 前言1. 外键约束与级联操作概述1.1 什么是外键约束1.2 级联操作的实际应用场景 2. 错误分析:SQLIntegrityConstraintViolationException2.1 错误场景描述2.2 触发错误的根本原因 3. 解决方法及优化建议3.1 数据库级别的解决方案3.2 应用层的解决方案 4. 友好提…

社区团购中 2+1 链动模式商城小程序的创新融合与发展策略研究

摘要:本文聚焦于社区团购这一新兴零售模式的发展态势,深入探讨 21 链动模式商城小程序与之融合的创新机制与应用策略。通过剖析社区团购的运营模式、优势特点以及发展现状,结合 21 链动模式商城小程序的功能特性,研究二者协同作用…

qt QGraphicsScale详解

1、概述 QGraphicsScale是Qt框架中提供的一个类,它提供了一种简单而灵活的方式在QGraphicsView框架中实现缩放变换。通过设置水平和垂直缩放因子、缩放中心点,可以创建各种缩放效果,提升用户界面的交互性和视觉吸引力。结合QPropertyAnimati…

Narya.ai正在寻找iOS工程师!#Mixlab内推

如果你对AI技术和iOS开发充满热情,这里有一个绝佳的机会加入一家专注于AI应用创新的初创公司。Narya.ai正在招聘iOS工程师,帮助他们开发下一代效率工具,旨在提升用户的日常生活效率与幸福感。 关于Narya.ai: 专注于AI应用层创新&a…

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下: body {background-color: lightblue; } 通过CSS,颜色通常由以下方式指定: 有效的颜色名称-比如“…

基于 MVC 架构的 SpringBoot 高校行政事务管理系统:设计优化与实现验证

摘 要 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径。为了…

Git操作学习2

1.使用git rm删除文件 查看文件夹的内容 ls -lr 删除文件rm 文件名 但是此时只删了工作区的文件,仓库还没有删 可以再使用git add更新提交给仓库 也可以直接通过git rm 删除仓库里面的文件 工作区也删除了 暂存区也删除了 最后记得提交 否则删除的文件在版本库还…

`pnpm` 不是内部或外部命令,也不是可运行的程序或批处理文件(问题已解决,2024/12/3

主打一个有用 只需要加一个环境变量 直接安装NodeJS的情况使用NVM安装NodeJS的情况 本篇博客主要针对第二种情况,第一种也可参考做法,当然眨眼睛建议都换成第二种 默认情况下的解决方法:⭐⭐⭐ 先找到node的位置,默认文件夹名字…

H3C OSPF实验

实验拓扑 实验需求 按照图示配置 IP 地址按照图示分区域配置 OSPF ,实现全网互通为了路由结构稳定,要求路由器使用环回口作为 Router-id,ABR 的环回口宣告进骨干区域 实验解法 一、配置IP地址 [R1]int l0 [R1-LoopBack0]ip add 1.1.1.1 32 […

在鲲鹏麒麟服务器上部署MySQL主从集群

因项目需求需要部署主从MySQL集群,继续采用上次的部署的MySQL镜像arm64v8/mysql:latest,版本信息为v8.1.0。计划部署服务器192.168.31.100和192.168.31.101 部署MySQL主节点 在192.168.31.100上先创建好/data/docker/mysql/data和/data/docker/mysql/l…

arkTS:持久化储存UI状态的基本用法(PersistentStorage)

arkUI:持久化储存UI状态的基本用法(PersistentStorage) 1 主要内容说明2 例子2.1 持久化储存UI状态的基本用法(PersistentStorage)2.1.1 源码1的相关说明2.1.1.1 数据存储2.1.1.2 数据读取2.1.1.3 动态更新2.1.1.4 显示…

SQLite:DDL(数据定义语言)的基本用法

SQLite:DDL(数据定义语言)的基本用法 1 主要内容说明2 相关内容说明2.1 创建表格(create table)2.1.1 SQLite常见的数据类型2.1.1.1 integer(整型)2.1.1.2 text(文本型)2…

【阅读记录-章节5】Build a Large Language Model (From Scratch)

目录 5. Pretraining on unlabeled data5.1 Evaluating generative text models5.1.1 Evaluating generative text models5.1.2 Calculating the text generation loss评估模型生成文本的质量 5.1.3 Calculating the training and validation set losses 5.2 Training an LLM5.…

【JMX JVM监控】Prometheus读取Trino的JMX数据到Grafana展示

trino运行拥有自己的UI来监控资源使用率,但领导需要更好的展示做些图表出来放到PPT里面,选择了用prometheus收集数据和grafana来展示图表。本文就trino的数据采集和展示做记录,对于prometheus和grafana的安装不做介绍。 首先要采集trino的数据…

网络安全框架及模型-PPDR模型

网络安全框架及模型-PPDR模型 概述: 为了有效应对不断变化的网络安全环境,人们意识到需要一种综合性的方法来管理和保护网络安全。因此,PPDR模型应运而生。它将策略、防护、检测和响应四个要素结合起来,提供了一个全面的框架来处理网络安全问题。 工作原理: PPDR模型的…

渗透测试之Web基础之Linux病毒编写——泷羽sec

声明: 学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。本文只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 (bilibili.com)https://space.bilibili.com/350329294 导读: 时刻…

Qt几何数据类型:QLine类型详解(基础向)

QLine类 QLine 是 Qt 提供的一个简单的几何类,适用于整数精度的线段表示,用于表示二维空间中的直线段。它主要用于计算和绘图中的基本几何处理。 如果需要更复杂的功能(如角度计算或长度的浮点表示),可以转为 QLineF。…

Ubuntu22.04上kdump和crash的使用

0.前言 1.引用: 解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 ubuntu内核转储分析——kdump和crash的下载和使用_ubuntu kdump-CSDN博客 U…