首页 > 分享 > 个人笔记:OpenCV(一)图像分类——猫狗分类为例

个人笔记:OpenCV(一)图像分类——猫狗分类为例

目录

前言:

数据集准备

模型训练

模型调用

附录一:代码运行结果参考

附录二:代码详解(个人简介仅供参考)

前言:

        使用的编译环境和工具:Anaconda、Jupyter Notebook

        需要安装的库:OpenCV(打开 Anaconda Prompt 终端,输入命令:conda install opencv)

数据集准备 文件结构 CATandDOG(总文件夹)data(数据集文件夹)

XXX.ipynb(代码文件)

train(训练集文件夹)test(测试集文件夹)cat(猫的图片)dog(狗的图片) 模型训练

以下是模型训练代码:

import cv2

import numpy as np

import os

def load_data():

train_data = []

train_labels = []

for label, folder_name in enumerate(['cat', 'dog']):

folder_path = os.path.join('data', 'train', folder_name)

for filename in os.listdir(folder_path):

img_path = os.path.join(folder_path, filename)

img = cv2.imread(img_path)

img = cv2.resize(img, (128, 128))

train_data.append(img)

train_labels.append(label)

train_data = np.array(train_data)

train_labels = np.array(train_labels)

train_data = train_data.astype(np.float32)

return train_data, train_labels

train_data, train_labels = load_data()

train_data = train_data.reshape((train_data.shape[0], -1))

model = cv2.ml.SVM_create()

model.setType(cv2.ml.SVM_C_SVC)

model.setKernel(cv2.ml.SVM_LINEAR)

model.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, 100, 1e-6))

model.train(train_data, cv2.ml.ROW_SAMPLE, train_labels)

model.save('catdog_model.xml')

等待运行结束即可在CATandDOG文件夹中找到生成的catdog_model.xml模型文件。

模型调用

模型调用有两种方式。

① 第一种是训练之后直接调用,直接在模型训练代码后加上以下代码:

test_data = []

folder_path = os.path.join('data', 'test')

for filename in os.listdir(folder_path):

img_path = os.path.join(folder_path, filename)

img = cv2.imread(img_path)

img = cv2.resize(img, (128, 128))

test_data.append(img)

test_data = np.array(test_data)

test_data = test_data.astype(np.float32)

test_data = test_data.reshape((test_data.shape[0], -1))

_, test_labels = model.predict(test_data)

for filename, label in zip(os.listdir(folder_path), test_labels):

if label == 0:

print(filename, 'is a cat')

elif label == 1:

print(filename, 'is a dog')

② 另一种方式是python程序调用.xml模型文件,代码如下:

import cv2

import numpy as np

import os

import time

start_time = time.time()

model = cv2.ml.SVM_load('catdog_model.xml')

test_data = []

folder_path = os.path.join('data', 'test')

for filename in os.listdir(folder_path):

img_path = os.path.join(folder_path, filename)

img = cv2.imread(img_path)

img = cv2.resize(img, (128, 128))

test_data.append(img)

test_data = np.array(test_data)

test_data = test_data.astype(np.float32)

test_data = test_data.reshape((test_data.shape[0], -1))

_, test_labels = model.predict(test_data)

for filename, label in zip(os.listdir(folder_path), test_labels):

if label == 0:

print(filename, 'is a cat')

elif label == 1:

print(filename, 'is a dog')

end_time = time.time()

print('Time elapsed:', end_time - start_time, 'seconds')

附录一:代码运行结果参考 方法一运行结果 方法二运行结果 我的测试集(可以看到测试结果基本正确) 附录二:代码详解(个人见解仅供参考)

train_data = []

train_labels = []

#定义一个空列表train_data和train_labels用于存储训练数据和标签

for label, folder_name in enumerate(['cat', 'dog']):

#对于列表中的每个元素,使用enumerate()函数生成一个元素和其索引组成的序列,其中label表示索引,folder_name表示元素,用于遍历猫和狗两个文件夹。

folder_path = os.path.join('data', 'train', folder_name)

使用os.path.join()函数将'data', 'train', folder_name三个字符串合并为一个路径字符串,用于指定训练数据所在的文件夹路径。

for filename in os.listdir(folder_path):

遍历文件夹下的每个文件名

img_path = os.path.join(folder_path, filename)

img = cv2.imread(img_path)

img = cv2.resize(img, (128, 128))

使用os.path.join()函数将folder_path和filename组合为完整的图片路径img_path,然后使用cv2.imread()函数读取图片,cv2.resize()函数将图片大小调整为128x128像素。

train_data.append(img)

train_labels.append(label)

将处理过的图片存储在train_data列表中,将对应的标签存储在train_labels列表中。

train_data = np.array(train_data)

train_labels = np.array(train_labels)

将train_data和train_labels转换为numpy数组。

train_data = train_data.astype(np.float32)

将train_data的数据类型转换为np.float32,以便后续处理。

return train_data, train_labels

返回处理好的训练数据train_data和对应的标签train_labels。

train_data, train_labels = load_data()

调用load_data()函数加载训练数据,将训练数据和标签分别存储在train_data和train_labels变量中。

train_data = train_data.reshape((train_data.shape[0], -1))

将train_data变量的形状从(n, w, h, c)转换为(n, w * h * c),即将每个图片数据压缩成一维数组。

model = cv2.ml.SVM_create()

创建一个SVM分类器对象model。

model.setType(cv2.ml.SVM_C_SVC)

设置SVM分类器的类型为C_SVC,即支持向量分类器。

model.setKernel(cv2.ml.SVM_LINEAR)

设置SVM分类器的核函数为线性核。

model.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, 100, 1e-6))

设置SVM分类器的终止准则,当迭代次数达到100次或误差小于1e-6时停止训练。

model.train(train_data, cv2.ml.ROW_SAMPLE, train_labels)

使用训练数据和标签train_data、train_labels训练SVM分类器。

model.save('catdog_model.xml')

将训练好的模型保存到catdog_model.xml文件中。

test_data = []

定义一个空列表test_data用于存储测试数据。

folder_path = os.path.join('data', 'test')

使用os.path.join()函数将'data'和'test'两个字符串合并为一个路径字符串,用于指定测试数据所在的文件夹路径。

for filename in os.listdir(folder_path):

遍历文件夹下的每个文件名。

img_path = os.path.join(folder_path, filename)

img = cv2.imread(img_path)

img = cv2.resize(img, (128, 128))

使用os.path.join()函数将folder_path和filename组合为完整的图片路径img_path,然后使用cv2.imread()函数读取图片,cv2.resize()函数将图片大小调整为128x128像素。

test_data.append(img)

将处理过的图片存储在test_data列表中。

test_data = np.array(test_data)

将test_data转换为numpy数组。

test_data = test_data.astype(np.float32)

将test_data的数据类型转换为np.float32,以便后续处理。

test_data = test_data.reshape((test_data.shape[0], -1))

将test_data变量的形状从(n, w, h, c)转换为(n, w * h * c),即将每个图片数据压缩成一维数组。

model = cv2.ml.SVM_load('catdog_model.xml')

在本例中,该行代码加载了文件名为 'catdog_model.xml' 的 SVM 模型,并将其赋值给变量 model。这个 SVM 模型是在之前的训练过程中训练好的,用于对猫狗图像进行分类。加载已经训练好的 SVM 模型,可以避免重新训练模型的时间和计算成本,同时可以快速地对新的数据进行分类预测。

_, test_labels = model.predict(test_data)

使用训练好的SVM分类器model对测试数据test_data进行预测,结果存储在test_labels中。_表示不关心预测结果的置信度。

for filename, label in zip(os.listdir(folder_path), test_labels):

循环语句用于遍历测试数据集中的所有样本。os.listdir(folder_path) 用于获取指定文件夹 folder_path 中的所有文件名,test_labels 是测试数据集中每个样本的标签,将它们通过 zip 函数打包在一起,得到一个可迭代的对象,每次迭代返回一个文件名和对应的标签。

if label == 0:

print(filename, 'is a cat')

用于输出当前样本的文件名和标签。如果标签为0,即当前样本为猫。

elif label == 1:

print(filename, 'is a dog')

用于输出当前样本的文件名和标签。如果标签为1,即当前样本为狗。

相关知识

个人笔记:OpenCV(一)图像分类——猫狗分类为例
基于度学习的猫狗分类识别
基于Python的图像分类 项目实践——图像分类项目
Python实现对12500张猫狗图像的精准分类
OpenCV怎么进行宠物识别和行为分析
【Deep Learning】基于 Keras 的猫狗分类识别
基于深度学习的猫狗分类实战
猫狗数据集:12000张图助力AI分类训练
深度学习图像处理04:图像分类模型训练实战——动物分类
基于tensorflow深度学习的猫狗分类识别

网址: 个人笔记:OpenCV(一)图像分类——猫狗分类为例 https://m.mcbbbk.com/newsview484249.html

所属分类:萌宠日常
上一篇: 如何划分出宠物功能空间,快来瞧瞧
下一篇: oxford