2017-03-03 60 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 ... –