📢 转载信息
原文链接:https://machinelearningmastery.com/the-beginners-guide-to-computer-vision-with-python/
原文作者:Iván Palomares Carrascosa
在本文中,您将学习如何使用广泛可用的Python库完成三个对初学者友好的计算机视觉任务——边缘检测、简单目标检测和图像分类。
我们将涵盖的主题包括:
- 安装和设置所需的Python库。
- 使用经典的OpenCV工具检测边缘和人脸。
- 训练一个紧凑的卷积神经网络(CNN)进行图像分类。
让我们来探索这些技术。
计算机视觉Python初学者指南
图片来源:Editor
引言
计算机视觉是人工智能的一个领域,它赋予计算机系统分析、解释和理解视觉数据(即图像和视频)的能力。它涵盖了从经典的图像滤波、边缘检测和特征提取等任务,到更高级的图像和视频分类以及复杂目标检测,后者通常需要构建机器学习和深度学习模型。
值得庆幸的是,像OpenCV和TensorFlow这样的Python库使得即便是初学者,也能仅用几行代码创建并试验自己的计算机视觉解决方案。
本文旨在引导对计算机视觉感兴趣的初学者完成三个基本计算机视觉任务:
- 用于边缘检测的图像处理
- 简单目标检测,例如人脸检测
- 图像分类
对于每个任务,我们都提供了一个使用免费可用或内置数据的最小工作Python示例,并附带必要的解释。您可以在Google Colab等类Jupyter Notebook环境中,或在本地IDE中可靠地运行此代码。
设置与准备
使用本文提供的代码的一个重要先决条件是安装几个Python库。如果您在Notebook中运行代码,请将以下命令粘贴到初始单元格中(在Notebook中,请使用“!”前缀):
pip install opencv-python tensorflow scikit-image matplotlib numpy
使用OpenCV进行图像处理
OpenCV是一个Python库,它提供了一系列用于高效构建计算机视觉应用的工具——从基本的图像转换到简单的目标检测任务。它的特点是速度快且功能广泛。
OpenCV支持的主要任务领域之一是图像处理,它专注于对图像应用转换,通常有两个目标:提高图像质量或提取有用信息。示例包括将彩色图像转换为灰度图、检测边缘、平滑以减少噪声,以及阈值处理以分离特定区域(例如前景与背景)。
本指南中的第一个示例使用scikit-image库提供的内置示例图像,在其灰度版本上检测边缘。
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()
上述代码中应用的过程很简单,但它说明了一个非常常见的图像处理场景:
- 加载和预处理图像以供分析:将RGB图像转换为OpenCV的BGR约定,然后转换为灰度图以进行进一步处理。
COLOR_RGB2BGR和COLOR_BGR2GRAY等函数使此过程非常直接。 - 使用内置的Canny边缘检测算法来识别图像中的边缘。
- 绘制结果:用于边缘检测的灰度图像和生成的边缘图。
结果如下所示:
使用OpenCV进行边缘检测
使用OpenCV进行目标检测
现在我们超越了经典的像素级处理,开始识别图像中更高级别的对象。OpenCV使用预训练模型(如Haar级联)使这成为可能,这些模型可以应用于许多真实世界的图像,并且对于简单检测用例(例如检测人脸)效果很好。
以下代码使用了与前一节相同的宇航员图像,将其转换为灰度图,并应用了为识别人脸而训练的Haar级联。该级联的元数据包含在haarcascade_frontalface_default.xml中。
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列表中返回一个或多个检测到的对象(人脸)。对于检测到的每个对象,我们提取定义了包围人脸的边界框的角坐标。
结果:
使用OpenCV进行人脸检测
使用TensorFlow进行图像分类
图像分类任务属于另一个级别。这些问题在很大程度上取决于特定的数据集(或至少是具有相似统计特性的数据)。其实践意义在于,通常需要训练一个机器学习模型来进行分类。对于简单、低分辨率的图像,随机森林或浅层神经网络等集成方法可能就足够了,但对于复杂、高分辨率的图像,最好的选择通常是更深层次的神经网络架构,例如卷积神经网络(CNN),它们可以在不同类别之间学习视觉特征和模式。
此示例代码使用了流行的Fashion-MNIST数据集,其中包含低分辨率的服装图像,示例被分为10个类别(衬衫、裤子、运动鞋等)。经过一些简单的数据准备后,数据集被划分为训练集和测试集。在机器学习中,训练集会与标签(图像已知的类别)一起传递给模型,以便模型可以学习输入-输出关系。在训练完模型——此处定义为一个简单的CNN——之后,测试集中剩余的示例可以传递给模型以执行类别预测,即推断给定图像中显示的是哪种类型的时尚产品。
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}")
使用TensorFlow训练图像分类模型
现在您拥有一个训练好的模型。
总结
本文引导初学者了解了三种常见的计算机视觉任务,并展示了如何使用OpenCV和TensorFlow等Python库来解决这些问题——涵盖了从经典图像处理和预训练检测器到从头开始训练小型预测模型的所有内容。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区