通过yolov8识别无人机俯拍视频果量

1.准备配置文件 :首先,你需要下载YOLO项目中的基础配置文件,以确保追踪功能正常工作。请激活你的yolov8环境,并用以下命令初始化Ultralytics的配置文件:

这会在本地生成一个 'ultralytics' 文件夹

yolo cfg

执行完毕后,你会得到一个 ultralytics/cfg/default.yaml 文件,这是之后脚本读取配置的基础。

**2.下载追踪器配置:**YOLO官方提供了一个高度适配的目标追踪器配置。下载后,将其放在与Python脚本相同的目录下。

https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/trackers/bytetrack.yaml

3.完整python代码:

复制代码
from ultralytics import YOLO
import cv2
from collections import defaultdict
from typing import List, Dict, Tuple
import numpy as np

# --- 配置参数 (请根据你的实际情况修改) ---
MODEL_PATH = "runs/detect/runs/fruit_final/102img_150e/weights/best.pt" # 你的模型路径
SOURCE_VIDEO = "path/to/your/drone_video.mp4" # 输入无人机视频路径
TARGET_VIDEO = "processed_fruits_counting_video.mp4" # 输出视频路径
TRACKER_CONFIG = "bytetrack.yaml" # 追踪器配置文件路径
CONF_THRESHOLD = 0.5 # 置信度阈值,高于此值才认为是有效的果子
IOU_THRESHOLD = 0.5 # 交并比阈值,用于非极大值抑制(NMS)

def main():
    print("[INFO] 加载模型...")
    # 1. 加载你的自定义模型
    model = YOLO(MODEL_PATH)

    # 2. 打开视频文件
    cap = cv2.VideoCapture(SOURCE_VIDEO)
    if not cap.isOpened():
        print(f"[ERROR] 无法打开视频文件: {SOURCE_VIDEO}")
        return

    # 3. 准备输出视频写入器,保持与原视频相同的格式和帧率
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    out = cv2.VideoWriter(TARGET_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))

    # 4. 初始化用于存储果子ID和计数的数据结构
    # 'set'用于存储唯一的果子ID,避免重复计数;'deque'可用于记录历史ID,但核心是set
    fruit_ids = set()
    # 可选:存储每一帧的ID,用于更复杂的逻辑,比如统计每一株树,但基础版用set就够了
    
    # 我们还可以存储每个果子的轨迹,用于调试或高级功能
    track_history = defaultdict(lambda: [])

    print("[INFO] 开始处理视频...")
    frame_count = 0
    while cap.isOpened():
        success, frame = cap.read()
        if not success:
            break

        frame_count += 1
        # 5. 对每一帧执行目标追踪 (启用 'track' 模式)
        # 参数 'persist=True' 确保ID在不同帧之间保持一致[reference:1]
        # 'conf' 设置置信度阈值,过滤低质量的检测[reference:2]
        # 'iou' 设置非极大值抑制(NMS)的IOU阈值,减少重叠框
        # 'tracker' 指定我们下载的追踪器配置文件
        results = model.track(frame, 
                              persist=True, 
                              conf=CONF_THRESHOLD, 
                              iou=IOU_THRESHOLD,
                              tracker=TRACKER_CONFIG)
        
        # 6. 从结果中提取被成功追踪的果子
        boxes = results[0].boxes
        # 只有当检测到目标且ID被成功追踪时,才进行计数
        if boxes is not None and boxes.id is not None:
            # 获取当前帧所有被追踪果子的唯一ID (整数)
            track_ids = boxes.id.int().cpu().tolist()
            # 将所有新出现的ID添加到set中,实现全局去重
            fruit_ids.update(track_ids)

            # 可选功能:绘制每个果子的运动轨迹
            # 获取每个果子的边界框坐标
            xywh = boxes.xywh.cpu().numpy()
            for track_id, box in zip(track_ids, xywh):
                x, y, w, h = box
                track = track_history[track_id]
                track.append((float(x), float(y)))  # 记录中心点
                if len(track) > 30:  # 只保留最近30帧的轨迹
                    track.pop(0)
                # 绘制轨迹线 (在输出视频上会很直观)
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(0, 255, 0), thickness=2)
        
        # 7. 在帧上添加计数和帧数信息
        total_count = len(fruit_ids)
        cv2.putText(frame, f"Total Fruits Count: {total_count}", (10, 30), 
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        cv2.putText(frame, f"Frame: {frame_count}", (10, 70), 
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
        
        # 打印或显示当前帧信息
        print(f"Frame {frame_count}: Current unique fruits in video: {len(fruit_ids)}")
        
        # 8. 将处理后的帧写入输出视频
        out.write(frame)
        
        # (可选)如果想实时显示,可以取消下面的注释
        # cv2.imshow("YOLOv8 Tracking", frame)
        # if cv2.waitKey(1) & 0xFF == ord('q'):
        #     break

    # 9. 资源释放
    cap.release()
    out.release()
    cv2.destroyAllWindows()
    print("[INFO] 视频处理完成!")
    print(f"最终统计结果: 视频中共有 {len(fruit_ids)} 个独特的果子被检测到。")
    print(f"结果视频已保存至: {TARGET_VIDEO}")

if __name__ == "__main__":
    main()
相关推荐
微尘hjx3 天前
【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析
深度学习·yolo·目标跟踪·ultralytics·轨迹算法·deep-oc-sort·车流统计
AI日报派送佬3 天前
高效目标检测利器:X-AnyLabeling 加载自定义 YOLO 模型自动标注实操指南
人工智能·yolo·目标检测
微尘hjx3 天前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
微尘hjx3 天前
【Deep-OC-SORT 03】多轨迹算法Deep-OC-SORT-卡尔曼滤波预测过程
算法·yolo·目标跟踪·ultralytics·车跟踪·轨迹算法·deep-oc-sort
qq_25294131684 天前
日本道路病害检测数据集 | 道路病害 裂缝检测 坑洼识别 市政巡检9287期
人工智能·深度学习·yolo·目标检测·计算机视觉·道路检测
qq_25294131684 天前
伊蚊检测数据集 | 伊蚊检测 病媒生物 公共卫生 目标检测9304期
人工智能·yolo·目标检测·计算机视觉·蚊子·尹蚊
qq_25294131684 天前
无人机视角公路两侧滑坡检测数据集 | 公路巡检 滑坡检测 地质灾害 无人机航拍9302期
yolo·目标检测·目标跟踪·无人机·地质灾害·无人机视角·滑坡检测
向哆哆5 天前
羊行为目标检测数据集:4类别、2,000张图像 | 目标检测
人工智能·yolo·目标检测·目标跟踪
燃烧的枫5 天前
Windows 下 YOLO11 Pose 的 TensorRT C++ 部署
windows·yolo·tensorrt·1024程序员节·yolo11-pose
磁场转动100万匹5 天前
道路巡检系统检测案例:YOLOv5 + Flask + PyQt 全栈实现
python·yolo