【问题标题】:Problem when gathering image data with cv2使用 cv2 收集图像数据时出现问题
【发布时间】:2020-02-11 10:35:56
【问题描述】:

我正在尝试从一些带有 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: error: (-215:Assertion failed) !ssize.empty() in function 'cv ::调整大小' D:.../cats_and_dogs/PetImages\Cat\9565.jpg

它也会打印这个错误:

Traceback(最近一次调用最后一次):

文件“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

...

【问题讨论】:

    标签: python image list image-processing cv2


    【解决方案1】:

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

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

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

    编辑:2019 年 10 月 14 日

    此外,random.shuffle() 在原地运行,因此返回 None。将training_data = random.shuffle(training_data) 更改为random.shuffle(training_data)

    【讨论】:

    • 哦.. 好的,谢谢,我怎么能检测到这些损坏的图像
    • 那么您的 try/except 语句应该会跳过任何损坏的图像。但是,您的整个图像语料库似乎都存在问题。输出中的 linesfor features, label in training_data: TypeError: 'NoneType' object is not iterable 看起来好像没有图像添加到您的训练数据中。
    • 是的,这很奇怪,当我打印我的 training_data 时,它只是不打印
    • face palm random.shuffle() 在适当的位置进行随机播放,因此它没有返回值。相反,该行应该是 random.shuffle(training_data) 而不是 training_data = random.shuffle(training_data)
    • 感谢您的接受!我编辑了原始答案以包含有关 random.shuffle 的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多