Python统计Labelme标注文件信息并绘制散点图

前言

  • 本文是个人使用Python处理文件的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入我的个人主页查看

前提条件

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • Python OS模块是负责程序与操作系统的交互,提供了访问操作系统底层的接口和非常丰富的方法用来处理文件和目录。

实验环境

  • Python 3.x (面向对象的高级语言)

Python统计Labelme标注文件信息并绘制散点图

import os
import cv2
import json
import pyecharts.options as opts
from pyecharts.charts import Scatter
from pyecharts.commons.utils import JsCode
from pyecharts.faker import Faker

# 图像显示函数
def show(name, img):
    cv2.namedWindow(name, 0)  # 用来创建指定名称的窗口,0表示CV_WINDOW_NORMAL
    # cv2.resizeWindow(name, img.shape[1], img.shape[0]); # 设置宽高大小为640*480
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def count_json_label(in_json_path,label_num,width_list,height_list,area_list):
    with open(in_json_path, "r", encoding='utf-8') as f:
        # json.load数据到变量json_data
        json_data = json.load(f)
    
    # 统计标签数
    for i in json_data['shapes']:
        if i['label'] in label_num.keys():
            label_num[i['label']] = label_num[i['label']] + 1
        else:
            label_num[i['label']] = 1
    
    # 生成存储长和宽数据的列表
    for i in json_data['shapes']:
        w = i['points'][1][0] - i['points'][0][0]
        h = i['points'][1][1] - i['points'][0][1]
        # print(w,h)
        width_list.append(abs(w))
        height_list.append(abs(h))
        area_list.append(abs(w)*abs(h))

def write_info_txt(txt_path,label_num,width_list,height_list,area_list):
    with open('rect_info.txt','w') as f:
        f.write('总标注数:'+str(sum(label_num.values()))+'\n')
        f.write('label_num:'+str(label_num)+ '\n')

        f.write('min(width_list):'+str(min(width_list))+'\n')
        f.write('len(width_list):'+str(len(width_list))+'\n')

        f.write('min(height_list):'+str(min(height_list))+'\n')
        f.write('len(height_list):'+str(len(height_list))+'\n')

        f.write('min(area_list):'+str(min(area_list))+'\n')
        f.write('len(area_list):'+str(len(area_list))+'\n')

def draw_scatter(width_list,height_list):
    x_data = width_list
    y_data = height_list

    (
        Scatter()
        .add_xaxis(xaxis_data=x_data)
        .add_yaxis(
            series_name="(width,height)",
            y_axis=y_data,
            symbol_size=3,
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_series_opts()
        .set_global_opts(
            xaxis_opts=opts.AxisOpts(
                name = 'Width',
                type_="value", splitline_opts=opts.SplitLineOpts(is_show=True)
            ),
            yaxis_opts=opts.AxisOpts(
                name = 'Height',
                type_="value",
                axistick_opts=opts.AxisTickOpts(is_show=True),
                splitline_opts=opts.SplitLineOpts(is_show=True),
            ),
            tooltip_opts=opts.TooltipOpts(
                formatter=JsCode(
                    "function (params) {return ' ( ' +params.value[0] + ' , ' + params.value[1]+ ' )';}"
                )
            ),
        )
        .render("w_h_scatter_chart.html")
    )

if __name__=="__main__":
    in_dir_name = 'jsons/' # 图片和json所在文件夹
    # out_dir_name = 'output/'
    all_name_list = os.listdir(in_dir_name) # 获取文件夹内所有文件名列表

    # 获取所有json文件,并修改
    json_name_list = [i for i in all_name_list if i.endswith('.json')] # 图片路径列表
    # print(json_name_list)

    label_num = {}
    width_list = []
    height_list = []
    area_list = []

    for json_name in json_name_list: # 遍历json文件并修改
        in_json_path = in_dir_name + json_name
        # print(in_json_path)
        count_json_label(in_json_path,label_num,width_list,height_list,area_list)
    
    print('总标注数:',sum(label_num.values()))
    print('label_num:',label_num)

    # print('width_list:',width_list)
    print('min(width_list):',min(width_list))
    print('len(width_list):',len(width_list))

    # print('height_list:',height_list)
    print('min(height_list):',min(height_list))
    print('len(height_list):',len(height_list))

    # print('area_list:',area_list)
    print('min(area_list):',min(area_list))
    print('len(area_list):',len(area_list))

# 写入信息到txt文件中
write_info_txt('rect_info.txt',label_num,width_list,height_list,area_list)
# 生成散点图
draw_scatter(width_list,height_list)
总标注数: 3504
label_num: {'1': 2612, '2': 228, '0': 151}
min(width_list): 7.420494699646497
len(width_list): 3504
min(height_list): 9.30232558139528
len(height_list): 3504
min(area_list): 76.04040504938182
len(area_list): 3504

在这里插入图片描述

更多精彩内容,可点击进入Python日常小操作专栏或我的个人主页查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FriendshipT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值