Как читать изображения в папке и хранить их номер класса и данные изображения? Python - PullRequest
1 голос
/ 08 января 2020

У меня есть папка, которая состоит из 100 изображений, все из которых являются png. Имя файла: 1.png, 2.png, 3.png ... все до 100.

В настоящее время я разбил эти изображения вручную на разные подпапки (10 папок по 10 изображений в каждой). каждая папка является категорией (автомобиль, самолет, лошадь, собака и т. д. c).

Вместо того, чтобы вручную создавать 10 подпапок для копирования и вставки изображений в каждую подпапку, я хочу прочитать и сохранить их данные в соответствии с именем их изображения, которое соответствует записи индекса в текстовом файле.

Файл блокнота выглядит следующим образом. В основном это означает, что 1.png - самолет, 2.png - самолет, 11.png - автомобиль и т. Д.

airplane
airplane
airplane
airplane
airplane
airplane
airplane
airplane
airplane
airplane
car
car
car
car
car
car
car
car
car
car
bird
bird
bird
bird
bird
bird
bird
bird
bird
bird
cat
cat
cat
cat
cat
cat
cat
cat
cat
cat
deer
deer
deer
deer
deer
deer
deer
deer
deer
deer
dog
dog
dog
dog
dog
dog
dog
dog
dog
dog
frog
frog
frog
frog
frog
frog
frog
frog
frog
frog
horse
horse
horse
horse
horse
horse
horse
horse
horse
horse
ship
ship
ship
ship
ship
ship
ship
ship
ship
ship
truck
truck
truck
truck
truck
truck
truck
truck
truck
truck

Как мне выполнить такую ​​операцию, чтобы сгенерировать номер их класса ) для целей глубокого обучения? Это то, что я ранее использовал:

def create_data(data_dir,array_name):
    for category in CATEGORIES:  
        path = os.path.join(data_dir,category)  # create path to class
        class_num = CATEGORIES.index(category)  # get the classification
        for img in os.listdir(path):  # iterate over each image
            try:
                img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_COLOR)                     new_array = img_array
                array_name.append([new_array, class_num]) 
            except Exception as e:  # in the interest in keeping the output clean...
                pass

def normalise(X):
    X = X/255.0

def append(data_array,X,y):
    for features,label in data_array:
        X.append(features)
        y.append(label)

1 Ответ

0 голосов
/ 08 января 2020

Не совсем уверен, что это именно то, что вы имеете в виду, но это должно помочь:

import cv2

def read_images_and_labels(img_dir, label_file):
    with open(label_file) as f:
        labels = [word.lower().strip() for word in f.read().split("\n")]
    data = {}
    for (ind, val) in enumerate(list(set(labels))):
        data[val] = ind
    corrected_labels = [data[label] for label in labels]
    images = [cv2.imread('{}/{}.png'.format(img_dir, ind), cv2.IMREAD_COLOR) for (ind, label) in enumerate(labels, 1)]
    return list(zip(images, corrected_labels))

img_dir - это место, где хранятся изображения, а label_file - место, где хранятся данные меток. на основе вашего кода замените вызов create_data() на

array_name = read_images_and_labels(data_dir, file='index.txt')

Если вы хотите проверить метки, передайте данные в следующую функцию. Установите время ожидания выше / ниже для большей / меньшей продолжительности (время ожидания указывается в миллисекундах). Можно просмотреть окно cv2 с меткой на изображении.

def verify_labels(data, label_file='index.txt', timeout=1000):
    with open(label_file) as f:
        labels = list(set(f.read().lower().split("\n")))
    for (img, ind) in data:
        lbl = labels[ind]  
        image = cv2.putText(img, lbl, (50,50), cv2.FONT_HERSHEY_SIMPLEX,  
                   1, (0, 0, 255), cv2.LINE_AA, False) 
        cv2.imshow(lbl, image)
        cv2.waitKey(timeout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...