Skip to content

YOLOV8 is used to implement two methods to realize pedestrian detection, one is transfer learning, and the other is zero-shot method.

Notifications You must be signed in to change notification settings

111wukong/pedestrian-detection-yoloV8

Repository files navigation

1. 准备环境

首先,需要安装ultralytics库,它包含YOLOv8。


pip install ultralytics

2. 准备数据集

假设你的数据集已经转换为YOLO格式(即每个图像都有对应的YOLO格式的注释文件)。数据集应该有以下结构:

kotlinCopy codedataset/
  ├── images/
  │   ├── train/
  │   │   ├── img1.jpg
  │   │   ├── img2.jpg
  │   │   └── ...
  │   ├── val/
  │   │   ├── img1.jpg
  │   │   └── ...
  └── labels/
      ├── train/
      │   ├── img1.txt
      │   ├── img2.txt
      │   └── ...
      ├── val/
      │   ├── img1.txt
      │   └── ...

3. 配置YOLOv8模型

创建一个YAML文件来配置你的数据集,例如data.yaml

train: dataset/images/train
val: dataset/images/val

nc: 1  # 类别数量,这里是1类:行人
names: ['person']

4. 训练模型

使用以下Python脚本或命令行指令来训练YOLOv8模型:

from ultralytics import YOLO

# 加载YOLOv8模型
model = YOLO('yolov8n.pt')  # 选择合适的模型大小:yolov8n.pt, yolov8s.pt, yolov8m.pt, yolov8l.pt, yolov8x.pt

# 开始训练
model.train(data='data.yaml', epochs=100, imgsz=640, batch=16)

或者使用命令行:

yolo task=detect mode=train model=yolov8n.pt data=data.yaml epochs=100 imgsz=640 batch=16

5. 验证和测试

在训练期间,模型会自动使用验证数据集进行评估。你可以在训练完成后进行进一步的评估:

# 评估模型
metrics = model.val()
print(metrics)

6. 推理

使用训练好的模型进行推理:

# 使用训练好的模型进行推理
results = model('path/to/image.jpg')  # 可以是单张图片路径或目录
results.show()  # 显示检测结果
results.save('path/to/save')  # 保存检测结果

img

或者使用命令行:

yolo task=detect mode=predict model=path/to/best.pt source=path/to/image.jpg

代码示例总结

以下是一个完整的示例代码:

pythonCopy codefrom ultralytics import YOLO

# 加载YOLOv8模型
model = YOLO('yolov8n.pt')

# 开始训练
model.train(data='data.yaml', epochs=100, imgsz=640, batch=16)

# 评估模型
metrics = model.val()
print(metrics)

# 使用训练好的模型进行推理
results = model('path/to/image.jpg')
results.show()  # 显示检测结果
results.save('path/to/save')  # 保存检测结果

注意事项

  1. 超参数调整:训练过程中可以根据需要调整超参数(如学习率、批量大小等)。

  2. 数据增强:使用数据增强技术可以提高模型的泛化能力。

  3. 模型选择:根据你的计算资源选择合适的模型大小(如nano, small, medium, large, xlarge)。

  4. 结果分析:分析模型的评估指标(如mAP, Precision, Recall)以调整模型和数据。

    零样本实现行人检测:

    标签过滤方法

    在这种方法中,不对模型进行重新训练,而是在模型输出的基础上,通过筛选、过滤标签来达到特定的识别目标。以下详细介绍这种方法: 1.模型输出: 首先使用一个预训练好的目标检测模型来对图像进行检测。在这里插入图片描述 这些模型已经在大型数据集上进行了训练,学习到了各种不同类别的目标的特征。

    2.目标标签过滤: 接下来,从模型的输出结果中提取目标的标签信息。这些标签通常包含了检测到的目标类别(如人、车、狗等)、位置(边界框坐标)、置信度分数等信息。

    3.选择感兴趣的类别: 在标签过滤的过程中,根据任务需求选择感兴趣的目标类别。例如,只对行人感兴趣,您可以只保留标签为“行人”的目标检测结果,而过滤掉其他类别的目标。

    4.阈值处理: 除了选择感兴趣的类别外,还可以根据置信度分数来进行阈值处理。通常情况下,模型会为每个检测到的目标分配一个置信度分数,表示该目标存在的概率。您可以根据设定的阈值来过滤掉低置信度的检测结果,以确保只保留可信度较高的目标。

    5.结果可视化或保存: 最后,将经过标签过滤处理后的目标检测结果进行可视化或保存。通常,可以将过滤后的结果在图像或视频中标注出来,以便后续分析或应用。

    完整的demo

    只需要运行这段推理脚本即可。

    import cv2
    from ultralytics import YOLO
    # 加载YOLOv8模型
    model = YOLO('yolov8n.pt')  # 你可以选择其他模型,例如yolov8s.pt, yolov8m.pt等
    image_path = 'test-img/ms.jpg'  # 替换为你的图像路径
    image = cv2.imread(image_path)
    # 使用模型进行检测
    results = model(image)
    # 筛选出标签为"person"的检测结果(COCO数据集中,类别0通常为'person')
    person_results = [result for result in results[0].boxes if result.cls[0] == 0]
    # 绘制检测到的"person"的边界框
    for box in person_results:
        x1, y1, x2, y2 = map(int, box.xyxy[0])
        confidence = box.conf[0]
        label = f"person {confidence:.2f}"
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 3)
        cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 4)
    # 保存结果图像
    output_path_person_only = 'person_only_detected_image1.jpg'
    cv2.imwrite(output_path_person_only, image)
    print(f"检测结果已保存到 {output_path_person_only}")

    原始检测结果

    在这里插入图片描述

    标签过滤后的检测结果

    在这里插入图片描述

    两种方法的区别

    迁移学习优缺点:

    优点:

    • 目标定制化: 重新训练模型可以针对特定的任务和数据集进行优化,可以更好地满足特定需求,提高模型性能和准确性。
    • 灵活性: 可以调整模型架构、超参数和训练策略,以适应不同的数据特征和应用场景,具有更大的灵活性。
    • 更适应新任务: 重新训练模型可以使其更适应新的目标类别、背景和环境变化,提高泛化能力和适应性。

    缺点:

    • 时间和资源消耗: 需要花费大量时间和计算资源来重新训练模型,特别是对于大型数据集和复杂模型而言。
    • 数据标注需求: 需要大量标注好的数据集来进行重新训练,标注过程可能耗时耗力。
    • 潜在过拟合: 重新训练模型可能会导致过度拟合于新数据集,特别是当新数据集相对较小或与原始数据集有显著差异时

    过滤标签的优缺点:

    优点:

    • 简单快速: 只需要对已有模型的输出进行简单的标签过滤,不需要重新训练模型,过程简单快速。
    • 资源消耗低: 不需要重新分配大量的计算资源和时间,适用于资源有限或时间紧迫的情况。
    • 保留原模型特性: 可以保留原始模型在大型数据集上学到的丰富特征和知识,避免了重新训练可能带来的性能下降。

    缺点:

    • 限制性: 受限于原始模型在预训练数据集上学习到的特征和知识,可能无法很好地适应新任务和数据集,性能可能受限。
    • 无法完全定制化: 无法对模型架构和参数进行定制化调整,可能无法满足特定需求。
    • 可能导致误差传播: 对于一些复杂的数据集和场景,简单的标签过滤可能会导致误差传播,影响最终的检测性能。

    总结

    没有最好的方法,只有最合适的方法。

About

YOLOV8 is used to implement two methods to realize pedestrian detection, one is transfer learning, and the other is zero-shot method.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published