YOLO下一步:輸出預測boundingbox做進一步處理
阿新 • • 發佈:2018-12-31
對於我們使用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=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')
最後處理的結果: