Python实现简单的图像识别

一、什么是图像识别

图像识别是一种模式识别技术,也称为计算机视觉。其可以通过计算机程序自动分析图片中的内容,并进行分类、识别等操作。图像识别是人工智能的一个重要领域,目前已被广泛应用于人脸识别、自动驾驶、安防监控等领域。

二、Python图像识别库介绍

Python是一种强大的编程语言,也被广泛应用于机器学习、数据分析、人工智能等领域。在Python中,有多个图像识别相关的库,其中比较常用的有:

1、OpenCV:OpenCV是一个流行的计算机视觉库,其支持多种编程语言,并且提供了很多用于图像处理、分析和识别的算法和工具。

2、Pillow:Pillow是Python Imaging Library(PIL)的一个分支,其提供了便捷的图像处理和图像格式转换等功能。

3、Keras:Keras是一个高层次的人工智能库,其提供了多种图像识别算法和模型,包括卷积神经网络、深度学习等。

三、Python实现图像分类

为了演示Python实现图像识别的过程,我们以图像分类为例。具体而言,我们将使用OpenCV和Keras库来训练一个深度学习模型,以将一张图片归类为人脸或非人脸。

1. 数据集准备

图像识别的基础是数据集,我们需要使用足够的数据集来训练模型。在这个例子中,我们将使用MIT的人脸数据集,包含了数千张不同人脸的照片,以及一些非人脸的照片。

import cv2
import numpy as np
import os

people = ["Ben Affleck", "Elton John", "Jerry Seinfield", "Madonna", "Mindy Kaling"]
DIR = r"./faces/"
features = []
labels = []

def create_data():
    for person in people:
        path = os.path.join(DIR, person)
        label = people.index(person)
        for img in os.listdir(path):
            img_path = os.path.join(path, img)
            img_array = cv2.imread(img_path)
            gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)

            # 把gray的照片压缩到(50,50)
            roi = cv2.resize(gray, (50, 50))
            features.append(roi)
            labels.append(label)

create_data()

代码解释:

我们首先导入必需的库,包括OpenCV、numpy和os。在该代码段中,我们定义了几个变量,包括people(人名列表)、DIR(照片存储路径)、features(图像集合)和labels(标签集合)。

随后,我们遍历人名列表,并通过os库找到对应人名文件夹中的所有照片。图像在读取后,我们将其转换为灰度图像,并将其大小压缩到(50,50)。最后,我们将灰度图像存储到特征向量集合中,并将对应的标签存储在标签集合中。

在该代码段执行完毕后,我们就得到了两个集合,包括features和labels。其中,features是一个包含所有图像特征向量的集合,labels是一个包含所有标签的集合,其对应于每个图像的所属类别。

2. 训练模型

有了准备好的数据集之后,我们就可以开始训练我们的模型了。在这个例子中,我们将使用Keras库中的Sequential模型来搭建深度学习模型,包括卷积层、激活函数、池化层、全连接层等。

import tensorflow as tf
from keras.utils import np_utils

features = np.array(features).reshape(-1, 50, 50, 1) # -1自动设定数组行数
labels = np.array(labels)

# 标签独热编码
labels = np_utils.to_categorical(labels)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(64, (3, 3), input_shape=features.shape[1:])) # 卷积层
model.add(tf.keras.layers.Activation("relu")) # 激活函数
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) # 池化层

model.add(tf.keras.layers.Conv2D(64, (3, 3))) # 第二个卷积层
model.add(tf.keras.layers.Activation("relu")) # 第二个激活函数
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) # 第二个池化层

model.add(tf.keras.layers.Flatten()) # 展平
model.add(tf.keras.layers.Dense(64)) # 全连接层
model.add(tf.keras.layers.Activation('relu')) # 全连接层激活函数

model.add(tf.keras.layers.Dense(2)) # 输出层,2种分类
model.add(tf.keras.layers.Activation('softmax')) # 输出层激活函数

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(features, labels, epochs=10, validation_split=0.2)

代码解释:

我们首先导入必要的库,包括tensorflow和Keras中的np_utils。在该代码段开始之前,我们需要先对特征集合进行一些预处理操作。我们使用np.array函数将特征向量转换为数组,并使用reshape函数来将它们转换为适合模型输入的形状。

随后,我们使用np_utils库的to_categorical函数对标签进行独热编码。该操作将原始标签转换为二进制数组的形式,以便于模型的训练。

接下来,我们开始搭建深度学习模型。在该代码段中,我们使用Keras库的Sequential模型,并通过Add方法添加多个层次。包括两个卷积层、激活函数、池化层、展平层、全连接层和输出层。

在模型搭建完毕之后,我们使用compile方法来配置模型的优化器、损失函数和评估指标。最后,通过fit方法来训练我们的模型,包括传入特征向量集合、标签集合、训练轮次等参数。在训练完成之后,我们就得到了一个训练好的深度学习模型。

3. 图像分类

有了训练好的模型之后,我们就可以使用它来进行图像分类了。在这个例子中,我们将以Kerala Blasters Women FC队员的一张照片为例,来尝试对其进行分类。

def classify_image(img_name):
    img_path = os.path.join(DIR, "test", img_name)
    img_array = cv2.imread(img_path)
    gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)
    roi = cv2.resize(gray, (50, 50))
    features = np.array(roi).reshape(-1, 50, 50, 1)

    # 加载模型
    model = tf.keras.models.load_model('models/model.h5')

    prediction = model.predict([features])
    prediction_label = people[int(prediction[0][0])]

    # 如果预测为人脸
    if prediction_label == "face":
        cv2.putText(img_array, prediction_label, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    # 如果预测为非人脸
    else:
        cv2.putText(img_array, prediction_label, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    return img_array

img = classify_image("face_test.jpg")
cv2.imshow("Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解释:

该代码段首先定义了一个classify_image函数,用于对输入的照片进行预测。该函数首先读取输入的图像文件,并将其大小压缩到(50,50)的灰度图像。接下来,我们将其转换为特征向量,并使用训练好的模型进行预测。最终,我们将预测结果的标签添加到图像中,并将其显示在窗口中。

四、总结

本文介绍了Python实现简单的图像分类的过程。我们首先介绍了什么是图像识别,以及Python图像识别库的一些介绍。随后,我们演示了如何通过OpenCV和Keras实现图像分类过程,包括数据集准备、模型训练和图像分类。最后,我们给出了一个完整的代码示例,以便读者学习和参考。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/285129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-22 15:43
下一篇 2024-12-22 15:43

相关推荐

  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29

发表回复

登录后才能评论