python3 可视化COCO格式json文件目标检测矩形框

2023-05-16

import os
import json
import argparse
from PIL import Image, ImageDraw, ImageFont

FONT_SIZE = 13*2
IMAGE_FONT = ImageFont.truetype(u"simhei.ttf", FONT_SIZE)
COLOR_LIST = ["red", "green", "blue", "cyan", "yellow", "purple",
              "deeppink", "ghostwhite", "darkcyan", "olive",
              "orange", "orangered", "darkgreen"]


class ShowResult(object):
    def __init__(self, args):
        self.args = args
        self.json_file_path = self.args.json_file_path
        self.img_path_root = self.args.img_path_root
        self.show_img_path_root = self.args.show_img_path_root
        self._category_id_convert_to_name()
        self._data_preprocess()

    def _category_id_convert_to_name(self):
        # 构建一个字典: {"category_id": category_name,...}
        orig_json_file = open(self.json_file_path, encoding='utf-8')
        self.orig_json = json.load(orig_json_file)
        self.category_id_name_dict = {}
        orig_category_id_name_dict = self.orig_json["categories"]
        for idx, category_id_name_dict in enumerate(orig_category_id_name_dict):
            self.category_id_name_dict[category_id_name_dict["id"]] = category_id_name_dict["name"]

    def _data_preprocess(self):
        # 构建一个字典: {"img_id": [{bbox_attr_dict}, ...], ...}
        result_json_file = open(self.json_file_path, encoding='utf-8')
        self.resut_json = json.load(result_json_file)
        self.resut_json = self.resut_json["annotations"]
        self.img_id_bboxes_attr_dict = {}
        for idx, result_ann in enumerate(self.resut_json):
            result_attr_dict = {"bbox": result_ann["bbox"],
                                #"score": result_ann["score"],
                                "category_id": result_ann["category_id"]}
            if result_ann["image_id"] not in self.img_id_bboxes_attr_dict.keys():
                self.img_id_bboxes_attr_dict[result_ann["image_id"]] = []
                self.img_id_bboxes_attr_dict[result_ann["image_id"]].append(result_attr_dict)
            else:
                self.img_id_bboxes_attr_dict[result_ann["image_id"]].append(result_attr_dict)

    def mainprocess(self):
        # 对 self.img_id_bboxes_attr_dict进行循环操作:
        # 对每一张图片
        for idx, (img_id, attr_dict_list) in enumerate(self.img_id_bboxes_attr_dict.items()):
            img_path = os.path.join(self.img_path_root, img_id + ".png")
            print("当前正在处理第-{0}-张图片, 总共需要处理-{1}-张, 完成百分比:{2:.2%}".format(idx+1,
                                                                        len(self.img_id_bboxes_attr_dict.keys()),
                                                                        (idx+1) / len(self.img_id_bboxes_attr_dict.keys())))
            # 对每一个bbox标注
            img = Image.open(img_path, "r")  # img1.size返回的宽度和高度(像素表示)
            draw = ImageDraw.Draw(img)
            # 提取所有bboxes信息
            for jdx, attr_dict in enumerate(attr_dict_list):
                COLOR = COLOR_LIST[jdx % len(COLOR_LIST)]
                # 对每一个bboxes标注信息
                bbox = attr_dict["bbox"]
                #score = attr_dict["score"]
                category_name = self.category_id_name_dict[attr_dict["category_id"]]
                x1, y1 = bbox[0], bbox[1]

                top_left = (int(bbox[0]), int(bbox[1]))  # x1,y1
                top_right = (int(bbox[0])+int(bbox[2]), int(bbox[1]))  # x2,y1
                down_right = (int(bbox[0])+int(bbox[2]), int(bbox[1])+int(bbox[3]))  # x2,y2
                down_left = (int(bbox[0]), int(bbox[1])+int(bbox[3]))  # x1,y2

                draw.line([top_left, top_right, down_right, down_left, top_left], width=5, fill=COLOR)

                # 将类别和分数写在左上角
                #new_score = str(score).split('.')[0] + '.' + str(score).split('.')[1][:2]
                #draw.text((x1, y1 - FONT_SIZE), new_score, font=IMAGE_FONT, fill=COLOR)
                #draw.text((x1 + 25, y1 - FONT_SIZE), "|", font=IMAGE_FONT, fill=COLOR)
                draw.text((x1 + 30, y1-FONT_SIZE), str(category_name), font=IMAGE_FONT, fill=COLOR)

            # 存储图片
            save_path = os.path.join(self.show_img_path_root, img_id + ".png")
            img.save(save_path, 'png')


def main():
    parser = argparse.ArgumentParser()
    # json文件路径
    parser.add_argument('-json_file_path', default=r"I:\competiton_data\2020Haihua-garbage_sorting\complex_open_data\train\annotations\train.json",
                        help='the single img json file path')
    # 图片文件夹root
    parser.add_argument('-img_path_root', default=r"I:\competiton_data\2020Haihua-garbage_sorting\complex_open_data\train\images",
                        help='the val img path root')

    # 显示图片存储文件路径
    parser.add_argument('-show_img_path_root', default=r"D:\gabage_result",
                        help='the show img path root')

    args = parser.parse_args()
    showresult = ShowResult(args)

    showresult.mainprocess()


if __name__ == '__main__':
    main()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 可视化COCO格式json文件目标检测矩形框 的相关文章

随机推荐

  • 利用python pil 实现给图片上添加文字

    最近的一个工程项目是讲文字添加到图像上 使用了opencv xff0c 结果发现利用opencv给图像添加文字有局限 xff08 1 xff09 可利用的字体类型比较少 xff0c 需要安装Freetype扩展 xff0c 比较复杂 xff
  • Sklearn到底是什么?

    更多详细代码关注sklearn中文官方文档 xff1a http www scikitlearn com cn http lijiancheng0614 github io scikit learn index html 1 概念 Skle
  • esp8266 error: espcomm_open failed

    gpi0 没有接地 xff0c 接上地就可以了注意和usb分出的gnd接口接的是同一个地
  • 微信小程序quickstart项目中有关userInfoReadyCallback的解释

    userInfoReadyCallback 在index js中定义 xff0c 在app js中使用 附app js代码 xff1a app js App onLaunch function 展示本地存储能力 var logs 61 wx
  • 微信小程序引入模块中wxml、wxss、js

    先描述下目录结构 xff0c 见下图 UI页面见下图 其中ok按键是引入的log模块 xff0c log模块非page页 indexButton是index页本身拥有的组件 xff0c index页直接导入Log模块中的组件 xff0c c
  • PHP解析错误 PHP Parse error: syntax error, unexpected '[' in

    之前做了一次php后台代码在不同服务器的迁移 xff0c 代码迁移到新服务器上 xff0c 代码运行不了 xff0c 返回500内部错误 500 内部错误 xff0c 就查看服务器上 var log php fpm www error lo
  • 微信小程序使用video组件时的一些坑

    xff08 1 xff09 mp4视频用video组件播放会卡顿 绿屏 尤其是在快进 拖动时间条时 在video组件上 xff0c 试试加个custom cache 61 false 属性 xff0c 可以完美解决卡顿 绿屏的现象 xff0
  • java中JFrame中函数removeAll的用法

    解答链接 用baidu搜了半天搜不出来 xff0c 用google一下就出来了 下面用自己的代码来解释下removeAll xff08 xff09 的用法 注意一定要在getContentPane xff08 xff09 中用removeA
  • ROS中的package.xml详解

    span class token prolog lt xml version 61 34 1 0 34 gt span span class token tag span class token tag span class token p
  • (一)了解Freertos

    关于Freertos FreeRTOS非常适合使用微控制器或小型微处理器的深度嵌入式实时应用程序 这种类型的应用程序通常包含硬实时需求和软实时需求 软实时需求 是那些规定了一个时间截止日期的需求 但是违反这个截止日期并不会使系统崩溃 例如
  • 如何关闭iOS系统自动更新提示?

    原文链接 xff1a https www zhihu com question 37297197 打开iPhone或者iPad的Safari浏览器 xff0c 复制以下网址并从自带浏览器打开 https oldcat me web NOOT
  • 大数据高级开发工程师——大数据相关工具之三 Maxwell

    文章目录 大数据相关工具Maxwell数据实时同步工具Maxwell 简介Maxwell工作原理MySQL Binlog 介绍1 Binlog简介2 Binlog的日志格式 Mysql 实时数据同步方案对比开启MySQL的BinlogMax
  • TF-IDF算法详解及sklearn代码实现

    目录 1 基本介绍 xff08 1 xff09 TF xff08 词频 Term Frequency xff09 xff08 2 xff09 IDF xff08 逆向文件频率 Inverse Document Frequency xff09
  • UEFI下Windows启动引导的顺序(附带linux双系统)

    这里均以64位系统 xff08 windows和linux均是 xff09 xff0c gpt分区 xff0c UEFI引导作为例子 xff0c 现在基本上不会不支持吧 windows下UEFI引导文件的载入顺序 主板启动windows的一
  • 在ROS环境下用yolov3-tiny训练自己的数据集

    由于整个过程新建 修改 设置的文件和参数较多 所以我先放张整个流程分析图在这 xff0c 方便大家结合下列步骤去更好理解 0 提前准备 xff1a 下载darknet xff08 yolov3 xff09 并编译 span class to
  • ROS下使用usb_cam驱动读取摄像头数据

    因为darknet ros会直接订阅指定的图像话题名 xff0c 然后对图像进行检测 xff0c 绘制检测框 xff0c 并发布相应的检测话题 xff0c 因此首先需要找一个能够发布图像话题的ROS包 xff0c 这里经推荐使用ROS官方提
  • python 各种加密

    背景 加密学习 对称加密 对称密钥加密 xff0c 又叫私钥加密 即信息发送的方和接受方用一个密钥去加密和揭秘数据 最大的优势是 加解密速度快 xff0c 适合对大量数据进行加密 xff0c 对称加密的缺点是密钥的管理和分配 xff0c 换
  • 参加中国移动开发者大会有感

    作为我校CSDN俱乐部的主席 xff0c 我很荣幸受到CSDN的邀请参加中国移动开发者大会 xff0c 下面写点自己的感悟 xff1a 移动互联网应用大时代已经到来 xff0c 所有的IT应用都将移动化 xff0c 所有的信息服务都将移动化
  • IntelD435摄像头将深度图与摄像头进行像素对齐(并抽帧保存)

    coding 61 utf 8 import pyrealsense2 as rs import numpy as np import cv2 import os 创建一个管道 pipeline 61 rs pipeline Create
  • python3 可视化COCO格式json文件目标检测矩形框

    import os import json import argparse from PIL import Image ImageDraw ImageFont FONT SIZE 61 13 2 IMAGE FONT 61 ImageFon