python - 如何为图像分类准备训练数据
问题描述
我是机器学习的新手,在图像分类方面有一些问题。使用简单的分类器技术 K 最近邻我试图区分猫和狗。
到目前为止我的代码:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
DATADIR = "/Users/me/Desktop/ds2/ML_image_classification/kagglecatsanddogs_3367a/PetImages"
CATEGORIES = ['Dog', 'Cat']
IMG_SIZE = 30
data = []
categories = []
for category in CATEGORIES:
path = os.path.join(DATADIR, category)
categ_id = CATEGORIES.index(category)
for img in os.listdir(path):
try:
img_array = cv2.imread(os.path.join(path,img), 0)
new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
data.append(new_array)
categories.append(categ_id)
except Exception as e:
# print(e)
pass
print(data[0])
s1 = pd.Series(data)
s2 = pd.Series(categories)
frame = {'Img array': s1, 'category': s2}
df = pd.DataFrame(frame)
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
在这里尝试拟合数据时出现错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-76-9d98d7b11202> in <module>
2 from sklearn.neighbors import KNeighborsClassifier
3
----> 4 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
5
6 print(X_train)
~/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py in train_test_split(*arrays, **options)
2094 raise TypeError("Invalid parameters passed: %s" % str(options))
2095
-> 2096 arrays = indexable(*arrays)
2097
2098 n_samples = _num_samples(arrays[0])
~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in indexable(*iterables)
228 else:
229 result.append(np.array(X))
--> 230 check_consistent_length(*result)
231 return result
232
~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
203 if len(uniques) > 1:
204 raise ValueError("Found input variables with inconsistent numbers of"
--> 205 " samples: %r" % [int(l) for l in lengths])
206
207
ValueError: Found input variables with inconsistent numbers of samples: [24946, 22451400]
如何正确准备训练数据?顺便提一句。我不想使用深度学习。这将是我的下一步。
将不胜感激这里的任何帮助..
解决方案
如果您不使用深度学习进行图像分类,则必须准备适合监督学习分类的数据。
脚步
1)将所有图像调整为相同大小。您可以循环遍历每个图像并调整大小并保存。
2)获取每个图像的像素向量并创建数据集。例如,如果您的猫图像在“猫”文件夹中,而狗图像在“狗”文件夹中,则遍历文件夹内的所有图像并获取像素值。同时将数据标记为“cat”(cat=1)和“non-cat”(non-cat=0)
import os
import imageio
import pandas as pd
catimages = os.listdir("Cat")
dogimages = os.listdir("Dog")
catVec = []
dogVec = []
for img in catimages:
img = imageio.imread(f"Cat/{img}")
ar = img.flatten()
catVec.append(ar)
catdf = pd.DataFrame(catVec)
catdf.insert(loc=0,column ="label",value=1)
for img in dogimages:
img = imageio.imread(f"Dog/{img}")
ar = img.flatten()
dogVec.append(ar)
dogdf = pd.DataFrame(dogVec)
dogdf.insert(loc=0,column ="label",value=0)
3) 连接 catdf 和 dogdf 并打乱数据帧
data = pd.concat([catdf,dogdf])
data = data.sample(frac=1)
现在您有了带有标签的图像数据集。
4)拆分数据集以训练和测试并拟合模型。
推荐阅读
- typescript - 从 onCreate 的 Firestore snap.data 检索数据但有未定义的错误
- c - C中嵌套结构的指针类型
- docker - 如何确保 Airflow 中的所有工作人员(容器)具有相同的环境?
- bash - 当 gofmt 建议更改时,让 gofmt 以退出状态 1 退出?
- vue.js - 如何将 D3 组件附加到另一个 vue 文件中的 div
- eclipse - 每次都有 java.lang.NullPointerException
- node.js - ng-selected 不起作用,但将选项修改为 selected="selected",使用 ng-repeat
- css - SCSS/CSS 不使用 webpack 加载
- shiny - 在任何情况下我都无法使用 mathjax
- javascript - react-select 错误:str.replace 不是函数错误