YOLO下一步:输出预测boundingbox做进一步处理

来源:互联网 发布:襄阳华为云计算招聘 编辑:程序博客网 时间:2024/05/15 08:23

对于我们使用yolo做一下research中的其他应用而言,最终目的肯定不是看看预测boundingbox就ok了。
具体对于我而言,就需要在得到boundingbox后再找出目标的局部信息。下面简单介绍一下如何完成。
1.修改源代码
在源代码image.c中找到draw_detections()函数,print出方框的位置即可,如下:
这里写图片描述
2.记录终端输出到文本文件
我这里使用的命令是| tee train_log.txt ,可参考:Linux中记录终端(Terminal)输出到文本文件
3.python进一步提取boundingbox并做简单处理
先看一眼输入数据(即上一步输出到文件中的数据):
这里写图片描述
可以看到有时候检测到有时候检测不到,这里我为了后面方便处理(这里我是要提取类别名为tip的box坐标并进行处理),简单处理了一下(已知每一帧有且只有一个tip,如果没有检测到则用相邻帧的坐标填充),并保存到新文件内。
代码如下:

把‘tip’的一行数据读入到dic中

i=0d={}with open('output_coordinate.txt') as f:    for line in f.readlines():        if 'Objects:' in line:            i=i+1                    if 'tip:' in line:            d[i]=line.strip()# print(i)# print(d)
若某一帧中没有检测到tip,则默认为上一帧检测到的数据
d[1]=d[2]for k in range(1, i+1):    if not d.get(k):        d[k]=d[k-1]# print(d)
将tip数据分割为list
import refor k, v in d.items():    d[k]=re.split(r'\s+', v)# print(d)
数组重组为dict格式
frames=[]probs=[]lx=[]rx=[]ly=[]ry=[]for k, v in d.items():    frames.append(k)    probs.append(v[1])    lx.append(v[2])    rx.append(v[3])    ly.append(v[4])    ry.append(v[5])data = {'frames':frames,        'probs':probs,        'lx':lx,        'rx':rx,        'ly':ly,        'ry':ry,}
数据存储到DataFrame
from pandas import Series, DataFrameframes_num=1590frame = DataFrame(data, columns = ['probs', 'lx', 'rx', 'ly', 'ry'], index = list(range(1, frames_num+1)))frame.index.name = 'frames'frame.columns.name = 'coordiante'frame.head()
coordiante probs lx rx ly ry frames 1 36% 559 811 247 306 2 36% 559 811 247 306 3 37% 559 811 247 305 4 37% 558 810 246 305 5 37% 557 810 245 304

坐标数据保存到文本

with open('tip_coordinate.txt', 'w') as f:    for j in range(frames_num):        f.write(lx[j]+' '+ly[j]+' '+rx[j]+' '+ry[j]+'\n')  

最后处理的结果:
这里写图片描述

0 0
原创粉丝点击