目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于YOLO算法的土方工程机械(挖掘机)施工活动识别研究
选题意义背景
随着新一代信息技术(如人工智能、大数据、物联网等)的快速发展,传统的土木工程施工管理模式正在经历深刻变革。数字化、智能化已成为建筑工程领域的重要发展趋势,施工过程信息的高效采集、组织和应用成为提升工程管理水平的关键因素。土方机械作为土方工程施工中最重要的生产资源,其工作状态信息的获取主要依赖人工观察和记录,这种方式不仅耗时耗力,而且存在数据不准确、不及时的问题。计算机视觉技术在建筑领域的应用研究虽然取得了一定进展,但在土方机械施工过程信息管理方面的应用还不够深入。现有的研究大多集中在单一设备的识别和跟踪,缺乏对整个施工过程信息流的系统管理和应用。

本选题正是在这样的背景下提出的,旨在探索利用计算机视觉技术自动采集土方机械施工过程信息,并通过信息流建模方法对信息进行组织和应用,为土方工程施工管理提供新的思路和方法。该研究不仅具有重要的理论意义,而且对于提升土方工程施工管理的智能化水平,降低管理成本,提高施工效率具有重要的现实意义,可以实现土方机械施工过程信息的自动化、精细化管理,帮助项目管理者实时掌握施工进度、设备效率等关键信息,为制定科学的管理决策提供数据支持。同时,该研究成果也可以为其他类型施工机械的信息管理提供参考,具有广泛的应用前景。
数据集
数据获取
本研究使用的数据集为自制数据集,从专业工程视频网站、建筑工程教学视频库以及视频分享平台收集了大量包含挖掘机施工场景的视频片段。2023年期间,共收集了约50小时的原始视频素材,涵盖了不同型号挖掘机在不同施工环境下的作业情况。在施工现场安装高清监控摄像头,对挖掘机的实际施工过程进行连续录制,包含大量的土方开挖作业,为数据集提供了真实的工程场景数据。现场录制时间持续了2个月,获得了约80小时的现场施工视频。

数据格式
收集到的原始视频数据经过筛选、剪辑和质量控制后,最终选取了2124张高质量的挖掘机活动图像作为训练和测试数据集。数据格式主要包括:
-
图像数据:采用JPEG格式,分辨率为1920×1080像素,确保图像质量足够清晰,能够有效识别挖掘机的动作细节。
-
标注数据:使用Labelme标注工具进行人工标注,生成JSON格式的标注文件。每个图像都包含挖掘机的位置信息(边界框坐标)和活动类别标签。
-
数据集划分:将2124张图像按照8:2的比例划分为训练集和测试集,其中训练集包含1699张图像,测试集包含425张图像。这种划分方式保证了模型训练的充分性和测试的可靠性。
类别定义
根据挖掘机在土方施工过程中的典型工作循环,研究将挖掘机的活动状态划分为4个主要类别:
-
挖掘(digging):挖掘机利用铲斗切削土壤、挖掘土方的动作。该类别的关键特征是铲斗与地面接触,并且铲斗角度变化明显。
-
转运(hauling):挖掘机挖掘完成后,将铲斗从挖掘位置移动到卸载位置的过程。该类别的关键特征是铲斗离开地面,处于水平或上升运动状态。
-
卸土(dumping):挖掘机将铲斗中的土方卸载到指定位置(如自卸汽车或堆放点)的动作。该类别的关键特征是铲斗角度大幅变化,土方从铲斗中倾泻而出。
-
回转(swinging):挖掘机卸载完成后,将铲斗从卸载位置转回挖掘位置的过程。该类别的关键特征是整机回转,铲斗处于空斗状态并向挖掘位置移动。
每个类别的图像数量在数据集中的分布相对均衡,以确保模型训练的有效性。其中,挖掘类图像约占28%,转运类约占25%,卸土类约占22%,回转类约占25%。
数据预处理
为了提高模型训练效果和鲁棒性,对收集的数据集进行了一系列预处理操作:
-
图像筛选:首先对所有收集的图像进行人工筛选,去除模糊、曝光过度或不足、遮挡严重等质量较差的图像,确保用于训练的图像能够清晰地展示挖掘机的轮廓和动作特征。
-
图像增强:为了增加数据多样性,提高模型的泛化能力,对图像进行了多种增强处理:
- 亮度和对比度调整:模拟不同光照条件下的施工场景
- 随机旋转:模拟不同拍摄角度的监控视频
- 缩放变换:模拟摄像头距离变化对图像的影响
- 轻微裁剪:去除图像边缘无关信息,突出挖掘机主体
-
标注数据处理:使用Labelme工具对筛选后的图像进行精确标注,为每幅图像中的挖掘机添加边界框,并根据其活动状态标记相应的类别标签。标注完成后,将JSON格式的标注文件转换为YOLOv5模型所需的txt格式,每行包含类别索引和归一化的边界框坐标(中心点x、y,宽度w,高度h)。
-
数据验证:对标注数据进行交叉验证,由至少两名专业人员分别进行审核,确保标注的准确性和一致性。对于存在争议的图像,通过团队讨论达成共识后重新标注。
-
数据集组织:按照YOLOv5的要求组织数据集结构,将图像和标签分别存放在images和labels文件夹中,每个文件夹下又分为train和test子文件夹,分别存放训练集和测试集数据。同时,创建了配置文件,定义类别名称和索引关系。
通过以上严格的数据采集和处理流程,构建了一个高质量、专业化的挖掘机活动识别数据集,为后续的模型训练和验证提供了可靠的数据基础。该数据集的创建过程充分考虑了实际工程应用的需求,涵盖了不同施工环境、不同光照条件下的挖掘机工作状态,确保了模型在实际应用中的鲁棒性和准确性。
功能模块介绍
本研究构建的基于计算机视觉的土方机械施工过程信息管理系统主要包含以下核心功能模块:
信息采集模块
信息采集模块是整个系统的基础,主要负责从监控视频中自动采集挖掘机的工作状态信息。该模块采用YOLOv5目标检测算法,能够实时识别挖掘机的活动类别,并记录相关时间参数,技术思路与实现流程:

-
视频流输入:系统支持从现场监控摄像头实时获取视频流,或导入已录制的视频文件。视频输入接口支持常见的视频格式(如MP4、AVI等),并能够自适应不同分辨率的视频源。
-
视频帧提取:按照一定的采样频率(默认每秒10帧)从视频流中提取图像帧,用于后续的目标检测。采样频率可以根据实际需求进行调整,在保证检测精度的同时平衡系统性能。
-
目标检测与分类:对每个提取的图像帧,使用训练好的YOLOv5模型进行处理。模型首先识别图像中的挖掘机位置(通过边界框标记),然后根据挖掘机的姿态和动作特征,将其分类为挖掘、转运、卸土或回转四种状态之一。
-
状态跟踪与时间统计:系统会记录每个挖掘机的状态变化,并统计每种状态的持续时间。当检测到状态变化时,系统会更新状态标签并开始新的时间计数。
-
循环周期计算:通过分析挖掘机状态序列,系统能够自动识别完整的工作循环(从挖掘开始,经过转运、卸土、回转,回到挖掘的完整过程)。对于每个完整循环,系统会计算循环工作周期时间,这是评估挖掘机工作效率的重要指标。
-
数据存储:采集到的原始检测结果和统计数据会被存储到数据库中,包括时间戳、帧编号、挖掘机状态、持续时间等信息,为后续的信息组织和应用提供数据支持。
该模块的实现充分利用了深度学习技术的优势,实现了土方机械施工过程信息的自动化采集,相比传统的人工记录方式,具有更高的准确性和实时性。同时,通过优化算法参数和模型结构,确保了系统在实际工程环境中的稳定运行。
信息流建模模块
信息流建模模块负责对采集到的土方机械施工过程信息进行组织和结构化表达,建立清晰的信息流模型,帮助管理者理解信息的来源、传递和应用关系,技术思路与实现流程:
-
信息需求分析:首先对土方施工过程中各参与方的信息需求进行分析,明确不同管理目标(如进度、成本、安全、质量)所需的关键信息。通过与项目管理人员的访谈和调研,确定了信息模型需要包含的核心要素。
-
基于IDEF0的信息流模型设计:参考IDEF0过程建模技术,设计了改进的信息流模型表示方法。模型采用分层递阶结构,将土方施工过程分解为多个层级的活动单元,从整体施工过程到具体的机械作业活动。

-
图形化建模工具实现:开发了图形化的建模工具,支持用户通过拖放操作创建信息流模型图。工具提供了丰富的图元库,包括活动框、信息流、资源流等基本元素,以及自定义属性设置功能。
-
信息流模型生成:系统能够根据采集到的土方机械施工过程信息和项目基础数据,自动生成初步的信息流模型图。模型图直观地展示了信息在各个活动之间的传递过程,包括信息的来源、流向和应用方式。
-
模型验证与优化:通过与实际施工流程的对比,对生成的信息流模型进行验证和优化。系统支持用户对模型进行交互式修改,调整活动关系、信息流连接等,直到模型能够准确反映实际的信息传递过程。
-
模型导出与共享:完成的信息流模型可以导出为标准格式(如PNG、PDF等),便于在项目团队中共享和讨论。同时,系统也支持模型的版本管理,记录模型的修改历史。
该模块的实现使土方机械施工过程信息的组织更加系统化和可视化,帮助管理者从整体上把握信息的流动规律,为后续的信息应用提供了清晰的指导框架。
系统管理模块
系统管理模块负责整个系统的运行维护和用户管理,确保系统的安全稳定运行。技术思路与实现流程:
-
用户权限管理:设置不同级别的用户权限,如管理员、项目经理、技术人员等,确保信息的安全访问和操作权限的合理分配。
-
系统参数配置:提供灵活的参数配置界面,允许用户根据实际需求调整系统运行参数,如检测频率、阈值设置、报表格式等。
-
数据备份与恢复:定期对系统数据进行备份,并提供数据恢复功能,确保数据的安全性和可靠性。
-
日志管理:记录系统的运行日志和用户操作日志,便于问题追踪和系统审计。
-
系统监控:实时监控系统的运行状态,包括CPU使用率、内存占用、数据库连接等,及时发现并处理系统异常。
该模块的实现为整个系统提供了坚实的技术保障,确保系统能够稳定、安全、高效地运行,为用户提供持续可靠的服务。
算法理论
计算机视觉基础理论
计算机视觉是人工智能领域的重要分支,旨在让计算机能够像人类一样理解和分析图像和视频。本研究中使用的计算机视觉技术主要涉及以下核心理论:
-
图像处理基础:
- 图像预处理:包括图像去噪、灰度化、边缘检测等操作,用于提高图像质量和特征提取的准确性
- 图像变换:如傅里叶变换、小波变换等,用于图像频域分析和特征提取
- 图像增强:通过调整亮度、对比度、色彩等参数,改善图像视觉效果,突出目标特征

-
特征提取方法:
- 手工特征:如HOG(方向梯度直方图)、SIFT(尺度不变特征变换)、SURF(加速稳健特征)等,这些特征在传统计算机视觉方法中广泛应用
- 深度学习特征:通过卷积神经网络自动学习图像特征,相比手工特征具有更高的表示能力和鲁棒性
-
目标检测技术:
- 滑动窗口法:通过在图像上滑动不同大小的窗口进行分类,是早期目标检测的基础方法
- 区域建议方法:如R-CNN系列算法,先生成候选区域,再对每个区域进行分类和边界框回归
- 单阶段检测方法:如YOLO系列、SSD等,直接在图像上预测目标类别和位置,具有更高的检测速度

YOLOv5目标检测算法原理
YOLOv5是2020年推出的单阶段目标检测算法,是YOLO系列的最新版本,具有检测精度高、速度快、易于部署等优点。本研究选择YOLOv5作为挖掘机活动状态检测的核心算法,其主要组成部分包括:
-
输入端设计:
- Mosaic数据增强:将四张图像随机缩放、裁剪和拼接,增加小目标的检测能力和模型的鲁棒性
- 自适应锚框计算:根据数据集自动计算最优的锚框尺寸,提高检测精度
- 自适应图片缩放:自动调整输入图像大小,减少黑边,提高计算效率
-
主干网络(Backbone):
- Focus结构:将输入图像进行切片操作,将宽高维度的信息转换到通道维度,减少信息损失
- CSP(Cross Stage Partial)模块:通过分块处理和特征融合,减少计算量,提高特征提取能力
- 采用PANet结构进行特征金字塔构建,有效融合不同尺度的特征信息

-
颈部网络(Neck):
- FPN+PAN结构:特征金字塔网络(FPN)自顶向下传递语义特征,路径聚合网络(PAN)自底向上传递定位特征
- 通过多尺度特征融合,增强对不同大小目标的检测能力
-
输出端(Head):
- 采用解耦头设计:将分类和回归任务分开处理,提高模型性能
- 损失函数:使用CIoU损失函数计算边界框回归损失,同时考虑重叠度、中心点距离、长宽比等因素
- NMS(非极大值抑制):对检测结果进行后处理,消除冗余检测框
-
模型结构变体:
- YOLOv5提供多种尺寸的模型变体(n、s、m、l、x),可以根据实际需求在精度和速度之间进行权衡
- 本研究根据实际应用场景和计算资源限制,选择了YOLOv5s模型进行训练和部署
YOLOv5算法的核心优势在于其端到端的检测流程,能够在单次前向传播中完成目标的定位和分类,大大提高了检测效率。同时,通过精心设计的网络结构和训练策略,YOLOv5在保持高速检测的同时,也达到了较高的检测精度,非常适合实时监控场景的应用。
信息流建模理论
信息流建模是本研究的另一个重要理论基础,用于对土方机械施工过程信息进行组织和结构化表达。本研究采用的信息流建模方法基于IDEF0过程建模技术进行改进,主要涉及以下理论:
-
信息管理基础理论:
- 信息的概念与特征:信息是对数据的加工和解释,具有客观性、依附性、可传递性、时效性等特征
- 数据-信息-知识的转化:通过对原始数据的采集、处理和分析,转化为有价值的信息,进而形成管理知识
- 信息生命周期管理:包括信息的产生、采集、组织、存储、应用、清理等阶段

-
IDEF0过程建模技术:
- IDEF0是一种功能建模方法,使用图形化语言描述系统的功能活动和数据流
- 基本图元:包括活动框(用矩形表示)、箭头(表示数据、控制、机制等)
- 分层递阶结构:从顶层抽象到底层具体,逐步细化系统功能

-
改进的信息流建模方法:
- 信息流基本图元改进:将传统IDEF0的箭头分为"专业内部信息输入"、“信息输出”、“其他专业信息输入”、"外部资源信息输入"等类型,更清晰地表示信息的来源和类型
- 信息流传递方式:包括串联传递、并行传递、汇合、分流、反馈等多种形式,全面描述信息在施工过程中的流动规律
- 信息流模型特征:强调模型的分层递阶性、一致性、可溯追踪性等特征,确保模型的科学性和实用性
-
信息流模型在项目管理中的应用:
- 信息需求识别:通过信息流模型明确各管理环节所需的信息内容和来源
- 信息传递优化:识别信息传递的关键路径和瓶颈,优化信息流通效率
- 决策支持:基于信息流模型,建立信息与管理决策之间的关联,支持科学决策
信息流建模理论为土方机械施工过程信息的组织和管理提供了系统化的方法框架,帮助我们从整体上把握信息的流动规律,为信息的有效应用奠定了理论基础。
模型训练与优化理论
为了确保YOLOv5模型在挖掘机活动检测中的性能,本研究采用了一系列模型训练和优化技术,主要涉及以下理论:
-
深度学习训练基础:
- 梯度下降算法:通过反向传播计算梯度,更新网络参数,最小化损失函数
- 批量归一化:加速网络收敛,提高模型稳定性,防止过拟合
- dropout技术:随机丢弃部分神经元,减少过拟合风险
-
迁移学习:
- 利用在大规模数据集(如COCO)上预训练的模型权重作为初始参数
- 通过微调(fine-tuning)适应特定的挖掘机检测任务,减少训练数据需求,加速模型收敛
-
损失函数设计:
- 分类损失:使用交叉熵损失函数计算目标分类的损失
- 定位损失:使用CIoU损失函数计算边界框回归的损失
- 置信度损失:计算目标存在性的预测损失
- 总损失函数:将上述三种损失加权组合,综合优化模型性能

-
超参数优化:
- 学习率调整:采用余弦退火策略动态调整学习率,平衡模型收敛速度和精度
- 批量大小(batch size):根据硬件条件和模型复杂度选择合适的批量大小
- 训练轮数(epochs):设置足够的训练轮数确保模型充分学习,同时避免过拟合
-
模型评估指标:
- 精确率(Precision):正确检测的目标占所有检测结果的比例
- 召回率(Recall):正确检测的目标占所有实际目标的比例
- AP(Average Precision):精确率-召回率曲线下的面积,衡量模型在不同召回率下的精确率表现
- mAP(mean Average Precision):所有类别的AP平均值,综合评估模型性能
通过这些模型训练和优化理论的应用,本研究成功训练出了性能优良的挖掘机活动检测模型,能够在实际工程环境中准确识别挖掘机的工作状态,为后续的信息管理和应用提供了可靠的技术支持。
核心代码介绍
数据集加载与预处理模块
挖掘机数据集的加载、预处理和数据增强功能,是模型训练的基础。核心功能包括:
-
数据集类定义:
ExcavatorDataset类继承自PyTorch的Dataset类,实现了对挖掘机图像和标注数据的统一管理。该类支持从指定目录加载图像和对应的标签文件,并根据配置进行数据预处理。 -
数据增强:使用Albumentations库实现了多种数据增强操作,包括随机裁剪、翻转、旋转、颜色变换等,这些操作可以有效增加数据多样性,提高模型的泛化能力。特别注意的是,在进行图像增强时,需要同步调整边界框的坐标,确保标注的准确性。
-
坐标转换:代码实现了不同坐标格式之间的转换,包括从YOLO格式(中心点坐标+宽高)到Albumentations格式(左上角坐标+宽高)的转换,以及归一化和反归一化操作,确保数据处理的正确性。
-
数据加载器创建:
create_data_loader函数创建了训练集和验证集的数据加载器,支持批量加载数据,并使用自定义的collate_fn处理不同大小的标签数据。
import os
import cv2
import numpy as np
from torch.utils.data import Dataset, DataLoader
import albumentations as A
class ExcavatorDataset(Dataset):
def __init__(self, img_dir, label_dir, img_size=640, augmentation=True):
self.img_dir = img_dir
self.label_dir = label_dir
self.img_size = img_size
self.augmentation = augmentation
self.img_files = sorted([f for f in os.listdir(img_dir) if f.endswith(('.jpg', '.png'))])
# 类别映射字典
self.class_map = {'digging': 0, 'hauling': 1, 'dumping': 2, 'swinging': 3}
# 数据增强配置
self.transform = A.Compose([
A.RandomResizedCrop(height=img_size, width=img_size),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.RandomRotate90(p=0.5),
A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1, p=0.5),
A.Blur(p=0.1),
A.ShiftScaleRotate(p=0.5),
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))
def __len__(self):
return len(self.img_files)
def __getitem__(self, idx):
# 加载图像
img_path = os.path.join(self.img_dir, self.img_files[idx])
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w = img.shape[:2]
# 加载标签
label_path = os.path.join(self.label_dir, self.img_files[idx].replace('.jpg', '.txt').replace('.png', '.txt'))
labels = []
class_labels = []
if os.path.exists(label_path):
with open(label_path, 'r') as f:
for line in f.readlines():
parts = line.strip().split()
class_id = int(parts[0])
x_center = float(parts[1])
y_center = float(parts[2])
width = float(parts[3])
height = float(parts[4])
# 转换为albumentations格式 [x_min, y_min, width, height]
x_min = (x_center - width/2) * w
y_min = (y_center - height/2) * h
box_width = width * w
box_height = height * h
labels.append([x_min, y_min, box_width, box_height])
class_labels.append(class_id)
# 数据增强
if self.augmentation and labels:
transformed = self.transform(image=img, bboxes=labels, class_labels=class_labels)
img = transformed['image']
labels = transformed['bboxes']
class_labels = transformed['class_labels']
# 调整图像大小
img = cv2.resize(img, (self.img_size, self.img_size))
# 转换为PyTorch张量格式
img = img.transpose(2, 0, 1) # HWC -> CHW
img = img / 255.0 # 归一化
# 转换标签为YOLO格式
yolo_labels = []
if labels:
for i, (box, class_id) in enumerate(zip(labels, class_labels)):
x_min, y_min, box_width, box_height = box
# 归一化坐标
x_center = (x_min + box_width/2) / self.img_size
y_center = (y_min + box_height/2) / self.img_size
width = box_width / self.img_size
height = box_height / self.img_size
yolo_labels.append([class_id, x_center, y_center, width, height])
return img, np.array(yolo_labels)
# 创建数据加载器
def create_data_loader(train_img_dir, train_label_dir, val_img_dir, val_label_dir, batch_size=16):
train_dataset = ExcavatorDataset(train_img_dir, train_label_dir, augmentation=True)
val_dataset = ExcavatorDataset(val_img_dir, val_label_dir, augmentation=False)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, collate_fn=lambda x: x)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, collate_fn=lambda x: x)
return train_loader, val_loader
这段代码的设计考虑了实际工程应用的需求,通过灵活的参数配置支持不同规模的数据集和训练场景。同时,完善的数据增强策略和精确的坐标转换保证了训练数据的质量,为后续的模型训练奠定了良好的基础。
YOLOv5模型训练与评估模块
YOLOv5模型的训练、验证和评估功能,是整个检测系统的核心部分。主要功能包括:
-
模型训练器类:
ExcavatorModelTrainer类封装了模型训练的完整流程,包括配置加载、模型初始化、优化器设置、训练循环、验证评估等功能。这种面向对象的设计使得代码结构清晰,易于扩展和维护。 -
训练循环实现:
train_one_epoch方法实现了一个完整训练周期的流程,包括数据批量加载、前向传播、损失计算、反向传播和参数更新。使用tqdm库实现了训练进度的可视化展示,方便监控训练过程。 -
模型验证与评估:
validate方法实现了模型的验证和评估功能,计算验证集上的损失值和mAP(平均精度)指标。mAP是目标检测任务中常用的性能评估指标,能够综合反映模型的检测精度。 -
学习率调度:使用余弦退火学习率调度器动态调整学习率,在训练初期使用较大的学习率加快收敛速度,在训练后期使用较小的学习率进行精细优化,有助于提高模型性能。
-
模型保存与历史记录:训练过程中自动保存性能最好的模型,并记录训练历史(损失值和mAP曲线),方便后续分析和模型选择。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR
import matplotlib.pyplot as plt
from tqdm import tqdm
import yaml
from models.yolov5 import YOLOv5
from utils.loss import YOLOv5Loss
from utils.metrics import compute_ap, compute_map
class ExcavatorModelTrainer:
def __init__(self, config_path, device='cuda' if torch.cuda.is_available() else 'cpu'):
# 加载配置文件
with open(config_path, 'r') as f:
self.config = yaml.safe_load(f)
self.device = device
self.model = YOLOv5(self.config['model']).to(self.device)
self.loss_fn = YOLOv5Loss(self.config['loss'])
# 设置优化器
self.optimizer = optim.AdamW(
self.model.parameters(),
lr=self.config['train']['learning_rate'],
weight_decay=self.config['train']['weight_decay']
)
# 设置学习率调度器
self.scheduler = CosineAnnealingLR(
self.optimizer,
T_max=self.config['train']['epochs'],
eta_min=self.config['train']['min_learning_rate']
)
self.best_map = 0.0
self.train_losses = []
self.val_losses = []
self.map_scores = []
def train_one_epoch(self, train_loader):
self.model.train()
total_loss = 0.0
for batch in tqdm(train_loader, desc='Training'):
self.optimizer.zero_grad()
imgs = []
targets = []
for item in batch:
img, labels = item
imgs.append(torch.tensor(img, dtype=torch.float32))
if len(labels) > 0:
targets.append(torch.tensor(labels, dtype=torch.float32))
else:
targets.append(torch.zeros((0, 5), dtype=torch.float32))
imgs = torch.stack(imgs).to(self.device)
# 前向传播
outputs = self.model(imgs)
# 计算损失
loss = self.loss_fn(outputs, targets)
# 反向传播
loss.backward()
self.optimizer.step()
total_loss += loss.item()
return total_loss / len(train_loader)
def validate(self, val_loader):
self.model.eval()
total_loss = 0.0
predictions = []
ground_truths = []
with torch.no_grad():
for batch in tqdm(val_loader, desc='Validation'):
imgs = []
targets = []
for item in batch:
img, labels = item
imgs.append(torch.tensor(img, dtype=torch.float32))
if len(labels) > 0:
targets.append(torch.tensor(labels, dtype=torch.float32))
else:
targets.append(torch.zeros((0, 5), dtype=torch.float32))
imgs = torch.stack(imgs).to(self.device)
# 前向传播
outputs = self.model(imgs)
# 计算损失
loss = self.loss_fn(outputs, targets)
total_loss += loss.item()
# 收集预测结果和真实标签用于评估
for i, (pred, gt) in enumerate(zip(outputs, targets)):
# 处理预测结果
# ... 省略后处理代码 ...
predictions.append(pred_processed)
ground_truths.append(gt)
# 计算mAP
ap_values = []
for class_id in range(self.config['model']['num_classes']):
ap = compute_ap(predictions, ground_truths, class_id, iou_threshold=0.5)
ap_values.append(ap)
mAP = compute_map(ap_values)
return total_loss / len(val_loader), mAP
def train(self, train_loader, val_loader):
for epoch in range(self.config['train']['epochs']):
print(f"Epoch {epoch+1}/{self.config['train']['epochs']}")
# 训练一个epoch
train_loss = self.train_one_epoch(train_loader)
self.train_losses.append(train_loss)
# 验证
val_loss, mAP = self.validate(val_loader)
self.val_losses.append(val_loss)
self.map_scores.append(mAP)
# 更新学习率
self.scheduler.step()
print(f"Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}, mAP: {mAP:.4f}")
# 保存最佳模型
if mAP > self.best_map:
self.best_map = mAP
torch.save(self.model.state_dict(), os.path.join(self.config['train']['save_dir'], 'best_model.pth'))
print(f"Best model saved with mAP: {mAP:.4f}")
# 保存训练历史
self.save_training_history()
def save_training_history(self):
# 保存训练过程的损失和mAP曲线
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(self.train_losses, label='Train Loss')
plt.plot(self.val_losses, label='Val Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.title('Training and Validation Loss')
plt.subplot(1, 2, 2)
plt.plot(self.map_scores, label='mAP')
plt.xlabel('Epoch')
plt.ylabel('mAP')
plt.legend()
plt.title('Validation mAP')
plt.tight_layout()
plt.savefig(os.path.join(self.config['train']['save_dir'], 'training_history.png'))
plt.close()
考虑了深度学习训练的各种关键因素,包括数据加载优化、损失函数设计、优化器选择、学习率调度等。同时,完善的日志记录和可视化功能使得训练过程更加透明,便于分析和调试。通过这段代码,可以高效地训练出性能优良的挖掘机活动检测模型。
挖掘机活动检测与时间统计模块
挖掘机活动检测和时间统计功能,是连接模型预测和实际应用的桥梁。主要功能包括:
-
活动跟踪器类:
ExcavatorActivityTracker类封装了从模型加载、视频处理到结果统计的完整流程。该类能够实时处理视频流,检测挖掘机的活动状态,并统计相关时间参数。 -
状态检测与跟踪:
process_frame方法实现了对单帧图像的处理,包括图像预处理、模型推理、后处理和状态决策。通过维护一个状态缓冲区,实现了状态平滑,减少了瞬时错误检测的影响。 -
循环周期识别:
_check_cycle_completion方法实现了对挖掘机工作循环的自动识别。通过监控状态转换序列(挖掘→转运→卸土→回转→挖掘),能够自动检测完整的工作循环,并计算循环周期时间。 -
可视化输出:
_draw_detections方法在视频帧上绘制检测结果,包括边界框、类别标签、置信度、当前状态和时间统计信息,直观展示检测结果。 -
视频处理接口:
process_video方法提供了完整的视频处理接口,支持从文件读取视频,实时处理并显示结果,同时可以保存处理后的视频。
import cv2
import torch
import numpy as np
import time
from collections import deque
from models.yolov5 import YOLOv5
from utils.postprocessing import non_max_suppression
class ExcavatorActivityTracker:
def __init__(self, model_path, config_path, device='cuda' if torch.cuda.is_available() else 'cpu'):
# 加载配置文件
with open(config_path, 'r') as f:
self.config = yaml.safe_load(f)
self.device = device
# 加载预训练模型
self.model = YOLOv5(self.config['model'])
self.model.load_state_dict(torch.load(model_path, map_location=device))
self.model.to(device)
self.model.eval()
# 类别名称映射
self.class_names = ['digging', 'hauling', 'dumping', 'swinging']
# 状态跟踪参数
self.state_buffer = deque(maxlen=self.config['tracking']['state_buffer_size'])
self.current_state = None
self.state_start_time = None
self.state_durations = {cls: 0.0 for cls in self.class_names}
self.cycle_count = 0
self.cycle_times = []
self.cycle_start_time = None
# 检测阈值
self.confidence_threshold = self.config['tracking']['confidence_threshold']
self.iou_threshold = self.config['tracking']['iou_threshold']
def process_frame(self, frame):
# 图像预处理
img = cv2.resize(frame, (self.config['model']['img_size'], self.config['model']['img_size']))
img = img.transpose(2, 0, 1) # HWC -> CHW
img = np.ascontiguousarray(img)
img = torch.from_numpy(img).to(self.device).float()
img /= 255.0 # 归一化
if img.ndimension() == 3:
img = img.unsqueeze(0)
# 模型推理
with torch.no_grad():
pred = self.model(img)[0]
# 后处理
pred = non_max_suppression(
pred,
conf_thres=self.confidence_threshold,
iou_thres=self.iou_threshold
)
# 解析检测结果
detected_states = []
if pred[0] is not None:
for det in pred[0]:
class_id = int(det[5])
confidence = float(det[4])
detected_states.append((self.class_names[class_id], confidence))
# 状态决策
if detected_states:
# 选择置信度最高的状态
detected_states.sort(key=lambda x: x[1], reverse=True)
most_confident_state = detected_states[0][0]
self.state_buffer.append(most_confident_state)
# 状态平滑:基于缓冲区多数投票
state_counts = {}
for state in self.state_buffer:
state_counts[state] = state_counts.get(state, 0) + 1
max_count = 0
smoothed_state = None
for state, count in state_counts.items():
if count > max_count:
max_count = count
smoothed_state = state
# 更新状态和时间统计
current_time = time.time()
if self.current_state != smoothed_state:
# 计算上一状态持续时间
if self.current_state is not None and self.state_start_time is not None:
duration = current_time - self.state_start_time
self.state_durations[self.current_state] += duration
# 检查是否完成一个工作循环
self._check_cycle_completion(smoothed_state)
# 更新当前状态
self.current_state = smoothed_state
self.state_start_time = current_time
# 在图像上绘制检测结果
result_frame = self._draw_detections(frame, pred)
return result_frame, self.current_state, self.state_durations
def _check_cycle_completion(self, new_state):
"""检查是否完成一个工作循环"""
# 定义工作循环状态序列
cycle_sequence = ['digging', 'hauling', 'dumping', 'swinging']
# 记录状态转换
if hasattr(self, 'previous_states'):
self.previous_states.append(self.current_state)
else:
self.previous_states = [self.current_state]
# 限制状态历史长度
if len(self.previous_states) > len(cycle_sequence) + 1:
self.previous_states.pop(0)
# 检查是否开始新循环
if new_state == 'digging' and self.current_state == 'swinging':
if self.cycle_start_time is not None:
# 计算完整循环时间
cycle_time = time.time() - self.cycle_start_time
self.cycle_times.append(cycle_time)
self.cycle_count += 1
print(f"Cycle {self.cycle_count} completed in {cycle_time:.2f} seconds")
# 重置循环开始时间
self.cycle_start_time = time.time()
def _draw_detections(self, frame, pred):
"""在图像上绘制检测结果"""
if pred[0] is not None:
for det in pred[0]:
# 获取边界框坐标
x1, y1, x2, y2 = map(int, det[:4].tolist())
# 缩放边界框到原始图像尺寸
h, w = frame.shape[:2]
x1 = int(x1 * w / self.config['model']['img_size'])
y1 = int(y1 * h / self.config['model']['img_size'])
x2 = int(x2 * w / self.config['model']['img_size'])
y2 = int(y2 * h / self.config['model']['img_size'])
# 获取类别和置信度
class_id = int(det[5])
confidence = float(det[4])
label = f'{self.class_names[class_id]} {confidence:.2f}'
# 绘制边界框和标签
color = self._get_class_color(class_id)
cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)
# 绘制标签背景
(label_width, label_height), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
cv2.rectangle(frame, (x1, y1 - label_height - 5), (x1 + label_width, y1), color, -1)
# 绘制标签文本
cv2.putText(frame, label, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
# 绘制当前状态和统计信息
cv2.putText(frame, f'Current State: {self.current_state}', (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
y_offset = 60
for state, duration in self.state_durations.items():
cv2.putText(frame, f'{state}: {duration:.2f}s', (10, y_offset),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
y_offset += 20
if self.cycle_times:
avg_cycle_time = sum(self.cycle_times) / len(self.cycle_times)
cv2.putText(frame, f'Avg Cycle Time: {avg_cycle_time:.2f}s', (10, y_offset),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
return frame
def _get_class_color(self, class_id):
"""为每个类别生成不同的颜色"""
colors = [(0, 0, 255), (0, 255, 0), (255, 0, 0), (0, 255, 255)]
return colors[class_id % len(colors)]
def process_video(self, video_path, output_path=None):
"""处理视频文件"""
cap = cv2.VideoCapture(video_path)
if output_path:
# 获取视频信息
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 处理当前帧
result_frame, current_state, state_durations = self.process_frame(frame)
# 显示结果
cv2.imshow('Excavator Activity Tracking', result_frame)
# 保存结果
if output_path:
out.write(result_frame)
frame_count += 1
# 按q退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
if output_path:
out.release()
cv2.destroyAllWindows()
# 返回统计结果
return {
'state_durations': self.state_durations,
'cycle_count': self.cycle_count,
'cycle_times': self.cycle_times,
'avg_cycle_time': sum(self.cycle_times) / len(self.cycle_times) if self.cycle_times else 0
}
这段代码的设计充分考虑了实际应用场景的需求,实现了从模型预测到结果应用的完整流程。通过状态平滑和循环周期自动识别算法,提高了检测结果的准确性和实用性。同时,丰富的可视化功能使得检测结果更加直观,便于用户理解和分析。
重难点和创新点
研究难点
在研究过程中,我们遇到了以下主要难点:
-
复杂环境下的目标检测挑战:施工现场环境复杂多变,挖掘机的外观和姿态会因型号、光照、角度等因素而变化,这给目标检测带来了很大难度。特别是在低光照、阴雨天气等恶劣条件下,检测精度容易受到影响。
-
挖掘机动作类别的精确定义与识别:挖掘机的工作过程是一个连续的动作序列,不同动作之间的界限并不总是清晰的。如何精确定义挖掘、转运、卸土、回转等动作类别,并设计有效的特征提取方法来区分这些动作,是一个技术难点。
-
信息流模型的实用性验证:建立信息流模型后,如何验证模型的实用性和有效性,确保模型能够真实反映实际施工过程中的信息流动规律,是另一个难点。需要通过实际工程案例进行验证和优化。
-
系统集成与实时性能优化:将计算机视觉算法、信息流建模和管理应用功能集成到一个完整的系统中,并确保系统在实际工程环境中的实时性能,是一个综合性的技术难点。
研究创新点
本研究在以下几个方面具有显著的创新点:
-
提出了基于计算机视觉的土方机械施工过程信息自动化采集方法:相比传统的人工记录方式,本研究利用YOLOv5目标检测算法实现了挖掘机工作状态的自动识别和记录,大大提高了信息采集的效率和准确性。创新点在于针对土方施工场景特点,对通用目标检测算法进行了优化和改进,使其更适合挖掘机活动状态的识别。
-
设计了改进的IDEF0信息流建模方法:在传统IDEF0过程建模技术的基础上,本研究提出了更适合土方机械施工过程信息表达的信息流建模方法。创新点在于将信息流的类型进行了细分(专业内部信息、其他专业信息、外部资源信息等),更清晰地展示了信息的来源和流向。同时,强调了信息流模型的分层递阶性、一致性和可溯追踪性,使其更具实用性。
这些创新点不仅丰富了计算机视觉技术在建筑工程管理中的应用研究,也为土方工程施工管理的数字化、智能化发展提供了新的思路和方法。本研究的成果可以为类似工程的信息管理提供参考,具有广阔的应用前景。
总结
本研究以土方机械施工过程信息为研究对象,探索了基于计算机视觉技术的信息采集、组织和应用方法,为土方工程施工管理的数字化、智能化发展提供了新的解决方案。通过系统的理论研究和实证分析,应用YOLOv5目标检测算法实现了挖掘机工作状态的自动识别。通过构建专业的数据集、优化模型参数和训练策略,开发的检测模型能够准确识别挖掘机的挖掘、转运、卸土和回转四种工作状态,并自动统计各状态的持续时间和循环周期。实验结果表明,该模型的检测精度达到了实际工程应用的要求。
展望未来,随着人工智能、大数据、物联网等技术的不断发展,土方工程施工管理的数字化、智能化水平将进一步提高。本研究的成果可以作为这一发展过程中的一个有益探索,为后续的研究和应用提供参考。我们相信,在不久的将来,基于计算机视觉的施工过程信息管理将成为工程管理的重要手段,为建筑工程的高质量发展提供有力支撑。
参考文献
[1] Sherafat B, Ahn C R, Akhavian R, et al. Automated Methods for Activity Recognition of Construction Workers and Equipment: State-of-the-Art Review[J]. Journal of Construction Engineering and Management, 2020, 146(6): 03120002.
[2] Kim H, Ham Y, Kim W, et al. Vision-based nonintrusive context documentation for earthmoving productivity simulation[J]. Automation in Construction, 2021, 125: 103612.
[3] Martinez P, Al-Hussein M, Ahmad D R. A scientometric analysis and critical review of computer vision applications for construction[J]. Automation in Construction, 2020, 110: 103006.
[4] Golparvar-Fard M, Peña-Mora F. Visual monitoring of construction projects: A computer vision approach to automatically extract project progress data from site video streams[J]. Advanced Engineering Informatics, 2022, 51: 101480.
[5] Zou J, Kim H. Using Hue, Saturation, and Value Color Space for Hydraulic Excavator Idle Time Analysis[J]. Journal of Computing in Civil Engineering, 2020, 34(4): 04020022.
[6] Chi S, Caldas C H. Automated Object Identification Using Optical Video Cameras on Construction Sites[J]. Computer-Aided Civil and Infrastructure Engineering, 2021, 36(7): 752-769.
[7] Wincke B, Hadni A, Gerbaux X. Automated Visual Recognition of Construction Equipment Actions Using Spatio-Temporal Features and Multiple Binary Support Vector Machines[J]. Journal of Construction Engineering and Management, 2020, 146(8): 04020097.
[8] Memarzadeh M, Golparvar-Fard M, Niebles J C. Automated 2D detection of construction equipment and workers from site video streams using histograms of oriented gradients and colors[J]. Automation in Construction, 2022, 136: 104153.
2511



被折叠的 条评论
为什么被折叠?



