2017-11-21 3 views
0

단일 디렉토리 (각 클래스의 하위 폴더 없음)에 저장된 많은 이미지 (10M +)로 작업하고 pandas DataFrame을 사용하여 클래스 레이블을 추적합니다. 이미지 양은 메모리에 맞지 않으므로 디스크에서 미니 바이트를 읽어야합니다. 지금까지 Keras .flow_from_directory()을 사용했지만 이미지를 클래스 당 하나의 하위 폴더로 이동해야합니다 (열차/유효성 검사 분할별로). 그것은 훌륭하게 작동하지만, 이미지의 다른 부분 집합을 사용하고 다양한 방법으로 클래스를 정의하고자 할 때 매우 실용적이지 않게됩니다. 하위 폴더로 이미지를 이동하는 대신 미니 바 읽기를 추적하기 위해 데이터베이스 (예 : pandas.DataFrame)를 사용하는 대체 전략이 있습니까?Keras : 하나의 디렉토리에 모든 이미지 보관

답변

0

사용자 지정 데이터 생성기가 필요합니다.

model.fit_generator(generator=batch_generator(ids_train_split), \ 
       steps_per_epoch= \ 
       np.ceil(float(len(ids_train_split))/float(batch_size)),\ 
       epochs=epochs, verbose=1, callbacks=callbacks, \ 
       validation_data=batch_generator(ids_valid_split), \ 
       validation_steps=np.ceil(float(len(ids_valid_split))/float(batch_size))) 
:

import numpy as np 
import cv2 
def batch_generator(ids): 
    while True: 
     for start in range(0, len(ids), batch_size): 
      x_batch = [] 
      y_batch = [] 
      end = min(start + batch_size, len(ids)) 
      ids_batch = ids[start:end] 
      for id in ids_batch: 
       img = cv2.imread(dpath+'train/{}.jpg'.format(id)) 
       #img = cv2.resize(img, (224, 224), interpolation = cv2.INTER_AREA) 
       labelname=df_train.loc[df_train.id==id,'column_name'].values 
       labelnum=classes.index(labelname) 
       x_batch.append(img) 
       y_batch.append(labelnum) 
      x_batch = np.array(x_batch, np.float32) 
      y_batch = to_categorical(y_batch,120) 
      yield x_batch, y_batch 

그럼 당신은 유일한 식별자 (또는 이미지 이름)이 같은 NumPy와 배열 발전기를 호출 할 수 있습니다