
Python计算机视觉实战从图像处理到目标检测前言大家好我是第一程序员名字大人很菜。作为一个非科班转码、正在学习Rust和Python的萌新最近我开始学习计算机视觉。今天我想分享一下Python计算机视觉的实战经验从图像处理到目标检测。一、计算机视觉基础1.1 计算机视觉的基本概念计算机视觉让计算机理解和处理图像的学科图像处理对图像进行各种操作如滤波、变换等图像识别识别图像中的物体或模式目标检测检测图像中的物体并定位图像分割将图像分割成不同的区域1.2 计算机视觉的应用场景人脸识别身份验证、安防监控等物体检测自动驾驶、安防监控等图像分类图像搜索、内容审核等医学影像疾病诊断、医学研究等增强现实游戏、教育等二、环境搭建2.1 安装必要的库# 安装OpenCV pip install opencv-python # 安装NumPy pip install numpy # 安装Matplotlib pip install matplotlib # 安装Pillow pip install Pillow # 安装深度学习库 pip install torch torchvision三、基础操作3.1 图像读取与显示使用OpenCV读取和显示图像import cv2 import matplotlib.pyplot as plt # 读取图像 img cv2.imread(image.jpg) # 转换颜色空间OpenCV默认BGRMatplotlib默认RGB img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 显示图像 plt.imshow(img_rgb) plt.axis(off) plt.show()3.2 图像处理图像灰度化、模糊和边缘检测import cv2 import matplotlib.pyplot as plt # 读取图像 img cv2.imread(image.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 灰度化 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 模糊处理 blurred cv2.GaussianBlur(gray, (5, 5), 0) # 边缘检测 edges cv2.Canny(blurred, 50, 150) # 显示结果 fig, axes plt.subplots(1, 4, figsize(20, 5)) axes[0].imshow(img_rgb) axes[0].set_title(Original) axes[0].axis(off) axes[1].imshow(gray, cmapgray) axes[1].set_title(Grayscale) axes[1].axis(off) axes[2].imshow(blurred, cmapgray) axes[2].set_title(Blurred) axes[2].axis(off) axes[3].imshow(edges, cmapgray) axes[3].set_title(Edges) axes[3].axis(off) plt.show()3.3 图像变换图像缩放、旋转和翻转import cv2 import matplotlib.pyplot as plt # 读取图像 img cv2.imread(image.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 缩放 resized cv2.resize(img, (300, 200)) resized_rgb cv2.cvtColor(resized, cv2.COLOR_BGR2RGB) # 旋转 (h, w) img.shape[:2] center (w // 2, h // 2) M cv2.getRotationMatrix2D(center, 45, 1.0) rotated cv2.warpAffine(img, M, (w, h)) rotated_rgb cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB) # 翻转 flipped cv2.flip(img, 1) # 1表示水平翻转0表示垂直翻转-1表示同时翻转 flipped_rgb cv2.cvtColor(flipped, cv2.COLOR_BGR2RGB) # 显示结果 fig, axes plt.subplots(1, 4, figsize(20, 5)) axes[0].imshow(img_rgb) axes[0].set_title(Original) axes[0].axis(off) axes[1].imshow(resized_rgb) axes[1].set_title(Resized) axes[1].axis(off) axes[2].imshow(rotated_rgb) axes[2].set_title(Rotated) axes[2].axis(off) axes[3].imshow(flipped_rgb) axes[3].set_title(Flipped) axes[3].axis(off) plt.show()四、实战项目图像分类4.1 使用预训练模型进行图像分类使用ResNet进行图像分类import torch import torchvision from torchvision import transforms from PIL import Image import matplotlib.pyplot as plt # 加载预训练模型 model torchvision.models.resnet18(pretrainedTrue) model.eval() # 图像预处理 transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 加载图像 img Image.open(cat.jpg) plt.imshow(img) plt.axis(off) plt.show() # 预处理图像 img_t transform(img) batch_t torch.unsqueeze(img_t, 0) # 预测 with torch.no_grad(): outputs model(batch_t) # 加载标签 with open(imagenet_classes.txt) as f: classes [line.strip() for line in f] # 获得预测结果 _, indices torch.sort(outputs, descendingTrue) percentages torch.nn.functional.softmax(outputs, dim1)[0] * 100 # 显示前5个预测结果 print(预测结果:) for i in indices[0][:5]: print(f{classes[i]}: {percentages[i].item():.2f}%)五、实战项目目标检测5.1 使用YOLO进行目标检测使用YOLOv5进行目标检测import torch import cv2 import matplotlib.pyplot as plt # 加载YOLOv5模型 model torch.hub.load(ultralytics/yolov5, yolov5s) # 加载图像 img cv2.imread(street.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 预测 results model(img) # 显示结果 results.print() # 打印预测结果 results.show() # 显示带检测框的图像 # 保存结果 results.save()六、实战项目人脸识别6.1 使用OpenCV进行人脸识别使用Haar级联分类器进行人脸识别import cv2 import matplotlib.pyplot as plt # 加载人脸识别模型 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) # 加载图像 img cv2.imread(people.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces face_cascade.detectMultiScale(gray, 1.3, 5) # 绘制检测框 for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (xw, yh), (255, 0, 0), 2) # 显示结果 img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img_rgb) plt.axis(off) plt.show()七、计算机视觉的挑战与解决方案7.1 常见挑战光照变化不同光照条件下的图像差异很大视角变化同一物体从不同角度拍摄的图像差异很大遮挡物体被部分遮挡时难以识别尺度变化同一物体在不同距离拍摄的图像大小不同背景复杂复杂背景会干扰物体检测7.2 解决方案数据增强通过各种变换增加训练数据多尺度检测在不同尺度下检测物体鲁棒特征使用对光照、视角等变化不敏感的特征深度学习使用深度学习模型自动学习特征集成方法结合多个模型的预测结果八、从Rust开发者角度的思考8.1 性能优化图像处理使用Rust实现高性能的图像处理模型推理使用Rust优化模型推理过程内存管理Rust的内存管理可以减少内存泄漏8.2 跨语言集成使用PyO3将Rust代码集成到Python中使用WebAssembly将Rust实现的计算机视觉功能编译为WebAssembly使用gRPC在Rust和Python之间建立通信九、总结Python计算机视觉实战是一个从基础到应用的过程需要掌握图像处理、图像识别、目标检测等技能。作为一个非科班转码者我认为通过系统学习和实践完全可以掌握计算机视觉技术。虽然计算机视觉的学习曲线比较陡峭但通过项目实践和不断积累经验你会逐渐掌握其精髓。同时结合Rust的性能优势可以进一步优化计算机视觉应用的性能。保持学习保持输出。虽然现在我还是个菜鸡但我相信只要坚持总有一天能成为真正的「第一程序员」