基于Python实现一个AI物体识别

 更新时间:2024年11月04日 08:32:08   作者:志字辈小蚂蚁  
计算机视觉是其中的一大领域 ,应用场景也比较多,这篇文章主要为大家详细介绍了如何基于Python实现一个AI物体识别功能,需要的小伙伴可以了解下

一. 前言

近期在研究 AI 方面的应用 ,计算机视觉是其中的一大领域 ,应用场景也比较多。

这一篇主要尝试弄清楚 : 一个 AI 视觉识别的 功能点 ,涉及到哪些知识 ?

二. 处理流程

2.1 前置知识点

在实现这个功能之前 ,先要明白几个前置知识点 :

Python 层面需要的工具 :

组件工具功能描述作用
opencv-python一个开源计算机视觉库,提供图像和视频处理功能。用于加载、处理和显示图像,进行图像预处理,如缩放、裁剪和绘制。
tensorflow一个开源机器学习框架,支持深度学习模型的构建和训练。用于构建和训练物体识别模型,提供高层次的 API 和模型管理功能。
torch一个开源深度学习框架,以动态计算图著称,适合研究和生产。提供强大的张量计算功能,支持深度学习模型的训练和推理。
torchvisionPyTorch 的视觉工具包,提供常用的数据集、模型和图像变换。用于加载标准数据集(如 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

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()

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(): 创建数据加载器,方便批量处理数据。

总结一下

基本上使用起来贼简单 ,简单照着文档操作一下就能实现。

但是 : 生成级使用不会这么简单 , 模型相当于一个通用的数据集 ,它只能适配常见的需求。

以上就是基于Python实现一个AI物体识别的详细内容,更多关于Python AI物体识别的资料请关注脚本之家其它相关文章!

相关文章

  • Python+Kepler.gl实现时间轮播地图过程解析

    Python+Kepler.gl实现时间轮播地图过程解析

    这篇文章主要介绍了Python+Kepler.gl实现时间轮播地图过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 关于pygame自定义窗口创建及相关操作指南

    关于pygame自定义窗口创建及相关操作指南

    对于开发一个游戏来说,窗口的显示肯定是前提中的前提,对于pygame来说,只需要一小段代码就可以初始化窗口,下面这篇文章主要给大家介绍了关于pygame自定义窗口创建及相关操作的相关资料,需要的朋友可以参考下
    2022-07-07
  • Python实现小数转化为百分数的格式化输出方法示例

    Python实现小数转化为百分数的格式化输出方法示例

    这篇文章主要介绍了Python实现小数转化为百分数的格式化输出方法,结合具体实例形式分析了Python实现小数转换为百分数输出的相关操作技巧与注意事项,需要的朋友可以参考下
    2017-09-09
  • PyQt5利用QPainter绘制各种图形的实例

    PyQt5利用QPainter绘制各种图形的实例

    下面小编就为大家带来一篇PyQt5利用QPainter绘制各种图形的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • python检测远程udp端口是否打开的方法

    python检测远程udp端口是否打开的方法

    这篇文章主要介绍了python检测远程udp端口是否打开的方法,涉及Python操作socket实现检测udp端口的技巧,需要的朋友可以参考下
    2015-03-03
  • python批量查询、汉字去重处理CSV文件

    python批量查询、汉字去重处理CSV文件

    这篇文章主要为大家详细介绍了python批量查询、汉字去重处理CSV文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 详解Python里使用正则表达式的ASCII模式

    详解Python里使用正则表达式的ASCII模式

    ASCII(American Standard Code for Information Interchange),是一种单字节的编码。这篇文章主要介绍了Python里使用正则表达式的ASCII模式,需要的朋友可以参考下
    2017-11-11
  • python-地图可视化组件folium的操作

    python-地图可视化组件folium的操作

    这篇文章主要介绍了python-地图可视化组件folium的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • python中的随机数种子seed()用法说明

    python中的随机数种子seed()用法说明

    这篇文章主要介绍了python中的随机数种子seed()用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Mac 使用python3的matplot画图不显示的解决

    Mac 使用python3的matplot画图不显示的解决

    今天小编就为大家分享一篇Mac 使用python3的matplot画图不显示的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论