使用cv2收集图像数据时出现问题

时间:2019-10-14 19:24:05

标签: python image list image-processing cv2

我正在尝试使用cv2从python中的一些机器学习项目的猫猫图像中获取图像数据,并将它们全部附加到training_data列表中。但这只是在最后打印列表时打印None

起初我以为我可能需要将数据转换为一个numpy数组,但似乎没有任何效果,我真的不明白这是怎么回事。

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:断言失败)函数'cv中的!ssize.empty() :: resize'   D:... / cats_and_dogs / PetImages \ Cat \ 9565.jpg

它还会显示此错误:

  

回溯(最近通话最近一次):

     

文件“ D:/Python/tensorflow/tutorial/cats_and_dogs.py”,第44行,在       对于功能,在training_data中标记:   TypeError:“ NoneType”对象不可迭代

     

损坏的JPEG数据:标记0xd9之前的399个无关字节

     

损坏的JPEG数据:标记0xd9之前的226个无关字节

     

损坏的JPEG数据:标记0xd9之前的162个多余字节

     

警告:未知的JFIF版本号0.00

     

...

1 个答案:

答案 0 :(得分:0)

研究了错误之后,我发现了this线程可能与您遇到的问题有关。

简而言之,该线程注意到Oxford-IIIT Pet数据集存在问题。在该数据集中,某些图像以“ .jpg”扩展名结尾,但实际上是“ .png”。验证您从哪里获得图像。

看来您遇到类似/相同的问题。文件扩展名和实际图像数据之间的不匹配可能导致openCV无法正确读取数据。

  

编辑:2019年10月14日

此外,random.shuffle()在适当位置运行,因此返回None。将training_data = random.shuffle(training_data)更改为random.shuffle(training_data)