目标检测目标的统计

1 对目标数量,占比的统计

2 对目标尺寸(长,宽及面积的箱型图)

统计时你只需要修改对应目标的字典即可(下载STLITI.TTF字体格式,放到当前位置,替换fname中的位置)

# encoding:utf-8
""""
#20200331 统计目标检测中的数据,需要输入dota格式的标签x1,y1....x4,y4,category
"""
import numpy as np
import os
import matplotlib.pyplot as plt
from matplotlib import font_manager
import random


#目标数据统计字典
totalnum={ 'ship' : 0,
           "airplane"  : 0,
           "vehicle"    : 0,
           "overpass"  : 0,
           "basketballcourt"  : 0,
           "tenniscourt"  : 0,
           "airport"    : 0,
           'storagetank': 0,
           "Expressway-Service-area": 0,
           "harbor": 0,
           "baseballfield": 0,
           "bridge": 0,
           "chimney": 0,
           "groundtrackfield": 0,
           "trainstation":0,
           "stadium": 0,
           "windmill": 0,
           "golffield": 0,
           "Expressway-toll-station": 0,
           "dam":0
           }
#每类目标的长宽数据统计
totalnum_wh_area={"ship" : {'w':[],'h':[],'area':[]},
                  "airplane"   : {'w':[],'h':[],'area':[]},
                  "vehicle"     : {'w':[],'h':[],'area':[]},
                  "overpass"   : {'w':[],'h':[],'area':[]},
                  "basketballcourt"   : {'w':[],'h':[],'area':[]},
                  "tenniscourt"   : {'w':[],'h':[],'area':[]},
                  "airport"     : {'w':[],'h':[],'area':[]},
                  "storagetank": {'w': [], 'h': [], 'area': []},
                  "Expressway-Service-area": {'w': [], 'h': [], 'area': []},
                  "harbor": {'w': [], 'h': [], 'area': []},
                  "baseballfield": {'w': [], 'h': [], 'area': []},
                  "bridge": {'w': [], 'h': [], 'area': []},
                  "chimney": {'w': [], 'h': [], 'area': []},
                  "groundtrackfield": {'w': [], 'h': [], 'area': []},
                  "trainstation": {'w': [], 'h': [], 'area': []},
                  "stadium": {'w': [], 'h': [], 'area': []},
                  "windmill": {'w': [], 'h': [], 'area': []},
                  "golffield": {'w': [], 'h': [], 'area': []},
                  "Expressway-toll-station": {'w': [], 'h': [], 'area': []},
                  "dam": {'w': [], 'h': [], 'area': []}
                  }

colors=['black','lightcoral','maroon','red','salmon','darksalmon','peru','orange',\
        'darkgoldenrod','olivedrab','chartreuse','palegreen','lime','seagreen',\
        'cyan','deepskyblue','skyblue','dodgerblue','lightslategray','crimson','b']
#标题名字
category_title="dota"
#画不同目标的总数量条形图及占比扇形图
def draw_totalnum(inputfiles,out_put):
    files=os.listdir(inputfiles)
    #统计不同目标的数据
    for fliename in files:
        txt_path=os.path.join(inputfiles,fliename)
        txt_size=os.path.getsize(txt_path)
        txt_f=open(txt_path,"r")
        if txt_size != 0:
            for line in txt_f.readlines():
                split_line=line.replace("\n","").split(" ")
                category=split_line[8]
                category_label = category
                #category_label=dict_category[category]
                if category_label in totalnum.keys():
                    totalnum[category_label] += 1
                else:
                    print("####category is not inputfiles:",inputfiles,category_label)
        else:
            print ("###txt_path_size is 0:",txt_path)
    #根据统计的数目画柱状图
    key_list = []
    val_list = []
    for key in totalnum.keys():
        key_list.append(key)
        val_list.append(totalnum[key])
    #添加图像属性
    plt.figure(1)
    plt.figure(figsize=(10, 10))
    my_font = font_manager.FontProperties(fname="/data/xx/PycharmProjects/object_detection_tool/image_label_data_convert/STLITI.TTF")
    plt.xlabel("类别",fontproperties=my_font,size=10)
    plt.ylabel("数量(个)",fontproperties=my_font,size=10)
    plt.title(category_title+"数据统计",fontproperties=my_font,size=15)
    #绘制Y轴信息
    y=val_list
    first_bar = plt.bar(range(len(y)), y, width=0.4, color='blue')
    #绘制x轴的数据
    index=range(0,len(y))
    name_list=key_list
    plt.xticks(index, name_list,fontproperties=my_font,rotation=-60)  # 绘制x轴的标签
    #添加数量
    for data in first_bar:
        y=data.get_height()
        x=data.get_x()
        plt.text(x,y,str(y),va="bottom")

    plt.savefig(os.path.join(out_put,"ship_columnar.jpg"))
    plt.close(1)
    #画扇形图
    plt.figure(2)
    plt.figure(figsize=(12, 12))
    labels= key_list
    sizes=val_list
    colors_=random.sample(colors,len(key_list))
    explode=[]
    for index in range(len(key_list)):
        if val_list[index] < 300:
            explode.append(random.uniform(0.025,0.1))
        else:
            explode.append(0)
    explode=tuple(explode)
    patches, l_text,p_text = plt.pie(sizes,
                                     explode=explode,
                                     labels=labels,
                                     colors=colors,
                                     pctdistance=0.8,  # 设置百分比标签和圆心的距离
                                     labeldistance=1.02,  # 图例距圆心半径倍距离
                                     autopct='%3.2f%%',  # 数值保留固定小数位
                                     shadow=False,  # 无阴影设置
                                     startangle=90,  # 逆时针起始角度设置
                                     # center=(10, 10),  # 设置饼图的圆心(相当于X轴和Y轴的范围)
                                     # radius=10,  # 设置饼图的半径(相当于X轴和Y轴的范围)
                                     wedgeprops={'linewidth': 1, 'edgecolor': 'green'},  # 设置饼图内外边界的属性值
                                     textprops={'fontsize': 20, 'color': 'black', 'fontproperties': my_font}
                                     )
    for t in l_text:
        t.set_fontproperties(my_font)
    plt.axis("equal")
    #第一个数值用于控制左右移动,值越大越向右边移动,第二个数值用于控制的上下移动,值越大越向上移动
    plt.legend(loc='lower right', bbox_to_anchor=(1.1,-0.1))
    plt.title(category_title+'类别数据占比', fontproperties=my_font,size=15)
    plt.savefig(os.path.join(out_put,"ship_sector.jpg"))
    print("####totalnum:",totalnum)

#统计目标的长宽和面积,并画出箱型图
def draw_box_length_width_area(inputfiles, out_put):
    files = os.listdir(inputfiles)
    # 统计不同目标的数据
    for fliename in files:
        txt_path = os.path.join(inputfiles, fliename)
        txt_size = os.path.getsize(txt_path)
        txt_f = open(txt_path, "r")
        if txt_size != 0:
            for line in txt_f.readlines():
                split_line = line.replace("\n", "").split(" ")
                category = split_line[8]
                xmin = min(float(split_line[0]),float(split_line[2]),float(split_line[4]),float(split_line[6]))
                ymin = min(float(split_line[1]), float(split_line[3]), float(split_line[5]), float(split_line[7]))
                xmax = max(float(split_line[0]),float(split_line[2]),float(split_line[4]),float(split_line[6]))
                ymax = max(float(split_line[1]), float(split_line[3]), float(split_line[5]), float(split_line[7]))
                assert (xmax-xmin) >= 0, "w的值小于0"
                w=round((xmax-xmin),3)
                assert (ymax - ymin) >= 0, "h的值小于0"
                h=round((ymax - ymin),3)
                #category_label = dict_category[category]
                category_label =category
                area=round(w*h,3)
                if category_label in totalnum.keys():
                   totalnum_wh_area[category_label]['w'].append(w)
                   totalnum_wh_area[category_label]['h'].append(h)
                   totalnum_wh_area[category_label]['area'].append(area)
                else:
                    print("####category is not inputfiles:", inputfiles, category_label)
        else:
            print ("###txt_path_size is 0:", txt_path)
    #print ("#####totalnum_wh_area:",totalnum_wh_area)

    #画w,h的箱型图
    #拿取出箱型图的数据
    key_list = []
    val_w_list = []
    val_h_list = []
    val_area_list = []
    for key in totalnum_wh_area.keys():
        key_list.append(key)
        for key_ in totalnum_wh_area[key].keys():
            if key_ =='w':
                val_w_list.append(totalnum_wh_area[key][key_])
            elif key_ == 'h':
                val_h_list.append(totalnum_wh_area[key][key_])
            elif key_ == 'area':
                val_area_list.append(totalnum_wh_area[key][key_])
            else:
                print ("key_ is not exit")

    #area画图
    plt.figure(1)
    fig, ax = plt.subplots(figsize=(8, 6))
    my_font = font_manager.FontProperties(
        fname="/data/xxx/PycharmProjects/object_detection_tool/image_label_data_convert/STLITI.TTF")
    plt.xlabel("类别", fontproperties=my_font, size=10)
    plt.ylabel("area像素点(个)", fontproperties=my_font, size=10)
    plt.title(category_title+"_area数据统计", fontproperties=my_font, size=15)
    data=val_area_list
    labels=key_list
    ax.boxplot(data)
    ax.set_xticklabels(labels,fontproperties=my_font, size=10,rotation=-60)
    fig.savefig(os.path.join(out_put, "ship_aera_box.jpg"))
    plt.close(1)

    #绘制w,h
    plt.figure(2)
    fig, ax = plt.subplots(figsize=(8,6))
    my_font = font_manager.FontProperties(
        fname="/data/xxx/PycharmProjects/object_detection_tool/image_label_data_convert/STLITI.TTF")
    plt.xlabel("类别", fontproperties=my_font, size=10)
    plt.ylabel("w像素点(个)", fontproperties=my_font, size=10)
    plt.title(category_title+"_w数据统计", fontproperties=my_font, size=15)
    data = val_w_list
    labels = key_list
    ax.boxplot(data)
    ax.set_xticklabels(labels, fontproperties=my_font, size=10,rotation=-60)
    fig.savefig(os.path.join(out_put, "ship_w_box.jpg"))
    plt.close(2)

    plt.figure(3)
    fig, ax = plt.subplots(figsize=(8, 6))
    my_font = font_manager.FontProperties(
        fname="/data/xxx/PycharmProjects/object_detection_tool/image_label_data_convert/STLITI.TTF")
    plt.xlabel("类别", fontproperties=my_font, size=10)
    plt.ylabel("h像素点", fontproperties=my_font, size=10)
    plt.title(category_title+"_h数据统计", fontproperties=my_font, size=15)
    data = val_h_list
    labels = key_list
    ax.boxplot(data)
    ax.set_xticklabels(labels, fontproperties=my_font, size=10,rotation=-60)
    fig.savefig(os.path.join(out_put, "ship_h_box.jpg"))
    plt.close(3)



if __name__=="__main__":
    input_dota_txt="" #具体HBB数据格式的文件夹地址
    out_put=""        #生成图片的保存地址
    draw_totalnum(input_dota_txt,out_put)
    draw_box_length_width_area(input_dota_txt,out_put)
    print ("finished!!!!")

 

你可能感兴趣的:(目标检测)