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

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

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

i=0
d={}
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 re
for 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, DataFrame

frames_num=1590

frame = 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')  

最后处理的结果:
YOLO下一步:输出预测boundingbox做进一步处理_第3张图片

你可能感兴趣的:(计算机视觉,机器学习,YOLO使用过程笔记)