当前位置:网站首页>labelme的JSON文件转成COCO数据集格式
labelme的JSON文件转成COCO数据集格式
2022-06-23 14:37:00 【程序员小杜】
# -*- coding:utf-8 -*-
import argparse
import json
from tkinter import image_names
import matplotlib.pyplot as plt
import skimage.io as io
# import cv2
from labelme import utils
import numpy as np
import glob
import PIL.Image
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(MyEncoder, self).default(obj)
class labelme2coco(object):
def __init__(self, labelme_json=[], save_json_path='./tran.json'):
self.labelme_json = labelme_json
self.save_json_path = save_json_path
self.images = []
self.categories = []
self.annotations = []
# self.data_coco = {}
self.label = []
self.annID = 1
self.height = 0
self.width = 0
self.save_json()
def data_transfer(self):
for num, json_file in enumerate(self.labelme_json):
with open(json_file, 'r') as fp:
data = json.load(fp) # 加载json文件
self.images.append(self.image(data, num))
for shapes in data['shapes']:
label = shapes['label']
if label not in self.label:
self.categories.append(self.categorie(label))
self.label.append(label)
points = shapes['points'] # 这里的point是用rectangle标注得到的,只有两个点,需要转成四个点
points.append([points[0][0], points[1][1]])
points.append([points[1][0], points[0][1]])
self.annotations.append(self.annotation(points, label, num))
self.annID += 1
def image(self, data, num):
image = {}
print(data["imagePath"])
img = utils.img_b64_to_arr(data['imageData']) # 解析原图片数据
# img=io.imread(data['imagePath']) # 通过图片路径打开图片
# img = cv2.imread(data['imagePath'], 0)
height, width = img.shape[:2]
img = None
image['height'] = height
image['width'] = width
image['id'] = num + 1
image['file_name'] = data['imagePath'].split('/')[-1]
self.height = height
self.width = width
return image
def categorie(self, label):
categorie = {}
categorie['supercategory'] = 'Cancer'
categorie['id'] = len(self.label) + 1 # 0 默认为背景
categorie['name'] = label
return categorie
def annotation(self, points, label, num):
annotation = {}
annotation['segmentation'] = [list(np.asarray(points).flatten())]
annotation['iscrowd'] = 0
annotation['image_id'] = num + 1
# annotation['bbox'] = str(self.getbbox(points)) # 使用list保存json文件时报错(不知道为什么)
# list(map(int,a[1:-1].split(','))) a=annotation['bbox'] 使用该方式转成list
annotation['bbox'] = list(map(float, self.getbbox(points)))
annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3]
# annotation['category_id'] = self.getcatid(label)
annotation['category_id'] = self.getcatid(label) # 注意,源代码默认为1
annotation['id'] = self.annID
return annotation
def getcatid(self, label):
for categorie in self.categories:
if label == categorie['name']:
return categorie['id']
return 1
def getbbox(self, points):
# img = np.zeros([self.height,self.width],np.uint8)
# cv2.polylines(img, [np.asarray(points)], True, 1, lineType=cv2.LINE_AA) # 画边界线
# cv2.fillPoly(img, [np.asarray(points)], 1) # 画多边形 内部像素值为1
polygons = points
mask = self.polygons_to_mask([self.height, self.width], polygons)
return self.mask2box(mask)
def mask2box(self, mask):
'''从mask反算出其边框
mask:[h,w] 0、1组成的图片
1对应对象,只需计算1对应的行列号(左上角行列号,右下角行列号,就可以算出其边框)
'''
# np.where(mask==1)
index = np.argwhere(mask == 1)
rows = index[:, 0]
clos = index[:, 1]
# 解析左上角行列号
left_top_r = np.min(rows) # y
left_top_c = np.min(clos) # x
# 解析右下角行列号
right_bottom_r = np.max(rows)
right_bottom_c = np.max(clos)
# return [(left_top_r,left_top_c),(right_bottom_r,right_bottom_c)]
# return [(left_top_c, left_top_r), (right_bottom_c, right_bottom_r)]
# return [left_top_c, left_top_r, right_bottom_c, right_bottom_r] # [x1,y1,x2,y2]
return [left_top_c, left_top_r, right_bottom_c - left_top_c,
right_bottom_r - left_top_r] # [x1,y1,w,h] 对应COCO的bbox格式
def polygons_to_mask(self, img_shape, polygons):
mask = np.zeros(img_shape, dtype=np.uint8)
mask = PIL.Image.fromarray(mask)
xy = list(map(tuple, polygons))
PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)
mask = np.array(mask, dtype=bool)
return mask
def data2coco(self):
data_coco = {}
data_coco['images'] = self.images
data_coco['categories'] = self.categories
data_coco['annotations'] = self.annotations
return data_coco
def save_json(self):
self.data_transfer()
self.data_coco = self.data2coco()
# 保存json文件
json.dump(self.data_coco, open(self.save_json_path, 'w'), indent=4, cls=MyEncoder) # indent=4 更加美观显示
labelme_json = glob.glob(r'./*.json')
# labelme_json=['./1.json']
labelme2coco(labelme_json, '.\\instances_train2017.json') //在这里修改是train还是val

边栏推荐
- 直播间源码在开发前期必须做的工作及开发步骤
- golang--文件的多个处理场景
- Error creating bean with name xxx Factory method ‘sqlSessionFactory‘ threw exception; nested excepti
- 掌舵9年,艾伦研究所创始CEO光荣退休!他曾预言中国AI将领跑世界
- The largest IPO of Hong Kong stocks this year, with a net worth of 66billion, is the "King" sitting on the mine
- 山东:美食“隐藏款”,消费“扫地僧”
- 期货怎么开户安全吗,期货手续费哪家期货公司比较低,适合散户开户?
- js的slice()和splice()
- Summary of operating system underlying knowledge (interview)
- 一款自动生成单元测试的 IDEA 插件
猜你喜欢
![[opencv450] salt and pepper noise demo](/img/d8/a367c26b51d9dbaf53bf4fe2a13917.png)
[opencv450] salt and pepper noise demo

An idea plug-in for automatically generating unit tests

加快 yarn install 的三个简单技巧

2021-06-07

阿里 Seata 新版本终于解决了 TCC 模式的幂等、悬挂和空回滚问题

Effect evaluation of regression model under credit product quota pricing scenario

腾讯云服务器发送邮件失败

山东:美食“隐藏款”,消费“扫地僧”

Babbitt | metauniverse daily must read: meta, Microsoft and other technology giants set up the metauniverse Standards Forum. Huawei and Alibaba joined. NVIDIA executives said that they welcomed partic

Self inspection is recommended! The transaction caused by MySQL driver bug is not rolled back. Maybe you are facing this risk!
随机推荐
重卡界销售和服务的“扛把子”,临沂广顺深耕产品全生命周期服务
港股今年最大IPO来了,660亿身家,坐在矿山上的“大王”
2021-05-08
Une compréhension simple du tri rapide
Error creating bean with name xxx Factory method ‘sqlSessionFactory‘ threw exception; nested excepti
狂奔的极兔,摔了一跤
Uniswap acquires genie, an NFT transaction aggregator. Will the NFT transaction market change?
Execute the sc.exe QC command to query some services. The data area passed to the system call is too small
AI intelligent robot saves us time and effort
Summary of operating system underlying knowledge (interview)
Helm 基础入门 Helm介绍与安装
Why is Xiaomi stuck in the chip quagmire?
地平线开发板 调试
微信小程序引导用户添加小程序动画页
2021-04-15
idea查看.class文件 idea查看.class文件夹
快速排序的简单理解
useState vs useRef 和 useReducer:相同点、不同点和用例
golang--判断字符串是否相等
知名人脸搜索引擎惹众怒:仅需一张照片,几秒钟把你扒得底裤不剩