對於我們使用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')
最後處理的結果: