如何为图像分类准备训练数据

时间:2019-12-11 22:12:41

标签: python pandas machine-learning scikit-learn data-science

我是机器学习的新手,并且在图像分类方面存在一些问题。使用一种简单的分类器技术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)

如何正确准备训练数据? 顺便说一句。我不想使用深度学习。这将是我的下一步。

在此感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

如果您不使用深度学习进行图像分类,则必须准备适合监督学习分类的数据。

步骤

1)将所有图像调整为相同大小。您可以在每个图像上循环并调整大小并保存。

2)获取每个图像的像素矢量并创建数据集。例如,如果您的猫图像位于“ Cat”文件夹中,而狗图像位于“ Dog”文件夹中,则迭代该文件夹中的所有图像并获得像素值。同一时间将数据标记为“ 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)concat catdf和dogdf并重新整理数据框

data = pd.concat([catdf,dogdf])      
data = data.sample(frac=1)

现在您的图像中有数据集。

4)拆分数据集以进行训练,测试和拟合模型。

答案 1 :(得分:2)

如前所述,要使用经典机器学习进行图像分类,您需要将原始图像转换为矢量或numpy数组并从中提取特征。

如建议的那样,预处理步骤通常包括:

  • 缩放图像并对其进行标准化
  • 如果颜色在分类中不起作用,则将图像转换为灰度
  • 进行特征提取,例如通过应用各种计算机视觉滤镜进行边缘检测,像素来创建特征向量 密度检测等。
  • 最后划分为训练样本,然后输入模型。

我发现以下链接可能对您有帮助, https://medium.com/@dataturks/understanding-svms-for-image-classification-cf4f01232700

从您发布的问题来看,我认为您应该检查X_train,y_train和X_test,y_test的尺寸。训练数据可能与您的训练标签不符。

做一个快速的X_train.shape和y_train.shape来查看尺寸。

相关问题