我一直在研究将图像作为输入的顺序模型。但是,不同的是输入图像实际上是由按键确定的。
例如,训练序列是(你可以假设音响是视频的帧ID)如何通过keras中的密钥加载图像数据?
{ f1, f2, f3, ..., fn }
和相应的图像序列是
{ M[f1], M[f2], M[f3], ..., M[fn] }
,其中M是一个地图存储{ fi->图}映射。
假设下一批,我的训练序列成为
{ f2, f3, ..., fn+1 }
和图像序列变得
{ M[f2], M[f3], M[f4], ..., M[fn+1] }
正如你所看到的,如果我直接在图像序列保存到磁盘上,也有很多冗余(在上述情况下,M [f2]到M [fn]被保存两次)。所以似乎有必要通过键来引用图像,因此imagedataloader类不能使用。
[EDIT]
我的模型是一个2级分类器需要的图像序列作为输入,其中,所述图像被映射与帧ID(音响)。在我的data_preprocess代码中预先生成了图像序列是正片还是负片。
正样本可能是这样的:
{f3, f4, f5, f6, f7} 1
{f4, f5, f6, f7, f8} 1
{f5, f6, f7, f8, f9} 1
...
虽然负样本是这样的:
{f1, f2, f3, f4, f5} 0
{f2, f3, f4, f5, f6} 0
{f10, f11, f12, f13, f14} 0
...
因此,它不像图像分类问题,其中图像正好有一固定标签。在我的情况下,每个图像将被多次使用,它们的正面或负面一起由整个序列决定,但不是自身。
[EDIT II]
的图像是的N个视频帧,并这样存储在磁盘上:
|-data_root/
|-Video 1/
| |-frame_1_1.jpg
| |-frame_1_2.jpg
| ...
|-Video 2/
| |-frame_2_1.jpg
| |-frame_2_2.jpg
| ...
...
...
|-Video N/
| |-frame_N_1.jpg
| |-frame_N_2.jpg
...
我想做的是,给定的场景的帧/图像的两个序列,模型预测这两个场景是否属于同一类型。
由于视频可以含有长的时间跨度对于每个场景,我将一个场景分割的整个序列为多个非重叠的子序列(省略视频的索引):
Sequence of scene i: frame_1, frame_2, frame_3, ..., frame_n
Sub-sequence i_1: frame_1, frame_2, frame_3, ..., frame_10
Sub-sequence i_2: frame_11, frame_12, frame_13, ..., frame_20
Sub-sequence i_3: frame_21, frame_22, frame_23, ..., frame_30
...
然后,我随机产生阳性样品PI(对从相同序列产生的子序列),如:
<Pair of sub-sequences> <Labels>
P1 {sub-sequence i_4, sub-sequence i_2}, 1
P2 {sub-sequence i_3, sub-sequence i_5}, 1
... ...
对于阴性样品,我生成对从不同场景的子序列(Ni)中的:
<Pair of sub-sequences> <Labels>
N1 {sub-sequence i_1, sub-sequence j_6}, 0
N2 {sub-sequence i_2, sub-sequence j_4}, 0
... ...
很明显,一帧/图像可以在不同的训练样本中出现多次。例如。在上述情况下,N2和P1都包含子序列i_2。因此,我选择通过帧ID序列(fi)并且在训练期间,通过帧ID(fi)获取序列的相应帧/图像来保存生成的样本对。
我应该如何优雅地与Keras做?
你可以做通过将想法分解为段落(简单地说是两条新行),很大程度上提高了您的问题的价值。你也可以用Graves(类似于这个1)旁边的撇号类似的密钥来包围代码位。代码块可以显示两条换行符,每行缩进四个空格。 –
这样的图像序列是否总是具有这种顺序indeces的形式,或者可能有像'f1,f3,f2,f5'这样的indeces?它们如何存储在磁盘上?你的目录的结构是什么?这个预处理函数如何用于标记数据? –