- 具体介绍请参考博客:(https://editor.csdn.net/md/?articleId=139529123)
首先,需要安装ultralytics
库,它包含YOLOv8。
pip install ultralytics
假设你的数据集已经转换为YOLO格式(即每个图像都有对应的YOLO格式的注释文件)。数据集应该有以下结构:
kotlinCopy codedataset/
├── images/
│ ├── train/
│ │ ├── img1.jpg
│ │ ├── img2.jpg
│ │ └── ...
│ ├── val/
│ │ ├── img1.jpg
│ │ └── ...
└── labels/
├── train/
│ ├── img1.txt
│ ├── img2.txt
│ └── ...
├── val/
│ ├── img1.txt
│ └── ...
创建一个YAML文件来配置你的数据集,例如data.yaml
:
train: dataset/images/train
val: dataset/images/val
nc: 1 # 类别数量,这里是1类:行人
names: ['person']
使用以下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
在训练期间,模型会自动使用验证数据集进行评估。你可以在训练完成后进行进一步的评估:
# 评估模型
metrics = model.val()
print(metrics)
使用训练好的模型进行推理:
# 使用训练好的模型进行推理
results = model('path/to/image.jpg') # 可以是单张图片路径或目录
results.show() # 显示检测结果
results.save('path/to/save') # 保存检测结果
或者使用命令行:
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') # 保存检测结果
-
超参数调整:训练过程中可以根据需要调整超参数(如学习率、批量大小等)。
-
数据增强:使用数据增强技术可以提高模型的泛化能力。
-
模型选择:根据你的计算资源选择合适的模型大小(如nano, small, medium, large, xlarge)。
-
结果分析:分析模型的评估指标(如mAP, Precision, Recall)以调整模型和数据。
在这种方法中,不对模型进行重新训练,而是在模型输出的基础上,通过筛选、过滤标签来达到特定的识别目标。以下详细介绍这种方法: 1.模型输出: 首先使用一个预训练好的目标检测模型来对图像进行检测。
这些模型已经在大型数据集上进行了训练,学习到了各种不同类别的目标的特征。
2.目标标签过滤: 接下来,从模型的输出结果中提取目标的标签信息。这些标签通常包含了检测到的目标类别(如人、车、狗等)、位置(边界框坐标)、置信度分数等信息。
3.选择感兴趣的类别: 在标签过滤的过程中,根据任务需求选择感兴趣的目标类别。例如,只对行人感兴趣,您可以只保留标签为“行人”的目标检测结果,而过滤掉其他类别的目标。
4.阈值处理: 除了选择感兴趣的类别外,还可以根据置信度分数来进行阈值处理。通常情况下,模型会为每个检测到的目标分配一个置信度分数,表示该目标存在的概率。您可以根据设定的阈值来过滤掉低置信度的检测结果,以确保只保留可信度较高的目标。
5.结果可视化或保存: 最后,将经过标签过滤处理后的目标检测结果进行可视化或保存。通常,可以将过滤后的结果在图像或视频中标注出来,以便后续分析或应用。
只需要运行这段推理脚本即可。
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}")
优点:
- 目标定制化: 重新训练模型可以针对特定的任务和数据集进行优化,可以更好地满足特定需求,提高模型性能和准确性。
- 灵活性: 可以调整模型架构、超参数和训练策略,以适应不同的数据特征和应用场景,具有更大的灵活性。
- 更适应新任务: 重新训练模型可以使其更适应新的目标类别、背景和环境变化,提高泛化能力和适应性。
缺点:
- 时间和资源消耗: 需要花费大量时间和计算资源来重新训练模型,特别是对于大型数据集和复杂模型而言。
- 数据标注需求: 需要大量标注好的数据集来进行重新训练,标注过程可能耗时耗力。
- 潜在过拟合: 重新训练模型可能会导致过度拟合于新数据集,特别是当新数据集相对较小或与原始数据集有显著差异时
优点:
- 简单快速: 只需要对已有模型的输出进行简单的标签过滤,不需要重新训练模型,过程简单快速。
- 资源消耗低: 不需要重新分配大量的计算资源和时间,适用于资源有限或时间紧迫的情况。
- 保留原模型特性: 可以保留原始模型在大型数据集上学到的丰富特征和知识,避免了重新训练可能带来的性能下降。
缺点:
- 限制性: 受限于原始模型在预训练数据集上学习到的特征和知识,可能无法很好地适应新任务和数据集,性能可能受限。
- 无法完全定制化: 无法对模型架构和参数进行定制化调整,可能无法满足特定需求。
- 可能导致误差传播: 对于一些复杂的数据集和场景,简单的标签过滤可能会导致误差传播,影响最终的检测性能。
没有最好的方法,只有最合适的方法。