我有一系列正在接受分析的视频。我们有50个视频,目前每个视频采样10个帧。我们通过一个模型运行每一帧,该模型输出一个长度为7的列表(各种指标的得分)。因此,我们有一个形状为[numVideos x [numFrames x [7]]]的X。此输出的顺序与视频中显示的顺序相同。
理想情况下,我们将使用此数据训练模型,新模型将输出单个int得分。
例如,总输入列表为形状(50、10、7)。这是50个视频分析之一的示例:
[[2.10857585e-01 3.44210785e-05 7.68336877e-02 6.52071908e-02
1.59574211e-01 6.07666420e-03 4.81416196e-01]
[1.25921518e-01 3.82323651e-06 9.80229899e-02 1.59665961e-02
5.27808852e-02 7.20748529e-02 6.35229409e-01]
[1.96348786e-01 1.39075582e-05 3.05381954e-01 8.71435739e-03
7.70738944e-02 3.36979516e-02 3.78769159e-01]
[4.88201588e-01 4.07423446e-04 1.31438121e-01 2.09173430e-02
5.96358590e-02 2.17649899e-02 2.77634591e-01]
[2.23202184e-01 9.74372160e-05 1.74910247e-01 2.34939177e-02
3.35233539e-01 6.30585337e-03 2.36756831e-01]
[6.06459320e-01 2.96085584e-03 1.29230097e-01 2.59685959e-03
1.56335548e-01 6.93407189e-03 9.54832658e-02]
[2.97920138e-01 1.25984091e-03 1.89080209e-01 5.00026112e-03
8.90274197e-02 6.42844364e-02 3.53427678e-01]
[3.03987801e-01 6.44640977e-06 1.16339259e-01 2.88505014e-03
1.53694913e-01 6.00992441e-02 3.62987250e-01]
[1.29550800e-01 1.86390607e-04 9.91750583e-02 2.72049874e-01
8.33113417e-02 2.60952320e-02 3.89631271e-01]
[1.64423732e-03 2.68871787e-07 3.26379202e-04 9.86126721e-01
5.81838889e-04 1.44834805e-03 9.87217203e-03] ]
我在这部分遇到了麻烦,因为我是Keras的新手-是否可以让Keras在视频级别按顺序考虑此数据?又是使用[numFrames x [7]]在单个视频上输出预测吗?我认为我们可以以任何顺序使用框架数据来建立一个好的模型,但是我相信框架的顺序(以及它们之间的变化和变化率)很有价值。
答案 0 :(得分:1)
最基本的方法是使用循环图层。它们是为按时间顺序工作并从中学习而设计的。
因此,如果您将X
的形状设为(50,10,7)
,如(videos, frames, features)
所示,则可以创建如下模型:
inputTensor = Input((10,7)) #also possible with (None,7) for variable frame counts
#some recurrent layers with return_sequences=True
output = LSTM(someUnits, return_sequences=True)(inputTensor)
output = LSTM(aFewUnits, return_sequences=True)(output)
现在,如果要为每帧评分,请保留return_sequences=True
并:
output = Dense(1, activation=someActivation)(output)
model = Model(inputTensor, output) #output shape = (50,10,1)
或者,如果您想要每个视频的总分,则最后一个循环层应为return_sequences=False
:
output = LSTM(aFewUnits, return_sequences=False)(output)
output = Dense(1, activation=someActivation)(output)
model = Model(inputTensor, output) #output shape = (50,1)
现在,如果您的帧是实际图像,并且您想处理这些图像,它将变得更加复杂。您应该考虑像素的存在和此数据的形状。
假设您有8 x 8像素的帧,在RGB中,您的视频输入形状应类似于(50,10,8,8,3)
。
一种方法是首先将图像重塑为特征:X.reshape((50,10,-1))
然后连接7个功能:X = np.concatenate([X,features], axis=-1)
然后继续使用该模型。
另一种方法是使用ConvLSTM2D层,该层采用形状像原始视频的输入。在模型的某个点上,您将空间尺寸折叠为要素(与上述相同的重塑过程),并与第二个输入(即7个要素)连接。