目 录CONTENT

文章目录

Python 计算机视觉入门指南

Administrator
2026-01-16 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/the-beginners-guide-to-computer-vision-with-python/

原文作者:Iván Palomares Carrascosa


在本文中,您将学习如何使用广泛可用的库,在Python中完成三项对初学者友好的计算机视觉任务—边缘检测、简单物体检测和图像分类。

我们将涵盖的主题包括:

  • 安装和设置所需的Python库。
  • 使用经典的OpenCV工具检测边缘和人脸。
  • 训练一个紧凑的卷积神经网络(CNN)用于图像分类。

让我们来探索这些技术。

The Beginner

Python计算机视觉入门指南
图片来源:Editor

引言

计算机视觉是人工智能的一个领域,它赋予计算机系统分析、解释和理解视觉数据(即图像和视频)的能力。它涵盖了从经典的图像滤波、边缘检测和特征提取等任务,到需要构建机器学习和深度学习模型的更高级任务,如图像和视频分类以及复杂的物体检测

值得庆幸的是,OpenCVTensorFlow等Python库使得即便是初学者,也能仅用几行代码创建和试验自己的计算机视觉解决方案。

本文旨在引导有兴趣进入计算机视觉领域的初学者完成三个基本计算机视觉任务的实现

  • 用于边缘检测的图像处理
  • 简单的物体检测,如人脸检测
  • 图像分类

对于每项任务,我们都提供了一个使用免费或内置数据的最小工作Python示例,并附带必要的解释。您可以在Google Colab等适合Notebook的环境中,或在本地IDE中可靠地运行这些代码。

设置与准备

使用本文提供的代码的一个重要先决条件是安装多个Python库。如果您在一个Notebook中运行代码,请将此命令粘贴到初始单元格中(在Notebook中请使用前缀“!”):

1
pip install opencv-python tensorflow scikit-image matplotlib numpy

使用 OpenCV 进行图像处理

OpenCV是一个Python库,它提供了一系列工具,用于高效地构建计算机视觉应用程序—从基本的图像转换到简单的物体检测任务。它的特点是速度快和功能广泛。

OpenCV支持的主要任务领域之一是图像处理,它侧重于对图像应用转换,通常有两个目标:提高图像质量或提取有用信息。示例包括将彩色图像转换为灰度图、检测边缘、平滑以减少噪声以及阈值处理以分离特定区域(例如前景与背景)。

本指南中的第一个示例使用scikit-image库提供的内置示例图像,对原始彩色图像的灰度版本进行边缘检测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from skimage import data
import cv2
import matplotlib.pyplot as plt
 
# Load a sample RGB image (astronaut) from scikit-image
image = data.astronaut()
 
# Convert RGB (scikit-image) to BGR (OpenCV convention), then to grayscale
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
# Canny edge detection
edges = cv2.Canny(gray, 100, 200)
 
# Display
plt.figure(figsize=(10, 4))
 
plt.subplot(1, 2, 1)
plt.imshow(gray, cmap="gray")
plt.title("Grayscale Image")
plt.axis("off")
 
plt.subplot(1, 2, 2)
plt.imshow(edges, cmap="gray")
plt.title("Edge Detection")
plt.axis("off")
 
plt.show()

上面代码中应用的过程很简单,但它说明了一个非常常见的图像处理场景:

  1. 加载和预处理图像以进行分析:将RGB图像转换为OpenCV的BGR约定,然后转换为灰度图以进行进一步处理。COLOR_RGB2BGRCOLOR_BGR2GRAY等函数使此过程变得简单明了。
  2. 使用内置的Canny边缘检测算法来识别图像中的边缘。
  3. 绘制结果:用于边缘检测的灰度图像和生成的边缘图。

结果如下所示:

Edge detection with OpenCV

使用OpenCV进行边缘检测

使用 OpenCV 进行物体检测

现在是时候超越经典的像素级处理,在图像中识别更高级别的物体了。OpenCV通过预训练模型(如Haar级联)使这成为可能,这些模型可以应用于许多现实世界的图像,并适用于简单的检测用例,例如检测人脸。

下面的代码使用了与前一节相同的宇航员图像,将其转换为灰度图,并应用了为识别正面人脸而训练的Haar级联。级联的元数据包含在haarcascade_frontalface_default.xml中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from skimage import data
import cv2
import matplotlib.pyplot as plt
 
# Load the sample image and convert to BGR (OpenCV convention)
image = data.astronaut()
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
 
# Haar cascade is an OpenCV classifier trained for detecting faces
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
 
# The model requires grayscale images
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
# Detect faces
faces = face_cascade.detectMultiScale(
    gray, scaleFactor=1.1, minNeighbors=5
)
 
# Draw bounding boxes
output = image.copy()
for (x, y, w, h) in faces:
    cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 2)
 
# Display
plt.imshow(cv2.cvtColor(output, cv2.COLOR_BGR2RGB))
plt.title("Face Detection")
plt.axis("off")
plt.show()

请注意,模型可以返回存储在faces列表中的一个或多个检测到的物体(人脸)。对于检测到的每个物体,我们提取定义了包围人脸的边界框的角坐标。

结果:

Face detection with OpenCV

使用OpenCV进行人脸检测

使用 TensorFlow 进行图像分类

图像分类任务处于另一个层级。这些问题在很大程度上取决于特定的数据集(或至少是具有相似统计特性的数据)。主要的实际影响是需要训练一个机器学习模型进行分类。对于简单、低分辨率的图像,随机森林或浅层神经网络等集成方法可能就足够了,但对于复杂、高分辨率的图像,您最好的选择通常是更深层次的神经网络架构,例如卷积神经网络(CNN),它们可以在不同类别之间学习视觉特征和模式。

此示例代码使用了流行的Fashion-MNIST数据集,该数据集包含低分辨率的服装图像,示例被分成10个类别(衬衫、裤子、运动鞋等)。经过一些简单的数据准备后,数据集被划分为训练集和测试集。在机器学习中,训练集会与标签(图像已知的类别)一起传递给模型,以便模型可以学习输入-输出关系。模型训练后—此处定义为一个简单的CNN—剩余的测试集示例可以传递给模型以执行类别预测,即推断给定图像中显示的是哪种时尚产品。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import tensorflow as tf
from tensorflow.keras import layers, models
 
# Load Fashion-MNIST dataset (publicly available)
(train_images, train_labels), (test_images, test_labels) = \
    tf.keras.datasets.fashion_mnist.load_data()
 
# Normalize pixel values for more robust training
train_images = train_images.astype("float32") / 255.0
test_images = test_images.astype("float32") / 255.0
 
# Simple CNN architecture with one convolution layer: enough for low-res images
model = models.Sequential([
    layers.Reshape((28, 28, 1), input_shape=(28, 28)),
    layers.Conv2D(32, 3, activation="relu"),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(64, activation="relu"),
    layers.Dense(10, activation="softmax")
])
 
# Compile and train the model
model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"]
)
 
history = model.fit(
    train_images,
    train_labels,
    epochs=5,
    validation_split=0.1,
    verbose=2
)
 
# (Optional) Evaluate on the test set
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
print(f"Test accuracy: {test_acc:.3f}")
Face detection with OpenCV

使用TensorFlow训练图像分类模型

现在您有了一个训练好的模型。

总结

本文指导初学者完成了三项常见的计算机视觉任务,并展示了如何使用OpenCVTensorFlow等Python库来解决这些问题—从经典的图像处理和预训练检测器,到从头开始训练小型预测模型。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区