OpenCV与AI深度学习 | 基于YOLOv8实现高级目标检测和区域计数

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:基于YOLOv8实现高级目标检测和区域计数

  物体检测是计算机视觉的基石。这需要识别和精确定位图像或视频中的物体。在此基础上,使用 Ultralytics YOLOv8 进行基于区域的物体计数可通过量化指定区域中的物体来增强物体检测。此类进步具有变革性的应用,从准确计算城市人行横道上的行人到通过计算货架上的产品来完善库存管理。

    利用 YOLOv8 进行对象计数不仅可以推动业务走向自动化,还可以改善安全措施和数据驱动的决策。

    本文主要介绍以下内容:

    • 多区域物体计数的特点

    • 真实用例

多区域物体计数的特点

    对象计数可统计视频或图像中的对象。另一方面,基于区域的计数侧重于计数特定区域内的对象。YOLOv8 的区域计数将重点转移到帧内的特定指定区域。它不只是计数;它还涉及正确计数,以及计数重要的地方。此模块配备了几个功能:

    可移动区域:设置区域坐标并启动 YOLOv8 区域计数模块的推理后 ,YOLOv8 允许实时调整,这意味着无需深入编辑代

智慧交通基于YOLOv8的行人车辆检测计数系统源码(部署教程+训练好的模型+各项评估指标曲线).zip 平均准确率:0.91 类别:person、truck、car、bus、traffic light 【资源介绍】 1、ultralytics-main ultralytics-main为YOLOv8源代码,里面涵盖基于yolov8分类、目标检测额、姿态估计、图像分割四部分代码,我们使用的是detect部分,也就是目标检测代码 2、搭建环境 安装anaconda pycharm windows系统、mac系统、Linux系统都适配 在anaconda中新建一个新的envs虚拟空间(可以参考博客来),命令窗口执行:conda create -n YOLOv8 python==3.8 创建完YOLOv8-GUI虚拟空间后,命令窗口执行:source activate YOLOv8 激活虚拟空间 然后就在YOLOv8虚拟空间内安装requirements.txt中的所有安装包,命令窗口执行:pip install -r requirements.txt 使用清华源安装更快 3、训练模型过程 进入到\ultralytics-main\ultralytics\yolo\v8\detect\文件夹下,datasets即为我们需要准备好的数据集,训练其他模型同理。 data文件夹下的bicycle.yaml文件为数据集配置文件,该文件为本人训练自行车检测模型时创建,训练其他模型,可自行创建。博文有介绍https://blog.csdn.net/DeepLearning_?spm=1011.2415.3001.5343 train.py中238行,修改为data = cfg.data or './bicycle.yaml' # or yolo.ClassificationDataset("mnist") 237行修改自己使用的预训练模型 若自己有显卡,修改239行,如我有四张显卡,即改成args = dict(model=model, data=data, device=”0,1,2,3“) 以上配置完成后运行train.py开始训练模型,训练完毕后会在runs/detect/文件夹下生成train*文件夹,里面包含模型评估指标等 4、推理测试 训练好模型,打开predict.py,修改87行,model = cfg.model or 'yolov8n.pt',把yolov8n.pt换成我们刚才训练完生成的模型路径(在\ultralytics-main\ultralytics\yolo\v8\detect\runs\detect文件夹下),待测试的图片或者视频存放于ultralytics\ultralytics\assets文件夹, 运行predict.py即可,检测结果会在runs/detect/train文件夹下生成。
### 使用YOLOv8实现视频内指定区域的物体检测数量统计 要实现在视频中特定区域目标检测数量统计,可以通过以下方法完成: #### 1. 环境准备 为了运行YOLOv8模型并处理视频数据,需先安装必要的依赖库。以下是环境配置的相关命令[^1]: ```bash pip install ultralytics pip install numpy opencv-python-headless matplotlib ``` #### 2. 加载预训练模型 加载YOLOv8的预训练权重文件用于目标检测任务。可以选择官方提供的不同版本(如`yolov8n.pt`, `yolov8s.pt`等),具体代码如下所示: ```python from ultralytics import YOLO model = YOLO('yolov8n.pt') # 加载YOLOv8 nano模型 ``` #### 3. 定义划定区域 通过定义多边形或多点坐标来设置感兴趣的区域(Region of Interest, ROI)。这些坐标表示视频帧上的特定范围,在后续步骤中仅对该范围内检测到的对象进行计数。 ```python import cv2 import numpy as np def define_roi(frame_shape): height, width = frame_shape[:2] roi_points = np.array([ [(width * 0.25, height * 0.7), (width * 0.75, height * 0.7), (width * 0.75, height * 0.95), (width * 0.25, height * 0.95)] ], dtype=np.int32) return roi_points ``` 上述函数创建了一个矩形ROI作为示例。 #### 4. 处理视频流 读取视频文件并对每一帧执行目标检测操作。对于每帧的结果,筛选出落在感兴趣区域内的目标,并对其进行分类计数。 ```python cap = cv2.VideoCapture('input_video.mp4') roi_points = None while cap.isOpened(): ret, frame = cap.read() if not ret: break if roi_points is None: roi_points = define_roi(frame.shape) results = model.predict(source=frame, conf=0.5)[0] object_count = {} for result in results.boxes.data.tolist(): x1, y1, x2, y2, score, class_id = map(int, result) center_x = int((x1 + x2) / 2) center_y = int((y1 + y2) / 2) inside_roi = cv2.pointPolygonTest(roi_points[0], (center_x, center_y), False) >= 0 if inside_roi: class_name = model.names[class_id] if class_name not in object_count: object_count[class_name] = 0 object_count[class_name] += 1 cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(frame, f'{class_name}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) cv2.polylines(frame, [roi_points], True, (255, 0, 0), thickness=2) text_position = (10, 30) for idx, (object_type, count) in enumerate(object_count.items()): display_text = f"{object_type}: {count}" cv2.putText(frame, display_text, (text_position[0], text_position[1] + idx*30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) cv2.imshow('Frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 这段代码实现了对视频逐帧分析的功能,同时绘制了边界框、类别标签以及总数量显示在屏幕上[^2]。 #### 5. 可视化增强 如果希望更直观地了解目标物的空间分布情况,则可以引入密度热力图技术。这一步骤有助于观察哪些位置聚集较多目标物,从而辅助决策制定过程[^4]。 ```python import seaborn as sns heatmap_data = np.zeros((height, width)) for result in results.boxes.data.tolist(): x1, y1, x2, y2, _, _ = map(int, result) heatmap_data[y1:y2, x1:x2] += 1 sns.heatmap(heatmap_data, cmap="viridis", alpha=0.6) plt.axis('off') plt.show() ``` 以上部分展示了如何生成简单的热度映射图表。 --- ### 总结 综上所述,借助YOLOv8框架能够高效达成视频片段里限定领域里的实体探测同数目汇总的任务需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值