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

Posted

技术标签:

【中文标题】如何为图像分类准备训练数据【英文标题】:How to prepare training data for image classification 【发布时间】:2020-04-05 06:33:18 【问题描述】:

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

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

在此不胜感激..

【问题讨论】:

你在哪里创建变量Xy 【参考方案1】:

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

步骤

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) 拆分数据集以训练和测试并适应模型。

【讨论】:

嗨拉吉斯。非常感谢您的回复和提示。关键似乎是这条线:ar = img.flatten()。多亏了你,它工作了!感谢您的帮助! 伟大的..快乐的编码!!【参考方案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 看看会有什么尺寸。

【讨论】:

以上是关于如何为图像分类准备训练数据的主要内容,如果未能解决你的问题,请参考以下文章

如何为视网膜网络训练准备我的图像和注释?

如何为 4 个类别的文本分类创建训练数据

如何为多对一二元分类 LSTM 准备数据?

如何为图像分类中的马赛克增强创建类标签?

基于resnet训练flower图像分类模型(p31-p37)

基于resnet训练flower图像分类模型(p31-p37)