Генерация пакетов изображений в сумерках - PullRequest
2 голосов
/ 13 июня 2019

Я только начал с dask, потому что он предлагает большую мощность параллельной обработки. На моем диске около 40000 изображений, которые я собираюсь использовать для построения классификатора с использованием некоторой библиотеки DL, скажем, Keras или TF. Я собрал эту мета-информацию (путь к изображению и соответствующую метку) в кадре данных pandas, который выглядит следующим образом:

    img_path     labels
0   data/1.JPG   1
1   data/2.JPG   1
2   data/3.JPG   5
...     

Теперь вот мое простое задание: используйте dask для чтения изображений и соответствующих ярлыков lazy. Выполните некоторую обработку изображений и передайте партии в классификатор в batch size из 32.

  1. Определить функции для чтения и предварительной обработки:

    def read_data(idx):
        img = cv2.imread(data['img_path'].iloc[idx])
        label = data['labels'].iloc[idx]
        return img, label
    
    def img_resize(img):
        return cv2.resize(img, (224,224)) 
    
  2. Получите отсроченные массивы dask:

    data = [dd.delayed(read_data)(idx) for idx in range(len(df))]
    images = [d[0] for d in data]
    labels = [d[1] for d in data]
    resized_images = [dd.delayed(img_resize)(img) for img in images]
    resized_images = [dd.array.from_delayed(x, shape=(224,224, 3),dtype=np.float32) for x in resized_images]
    

Теперь вот мои вопросы:

Q1. Как мне получить batch данных с batch_size=32 из этого массива? Это эквивалентно ленивому генератору сейчас? Если нет, можно ли заставить его вести себя как один?

Q2. Как выбрать эффективный chunksize для лучшей генерации партии? Например, если у меня 4 ядер, размер изображений (224,224,3), как я могу повысить эффективность моей пакетной обработки?

...