Проблема при сборе данных изображения с помощью cv2 - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь получить данные изображений из некоторых изображений кошек и собак с помощью cv2 для проекта машинного обучения в python и добавить их все в список training_data. Но это просто печать None при печати списка в конце.

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

CATEGORIES = ["Dog", "Cat"]     # 0=dog, 1=cat
IMG_SIZE = 50

training_data = []

def create_training_data():
    i = 0
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)  # path to cats or dogs dir
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            i += 1
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])
            except Exception as e:
                print("general exception", e, os.path.join(path, img))
            if i % 1000 == 0:
                print(i, '...')
    print('\n\nfinished...\n\n')

create_training_data()

training_data = random.shuffle(training_data)

print(training_data)

X = []
y = []

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

X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)

Я думаю, что это связано с изменением размера, потому что он выдает множество следующих исключений:

общее исключение OpenCV (4.1.1) C:... \ opencv \ modules \ imgproc \ src \ resize.cpp: 3720: ошибка: (-215: утверждение не выполнено)! ssize.empty () в функции 'cv :: resize' D: ... / cats_and_dogs / PetImages\ Cat \ 9565.jpg

Также печатается эта ошибка:

Трассировка (последний последний вызов):

Файл "D: / Python/tensorflow/tutorial/cats_and_dogs.py ", строка 44, для объектов, метка в training_data: TypeError: объект 'NoneType' не повторяется

Поврежденные данные JPEG: 399 посторонних байтов перед маркером 0xd9

Поврежденные данные JPEG: 226 посторонних байтов перед маркером 0xd9

Поврежденные данные JPEG: 162 постороннихбайты перед маркером 0xd9

Предупреждение: неизвестный номер редакции JFIF 0,00

...

1 Ответ

0 голосов
/ 14 октября 2019

После исследования ваших ошибок я обнаружил эту ветку , которая может иметь отношение к вашей проблеме.

Короче говоря, тема отмечает проблему с набором данных Oxford-IIIT Pet. В этом наборе данных некоторые изображения заканчиваются расширением «.jpg», но на самом деле являются «.png». Проверьте, где вы получили ваши изображения.

Похоже, у вас похожая / та же проблема. Несоответствие между расширением файла и фактическими данными изображения может привести к тому, что openCV не сможет правильно считывать данные.

Редактировать: 2019 окт. 14

Дополнительно, random.shuffle() работает на месте и поэтому возвращает None. Изменить training_data = random.shuffle(training_data) на random.shuffle(training_data)

...