一. 前言
近期在研究 AI 方面的应用 ,计算机视觉是其中的一大领域 ,应用场景也比较多。
这一篇主要尝试弄清楚 : 一个 AI 视觉识别的 功能点 ,涉及到哪些知识 ?
二. 处理流程
2.1 前置知识点
在实现这个功能之前 ,先要明白几个前置知识点 :
Python 层面需要的工具 :
组件工具 | 功能描述 | 作用 |
---|---|---|
opencv-python | 一个开源计算机视觉库,提供图像和视频处理功能。 | 用于加载、处理和显示图像,进行图像预处理,如缩放、裁剪和绘制。 |
tensorflow | 一个开源机器学习框架,支持深度学习模型的构建和训练。 | 用于构建和训练物体识别模型,提供高层次的 API 和模型管理功能。 |
torch | 一个开源深度学习框架,以动态计算图著称,适合研究和生产。 | 提供强大的张量计算功能,支持深度学习模型的训练和推理。 |
torchvision | PyTorch 的视觉工具包,提供常用的数据集、模型和图像变换。 | 用于加载标准数据集(如 COCO),并提供预训练模型和图像预处理工具。 |
- OpenCV 在前几篇就有介绍 ,它作为计算机视觉库 ,提供了很多图形处理的功能。
- 下面3个主要是 AI 领域的组件 ,用于使用 AI 的各项能力
模型和模型的选择
我们在识别物体的过程中 ,图片中的物体到底是什么,这是需要一个 知识库
来帮助给出答案的。 而模型
就是那个知识库。
- 模型 是指一个数学表示或计算框架,旨在从输入数据中学习模式和规律,并进行预测或分类
一个模型的生成包括 : 数据收集 , 数据预处理 ,数据建模 ,模型训练 ,模型评估 ,模型测试 及 最终使用
关于模型的生成 ,不在本篇的讨论中 ,展示也不会这一块。 这一篇主要专注于使用。
- 常用的物体识别模型 :
模型 | 作用说明 | 适合的场景 |
---|---|---|
YOLO | 实时物体检测模型,通过全卷积网络实现快速检测,适合大规模应用。 | 视频监控、自动驾驶、机器人视觉 |
SSD | 单次检测器,结合不同尺度的特征图进行物体检测,速度快且准确。 | 移动设备、实时视频分析 |
Faster R-CNN | 采用区域提议网络(RPN)和深度卷积网络,实现高精度的物体检测。 | 需要高精度的任务,如医学影像分析 |
Mask R-CNN | 在 Faster R-CNN 基础上增加实例分割功能,能同时进行物体检测和分割。 | 图像编辑、自动标注 |
RetinaNet | 使用焦点损失(Focal Loss)处理类别不平衡问题,适合小物体检测。 | 复杂背景中的物体检测 |
EfficientDet | 结合高效模型架构与多尺度特征融合,资源有限的环境下表现出色。 | 嵌入式系统、移动设备 |
CenterNet | 基于中心点检测的框架,简单高效,适合实时检测。 | 需要实时性的物体检测应用 |
而本片主要使用的是 YOLO。
模型的使用
模型的使用有两种方式 :
- 一种是基于模型 + torch 的使用方式 , 也是最常规的用法
- 一种是基于封装的工具 ,实现快速的调用
2.2 模型的使用方式一
S1 : 下载 YoLo 模型
官方地址 :yolov5
// Python 插件安装
pip install torch torchvision torchaudio
pip install opencv-python
pip install matplotlib
// 克隆 YOLOv5 仓库:
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt
S2 : 编写使用模型逻辑
import torch
import cv2
import matplotlib.pyplot as plt
# 加载 YOLOv5 模型(这里使用预训练的 'yolov5s' 模型)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# 读取图像
image_path = 'C:\\Users\\Desktop\\test666.JPG'
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # OpenCV 使用 BGR 格式,转换为 RGB
# 进行物体识别
results = model(image)
# 打印结果
results.print() # 输出识别信息
# 可视化结果
results.show() # 显示图像和检测结果
# 保存结果
results.save(save_dir='output') # 保存检测结果到指定目录
# 如果需要更详细的处理
# 获取检测到的边界框、标签和置信度
boxes = results.xyxy[0] # 结果格式: (x1, y1, x2, y2, confidence, class)
for box in boxes:
x1, y1, x2, y2, conf, cls = box
print(f"Detected {model.names[int(cls)]} with confidence {conf:.2f} at [{x1:.2f}, {y1:.2f}, {x2:.2f}, {y2:.2f}]")
# 还可以使用 plt 显示图像
plt.imshow(image)
plt.axis('off') # 不显示坐标轴
plt.show()
S3 : 测试
2.2 模型的使用方式二
第二种方式更简单 ,例如 Ultralytics 就提供了一整套组件可以开箱即用。
S1 : Python 安装 ultralytics
pip install ultralytics
S2 : 对物体进行识别
from ultralytics import YOLO
import cv2
import matplotlib.pyplot as plt
# 加载 YOLOv5 或 YOLOv8 模型
model = YOLO('yolov5s.pt') # 或使用 'yolov8.pt'
# 读取图像
image_path = 'C:\\Users\\Desktop\\test666.JPG'
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换为 RGB 格式
# 进行物体识别
results = model.predict(source=image)
# 可视化结果
# 使用 cv2 绘制边界框
for result in results:
boxes = result.boxes.xyxy # 获取边界框信息
scores = result.boxes.conf # 获取置信度
classes = result.boxes.cls # 获取类别索引
for i in range(len(boxes)):
box = boxes[i]
score = scores[i]
cls = classes[i]
x1, y1, x2, y2 = box.numpy() # 转换为 numpy 数组
label = f"{model.names[int(cls)]} {score:.2f}"
# 绘制边界框
cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
cv2.putText(image, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
# 使用 matplotlib 显示图像
plt.imshow(image)
plt.axis('off') # 不显示坐标轴
plt.show()
- 👉 执行 模型的时候 ,会自动从远程下载模型
Downloading https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov5su.pt to 'yolov5su.pt'...
三. 扩展和发展
一般没有特殊的要求 ,大部分情况下 ,我们会选择框架直接使用。下面主要来介绍一下 ultralytics 的 API
加载模型 :
- YOLO(model): 用于加载 YOLO 模型,可以是本地路径或在线模型名称。
- predict(source): 对给定的图像、视频或文件夹进行物体检测。
结果处理 :
- results.print(): 打印检测结果,包括类别和置信度。
- results.xyxy: 返回检测到的边界框,格式为 (x1, y1, x2, y2, confidence, class)。
- results.show(): 显示带有检测框的图像。
- results.save(save_dir): 将带有检测框的图像保存到指定目录。
其他的更复杂的 :
针对初始模型 ,还可以通过数据集和训练来适配更复杂的场景 :
- train(): 训练模型,支持自定义数据集。
- val(): 验证模型性能,通常在训练后进行。
- Dataset(): 用于处理数据集,支持常见的数据格式。
- create_dataloader(): 创建数据加载器,方便批量处理数据。
总结一下
基本上使用起来贼简单 ,简单照着文档操作一下就能实现。
但是 : 生成级使用不会这么简单 , 模型相当于一个通用的数据集 ,它只能适配常见的需求。
如果想做特定的功能 ,则需要针对性的训练和微调。 这个下一篇再说。
最后的最后 ❤️❤️❤️👇👇👇
- 👈 欢迎关注 ,超200篇优质文章,未来持续高质量输出 🎉🎉
- 🔥🔥🔥 系列文章集合,高并发,源码应有尽有 👍👍
- 走过路过不要错过 ,知识无价还不收钱 ❗❗