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

Python 使用cv2采集图像数据时出现问题,python,image,list,image-processing,cv2,Python,Image,List,Image Processing,Cv2,我正试图用cv2从python机器学习项目的一些猫狗图像中获取图像数据,并将它们全部附加到training\u data列表中。但在最后打印列表时,它只是打印None 起初我认为可能我需要将数据转换成一个numpy数组,但似乎什么都不起作用,我真的不明白出了什么问题 CATEGORIES = ["Dog", "Cat"] # 0=dog, 1=cat IMG_SIZE = 50 training_data = [] def create_training_data(): i

我正试图用cv2从python机器学习项目的一些猫狗图像中获取图像数据,并将它们全部附加到
training\u 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::resize”中的ssize.empty() D:…/cats_和_dogs/PetImages\Cat\9565.jpg

它还打印此错误:

回溯(最近一次呼叫最后一次):

文件“D:/Python/tensorflow/tutorial/cats_and_dogs.py”,第44行,在 对于功能,请在“训练数据”中添加标签: TypeError:“非类型”对象不可编辑

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

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

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

警告:未知JFIF版本号0.00


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

简而言之,该线程注意到牛津IIIT Pet数据集存在一个问题。在该数据集中,一些图像以“.jpg”扩展名结尾,但实际上是“.png”。验证您从何处获取图像

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

编辑:2019年10月14日


另外,
random.shuffle()
在适当的位置运行,因此返回
None
。将
training\u data=random.shuffle(training\u data)
更改为
random.shuffle(training\u data)

oh。。好的,谢谢,那么我如何检测这些损坏的图像呢?您的try/except语句应该跳过任何损坏的图像。然而,看起来你的整个图像库可能有问题。对于功能,training_data:TypeError中的标签行
:输出中的“NoneType”对象不可编辑
,使其看起来好像没有图像添加到您的训练数据中。是的,这很奇怪,当我打印我的训练_数据时,它只是随机打印noneface palm。shuffle()执行适当的洗牌,因此它没有返回值。相反,该行应该是随机的。无序排列(训练数据)而不是随机的。无序排列(训练数据)感谢您的接受!我编辑了原始答案,以包含有关
random.shuffle