【代码整理】COCO格式数据集画框

2024-01-23 08:28

本文主要是介绍【代码整理】COCO格式数据集画框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可以用于排查数据集转化后可能出现的坐标错误,类别不对齐等需要可视化才能发现的问题

import部分

from pycocotools.coco import COCO
import numpy as np
import os
from PIL import Image
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon
import matplotlib.pyplot as plt

VisCOCOBox

class VisCOCOBox:def visCOCOGTBoxPerImg(self, coco, image2color, anns):'''可视化COCO数据集下一张图像的所有GTBoxesArgs::param coco:        COCO数据集实例:param image2color: 每个类别的颜色:param anns:        当前图像对应的GTBoxes信息Retuens:None'''# 获取当前正在使用的坐标轴对象"get current axis"(这里就是图像的坐标轴)ax = plt.gca()# 关闭plt的坐标轴自动缩放功能:# ax.set_autoscale_on(False)# polygons存储plt的多边形实例(即bbox), colors存储每个bbox对应的颜色(区分不同的类别)polygons, colors = [], []for ann in anns:color = image2color[ann['category_id']]x, y, w, h = ann['bbox']# 采用多边形画法:poly = [[x, y], [x, y + h], [x + w, y + h], [x + w, y]]polygons.append(Polygon(np.array(poly).reshape((4,2))))colors.append(color)# 可视化每个bbox的类别的文本(ax.text的bbox参数用于调整文本框的样式):ax.text(x, y, f"{coco.loadCats(ann['category_id'])[0]['name']}", color='white', bbox=dict(facecolor=color))# PatchCollection批量绘制图形, 而不是单独绘制每一个(采用填充,透明度为alpha)p = PatchCollection(polygons, facecolor=colors, linewidths=0, alpha=0.4)ax.add_collection(p)# 批量可视化coco格式数据集的GTdef visCOCOGTBoxes(self, jsonPath, imgDir, visNum, saveVisDir):'''批量可视化数据集GTBoxes(可以用于排查画框等错误)Args::param jsonPath:    COCO格式Json文件路径:param imgDir:      图像根目录:param visNum:      可视化几张图像:param saveVisDir:  可视化图像保存目录Retuens:None'''if not os.path.isdir(saveVisDir):os.makedirs(saveVisDir)# 创建COCO数据集读取实例:coco = COCO(jsonPath)# 每个类别都获得一个随机颜色:image2color = dict()for cat in coco.getCatIds():image2color[cat] = (np.random.random((1, 3)) * 0.7 + 0.3).tolist()[0]# 获取数据集中所有图像对应的imgId:imgId = coco.getImgIds()# 打乱数据集图像读取顺序:np.random.shuffle(imgId)for i in range(visNum):plt.figure(figsize=(20, 13))# 获取图像信息(json文件 "images" 字段)imgInfo = coco.loadImgs(imgId[i])[0]imgPath = os.path.normpath(os.path.join(imgDir, imgInfo['file_name']))# 这里win和linux或许不一样:imgName = imgPath.split('\\')[-1]# 得到当前图像里包含的BBox的所有idannIds = coco.getAnnIds(imgIds=imgInfo['id'])# anns (json文件 "annotations" 字段)anns = coco.loadAnns(annIds)# 读取图像image = Image.open(imgPath).convert('RGB')plt.imshow(image)# 画框:self.visCOCOGTBoxPerImg(coco, image2color, anns)# 样式:plt.xticks([])plt.yticks([])plt.tight_layout()# 保存可视化结果plt.savefig(os.path.join(saveVisDir, f'vis_{imgName}'), bbox_inches='tight', pad_inches=0.0, dpi=150)

example

if __name__ == '__main__':jsonPath = 'E:/datasets/RemoteSensing/visdrone2019/annotations/train.json'imgDir = 'E:/datasets/RemoteSensing/visdrone2019/images/train/images'saveVisDir = './vis1'COCOVis = VisCOCOBox()COCOVis.visCOCOGTBoxes(jsonPath, imgDir, 4, saveVisDir)

输出(COCO2017数据集train):
在这里插入图片描述

输出(VisDrone2019数据集):

在这里插入图片描述

这篇关于【代码整理】COCO格式数据集画框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635802

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码