python 处理1对n的问题
问题描述:如下图,当一个图形中有多个物体,检测得到的结果为,图像,列表,准确率,位置信息,将图像名作为key,后续值作为一个value存在一个字典里。
data/safety_hat/test/1000.jpg 1 0.988243 722 106 742 128
data/safety_hat/test/1000.jpg 1 0.978737 545 103 566 126
data/safety_hat/test/1000.jpg 1 0.971023 630 103 652 128
data/safety_hat/test/1000.jpg 1 0.9652 613 84 632 103
data/safety_hat/test/1000.jpg 1 0.958997 796 129 821 156
data/safety_hat/test/1000.jpg 1 0.948718 762 116 785 138
data/safety_hat/test/1000.jpg 1 0.926812 839 123 863 148
data/safety_hat/test/1000.jpg 1 0.905992 678 104 697 124
data/safety_hat/test/1000.jpg 1 0.88185 693 112 715 136
data/safety_hat/test/1000.jpg 1 0.537691 746 150 772 179
data/safety_hat/test/1000.jpg 1 0.383983 694 134 720 161
data/safety_hat/test/1001.jpg 2 0.999307 1010 179 1110 283
data/safety_hat/test/1001.jpg 2 0.997593 498 163 627 319
data/safety_hat/test/1001.jpg 2 0.991337 72 150 161 242
data/safety_hat/test/1001.jpg 2 0.983014 780 176 877 273
data/safety_hat/test/1002.jpg 1 0.999119 239 258 280 315
data/safety_hat/test/1002.jpg 1 0.81975 169 179 196 222
data/safety_hat/test/1003.jpg 1 0.992104 739 89 760 112
data/safety_hat/test/1003.jpg 1 0.986534 355 90 373 110
data/safety_hat/test/1003.jpg 1 0.983901 651 113 674 137
代码如下:
import os
from collections import OrderedDict
import pandas as pd
img_results = OrderedDict()
with open("output.txt","r") as f:
for line in f.readlines():
img_name, label, score, xmin, ymin, xmax, ymax = line.strip("\n").split()
image_name = img_name.split('/')[-1].split('.')[0]
result = dict()
result["label"] = int(label)
result["score"] = float(score)
result["bbox"] = [float(xmin), float(ymin), float(xmax), float(ymax)]
if img_name not in img_results:
img_results[img_name] = [result]
else:
img_results[img_name].append(result)
print(len(img_results))
使用img_results如下,统计每张图像中相同类别的物体出现的次数,存在csv文件中:
resu_jieguo=[]
for img_file, results in img_results.iteritems():
resu=dict()
img_name = img_file.split('/')[-1].split('.')[0]
resu['img_name']=img_name
head_num=0
head_sh_num=0
for result in results:
if result['label']==1:
head_num += 1
elif result['label']==2:
head_sh_num += 1
resu['head_sh']=head_sh_num
resu['head'] = head_num
resu_jieguo.append(resu)
resu_csv=pd.DataFrame(data=resu_jieguo)
resu_csv.to_csv('result_1120_3.csv')
OrderedDict
内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候, 它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。