项目背景与目的
项目背景
近年来,计算机视觉技术,特别是基于深度学习的目标检测方法,在许多应用领域得到了广泛的关注和应用。YOLO(You Only Look Once)作为一种高效的实时目标检测算法,凭借其速度快、精度高的优势,在学术界和工业界都取得了显著的成果。YOLOv8是YOLO系列最新版本,融合了许多先进的技术和优化策略,进一步提升了目标检测的性能。
本项目旨在利用YOLOv8模型,开发一个集成图像和视频目标检测的桌面应用程序,帮助用户方便地进行目标检测任务。该应用程序主要针对研究人员、工程师以及其他需要进行目标检测任务的用户,提供了一种简单易用的工具,能够快速检测图像或视频中的目标,并展示检测结果。
项目目的
1. **开发一个用户友好的桌面应用程序**:
- 利用PyQt5开发图形用户界面(GUI),使用户可以方便地导入图像和视频,进行目标检测,并查看检测结果。
- 提供基本的图像和视频导航功能,如加载图像/视频、查看上一张/下一张图像或视频帧等。
2. **集成YOLOv8模型进行目标检测**:
- 使用YOLOv8预训练模型进行目标检测,确保高效、准确地检测图像和视频中的目标。
- 实现目标检测结果的可视化,将检测框和标签叠加在图像或视频帧上,帮助用户直观地了解检测结果。
3. **支持模型训练与优化**:
- 提供训练YOLOv8模型的功能,允许用户使用自定义数据集训练模型。
- 在训练过程中保存最佳模型,确保用户能够获取最优的目标检测模型。
4. **提供结果保存功能**:
- 允许用户将检测结果保存为图像或视频文件,方便后续分析和处理。
项目实现
项目由两个主要部分组成:前端和后端。
前端
前端部分主要是图形用户界面(GUI)的实现,使用PyQt5开发。主要功能包括:
1. **图像和视频的加载与显示**:
- 导入图像:允许用户选择文件夹并加载其中的所有图像。
- 导入视频:允许用户选择视频文件并逐帧加载。
- 显示图像和视频帧:在GUI中显示原始图像或视频帧,以及检测后的结果。
2. **检测结果的导航和查看**:
- 上一个/下一个按钮:用于导航图像列表或视频帧。
- 开始检测按钮:触发目标检测过程,显示检测结果。
3. **结果的保存与移除**:
- 保存按钮:允许用户将检测结果保存为图像或视频文件。
- 移除按钮:从当前加载的列表中移除图像或视频,清除显示内容。
4. **应用退出功能**:
- 退出按钮:关闭应用程序。
后端
后端部分主要是YOLOv8模型的集成与目标检测的实现。主要功能包括:
1. **模型加载与预测**:
- 加载YOLOv8预训练模型。
- 对导入的图像或视频帧进行目标检测,生成检测结果。
2. **模型训练与优化**:
- 使用指定的数据集和超参数进行模型训练。
- 在训练过程中保存最佳模型。
3. **检测结果的处理与保存**:
- 将检测结果(包括检测框和标签)叠加在图像或视频帧上。
- 保存处理后的图像或视频文件。
结论
通过本项目,我们希望为需要进行目标检测任务的用户提供一个高效、易用的工具。该工具不仅能够快速、准确地检测图像和视频中的目标,还支持用户根据自定义数据集训练模型,满足不同应用场景的需求。未来,我们可以进一步扩展该项目的功能,如支持更多的模型类型、优化检测速度和精度、增加更多的图像和视频处理功能等。
数据预处理方法
数据预处理是为了提高模型训练效果和加速训练过程,对数据进行的一系列处理操作。常用的数据预处理方法包括:
-
图像缩放:
- 将图像调整到模型输入所需的尺寸。例如,对于YOLOv8,通常将图像缩放到640x640像素。
-
归一化:
- 将图像像素值归一化到[0, 1]范围,提高模型的收敛速度和稳定性
标注工具
labelme
标签格式
YOLO模型的标签格式非常简单,每个标注文件对应一个图像,包含多个标注信息。每行代表一个目标,格式如下:
class_id x_center y_center width height
49 0.642859 0.0792187 0.148063 0.148062
- class_id:目标类别的ID,从0开始。
- x_center:目标边界框中心点的x坐标,相对于图像宽度进行归一化,范围为[0, 1]。
- y_center:目标边界框中心点的y坐标,相对于图像高度进行归一化,范围为[0, 1]。
- width:目标边界框的宽度,相对于图像宽度进行归一化,范围为[0, 1]。
- height:目标边界框的高度,相对于图像高度进行归一化,范围为[0, 1]。
数据来源:自行标注200条+https://github.com/ultralytics/ultralytics在gihub上面公开数据集128条
loss变化:
模型训练:
yolo detect train data=datasets/mubiao/my_data.yaml model=yolov8n.yaml pretrained=ultralytics/yolov8n.pt epochs=50 batch=4 lr0=0.01 resume=True
模型评估效果:
运行后参数的变化:精度,召回率......可视化
在终端中运行了训练代码,转换成一般python代码后:
from ultralytics import YOLO
def train_yolov8():
# 加载预训练模型
model = YOLO('ultralytics/yolov8n.pt') #这些代码是根据终端训练模型写出详细的训练代码
# 开始训练
model.train(
data='datasets/mubiao/my_data.yaml', # 数据集配置文件路径
model='yolov8n.yaml', # 模型配置文件路径
epochs=50, # 训练的轮数
batch=4, # 批处理大小
lr0=0.01, # 初始学习率
resume=True, # 是否从上次中断处恢复训练
save_period=1 # 每个epoch保存一次模型
)
# 另存为最优模型
best_model_path = model.ckpt_path.replace('last', 'best')
model.save(best_model_path)
if __name__ == "__main__":
train_yolov8
以上代码就是训练完之后选择最好的模型(best)作为我们的一个项目的使用
后端:
import cv2