Создать массив из изображений в разных папках - PullRequest
0 голосов
/ 26 марта 2019

Я новичок в Python, учусь с нуля. У меня есть набор папок с изображениями, для которых я хочу применить различные алгоритмы машинного обучения. Однако я изо всех сил пытаюсь получить эти изображения в виде данных, которые я могу использовать.

Это мои предпосылки:

  • Каждое имя папки содержит ключ к изображению. Например, /birds/abc123.jpg и /birds/def456.jpg оба являются «птицами»
  • Каждое изображение 100x100px jpg
  • Я использую Python 2.7
  • Всего 2800 изображений

Это мой код, насколько я получил:

# Standard scientific Python imports
import matplotlib.pyplot as plt

# Import datasets, classifiers and performance metrics
from sklearn import svm, metrics

import numpy as np

import os # Working with files and folders

from PIL import Image # Image processing

rootdir = os.getcwd()
key_array = []
pixel_arr = np.empty((0,10000), int)

for subdir, dirs, files in os.walk('data'):
  dir_name = subdir.split("/")[-1]
  if "x" in dir_name:
    key_array.append(dir_name)
    for file in files:
      if ".DS_Store" not in file:
        file = os.path.join(subdir, file)
        im = Image.open(file)
        im_bw = im.convert('1') #Black and white
        new_np = np.array(im_bw2).reshape(1,-1)
        print new_np.shape
        pixel_arr = np.append(pixel_arr, new_np, axis=0)

Что работает в этом коде, так это просмотр папок, получение имен папок и выбор правильных файлов / изображений. Что я не могу заставить работать, так это создать простой массив, который будет 2800,10000 (или, возможно, правильный будет 10000,2800), то есть 2800 строк с 10000 значениями в каждом.

Это решение (которое я не уверен, работает ли оно) очень медленное, и я совершенно уверен, что должно быть решение, которое будет более быстрым и элегантным, чем это!

Как я могу создать этот массив с числовым индексом 2800x10000, желательно с индексным номером из присоединенного массива key_array?

1 Ответ

1 голос
/ 26 марта 2019

Если вам не нужны все изображения одновременно, вы можете использовать генератор.

def get_images():
  for subdir, dirs, files in os.walk('data'):
    dir_name = subdir.split("/")[-1]
    if "x" in dir_name:
      key_array.append(dir_name)
      for file in files:
        if ".DS_Store" not in file:
          file = os.path.join(subdir, file)
          im = Image.open(file)
          im_bw = im.convert('1') #Black and white

          yield np.array(im_bw2).reshape(1,-1)

Таким образом, вы не удерживаете все изображения в памяти одновременно, что, вероятно, поможет вам.

Использование изображений, которые вы затем сделаете:

for image in get_images():
  ...
...