使用yolo11x进行物体分类

发布于:2025-02-15 ⋅ 阅读:(106) ⋅ 点赞:(0)

利用 yolo11x 进行物体识别

一、物品分类

代码说明

  1. 模型加载:加载 yolo11x.pt 模型,如果这个模型在物体分类上表现不佳,可以考虑使用像 yolov8n.pt 这类通用的预训练模型。
  2. 摄像头设置:打开电脑摄像头并将帧率设置为 10fps,以此减轻处理负担。
  3. FPS 计算:借助 time 库计算每帧的处理时间,进而得到 FPS 值,并在画面左上角显示。
  4. 物体检测与分类
    • 运用 model(frame, conf=0.5, verbose=False, stream=True) 对当前帧进行物体检测,conf=0.5 表示只保留置信度大于 0.5 的检测结果,stream=True 开启异步推理。
    • 遍历检测结果,获取每个检测框的坐标、置信度、类别索引和类别名称。
    • 利用 cv2.rectangle 绘制检测框,使用 cv2.putText 显示类别名称和置信度。
  5. 退出机制:按 q 键退出循环,释放摄像头资源并关闭所有窗口。

注意事项

  • 模型选择:不同的模型在不同场景下表现不同,若当前模型分类效果不理想,可尝试更换其他预训练模型。
  • 置信度调整conf 参数可根据实际情况调整,若想检测更多物体可适当降低该值,若要保证检测准确性可提高该值。
import cv2
import time
from ultralytics import YOLO

# 加载当前目录下的 yolo11x.pt 模型,如果此模型不合适可更换为 yolov8n.pt 等
model = YOLO('yolo11x.pt')

# 打开电脑摄像头
cap = cv2.VideoCapture(0)
# 降低帧率
cap.set(cv2.CAP_PROP_FPS, 10)

# 初始化时间变量,用于计算 FPS
prev_time = 0

while True:
    # 读取摄像头的一帧图像
    ret, frame = cap.read()
    if not ret:
        break

    # 计算 FPS
    current_time = time.time()
    fps = 1 / (current_time - prev_time)
    prev_time = current_time

    # 使用 YOLO 模型进行物体检测,开启异步推理
    results = model(frame, conf=0.5, verbose=False, stream=True)

    # 遍历检测结果
    for r in results:
        boxes = r.boxes
        for box in boxes:
            # 获取边界框坐标
            x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
            # 获取置信度
            confidence = box.conf[0].cpu().numpy()
            # 获取类别索引
            class_index = int(box.cls[0].cpu().numpy())
            # 获取类别名称
            class_name = r.names[class_index]

            # 在图像上绘制边界框
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            # 在图像上显示类别名称和置信度
            cv2.putText(frame, f'{class_name}: {confidence:.2f}', (x1, y1 - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 在左上角显示 FPS
    cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 显示处理后的图像
    cv2.imshow('Object Classification', frame)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

二、车牌识别

因为没找到Tesseract OCR文件,只是标注了车牌的位置

import cv2
import time
from ultralytics import YOLO

# 加载当前目录下的 yolo11x.pt 模型
model = YOLO('yolo11x.pt')

# 打开电脑摄像头
cap = cv2.VideoCapture(0)
# 降低帧率
cap.set(cv2.CAP_PROP_FPS, 10)

# 初始化时间变量,用于计算 FPS
prev_time = 0

while True:
    # 读取摄像头的一帧图像
    ret, frame = cap.read()
    if not ret:
        break

    # 计算 FPS
    current_time = time.time()
    fps = 1 / (current_time - prev_time)
    prev_time = current_time

    # 使用 YOLO 模型进行车牌检测,开启异步推理
    results = model(frame, classes=2, conf=0.5, verbose=False, stream=True)

    # 遍历检测结果
    for r in results:
        boxes = r.boxes
        for box in boxes:
            # 获取边界框坐标
            x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
            # 获取置信度
            confidence = box.conf[0].cpu().numpy()

            # 在图像上绘制边界框
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            # 在图像上显示置信度
            cv2.putText(frame, f'License Plate Conf: {confidence:.2f}', (x1, y1 - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 在左上角显示 FPS
    cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 显示处理后的图像
    cv2.imshow('License Plate Detection', frame)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

三、检测到人物经过后截图保存

代码解释

  1. 初始化部分

    • 加载 YOLO 模型和打开摄像头,设置帧率。
    • 初始化 saved_persons 列表,用于存储已经保存过的人物的边界框信息。
    • 定义 is_similar_box 函数,用于判断两个边界框是否相似,通过计算交并比(IoU)来实现。
  2. 主循环部分

    • 读取摄像头的一帧图像,计算 FPS。
    • 使用 YOLO 模型进行物体检测。
    • 遍历检测结果,对于检测到的人物:
      • 检查该人物的边界框是否与已经保存过的人物的边界框相似。
      • 如果不相似,则将该边界框添加到 saved_persons 列表中,并保存当前帧的截图,文件名包含时间戳。
    • 在图像上绘制边界框和显示类别名称、置信度。
    • 在左上角显示 FPS。
  3. 退出部分

    • q 键退出循环,释放摄像头资源并关闭所有窗口。

注意事项

  • 模型选择:确保使用的模型能够准确检测到人物,yolo11x.pt 如果效果不好,可以尝试 yolov8n.pt 等其他预训练模型。
  • 相似度阈值is_similar_box 函数中的 threshold 参数可以根据实际情况调整,值越大表示要求的相似度越高。
  • 存储限制:如果长时间运行,saved_persons 列表可能会占用大量内存,可以考虑定期清理该列表。
import cv2
import time
from ultralytics import YOLO

# 加载当前目录下的 yolo11x.pt 模型,如果此模型不合适可更换为 yolov8n.pt 等
model = YOLO('yolo11x.pt')

# 打开电脑摄像头
cap = cv2.VideoCapture(0)
# 降低帧率
cap.set(cv2.CAP_PROP_FPS, 10)

# 初始化时间变量,用于计算 FPS
prev_time = 0

# 用于存储已经保存过的人物的边界框信息
saved_persons = []

# 定义一个函数来判断两个边界框是否相似
def is_similar_box(box1, box2, threshold=0.7):
    x1_1, y1_1, x2_1, y2_1 = box1
    x1_2, y1_2, x2_2, y2_2 = box2
    area_1 = (x2_1 - x1_1) * (y2_1 - y1_1)
    area_2 = (x2_2 - x1_2) * (y2_2 - y1_2)
    x_overlap = max(0, min(x2_1, x2_2) - max(x1_1, x1_2))
    y_overlap = max(0, min(y2_1, y2_2) - max(y1_1, y1_2))
    overlap_area = x_overlap * y_overlap
    iou = overlap_area / (area_1 + area_2 - overlap_area)
    return iou > threshold

while True:
    # 读取摄像头的一帧图像
    ret, frame = cap.read()
    if not ret:
        break

    # 计算 FPS
    current_time = time.time()
    fps = 1 / (current_time - prev_time)
    prev_time = current_time

    # 使用 YOLO 模型进行物体检测,开启异步推理
    results = model(frame, conf=0.5, verbose=False, stream=True)

    # 遍历检测结果
    for r in results:
        boxes = r.boxes
        for box in boxes:
            # 获取边界框坐标
            x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
            # 获取置信度
            confidence = box.conf[0].cpu().numpy()
            # 获取类别索引
            class_index = int(box.cls[0].cpu().numpy())
            # 获取类别名称
            class_name = r.names[class_index]

            # 检查是否检测到人物
            if class_name == 'person':
                # 检查该人物是否已经保存过
                is_saved = False
                for saved_box in saved_persons:
                    if is_similar_box((x1, y1, x2, y2), saved_box):
                        is_saved = True
                        break
                # 如果没有保存过,则保存截图
                if not is_saved:
                    saved_persons.append((x1, y1, x2, y2))
                    # 生成文件名
                    timestamp = time.strftime("%Y%m%d-%H%M%S")
                    filename = f'person_{timestamp}.jpg'
                    cv2.imwrite(filename, frame)
                    print(f'Saved screenshot: {filename}')

            # 在图像上绘制边界框
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            # 在图像上显示类别名称和置信度
            cv2.putText(frame, f'{class_name}: {confidence:.2f}', (x1, y1 - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 在左上角显示 FPS
    cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 显示处理后的图像
    cv2.imshow('Object Classification', frame)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()


网站公告

今日签到

点亮在社区的每一天
去签到