2017-03-03 22 views
4

我一直在研究将图像作为输入的顺序模型。但是,不同的是输入图像实际上是由按键确定的。
例如,训练序列是(你可以假设音响是视频的帧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做?

+0

你可以做通过将想法分解为段落(简单地说是两条新行),很大程度上提高了您的问题的价值。你也可以用Graves(类似于这个1)旁边的撇号类似的密钥来包围代码位。代码块可以显示两条换行符,每行缩进四个空格。 –

+0

这样的图像序列是否总是具有这种顺序indeces的形式,或者可能有像'f1,f3,f2,f5'这样的indeces?它们如何存储在磁盘上?你的目录的结构是什么?这个预处理函数如何用于标记数据? –

回答

3

不知道你如何建立你的序列,但你有没有考虑使用ImageDataGenerator from keras.preprocessing.image

一旦你用任何你想要的参数建立了这个对象,你可以使用flow_from_directory(directory_path)方法。一旦你做到了这一点,你可以使用这个对象的文件名属性:

my_generator = ImageDataGenerator(...) 
my_generator.flow_from_directory(path_dir) 
list_of_file_names = my_generator.filename 

你现在有列表索引和列表中的元素(= file_paths)之间的映射。

我希望这有助于吗?

编辑:

由此看来,你可以建立一个映射dictionnary

map_images = {str(os.path.splitext(os.path.split(file_path)[1])[0]): file_path for file_path in list_of_file_names} 

这需要你使用ImageDataGenerator图像文件夹从检索到的file_path,它提取的文件名,删除文件扩展名并将文件名称转换为您的frame_id的string

你现在有frame_idfile_path之间的映射,您可以用load_img() and img_to_array() from keras.preprocessing.image

功能load_img()使用这样定义并返回一个PIL图像实例:

def load_img(path, grayscale=False, target_size=None): """Loads an image into PIL format. # Arguments path: Path to image file grayscale: Boolean, whether to load the image as grayscale. target_size: Either 'None' (default to original size) or tuple of ints '(img_height, img_width)'. # Returns A PIL Image instance. # Raises ImportError: if PIL is not available. """

然后img_to_array()被定义为这样,并返回一个3D numpy数组来喂养你的模型:

def img_to_array(img, dim_ordering='default'): """Converts a PIL Image instance to a Numpy array. # Arguments img: PIL Image instance. dim_ordering: Image data format. # Returns A 3D Numpy array. # Raises ValueError: if invalid 'img' or 'dim_ordering' is passed. """

所以总结:1个建造你的frame_id和相应的文件的路径之间的映射。然后使用img_load()img_to_array()加载文件。我希望我已经正确理解你的问题!

编辑2:

看到您的新的编辑,现在我明白你的文件系统的结构,我们甚至可以添加视频在你的字典里是这样的:

# list of video_id of each frame 
videos = my_generator.classes 
# mapping of the frame_id to path_of_file and vid_id 
map_images = {str(os.path.splitext(os.path.split(file_path)[1])[0]): (file_path, vid_id) for file_path,vid_id in zip(list_of_file_names,videos) } 
+0

感谢您的回答!我编辑了我的问题。我希望我已经明确了我的问题。正如你所看到的,在训练期间可能会多次使用相同的图像,并且序列标签中可能包含正面或负面的图像。所以,为了节省空间,生成的序列实际上由帧ID组成。使用框架ID,我可以使用键(id) - >值(图像)映射来获取相应的图像。 –

+0

我的问题是更多的:你怎么知道哪个ID必须去哪里?文件夹中文件的名称是否已排序? –

+0

是的,图像保存inorder和他们的文件名正是帧ID。例如。 123.jpg 124.jpg ... –