List转csv、真实框标注数据可视化操作

news/2024/7/10 1:40:29 标签: 目标检测

问题:先前博客有提到获取labelimg标注真实框的宽高、归一化数据存入列表当中之后,怎么用plt模块将其表示出来?
解决:将list转csv之后,再结合matplotlib将其用坐标表示出来
话不多说:
步骤一获取csv文件,更改自己路径运行如下代码即可(推荐用debug模式运行)

import csv
import numpy as np
from PIL import Image
import os
import glob
import random
import xml.etree.ElementTree as ET
import matplotlib.pyplot as plt
import pandas as pd
import math

datas = []
# 对于每一个xml都寻找box
path = r'VOCdevkit/VOC2007/Annotations'
for xml_file in glob.glob('{}/*xml'.format(path)):
    tree = ET.parse(xml_file)
    height = int(tree.findtext('./size/height'))
    width = int(tree.findtext('./size/width'))
    if height <= 0 or width <= 0:
        continue

    # 对于每一个目标都获得它的宽高
    for obj in tree.iter('object'):
        xmin = int(float(obj.findtext('bndbox/xmin'))) / width
        ymin = int(float(obj.findtext('bndbox/ymin'))) / height
        xmax = int(float(obj.findtext('bndbox/xmax'))) / width
        ymax = int(float(obj.findtext('bndbox/ymax'))) / height

        xmin = np.float64(xmin)
        ymin = np.float64(ymin)
        xmax = np.float64(xmax)
        ymax = np.float64(ymax)
        # 得到宽高
        a=xmax - xmin
        b=ymax - ymin
        c=2
        a=math.floor(a * 10 ** c) / (10 ** c)
        b=math.floor(b * 10 ** c) / (10 ** c)

        #datas.append([xmax - xmin, ymax - ymin])
        datas.append([a, b])
        print(datas)
#x=xmax - xmin
#y=ymax - ymin
#print(x)
#print(y)
#print(len(datas))

name_attribute = ['width', 'height']
# writerCSV=pd.DataFrame(columns=name_attribute,data=data)
# writerCSV.to_csv('./no_fre.csv',encoding='utf-8')

csvFile = open('./no_fre1.csv', "w+")
try:
    writer = csv.writer(csvFile)
    writer.writerow(name_attribute)
    for i in range(len(datas)):
        #for j in range(len(datas[0])):

        writer.writerow(datas[i])
finally:
    csvFile.close()


csv结果:在这里插入图片描述

步骤二:注释转csv格式代码,调用matplotlib模块的plt.scatter()画出散点图

import numpy as np
from PIL import Image
import os
import glob
import random
import xml.etree.ElementTree as ET
import matplotlib.pyplot as plt
import pandas as pd
import math
datas = []
# 对于每一个xml都寻找box
path = r'VOCdevkit/VOC2007/Annotations'
for xml_file in glob.glob('{}/*xml'.format(path)):
    tree = ET.parse(xml_file)
    height = int(tree.findtext('./size/height'))
    width = int(tree.findtext('./size/width'))
    if height <= 0 or width <= 0:
        continue

    # 对于每一个目标都获得它的宽高
    for obj in tree.iter('object'):
        xmin = int(float(obj.findtext('bndbox/xmin'))) / width
        ymin = int(float(obj.findtext('bndbox/ymin'))) / height
        xmax = int(float(obj.findtext('bndbox/xmax'))) / width
        ymax = int(float(obj.findtext('bndbox/ymax'))) / height

        xmin = np.float64(xmin)
        ymin = np.float64(ymin)
        xmax = np.float64(xmax)
        ymax = np.float64(ymax)
        # 得到宽高
        a=xmax - xmin
        b=ymax - ymin
        c=2
        a=math.floor(a * 10 ** c) / (10 ** c)
        b=math.floor(b * 10 ** c) / (10 ** c)

        #datas.append([xmax - xmin, ymax - ymin])
        datas.append([a, b])
        print(datas)
#x=xmax - xmin
#y=ymax - ymin
#print(x)
#print(y)
#print(len(datas))
#将其注释,不然有报错
"""
name_attribute = ['width', 'height']
# writerCSV=pd.DataFrame(columns=name_attribute,data=data)
# writerCSV.to_csv('./no_fre.csv',encoding='utf-8')

csvFile = open('./no_fre1.csv', "w+")
try:
    writer = csv.writer(csvFile)
    writer.writerow(name_attribute)
    for i in range(len(datas)):
        #for j in range(len(datas[0])):

        writer.writerow(datas[i])
finally:
    csvFile.close()
"""
#x:y=1:1,放大5倍,且画出中间平分线
plt.figure(figsize=(5,5))
x = [0,0.2,0.4,0.6,0.8,1.0]
plt.plot(x, x)
hw=pd.read_csv('no_fre1.csv')#导入csv文件
#s为画散点的粗细,可自行调整;color参数可以换比如:"yollew","grey","red"
plt.scatter(hw['width'], hw['height'],s=6,color="blue")#s指的是点的面积
#注意这里x轴命名为"width",y轴为"height",与下面xlabel,ylabel的命名要对应
plt.xlabel(u"width")
plt.ylabel(u"height")
#画出散点图
plt.grid()  # 网格线显示
plt.show()
#将散点图显示出来
plt.savefig('point.png')


效果展示:
在这里插入图片描述
希望能给到大家帮助,引用请注明出处。


http://www.niftyadmin.cn/n/1726044.html

相关文章

matplotlib新建固定xy轴带网格空白画布(annotate使用、绘制激活函数)

目录1、新建画布2、 绘制符号3、sin函数4、sigmoid激活函数5、relu激活函数6、Tanh激活函数图像1、新建画布 1、tm,新建固定xy轴带网格空白画布还困扰我挺久的&#xff0c;网上资源比较乱&#xff0c;该实现代码整理如下&#xff1a; import glob import random import matpl…

python判断txt是否为空,并跳过空文件

问题&#xff1a;对批量txt文件做一些读写操作&#xff0c;一遇到为空的文件使得程序报错并终止&#xff0c;怎么判断一个txt文件内容是否为空&#xff0c;为空的话怎么跳过这些文件以继续下面的操作&#xff0c;并将为空的txt文件夹名称打印输出呢&#xff1f; 解决思路&#…

NOI模拟:保镖(Hall定理)

题意&#xff1a; 给一个二分图&#xff0c;找出满足以下条件的点集的个数&#xff1a; 1.该点集是原点集的子集。 2.该点集是一个匹配的点集的子集。 &#xff08;n ≤ 20&#xff09; 题解&#xff1a; 首先任意匹配的点集一定是一个最大匹配的子集。 题意转化为找出是…

批量更改图片名称、size大小

代码 import os import time from PIL import Imagedef alter(path,object):s os.listdir(path) #改尺寸像素大小代码段 """ count 1for i in s:document os.path.join(path,i)img Image.open(document)out img.resize((3840,2160))listStr [str(int(tim…

BZOJ3924: [Zjoi2015]幻想乡战略游戏(动态树分治)

传送门 题意&#xff1a; 给一棵树&#xff0c;每次给一些点增加点权&#xff0c;求一个点&#xff0c;使得∑j≠idis(i,j)∗val[j]最小,输出最小值。 题解&#xff1a;动态树分治 官方题解已经讲得很清楚了&#xff1a; 首先我们假设每次操作过后我们可以快速地在线查询以…

将图像按7:3划分train和val

问题&#xff1a;如何将原图按7:3划分train和val两个分类集呢&#xff1f; 代码&#xff1a; # -*- coding:utf-8 -*- #author :wu # 将一个文件夹下图片按比例分在两个文件夹下&#xff0c;比例改0.7这个值即可 import os import random import shutil from shutil import co…

BZOJ3676: [Apio2014]回文串(后缀自动机+manacher/回文自动机)

传送门 题意&#xff1a; 给一个字符串s。定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度。求出s的所有回文子串中的最 大出现值。 题解&#xff1a; manacher求出所有本质不同的回文子串后在后缀自动机上二分。 &#xff08;网上说的什么回文自动机感觉…

BZOJ1030: [JSOI2007]文本生成器(AC自动机)

传送门 题意&#xff1a; 给n个串&#xff0c;和字符串s的长度t。求满足包含至少一个串的字符串s的个数。 题解&#xff1a; 转化为求一个串都不满足的个数。可以直接在AC自动机上DP。 但注意比较坑的一点是如果一个串的子串中有不合法的子串的话也是不合法的。 #include…