1. 程式人生 > >YOLO下一步:輸出預測boundingbox做進一步處理

YOLO下一步:輸出預測boundingbox做進一步處理

對於我們使用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')  

最後處理的結果:
這裡寫圖片描述