使用 cv2 收集图像数据时出现问题
Problem when gathering image data with 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)
我认为这与调整大小有关,因为它抛出了很多这样的异常:
general exception OpenCV(4.1.1) C:...\opencv\modules\imgproc\src\resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
D:.../cats_and_dogs/PetImages\Cat65.jpg
它还会打印此错误:
Traceback (most recent call last):
File "D:/Python/tensorflow/tutorial/cats_and_dogs.py", line 44, in
for features, label in training_data:
TypeError: 'NoneType' object is not iterable
Corrupt JPEG data: 399 extraneous bytes before marker 0xd9
Corrupt JPEG data: 226 extraneous bytes before marker 0xd9
Corrupt JPEG data: 162 extraneous bytes before marker 0xd9
Warning: unknown JFIF revision number 0.00
...
在研究了您的错误后,我发现 this 个线程可能与您遇到的问题相关。
简而言之,该线程指出 Oxford-IIIT 宠物数据集存在问题。在该数据集中,一些图像以“.jpg”扩展名结尾,但实际上是“.png”。验证您从何处获取图像。
您似乎遇到了 similar/the 同样的问题。文件扩展名与实际图像数据不匹配可能导致openCV无法正确读入数据
Edit: 2019 Oct. 14
此外,random.shuffle()
就地运行,因此 returns None
。将 training_data = random.shuffle(training_data)
更改为 random.shuffle(training_data)
我正在尝试使用 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)
我认为这与调整大小有关,因为它抛出了很多这样的异常:
general exception OpenCV(4.1.1) C:...\opencv\modules\imgproc\src\resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize' D:.../cats_and_dogs/PetImages\Cat65.jpg
它还会打印此错误:
Traceback (most recent call last):
File "D:/Python/tensorflow/tutorial/cats_and_dogs.py", line 44, in for features, label in training_data: TypeError: 'NoneType' object is not iterable
Corrupt JPEG data: 399 extraneous bytes before marker 0xd9
Corrupt JPEG data: 226 extraneous bytes before marker 0xd9
Corrupt JPEG data: 162 extraneous bytes before marker 0xd9
Warning: unknown JFIF revision number 0.00
...
在研究了您的错误后,我发现 this 个线程可能与您遇到的问题相关。
简而言之,该线程指出 Oxford-IIIT 宠物数据集存在问题。在该数据集中,一些图像以“.jpg”扩展名结尾,但实际上是“.png”。验证您从何处获取图像。
您似乎遇到了 similar/the 同样的问题。文件扩展名与实际图像数据不匹配可能导致openCV无法正确读入数据
Edit: 2019 Oct. 14
此外,random.shuffle()
就地运行,因此 returns None
。将 training_data = random.shuffle(training_data)
更改为 random.shuffle(training_data)