引言
计算机视觉(Computer Vision, CV)是人工智能的一个重要分支,旨在让计算机“看懂”和理解图像和视频。随着深度学习技术的飞速发展,计算机视觉在工业检测、自动驾驶、医疗影像分析、安防监控等领域得到了广泛应用。本文将从入门到实战,系统性地介绍计算机视觉的核心算法,并提供详细的代码示例和项目案例,帮助读者快速掌握计算机视觉技术。
一、计算机视觉基础
1.1 图像处理基础
在深入计算机视觉算法之前,我们需要掌握图像处理的基础知识。图像处理是计算机视觉的前置步骤,主要包括图像的读取、显示、转换和基本操作。
1.1.1 图像读取与显示
使用Python的OpenCV库可以轻松实现图像的读取和显示。
import cv2
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('example.jpg')
# OpenCV默认使用BGR颜色空间,转换为RGB以便matplotlib显示
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 显示图像
plt.imshow(image_rgb)
plt.axis('off')
plt.show()
1.1.2 图像基本操作
图像的基本操作包括裁剪、缩放、旋转等。
# 裁剪图像
cropped_image = image[100:300, 200:400]
# 缩放图像
resized_image = cv2.resize(image, (200, 200))
# 旋转图像
height, width = image.shape[:2]
center = (width // 2, height // 2)
rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
1.2 颜色空间与滤波
1.2.1 颜色空间转换
常见的颜色空间有RGB、HSV、灰度等。HSV颜色空间在目标检测中非常有用,因为它对光照变化不敏感。
# 转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义蓝色范围
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([130, 255, 255])
# 创建掩膜
mask = cv2.inRange(hsv_image, lower_blue, upper_blue)
# 应用掩膜
result = cv2.bitwise_and(image, image, mask=mask)
1.2.2 图像滤波
滤波用于平滑图像或增强特征。
# 高斯滤波
gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0)
# 中值滤波(去噪)
median_blur = cv2.medianBlur(image, 5)
# 边缘检测(Canny)
edges = cv2.Canny(image, 100, 200)
二、图像识别核心算法
2.1 传统图像识别方法
在深度学习兴起之前,传统方法主要依赖手工特征提取和分类器。
2.1.1 SIFT特征提取
SIFT(Scale-Invariant Feature Transform)是一种经典的特征提取算法,对尺度、旋转和光照变化具有鲁棒性。
import cv2
import numpy as np
# 读取图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)
# 创建SIFT检测器
sift = cv2.SIFT_create()
# 检测关键点和描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 使用FLANN匹配器
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
# 应用Lowe's ratio test
good_matches = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good_matches.append(m)
# 绘制匹配结果
result = cv2.drawMatches(img1, kp1, img2, kp2, good_matches, None)
plt.imshow(result)
plt.show()
2.1.2 HOG特征与SVM分类器
HOG(Histogram of Oriented Gradients)特征常用于行人检测,结合SVM分类器可以实现目标检测。
from skimage.feature import hog
from skimage import exposure
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 假设我们有正样本(行人)和负样本(非行人)的图像数据
# 这里简化为示例,实际需要加载数据集
def extract_hog_features(images):
hog_features = []
for img in images:
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 提取HOG特征
features, hog_image = hog(gray, orientations=9, pixels_per_cell=(8, 8),
cells_per_block=(2, 2), visualize=True)
hog_features.append(features)
return np.array(hog_features)
# 假设X是图像数据,y是标签(0或1)
X_hog = extract_hog_features(X)
X_train, X_test, y_train, y_test = train_test_split(X_hog, y, test_size=0.2)
# 训练SVM分类器
svm = LinearSVC()
svm.fit(X_train, y_train)
# 预测
y_pred = svm.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
2.2 深度学习图像识别
2.1.1 卷积神经网络(CNN)
CNN是深度学习在图像识别中的核心模型。下面是一个简单的CNN实现,用于手写数字识别(MNIST数据集)。
import tensorflow as tf
from tensorflow.keras import layers, models
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# 数据预处理
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0
# 构建CNN模型
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc}")
2.1.2 迁移学习
迁移学习利用预训练模型(如VGG16、ResNet50)在新任务上进行微调,可以显著提高小数据集上的性能。
from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models
# 加载预训练的VGG16模型(不包括顶层)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 冻结预训练层
base_model.trainable = False
# 添加自定义顶层
model = models.Sequential([
base_model,
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax') # 假设有10个类别
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型(假设x_train, y_train已准备好)
# model.fit(x_train, y_train, epochs=10, validation_split=0.2)
三、目标检测核心算法
3.1 传统目标检测方法
3.1.1 Haar级联分类器
Haar级联分类器是一种基于Haar特征和AdaBoost的实时目标检测方法,常用于人脸检测。
import cv2
# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取图像
img = cv2.imread('face.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 绘制矩形框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
3.1.2 基于颜色的检测
基于颜色的检测常用于简单场景,如检测交通信号灯或特定物体。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('traffic_light.jpg')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义红色范围(两个范围,因为红色在HSV中跨越0和180)
lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([180, 255, 255])
# 创建掩膜
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 + mask2
# 形态学操作(去噪)
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 查找轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
for contour in contours:
area = cv2.contourArea(contour)
if area > 100: # 过滤小区域
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
3.2 深度学习目标检测
3.2.1 R-CNN系列
R-CNN(Region-based CNN)是目标检测的里程碑,后续有Fast R-CNN、Faster R-CNN等改进。
# 使用TensorFlow Object Detection API(需要安装和配置)
# 这里提供一个简化的示例,展示如何使用预训练的Faster R-CNN模型
import tensorflow as tf
import numpy as np
from PIL import Image
# 加载模型
model = tf.saved_model.load('path/to/faster_rcnn_model')
# 预处理图像
def preprocess_image(image_path):
image = Image.open(image_path)
image_np = np.array(image)
input_tensor = tf.convert_to_tensor(image_np)
input_tensor = input_tensor[tf.newaxis, ...] # 添加批次维度
return input_tensor
# 运行推理
def detect_objects(image_path):
input_tensor = preprocess_image(image_path)
detections = model(input_tensor)
return detections
# 示例
detections = detect_objects('example.jpg')
print(detections)
3.2.2 YOLO系列
YOLO(You Only Look Once)是一种单阶段目标检测算法,速度快且精度高。
import cv2
import numpy as np
# 加载YOLO模型
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
classes = []
with open('coco.names', 'r') as f:
classes = [line.strip() for line in f.readlines()]
# 读取图像
img = cv2.imread('example.jpg')
height, width, _ = img.shape
# 预处理图像
blob = cv2.dnn.blobFromImage(img, 1/255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
output_layers = net.getUnconnectedOutLayersNames()
layer_outputs = net.forward(output_layers)
# 解析输出
boxes = []
confidences = []
class_ids = []
for output in layer_outputs:
for detection in output:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
x = int(center_x - w/2)
y = int(center_y - h/2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
# 非极大值抑制
indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
# 绘制边界框
for i in indices:
i = i[0]
box = boxes[i]
x, y, w, h = box
label = str(classes[class_ids[i]])
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(img, label, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示结果
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
3.2.3 SSD(Single Shot MultiBox Detector)
SSD是另一种单阶段检测器,结合了多尺度特征图。
import tensorflow as tf
from tensorflow.keras import layers, models
# 构建SSD模型(简化版)
def build_ssd_model(input_shape=(300, 300, 3)):
base_model = tf.keras.applications.MobileNetV2(input_shape=input_shape, include_top=False, weights='imagenet')
# 添加额外的卷积层
x = base_model.output
x = layers.Conv2D(256, 3, padding='same', activation='relu')(x)
x = layers.Conv2D(128, 3, padding='same', activation='relu')(x)
x = layers.Conv2D(64, 3, padding='same', activation='relu')(x)
# 分类和回归头
classification = layers.Conv2D(21 * 4, 3, padding='same')(x) # 21个类别,4个坐标
regression = layers.Conv2D(21 * 4, 3, padding='same')(x)
model = models.Model(inputs=base_model.input, outputs=[classification, regression])
return model
model = build_ssd_model()
model.summary()
四、实战项目案例
4.1 项目1:人脸识别门禁系统
4.1.1 项目概述
开发一个基于人脸识别的门禁系统,能够实时检测人脸并识别身份,控制门禁开关。
4.1.2 技术方案
- 人脸检测:使用MTCNN或Haar级联检测人脸。
- 人脸特征提取:使用FaceNet或ArcFace提取人脸特征向量。
- 人脸匹配:计算特征向量之间的相似度(如余弦相似度)。
- 门禁控制:根据识别结果控制GPIO或模拟开关。
4.1.3 代码实现
import cv2
import numpy as np
import face_recognition
import RPi.GPIO as GPIO # 如果在树莓派上运行
# 初始化GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT) # 假设门禁控制引脚为18
# 加载已知人脸
known_face_encodings = []
known_face_names = []
# 假设我们有已知人脸的图像和名称
image = face_recognition.load_image_file('known_face.jpg')
encoding = face_recognition.face_encodings(image)[0]
known_face_encodings.append(encoding)
known_face_names.append("Alice")
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 转换为RGB(face_recognition使用RGB)
rgb_frame = frame[:, :, ::-1]
# 检测人脸
face_locations = face_recognition.face_locations(rgb_frame)
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
for face_encoding, face_location in zip(face_encodings, face_locations):
# 比较已知人脸
matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
name = "Unknown"
if True in matches:
first_match_index = matches.index(True)
name = known_face_names[first_match_index]
# 识别成功,开门
GPIO.output(18, GPIO.HIGH)
print(f"Welcome, {name}!")
else:
# 识别失败,不开门
GPIO.output(18, GPIO.LOW)
# 绘制标签
top, right, bottom, left = face_location
cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
cv2.putText(frame, name, (left, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示结果
cv2.imshow('Face Recognition', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
GPIO.cleanup()
4.2 项目2:智能交通监控系统
4.2.1 项目概述
开发一个智能交通监控系统,能够检测车辆、识别车牌、统计车流量,并检测违章行为(如闯红灯)。
4.2.2 技术方案
- 车辆检测:使用YOLOv5或Faster R-CNN检测车辆。
- 车牌识别:使用OCR技术(如Tesseract)识别车牌字符。
- 车流量统计:基于检测结果进行计数。
- 违章检测:结合红绿灯状态和车辆位置判断。
4.2.3 代码实现
import cv2
import numpy as np
import pytesseract
from ultralytics import YOLO # 需要安装ultralytics库
# 加载YOLOv5模型
model = YOLO('yolov5s.pt') # 使用预训练的YOLOv5s模型
# 读取视频
cap = cv2.VideoCapture('traffic_video.mp4')
# 车辆计数器
vehicle_count = 0
vehicle_ids = set()
# 红绿灯状态(模拟)
traffic_light = "red" # "red", "yellow", "green"
while True:
ret, frame = cap.read()
if not ret:
break
# 车辆检测
results = model(frame)
for result in results:
boxes = result.boxes
for box in boxes:
# 获取边界框坐标
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy()
confidence = box.conf[0].cpu().numpy()
class_id = int(box.cls[0].cpu().numpy())
# 只检测车辆(假设车辆类别ID为2)
if class_id == 2 and confidence > 0.5:
# 绘制边界框
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
# 车辆计数(简单基于位置)
vehicle_id = f"{int(x1)}_{int(y1)}"
if vehicle_id not in vehicle_ids:
vehicle_ids.add(vehicle_id)
vehicle_count += 1
# 车牌识别(简化示例)
# 实际中需要先检测车牌区域
# 这里假设车牌区域在车辆底部
plate_region = frame[int(y2)-30:int(y2), int(x1):int(x2)]
if plate_region.size > 0:
# 转换为灰度
gray = cv2.cvtColor(plate_region, cv2.COLOR_BGR2GRAY)
# 二值化
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# OCR识别
plate_text = pytesseract.image_to_string(binary, config='--psm 7')
cv2.putText(frame, plate_text.strip(), (int(x1), int(y1)-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# 违章检测(闯红灯)
if traffic_light == "red" and y1 < 300: # 假设停车线在y=300
cv2.putText(frame, "Violation: Running Red Light", (int(x1), int(y1)-30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
# 显示车流量
cv2.putText(frame, f"Vehicle Count: {vehicle_count}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 显示结果
cv2.imshow('Traffic Monitoring', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
4.3 项目3:医疗影像分析(肺结节检测)
4.3.1 项目概述
开发一个医疗影像分析系统,能够从CT扫描图像中检测肺结节,辅助医生诊断。
4.3.2 技术方案
- 数据预处理:归一化、去噪、增强。
- 肺结节检测:使用3D CNN或U-Net进行分割。
- 特征提取:提取结节的大小、形状、密度等特征。
- 分类:判断结节是良性还是恶性。
4.3.3 代码实现
import numpy as np
import pydicom
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
# 加载DICOM图像
def load_dicom_image(path):
ds = pydicom.dcmread(path)
image = ds.pixel_array
# 归一化
image = (image - np.min(image)) / (np.max(image) - np.min(image))
return image
# 构建3D U-Net模型(简化版)
def build_unet_3d(input_shape=(64, 64, 64, 1)):
inputs = layers.Input(shape=input_shape)
# 编码器
c1 = layers.Conv3D(32, 3, activation='relu', padding='same')(inputs)
p1 = layers.MaxPooling3D(2)(c1)
c2 = layers.Conv3D(64, 3, activation='relu', padding='same')(p1)
p2 = layers.MaxPooling3D(2)(c2)
# 瓶颈
b = layers.Conv3D(128, 3, activation='relu', padding='same')(p2)
# 解码器
u1 = layers.UpSampling3D(2)(b)
u1 = layers.concatenate([u1, c2])
c3 = layers.Conv3D(64, 3, activation='relu', padding='same')(u1)
u2 = layers.UpSampling3D(2)(c3)
u2 = layers.concatenate([u2, c1])
c4 = layers.Conv3D(32, 3, activation='relu', padding='same')(u2)
# 输出层
outputs = layers.Conv3D(1, 1, activation='sigmoid')(c4)
model = models.Model(inputs=inputs, outputs=outputs)
return model
# 示例:加载和预处理数据
image_3d = np.random.rand(64, 64, 64, 1) # 模拟3D图像数据
mask_3d = np.random.rand(64, 64, 64, 1) # 模拟分割掩膜
# 构建模型
model = build_unet_3d()
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型(示例)
# model.fit(image_3d, mask_3d, epochs=10, batch_size=1)
# 预测
prediction = model.predict(image_3d)
print(f"Prediction shape: {prediction.shape}")
五、进阶主题与最新趋势
5.1 Transformer在视觉中的应用
Vision Transformer (ViT) 将Transformer架构应用于图像分类,取得了优异的性能。
import tensorflow as tf
from tensorflow.keras import layers, models
def create_vit_model(input_shape=(224, 224, 3), num_classes=10):
# 图像分块
patch_size = 16
num_patches = (input_shape[0] // patch_size) * (input_shape[1] // patch_size)
# 输入层
inputs = layers.Input(shape=input_shape)
# 分块和投影
x = layers.Conv2D(768, patch_size, strides=patch_size, padding='valid')(inputs)
x = layers.Reshape((num_patches, 768))(x)
# 添加位置编码
position_embeddings = tf.random.normal((num_patches, 768))
x = x + position_embeddings
# Transformer编码器
for _ in range(12): # 12层Transformer
# 多头自注意力
attn_output = layers.MultiHeadAttention(num_heads=8, key_dim=64)(x, x)
x = layers.LayerNormalization(epsilon=1e-6)(x + attn_output)
# 前馈网络
ff_output = layers.Dense(3072, activation='relu')(x)
ff_output = layers.Dense(768)(ff_output)
x = layers.LayerNormalization(epsilon=1e-6)(x + ff_output)
# 分类头
x = layers.GlobalAveragePooling1D()(x)
outputs = layers.Dense(num_classes, activation='softmax')(x)
model = models.Model(inputs=inputs, outputs=outputs)
return model
# 创建模型
vit_model = create_vit_model()
vit_model.summary()
5.2 自监督学习
自监督学习利用未标注数据学习表示,减少对标注数据的依赖。
import tensorflow as tf
from tensorflow.keras import layers, models
# SimCLR自监督学习框架(简化版)
class SimCLR(models.Model):
def __init__(self, encoder, projection_dim=128):
super(SimCLR, self).__init__()
self.encoder = encoder
self.projection = models.Sequential([
layers.Dense(256, activation='relu'),
layers.Dense(projection_dim)
])
def call(self, inputs):
# 编码
features = self.encoder(inputs)
# 投影
projections = self.projection(features)
return projections
# 构建编码器
def create_encoder(input_shape=(224, 224, 3)):
base_model = tf.keras.applications.ResNet50(input_shape=input_shape, include_top=False, weights=None)
x = base_model.output
x = layers.GlobalAveragePooling2D()(x)
return models.Model(inputs=base_model.input, outputs=x)
# 创建SimCLR模型
encoder = create_encoder()
simclr_model = SimCLR(encoder)
# 自监督训练(示例)
# 需要定义对比损失函数
# simclr_model.compile(optimizer='adam', loss=contrastive_loss)
5.3 实时目标检测优化
对于实时应用,需要优化模型以提高速度。
import cv2
import numpy as np
# 使用OpenCV的DNN模块加速推理
net = cv2.dnn.readNet('yolov3-tiny.weights', 'yolov3-tiny.cfg')
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) # 使用CUDA加速
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) # 使用GPU
# 优化输入尺寸
input_size = (320, 320) # 更小的输入尺寸提高速度
# 读取视频
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 预处理
blob = cv2.dnn.blobFromImage(frame, 1/255.0, input_size, swapRB=True, crop=False)
net.setInput(blob)
outputs = net.forward()
# 解析输出(与之前类似)
# ...(省略解析代码)
# 显示结果
cv2.imshow('Real-time Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
六、学习资源与工具
6.1 推荐书籍
- 《计算机视觉:算法与应用》
- 《深度学习》(Ian Goodfellow等)
- 《Python计算机视觉编程》
6.2 在线课程
- Coursera: Deep Learning Specialization
- Udacity: Computer Vision Nanodegree
- Fast.ai: Practical Deep Learning for Coders
6.3 开源项目
- OpenCV: https://github.com/opencv/opencv
- TensorFlow Object Detection API: https://github.com/tensorflow/models/tree/master/research/object_detection
- YOLO: https://github.com/ultralytics/yolov5
- Detectron2: https://github.com/facebookresearch/detectron2
6.4 数据集
- ImageNet: 大规模图像分类数据集
- COCO: 通用目标检测数据集
- Pascal VOC: 传统目标检测数据集
- Cityscapes: 城市街景分割数据集
七、总结
本文从计算机视觉的基础知识出发,系统介绍了图像识别和目标检测的核心算法,并提供了详细的代码示例。通过三个实战项目案例,展示了如何将理论应用于实际场景。最后,介绍了计算机视觉的最新趋势和学习资源,帮助读者持续学习和进步。
计算机视觉是一个快速发展的领域,不断有新的算法和应用出现。建议读者在掌握基础知识后,积极参与开源项目和竞赛(如Kaggle),以提升实战能力。希望本文能为你的计算机视觉学习之旅提供有价值的参考。
