我為視頻中的每一幀獲取面部標志。有477地標,每一個都是一個(3,)向量。
我有一個 30 fps 的 10 分鐘視頻。這意味著我有18000shape 陣列(477,3)。我想將所有這些資訊存盤在一個 Pandas 資料框中,其中每一行都是一個框架,有 477 列,每個 (3,) 陣列一個。
目前,我正在這樣做:
frame_lms = []
for frame in video:
landmark_dict = {}
lm_count = 0
for landmark in frame:
x = landmark.x
y = landmark.y
xy = np.array([x,y])
landmark_dict[f"lm_{count}"] = xy
lm_count =1
frame_lms.append(landmark_dict)
df = pd.DataFrame.from_dict(frame_lms)
df.to_csv('save.csv')
我的想法是將所有內容存盤在一個 dicts 串列中,附加到一個串列中,然后從研究中保存,這表明這from_dict是創建 Pandas df 的最快方法。然而,這個程序仍然很慢,因為我必須保持frame_lms狀態,當我將(477,3)陣列附加到它時,狀態會變得很大。
解決此類問題的最有效的計算方法是什么?
uj5u.com熱心網友回復:
最好避免numpy.array在嵌套回圈的內部創建和轉換為許多物件。如果xy = np.array([x, y])將內部回圈更改為xy = (x, y). 在下面的代碼中,我將轉換留在了numpy.ndarray外面,因為我知道這對 OP 來說是可以的。
由于 python 管理串列非常有效,因此您可以使用資料創建串列串列,并在創建DataFrame.
創建串列的更快的Pythonic方法是
rv = [[(lm.x, lm.y) for lm in f] for f in video]
它等效于以下稍慢的代碼(不推薦):
import numpy as np
# load video here
rv = []
for frame in video:
internal = []
for landmark in frame:
internal.append((landmark.x, landmark.y))
rv.append(internal)
您可以DataFrame使用從串列中創建
df = pd.DataFrame(rv, columns=[f"lm_{count}" for count in range(477)])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/382340.html
