计算机视觉是人工智能领域的一个重要分支,它使得机器能够“看”世界并利用观察到的数据来改变环境或解决问题。计算机视觉技术在日常生活中的应用非常广泛,例如车牌识别、人脸识别等。它通过训练模型来捕捉和提取图像或视频流中的有用数据,从而实现对信息的解读。
初学者常常将图像处理和计算机视觉混淆,尽管它们涉及相似的概念。图像处理是通过调整亮度、对比度、缩放、旋转等参数来增强图像的方法,它不处理图像以获得有用的属性,而计算机视觉则专注于从图像和视频中提取有价值的信息。有时,计算机视觉可能会使用图像处理技术来改善原始图像,以提高特征理解过程。
计算机视觉的工作原理
计算机并不像人类那样将图像视为一个整体,它会将图像分解成像素,并使用每个像素的RGB值来理解图像中是否隐藏了任何重要特征。计算机视觉算法一次关注图像的一个像素块,并使用包含用于像素乘法的值的核心或过滤器来进行对象边缘检测。计算机会观察图像的所有方面,如颜色、阴影、笔画等,以识别和区分图像。
目前,使用卷积神经网络(CNN)来构建和训练模型。CNN是专门用于图像识别和处理的神经网络,专门设计用于处理像素数据。卷积层包含多个神经元和张量,它们帮助处理大量数据集作为输入,通过学习调整值以匹配对区分各种类别重要的特征。这是通过模型的广泛训练完成的。
OpenCV简介
OpenCV是一个开源的编程函数库,广泛用于实时计算机视觉和图像处理任务。它可以执行面部检测、目标检测和跟踪、地标检测、手写识别等任务。它支持多种语言,包括Python、Java和C++。
火灾检测项目
现在已经清楚了基本概念,让开始项目,以便可以基本了解计算机视觉涉及的内容。将使用计算机视觉来检测火灾,使用的是从Kaggle获取的火灾和非火灾的图像数据集。
这个项目是在Google Colab上使用Python和GPU运行的。
对于任何项目,第一步是导入整个代码中将使用的所有必要库。对于这个特定项目,将需要Numpy、Pandas、OS、OpenCV、Tensorflow、Keras、Scikit-Learn、Matplotlib和Seaborn等库。
import numpy as np
import pandas as pd
import os
import cv2
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import seaborn as sns
由于使用的是Google Colab,从Google Drive中挂载了数据。如果使用任何其他IDE,如Jupyter Notebook,可以直接从目录中访问文件。
from google.colab import drive
drive.mount('/content/drive')
data_dir = '/content/drive/My Drive/your-data-folder'
EDA是任何项目中非常重要的一步。它将使能够了解正在处理的数据,以及如何计划旅程以达到最终目标。
# 假设df是包含图像文件夹值计数的DataFrame
plt.figure(figsize=(10, 8))
sns.countplot(data=df, x='class')
plt.title('数据分布')
plt.show()
还显示了每个类别的5张图像,以检查将要处理的图像类型。从这个过程中,发现图像的形状和大小各不相同,这可能会在训练中引起问题。因此,在将它们分割成训练-测试之前,应该规范化图像的大小。可以使用OpenCV模块中的resize函数来做到这一点。
一旦图像被规范化,可以将它们分割成训练、测试和验证组。训练集将用于模型的训练过程,验证集将用于调整模型的参数,测试集将用于模型的测试。
# 假设X_train, X_test, y_train, y_test是分割后的数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
接下来,将使用Tensorflow和Keras构建一个简单的顺序卷积神经网络。这个CNN将由Conv2D、MaxPooling2D、Flatten和Dense层组成,激活函数为Relu。
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
MaxPooling2D(2, 2),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Flatten(),
Dense(64, activation='relu'),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=20, validation_data=(X_test, y_test))
训练模型后,达到了91%的准确率和38%的损失。绘制了一个混淆矩阵,并得到了2个假阳性和7个假阴性的积极响应。还对测试集进行了预测,并可视化了结果。对于一个简单的模型来说,这个结果是好的,因为它以高准确率预测输出。
要改进这些结果,可以应用数据增强来增强图像以产生更好的结果。可以尝试使用预训练模型(如VGG或MobileNet)来构建模型。这个过程被称为迁移学习。由于数据集是不平衡的,可以尝试过采样或欠采样来增加数据集。用更高的epoch训练模型和早停,尝试不同的损失函数,监控其他评估指标,如精确度和召回率。