首页 > 其他分享 >基于深度学习的舰船检测与识别系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

基于深度学习的舰船检测与识别系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

时间:2024-04-05 16:34:49浏览次数:22  
标签:训练 检测 模型 舰船 YOLOv8 v5 v7 类别

摘要:本文深入研究了基于YOLOv8/v7/v6/v5的舰船检测与识别系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Streamlit的交互式Web应用界面设计。在Web网页中可以支持图像、视频和实时摄像头进行舰船检测与识别,可上传不同训练模型(YOLOv8/v7/v6/v5)进行推理预测,界面可方便修改。本文附带了完整的网页设计、深度学习模型代码和训练数据集的下载链接。

目录

➷点击跳转至文末所有涉及的完整代码文件下载页☇


完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频https://www.bilibili.com/video/BV11M4m1X771/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2akplr
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5dq
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5pu
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm55u

        若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:


1. 网页功能与效果

        (1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中舰船小目标的检测。系统将自动识别并分析画面中的舰船小目标,并将检测结果实时显示在用户界面上,为用户提供即时的反馈。

        (2)选择图片检测:用户可以上传本地的图片文件到系统中进行舰船小目标识别。系统会分析上传的图片,识别出图片中的舰船小目标,并在界面上展示带有舰船小目标标签和置信度的检测结果,让用户能够清晰地了解到每个舰船小目标状态。

        (3)选择视频文件检测:系统支持用户上传视频文件进行舰船检测与识别。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的舰船小目标。用户可以观看带有舰船检测与识别标记的视频,了解视频中舰船小目标的变化。

        (4)选择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行舰船小目标识别。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。

        本系统还集成了一系列高级功能,以提高用户的使用体验和检测效率。用户可以在检测画面中同时或单独显示检测画面和原始画面,便于直观比较检测结果与实际情况。通过可点击的下拉框,用户能够单独标记特定目标并显示结果,这一点对于关注特定类型目标的用户来说极其有用。所有的检测结果都会在页面的表格中显示,用户还可以根据需要动态调整检测算法的置信度阈值和IOU阈值,以优化检测结果的精度和召回率。

        为了方便用户进一步分析和记录检测结果,本系统支持点击按钮将检测的表格结果输出到csv文件。此外,所有标记的图片、视频、摄像头画面结果都可以导出为avi图像文件,方便用户保存和分享检测结果。这些高级功能的设计,旨在为用户提供一个全面、灵活、易用的舰船检测与识别工具,满足不同用户在不同应用场景下的需求。


2. 绪论

2.1 研究背景及意义

        舰船检测与识别作为计算机视觉领域中的重要问题,具有广泛的应用前景和深远的社会意义。随着航运业的发展和海上活动的增加,对舰船进行实时、准确的检测与识别成为了海上安全、海洋监测、海事管理等领域的迫切需求。舰船检测与识别系统的研究不仅能够为航行员提供实时的航行安全警告,还能够为海事管理部门提供有效的海上监控手段,进而提升海上交通的安全性和管理效率。

        在过去的几年中,深度学习技术的快速发展为舰船检测与识别系统的研究带来了巨大的机遇和挑战。目标检测算法的不断进步,特别是像YOLOv8、YOLOv7、YOLOv6、YOLOv5等基于深度学习的模型的涌现,极大地提升了舰船检测与识别系统的性能和效率。与传统的目标检测方法相比,这些新型算法在速度、准确性和适应性方面都有了显著的改进,为实现实时舰船检测与识别提供了更可行的解决方案。

        在国内外,许多研究机构和学者都积极投入到舰船检测与识别系统的研究中。国外研究者通常关注于新型算法的提出和性能优化,以提高检测速度和准确性。例如,一些最新的研究工作将注意力机制和多尺度特征融合技术引入到目标检测模型中,以提高舰船检测的精度和鲁棒性。同时,国内的研究者也在积极探索舰船检测与识别系统在海事监测、边境安全等方面的应用。他们倾向于结合国内实际需求,针对不同场景和环境进行优化和改进,以满足国内海上安全管理的需求。

        然而,尽管目前已取得了一定的研究进展,但舰船检测与识别系统仍面临诸多挑战。例如,海上环境复杂多变,舰船的外观特征各异,加之天气、光照等因素的影响,导致舰船检测与识别系统在实际应用中容易受到干扰。此外,现有的数据集通常规模较小且缺乏多样性,难以满足模型的训练需求。因此,如何进一步提高舰船检测与识别系统的性能和鲁棒性,仍是当前研究的重点和挑战之一。

        综上所述,通过对舰船检测与识别系统的研究,我们旨在利用最新的深度学习技术,设计和开发出高效、准确、鲁棒的舰船检测与识别系统,以应对海上安全管理和海事监测等领域的挑战。同时,本文旨在对舰船检测与识别领域的研究现状进行全面梳理,提出解决方案,并对现有技术和数据集进行深入分析和评估,以期为相关研究提供新的思路和方法。

2.2 国内外研究现状

        在目前的研究背景下,舰船检测与识别领域正处于快速发展之中,众多学者和研究机构投入大量资源进行探索。近年来,随着深度学习技术的进步,尤其是在计算机视觉领域,一系列新型算法被提出并应用于小目标检测任务中,显著提高了检测的准确率和实时性。YOLO[1]系列作为实时目标检测的代表算法,经历了从YOLOv1到YOLOv8的发展历程。其中,YOLOv4和其后的版本在性能上取得了显著提升。YOLOv4通过引入更多的数据增强技术、更深的网络结构和新的特征融合策略,大幅提高了检测的准确度和速度。随后,YOLOv5[2]在易用性和速度上进一步优化,尽管它并非官方版本,但因其出色的性能和广泛的社区支持成为了业界的热点。YOLOv6[3]和YOLOv7[4]分别围绕模型的轻量化和进一步的性能提升进行设计,特别是在小目标检测上的表现。而最新的YOLOv8[5]则在此基础上进一步强化了模型的泛化能力和检测效率,使其在舰船检测与识别等复杂场景中表现更加出色。

        Transformer-based模型,如Vision Transformer (ViT)[6]和DEtection TRansformer (DETR),通过引入自注意力机制,有效地处理了目标检测中的长距离依赖问题。ViT通过将图像分割成序列化的小块并利用Transformer[7]结构进行处理,展现了在图像分类任务中的巨大潜力,其思想也被进一步扩展到目标检测任务中。DETR则直接利用Transformer结构来预测目标的边界框和类别,摒弃了传统目标检测中的锚框和非极大值抑制步骤,简化了检测流程,对小目标检测尤其有效。

        Glod-YOLO和MMDetection代表了目标检测算法的最新进展。Glod-YOLO对YOLO模型进行了深度定制和优化,特别针对光照变化、遮挡等复杂环境下的小目标检测进行了改进。MMDetection作为一个开源的检测工具箱,集成了包括YOLOv8、Faster R-CNN、RetinaNet在内的多种最新目标检测算法,提供了丰富的API和模型配置,支持快速实验和研究不同算法在特定任务上的表现。

        除了YOLO系列和ViT,其他算法如Faster R-CNN、RetinaNet以及最近的DETR (Detection Transformer) 也对小目标检测有着不俗的表现。Faster R-CNN通过引入区域建议网络(RPN),在保持较高准确率的同时,相较于其前身实现了更快的检测速度。RetinaNet通过引入Focal Loss来解决类别不平衡问题,有效提升了小目标的检测精度。DETR则摒弃了传统的锚框思想,直接利用Transformer的编码器-解码器结构进行目标检测,展示了良好的潜力。

        总之,随着计算机视觉和机器学习技术的不断进步,目标检测算法在舰船检测与识别任务中取得了显著的成就。通过不断的算法创新和技术改进,研究人员和工程师们正在向着更高的检测精度、更快的处理速度和更好的适应性迈进。尽管存在挑战,但未来在这一领域的研究仍然充满希望和可能。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        要解决的问题与解决方案:

  1. 模型准确性和速度

    • 本系统首要任务是提高舰船检测与识别的准确性和速度。针对舰船在不同环境下的多样性和快速变化,我们采用YOLOv8/v7/v6/v5等深度学习模型作为核心算法,并通过PyTorch框架进行训练和推理,以提高检测的准确性和处理速度。
  2. 环境适应性和模型泛化能力

    • 考虑到舰船检测与识别场景的多样性和复杂性,我们致力于提升系统的环境适应性和模型泛化能力。通过更新数据集、优化模型结构和训练策略,使得模型能够在不同光照、天气和背景条件下保持高准确率的检测能力。
  3. 用户交互界面的设计

    • 我们设计了基于Streamlit的交互式Web应用界面,提供舰船检测与识别功能。该界面支持上传图片、视频和实时摄像头进行检测,并可以方便地切换不同的训练模型(YOLOv8/v7/v6/v5)。通过美化CSS和深度学习算法的集成,实现了界面的直观性和功能性。
  4. 数据处理能力和存储效率

    • 由于舰船检测与识别涉及大量的图像和视频数据,我们采用高效的数据处理技术和存储机制,确保系统具备强大的数据处理能力和高效的存储效率。同时,我们注重数据的安全性和隐私保护,保障用户数据的安全。
  5. 系统的可扩展性和维护性

    • 为了应对科研和实际需求的变化,我们设计系统具备良好的可扩展性和维护性。系统支持无缝集成新的模型或功能,并且能够持续稳定运行,及时更新和升级,以满足用户不断变化的需求。

        通过以上解决方案,我们致力于打造一个高效准确、用户友好、安全可靠的基于YOLOv8/v7/v6/v5的舰船检测与识别系统,以满足不同场景下的实际应用需求。

2.3.2 解决方案

        拟采用的解决方案:

  1. 深度学习模型的选择和优化

    • 我们选择了基于YOLOv8/v7/v6/v5等深度学习模型作为核心算法,通过PyTorch框架进行模型训练和推理。这些模型在速度和准确度上都有良好的表现,尤其适用于实时舰船检测与识别任务。
    • 数据增强技术:我们将采用多种数据增强技术,如随机裁剪、缩放、旋转和色彩调整等,以提高模型的泛化能力。
    • 迁移学习:利用预训练的YOLOv8/v7/v6/v5模型进行迁移学习,针对舰船检测与识别任务进行微调,以加速训练过程并提高模型的检测性能。
  2. 技术框架和开发工具

    • PyTorch框架:作为深度学习框架的选择,PyTorch提供了灵活的编程环境和强大的GPU加速能力,适合快速开发和迭代深度学习模型。
    • Streamlit与PyCharm:我们将使用Streamlit构建基于Web的交互式应用界面,结合PyCharm作为开发工具,实现系统的快速开发和调试。
    • CSS美化:通过CSS技术对Web界面进行美化和风格定制,提升用户体验。
  3. 功能实现和系统设计

    • 多输入源支持:设计系统以支持多种输入源,包括图片、视频和实时摄像头捕获,以满足不同使用场景的需求。
    • 模型切换功能:实现动态模型切换功能,允许用户根据不同的需求选择不同的训练模型,增加系统的灵活性和适用范围。
    • 用户界面设计:通过Streamlit构建直观、功能丰富的用户界面,包括图片、视频、摄像头的检测功能以及切换不同模型文件等功能。
  4. 数据处理和存储策略

    • 高效数据处理:利用PyTorch的数据加载和预处理机制,实现高效的数据处理流程,确保系统的实时性能。
    • 智能数据存储:设计高效的数据存储方案,对检测结果和历史数据进行组织和索引,以便进行查询和分析。
  5. 性能优化和系统测试

    • 性能调优:通过对模型和系统进行性能分析,识别瓶颈并进行针对性的优化,如模型压缩、硬件加速等。
    • 全面测试:进行全面的系统测试,包括单元测试、功能测试和压力测试,确保系统的稳定性和可靠性。

        通过上述方法的实施,我们致力于开发出一个准确、高效且易用的基于YOLOv8/v7/v6/v5的舰船检测与识别系统,以满足不同用户在不同场景下的实际需求,同时提供良好的用户体验和可靠的性能表现。。

2.4 博文贡献与组织结构

        本文详细探讨了基于YOLOv8/v7/v6/v5的舰船检测与识别系统,全面介绍了从文献综述、数据集处理、算法选择与优化,到交互式Web界面的设计、算法性能对比,以及完整的数据集和代码资源。本文的主要贡献如下:

  1. 深入文献综述:本文提供了一个关于舰船检测与识别的全面文献综述,详细分析了当前领域内的研究现状和技术挑战,为研究者提供了宝贵的参考信息。

  2. 数据集处理与优化:介绍了针对舰船检测与识别任务的数据集处理技术,包括数据增强、清洗和标注方法,以提高模型的泛化能力和检测精度。

  3. 算法选择与性能优化:详细比较了YOLOv8/v7/v6/v5等深度学习模型在舰船检测与识别任务中的应用,突出了各自的优势与改进策略,提出了针对性的优化措施,以实现更高的检测精度和实时性。

  4. 交互式Web界面设计:基于Streamlit框架设计了一个美观友好的Web界面,支持用户通过图片、视频和实时摄像头进行小目标检测,同时提供了模型切换功能,增强了系统的可用性和灵活性。

  5. 实验结果与系统实现:展示了YOLOv7/v6/v5等算法在实际舰船数据集上的性能对比,验证了所提优化策略的有效性。同时,详细介绍了系统的设计与实现过程,提供了完整的数据集和代码资源包,便于研究者和开发者复现和进一步研究。

        后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在舰船小目标识别中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在舰船小目标识别任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的舰船小目标识别系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。


3. 数据集处理

        我们的舰船检测与识别系统所使用的数据集包含训练集、测试集和验证集,分别包含不同类别的舰船图像。以下是数据集的具体信息:

  • 训练集(Train):包含4022张舰船图像,用于深度学习模型的训练。训练集中的舰船图像涵盖了不同种类的舰船,包括A型、浮标、货轮、游轮、渔船和军舰等。
  • 测试集(Test):包含573张舰船图像,用于评估训练模型的性能和准确度。
  • 验证集(Validation):包含1130张舰船图像,用于在训练过程中验证模型的泛化能力和准确性。
Chinese_name = {'a': "A型", 'buoy': "浮标", 'container': "货轮", 'cruise': "游轮", 'fish-b': "渔船", 'warship': "军舰"}

        总共,我们的数据集包含5725张舰船图像,涵盖了多个类别的舰船。

        在数据集的预处理和增强处理方面,我们采取了多种技术来增强数据的多样性和模型的鲁棒性。预处理步骤包括图像尺寸调整、归一化等操作,以确保输入模型的统一性。而增强处理则包括随机裁剪、旋转、水平翻转、色彩调整等操作,以模拟不同环境下的舰船图像,提高模型的泛化能力。

        每张舰船图像都附带有相应的标签信息,用于指示图像中舰船的类别。我们根据舰船的特征和功能,将舰船分为不同的类别,包括A型、浮标、货轮、游轮、渔船和军舰等。这些标签信息对于训练和评估模型的性能至关重要,能够帮助模型准确地识别不同类别的舰船。

        
这四张图分别展示了目标检测数据集中不同维度的数据分布情况。我会根据每张图表的内容给出详细的分析。

  1. 第一张图表是一个柱状图,展示了不同类别对象的实例数。其中类别 'a' 的实例数最多,超过1200个实例。然后是 'buoy'(浮标)和 'container'(集装箱),两者的实例数接近,分别略高于和略低于800个实例。'cruise'(游轮)的实例数约为600个,而 'fish-b'(可能是一种鱼类)和 'warship'(军舰)的实例数相对较少,特别是 'warship' 类别,实例数最少,不到200个。

  2. 第二张图表是一个热力图,显示了对象在图像中的位置分布。可以看到,对象大多集中在图像的中心区域,这意味着在数据集中,目标对象往往位于图像的中心。

  3. 第三张图表是一个箱线图,表示对象的比例宽度和高度。从箱线图可以看出,大多数对象的宽度和高度比例分布在较窄的范围内,宽度大多集中在0.1至0.3之间,而高度则更为集中,大多数分布在0.2以下。

  4. 第四张图表是两个散点图,分别显示了对象的规范化宽度和高度分布。从图中可以看出,大多数对象的宽度较小,集中在0.1左右,而高度则更加集中,大多数对象的规范化高度小于0.1。

        综合以上分析,可以得出以下几点结论:

  • 数据集中存在类别不平衡的情况,某些类别(如 'a')的实例远远多于其他类别(如 'warship')。
  • 目标对象倾向于出现在图像的中央位置。
  • 对象的尺寸分布相对集中,特别是高度,这可能表明图像中的对象距离摄像机有相对固定的距离,或者是由于数据采集时的某种偏好或限制。
  • 数据集中的对象通常宽度较窄,高度更矮。

        这些结论对于理解数据集的特性以及在进行目标检测模型训练时应考虑的因素非常重要。比如,对于类别不平衡问题,可以采用过采样、权重调整等策略来增强模型对少数类别的识别能力。同时,由于对象大多集中在图像中心,这可能意味着模型可能不需要过于关注图像的边缘区域,但这也可能导致模型对边缘区域的对象检测不足,因此可能需要对数据集进行扩充以提高模型的泛化能力。

        在对象尺寸的分布上,由于大部分对象的尺寸较小且集中,模型可能需要对小尺寸对象有更好的识别能力,同时考虑到尺寸的这种集中趋势,可以在模型训练时采用相应的尺寸归一化处理,以提高检测精度。

        对于数据集中的具体类别和对象尺寸的进一步分析,还需要更详细的统计信息,例如各类别的平均尺寸,以及是否有可能的异常值或者噪声数据,这些都是在准备数据和训练模型前应该仔细考虑的问题。

image

        最终,我们通过这一丰富而精准的数据集,为舰船检测与识别技术的发展打下了坚实的基础。高度不平衡的类别分布和对小尺寸目标的侧重点,为我们提出了挑战,同时也指导了我们在模型训练和算法设计方面的努力方向。

4. 原理与代码介绍

4.1 YOLOv8算法原理

        YOLOv8算法是目前先进的目标检测框架之一,其设计理念在于通过高效的网络结构实现快速而精准的目标检测。YOLOv8的网络架构采用了Neck和Head的分离设计,这意味着特征提取(Backbone)和目标检测(Head)两个过程被明确区分,从而优化了每个部分的性能。

         在特征提取阶段,YOLOv8继承并发展了YOLOv5和YOLOv7的设计思想,采用CSPNet结构作为其Backbone,CSPNet的优势在于减少计算重复性,同时保持了丰富的渐进式特征。这种结构通过跨阶段部分网络(CSP)的方式,降低了计算量并改进了特征传播效率。这一点在处理大量图像数据时特别重要,因为它能够有效地减少计算资源消耗,同时保持或提升检测性能。

        YOLOv8的Neck部分采用了SPP(Spatial Pyramid Pooling)和FPN(Feature Pyramid Networks)的结合,这在多尺度目标检测中尤为关键。SPP能够在不同尺度下提取有效的上下文信息,而FPN通过多尺度特征融合增强了模型对不同大小目标的检测能力。SPP通过最大池化操作捕获不同尺度的特征,而FPN则通过自顶向下和自底向上的路径加强了特征之间的连接。。

        此外,YOLOv8在损失函数上也进行了创新,采用了Distribution Focal Loss和CIoU Loss。Distribution Focal Loss对于不平衡数据分布具有更好的鲁棒性,它能够减少易分样本对损失函数的贡献,更专注于难以识别的样本。CIoU Loss则更加关注边界框的几何精度,不仅考虑了预测框和实际框的重叠面积,还考虑了它们的中心点距离和形状相似度,这有助于在边界框回归任务中获得更高的精度。

4.2 模型构建

        在我们的舰船检测与识别系统中,YOLOv8v5Model.py文件承载了构建和操作模型的核心逻辑。这个脚本精巧地封装了加载预训练模型、执行预测、处理图像等关键步骤,以便对航拍图像中的小目标进行准确快速的检测。首先,脚本引入了各种必需的库,其中OpenCV库处理图像和视频数据,PyTorch库提供深度学习模型的实现,而从QtFusion.models导入的Detector类为我们的模型提供了抽象基类。ultralytics库的YOLO类负责加载和使用YOLO模型进行目标检测,而torch_utils提供的select_device函数则用于智能选择运行模型的设备。

import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device

        我们的模型初始化中设定了一系列参数,包括处理设备、置信度阈值和IOU阈值。这些参数的设定直接关系到模型的性能和预测结果的准确度。IOU阈值用于非最大抑制(NMS)过程,帮助减少重叠的预测框,而置信度阈值则确定了预测必须达到多少置信度才被视为有效。

device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
    'device': device,
    'conf': 0.25,
    'iou': 0.5,
    'classes': None,
    'verbose': False
}

        count_classes函数用于统计每个类别的检测数量。它接受检测信息和类别名称列表作为输入,并返回一个与类别名称列表相对应的计数列表。这个功能对于分析模型在不同类别上的表现非常有用。

def count_classes(det_info, class_names):
    count_dict = {name: 0 for name in class_names}
    for info in det_info:
        class_name = info['class_name']
        if class_name in count_dict:
            count_dict[class_name] += 1
    count_list = [count_dict[name] for name in class_names]
    return count_list

        YOLOv8v5Detector类封装了模型的行为,包括模型加载、图像预处理、预测和后处理。模型加载功能选择适当的设备并加载预训练的YOLO模型,以确保可以立即进行目标检测。预处理功能在当前实现中直接返回传入的图像,但为未来可能的图像转换留出了空间。预测功能是模型的核心,它接受输入图像并使用YOLO模型产生检测结果。这个过程将图像中潜在的每个目标封装为一系列预测结果,其中包括类别、边界框和置信度分数。后处理函数进一步解析YOLO模型的原始输出,将其转换成一种更加结构化和可读性强的格式。这个步骤至关重要,因为它使最终用户能够轻松理解和使用模型的预测结果。

class YOLOv8v5Detector(Detector):
    def __init__(self, params=None):
        super().__init__(params)
        self.model = None
        self.img = None
        self.names = list(Chinese_name.values())
        self.params = params if params else ini_params
	def load_model(self, model_path):
	    self.device = select_device(self.params['device'])
	    self.model = YOLO(model_path)
	    names_dict = self.model.names
	    self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
	    self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
	def preprocess(self, img):
	    self.img = img
	    return img
	
	def predict(self, img):
	    results = self.model(img, **ini_params)
	    return results
	
	def postprocess(self, pred):
	    results = []
	    for res in pred[0].boxes:
	        for box in res:
	            class_id = int(box.cls.cpu())
	            bbox = box.xyxy.cpu().squeeze().tolist()
	            bbox = [int(coord) for coord in bbox]
	            result = {
	                "class_name": self.names[class_id],
	                "bbox": bbox,
	                "score": box.conf.cpu().squeeze().item(),
	                "class_id": class_id,
	            }
	            results.append(result)
	    return results
	    
    def set_param(self, params):
        self.params.update(params)

        最后,提供了一个设置参数的方法,允许用户在运行时根据需求调整模型的置信度和IOU阈值。这意味着用户可以动态调整模型的行为,以获得更好的检测效果,例如,在精确度更重要的情况下提高置信度阈值,或者在召回率更重要时降低它。

        整个代码的设计考虑了易用性和灵活性,使得不同背景的用户都能高效地使用这个模型,并且能够根据他们的具体需求调整模型参数。通过提供一个结构化、面向对象的代码组织方式,这个脚本不仅便于维护和扩展,而且还能为最终用户提供一条清晰明了的路径来执行舰船小目标的检测任务。

4.3 训练代码

        在本篇博客中,我们将探讨如何使用YOLOv8模型来训练一个舰船小目标识别系统。这一过程不仅涉及到深度学习模型的加载和初始化,还包括数据集的准备以及训练参数的配置。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数 设置 说明
学习率(lr0 0.01 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf 0.01 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum 0.937 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay 0.0005 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs 3.0 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch 16 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz 640 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        环境设置与模型加载:首先需要导入必要的库,以便在训练过程中使用它们的功能。

import os
import torch
import yaml
from ultralytics import YOLO  # 用于加载YOLO模型
from QtFusion.path import abs_path  # 用于获取文件的绝对路径

        这些库提供了文件路径操作、深度学习功能和模型加载的能力。特别是ultralytics库中的YOLO类,这是我们训练YOLO模型的核心工具。

        接下来,我们根据当前系统是否支持CUDA(即NVIDIA GPU加速)来设置设备变量。这一步对于加速训练过程至关重要。

device = "0" if torch.cuda.is_available() else "cpu"

        数据集准备:我们首先设置了工作线程和批量大小,这些参数会影响数据加载的速度和内存使用。这里,workers指定了用于数据加载的工作线程数量,batch则设置了每个批次的图像数量。

workers = 1  # 工作进程数
batch = 8  # 每批处理的图像数量

        为了正确地加载和处理训练数据,我们需要指定数据集配置文件的路径:

data_name = "AerialAirportDetection"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')

        这段代码构建了数据集配置文件的路径,并使用abs_path函数转换为绝对路径,以避免路径相关的错误。
        紧接着,我们对数据集配置文件进行了一系列的读取和修改操作,以确保它指向正确的数据目录:

directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

if 'path' in data:
    data['path'] = directory_path
    with open(data_path, 'w') as file:
        yaml.safe_dump(data, file, sort_keys=False)

        训练模型:在数据集配置就绪后,我们加载了预训练的YOLO模型,并设置了任务类型为detect,准备开始训练。在这里,我们传递了所有必要的参数,包括图像大小imgsz,训练轮数epochs和训练任务的名称。此训练任务将执行120个时期的训练,这是一个在实践中通常需要根据实际情况调整的参数。

model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect')  # 加载预训练的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt')  # 加载预训练的YOLOv8模型
# Training.
results = model.train(  # 开始训练模型
    data=data_path,  # 指定训练数据的配置文件路径
    device=device,  # 自动选择进行训练
    workers=workers,  # 指定使用2个工作进程加载数据
    imgsz=640,  # 指定输入图像的大小为640x640
    epochs=120,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v5_' + data_name  # 指定训练任务的名称
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')  # 加载预训练的YOLOv8模型
results2 = model.train(  # 开始训练模型
    data=data_path,  # 指定训练数据的配置文件路径
    device=device,  # 自动选择进行训练
    workers=workers,  # 指定使用2个工作进程加载数据
    imgsz=640,  # 指定输入图像的大小为640x640
    epochs=120,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v8_' + data_name  # 指定训练任务的名称
)

        通过上述过程,我们成功地配置并启动了舰船小目标识别模型的训练任务。YOLOv8作为一个强大的目标检测框架,为我们的训练任务提供了良好的支持,使得训练过程既高效又方便。在训练完成后,我们将得到一个针对舰船小目标识别任务优化过的模型,它将能够准确识别和分析图像中的舰船小目标,为后续的应用提供强大的技术支撑。


5. 实验结果与分析

5.1 训练曲线

        采用以上代码进行训练,得到的训练过程曲线如下,展示了模型在学习数据集时的行为,并且揭示了模型优化过程中的关键趋势。

        首先,训练损失(train loss)图像展示了box loss、class loss和directional field loss(df1_loss)随着训练周期(epoch)的逐渐下降。这种下降趋势是训练过程中期望看到的,它表明模型正在学习并逐步提高对训练数据的拟合度。尤其值得注意的是,所有三种损失函数在经历了初始的快速下降后,趋于平稳,这表明学习过程已趋于稳定,模型参数的调整变得更加细微。

        其次,验证损失(val loss)图表同样展示了这三种损失随着时间的变化。验证损失的趋势对于评估模型的泛化能力至关重要。理想情况下,验证损失应该与训练损失类似地下降,这表明模型在未见数据上的表现与训练数据上相似。从图中我们可以观察到,验证损失在大部分时间内与训练损失保持相似的下降趋势,尽管在某些点上出现了波动,这些波动可能是由于模型在某些特定批次的数据上过拟合或者数据本身的难度不同。

        再来看精确度和召回率图表,这两个指标衡量的是模型识别正确对象的能力。精确度图表显示,在训练过程中精确度逐渐上升并趋于稳定,这意味着模型正确识别对象的能力提高。召回率图表展示了模型找到所有相关对象的能力,该图表中的召回率也显示出上升趋势,表明随着训练的进行,模型错过重要目标的次数在减少。

5.2 混淆矩阵

        混淆矩阵是一种特别在分类问题中广泛使用的工具,它展示了模型预测与实际标签之间的关系。在我们的舰船小目标识别模型中,混淆矩阵揭示了模型在不同舰船目标类别上的识别准确性。根据提供的混淆矩阵,我们可以对模型在舰船检测与识别任务上的性能进行深入分析。

        混淆矩阵是评估分类模型性能的关键工具,通过展示实际类别与模型预测类别之间的关系,可以直观地反映模型在各个类别上的识别能力。在您提供的混淆矩阵中,每一行表示实际类别,每一列表示模型预测的类别。矩阵对角线上的值表示正确分类的实例比例,而非对角线上的值则表示错误分类的实例比例。

        从图中可以看出,'buoy'(浮标)、'cruise'(游轮)和'warship'(军舰)三个类别的识别准确率较高,对角线上的值分别为0.98、0.95和0.89,说明模型在这三个类别上的预测性能很好。尤其是'buoy'和'cruise',模型几乎能完美地识别它们,这可能得益于这些类别有明显的特征或模型在训练过程中学习到了充足的这些类别的样本。

        然而,'container'(集装箱)和'a'类别的表现不佳,'container'类别只有0.74的准确率,说明有约四分之一的'container'被误分类到了其他类别。对于'a'类别,情况更为严重,其准确率仅为0.62,这意味着有将近四成的实例被错误分类。特别地,'a'类别有0.37的实例被误分类为背景,这可能是由于'a'类别的特征不够显著,或者是模型未能很好地区分这一类别与背景之间的差异。

        此外,我们还可以观察到,除了主对角线外,'container'类别和'cruise'类别之间有0.23的误分类率,这表明这两个类别可能在某些特征上具有相似性,导致模型在区分时出现了一定的困难。类似地,'fish-b'类别有0.16的实例被误分类为'cruise',这也表明模型在这些类别上可能混淆了。

        综上所述,混淆矩阵揭示了模型在各个类别上的识别表现,其中一些类别表现良好,而一些则需要改进。改进的方法包括增加难以区分类别的训练样本,使用更复杂的特征提取方法,或者调整分类阈值。通过深入分析混淆矩阵,我们可以更准确地定位模型的不足之处,并据此采取措施以提高模型整体的分类准确率。

        总之,混淆矩阵为我们提供了一个宝贵的视角,让我们可以直观地看到模型在各个类别上的表现,从而为我们提供了改进模型和进一步研究的方向。通过对这些结果的细致分析和理解,我们可以逐步优化我们的目标检测系统,最终实现更为精准和可靠的舰船检测与识别。

5.3 YOLOv8/v7/v6/v5对比实验

(1)实验设计
        本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在舰船小目标目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含舰船小目标的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。

模型 图像大小 (像素) mAPval 50-95 CPU ONNX 速度 (毫秒) A100 TensorRT 速度 (毫秒) 参数数量 (百万) FLOPs (十亿)
YOLOv5nu 640 34.3 73.6 1.06 2.6 7.7
YOLOv8n 640 37.3 80.4 0.99 3.2 8.7
YOLOv6N 640 37.5 - - 4.7 11.4
YOLOv7-tiny 640 37.4 - - 6.01 13.1

(2)度量指标

  • F1-Score:F1-Score 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。
  • mAP(Mean Average Precision):在目标检测任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了mAP。
名称 YOLOv5nu YOLOv6n YOLOv7-tiny YOLOv8n
mAP 0.781 0.773 0.674 0.778
F1-Score 0.76 0.76 0.65 0.76

(3)实验结果分析

        从实验结果来看,YOLOv5nu在mAP指标上表现最佳,达到了0.781,而YOLOv7-tiny的表现稍逊一筹,mAP仅为0.674。这表明YOLOv5nu在检测精确性上有优势,可能是因为其网络结构或优化策略更适合本实验中使用的数据集。YOLOv6n和YOLOv8n在mAP上的表现相当,均接近0.78,表明它们在准确性上有着不分伯仲的表现。

       在F1-Score指标上,三个模型:YOLOv5nu、YOLOv6n和YOLOv8n均为0.76,显示出一致的高水平性能,而YOLOv7-tiny则较低,为0.65。这可能是由于YOLOv7-tiny作为一个更轻量级的模型,在某些复杂的检测任务上可能不如其他版本。

       总的来说,YOLOv5nu在这次比较中表现最为突出,尤其是在mAP指标上。YOLOv6n和YOLOv8n虽然在mAP上略低于YOLOv5nu,但整体性能表现相近,显示出这些模型都具有较好的泛化能力和准确性。YOLOv7-tiny的表现虽然较弱,但考虑到其轻量化的设计,仍然是一个在资源有限的场景下值得考虑的选择。

       为了进一步改善模型性能,我们可以考虑进行更细致的超参数调优,使用更先进的数据增强技术,或者通过集成学习方法结合这些模型的优点。未来的工作还可以包括在更多的数据集上进行实验,以验证模型的泛化能力。


6. 系统设计与实现

6.1 系统架构概览

        系统架构主要包括以下几个关键组件:模型管理数据处理UI交互日志记录。每个组件都承担着系统运行中的特定职责,共同确保了系统的高效和稳定运行。

(一)模型管理

在模型管理部分,我们使用了YOLOv8v5Detector类来负责目标检测模型的加载、配置和预测。这个类封装了对YOLOv8/v7/v6/v5系列模型的操作,包括模型的加载(load_model)、参数设置(set_param)以及执行预测(predict)等。我们通过model_type属性支持不同版本的YOLO模型选择,以适应不同的性能和精度需求。

(二)数据处理

数据处理是系统的核心部分,负责对输入的图像数据进行预处理、调用模型进行预测以及后处理预测结果。这一功能主要通过frame_process方法实现。首先,通过调整图像尺寸(cv2.resize)和进行必要的图像预处理(model.preprocess)准备好模型输入数据。然后,使用模型进行预测并获取结果。最后,通过model.postprocess对预测结果进行后处理,包括绘制检测框(drawRectBox)和生成检测信息。

(三) UI交互

UI交互组件通过streamlit库构建,负责与用户的直接交互。在Detection_UI类中,我们设计了侧边栏配置(setup_sidebar)、页面布局设置(setup_page)和主窗口运行逻辑(setupMainWindow)等方法。用户可以通过侧边栏选择模型类型、调整检测参数、选择输入源等,系统根据这些配置实时更新主窗口显示的内容。

(四)日志记录

日志记录功能由LogTableResultLogger两个类共同完成。LogTable类负责管理检测过程中生成的所有日志数据,包括检测结果的保存、日志数据的持久化(save_to_csv)以及日志视图的更新(update_table)。ResultLogger则用于将每次检测的结果整合(concat_results),方便在UI中显示和日志文件中记录。

        通过上述设计,我们的系统能够有效地处理舰船图像中的小目标检测任务,为用户提供直观、实用的检测工具。我们将继续优化系统架构,引入更先进的技术,以提高检测的准确性和系统的可用性。

6.2 系统流程

        针对基于YOLOv8/v7/v6/v5的舰船检测与识别系统,下面我们将深入探讨系统的具体工作流程,并结合代码中的类和方法进行详细说明:

  1. 系统初始化(__init__

    • Detection_UI类的构造函数中,系统初始化包括设置页面标题、初始化页面布局(setup_page),应用CSS样式(def_css_hitml),加载模型(YOLOv8v5Detector实例化),并初始化UI元素(如侧边栏setup_sidebar)。
  2. 用户配置

    • 用户通过侧边栏(setup_sidebar方法中实现)进行配置,可以选择模型类型、调整检测参数(如置信度conf_threshold和IOU阈值iou_threshold),并选择输入源(上传的文件或摄像头)。
  3. 文件上传与摄像头选择

    • 用户选择上传文件(图片或视频)或选择摄像头作为输入源。系统通过uploaded_fileselected_camera变量处理用户的选择。
  4. 图像处理与目标检测(frame_process

    • 对于每个输入图像,首先使用cv2.resize调整图像尺寸,然后model.preprocess对图像进行预处理,以适配YOLOv8v5Detector模型的输入要求。
    • 调用YOLOv8v5Detectorpredict方法进行目标检测,然后对预测结果应用model.postprocess进行后处理,如绘制检测框(drawRectBox)并生成检测信息。
  5. 结果展示与日志记录

    • 系统在主界面上通过image_placeholderimage_placeholder_res展示处理后的图像。同时,检测信息如目标类别、置信度等通过LogTable类记录,并支持以CSV格式导出(save_to_csv)。
  6. 用户交互与反馈

    • 用户可以通过侧边栏进行进一步的操作,如更改检测参数或重新选择输入源。系统根据用户操作实时更新UI显示和检测结果。
  7. 结束与清理

    • 用户操作完成后,可以通过点击UI中的导出按钮(在setupMainWindow中处理)导出检测结果日志。系统也会在结束时自动进行资源释放和清理工作。

        本系统通过以上流程,有效地实现了对舰船图像中小目标的检测,从用户配置到结果展示的每一环节都设计得尽可能直观易用,确保了系统的实用性和有效性。


代码下载链接

         如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:

        资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷

演示与介绍视频https://www.bilibili.com/video/BV11M4m1X771/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2akplr
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5dq
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5pu
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm55u

完整安装运行教程:

        这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:

  1. Pycharm和Anaconda的安装教程https://deepcode.blog.csdn.net/article/details/136639378

        软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:

  1. Python环境配置教程https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
  2. 离线依赖包的安装指南https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);

        如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。


7. 结论与未来工作

        本文深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在舰船检测与识别领域的应用,成功开发了一个集成了这些前沿算法的舰船检测与识别系统。通过对YOLO系列多个版本的模型进行精细的对比和定制优化,本研究不仅显著提高了舰船检测与识别的精确度和响应速度,还利用Streamlit开发了一个直观、高效且用户友好的Web应用,使得用户能够在实际航海、海事管理、海上安全等场合中高效地进行舰船识别。

        通过系列实验的验证,本研究提出的方法在舰船识别的准确性和处理速度上均达到了优秀的标准。同时,我们提供了详尽的数据集处理流程、模型训练与预测的实现代码,以及基于Streamlit的系统设计和操作细节,为后续研究人员和开发者复制和参考提供了极大的便利。尽管已经取得显著成果,舰船检测与识别作为一个具有挑战性的领域,仍然存在众多待解决的问题和改进空间。未来的研究方向包括:

  • 模型优化:探索深层次的网络架构和优化策略,如采用神经网络架构搜索(NAS)技术,以进一步增强模型的性能和计算效率。
  • 多模态融合:考虑融入雷达、声纳等海上监测设备的数据,运用多模态学习提高舰船识别的准确性和可靠性。
  • 跨域适应性:针对不同海域和天气条件下的舰船识别,通过域适应技术增强模型的泛化能力。
  • 用户交互体验:进一步优化系统的界面设计和交互逻辑,使其更加贴合用户操作习惯,提升用户体验。
  • 实际应用拓展:将舰船检测与识别技术应用到更广的领域,如海上搜救、渔业监管、航道管理等,以充分发掘其潜在的社会价值和经济效益。

        综上所述,基于YOLO系列模型的舰船检测与识别技术正在迅猛发展,伴随着技术进步和应用范围的扩大,预计在不远的将来,深度学习驱动的舰船检测与识别将在各类海事活动中发挥日益重要的角色。


  1. Liu C, Tao Y, Liang J, et al. Object detection based on YOLO network[C]//2018 IEEE 4th information technology and mechatronics engineering conference (ITOEC). IEEE, 2018: 799-803. ↩︎

  2. Zhu X, Lyu S, Wang X, et al. TPH-YOLOv5: Improved YOLOv5 based on transformer prediction head for object detection on drone-captured scenarios[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 2778-2788. ↩︎

  3. Sun Z, Chen B. Research on Pedestrian Detection and Recognition Based on Improved YOLOv6 Algorithm[C]//International Conference on Artificial Intelligence in China. Singapore: Springer Nature Singapore, 2022: 281-289. ↩︎

  4. Zhao H, Zhang H, Zhao Y. Yolov7-sea: Object detection of maritime uav images based on improved yolov7[C]//Proceedings of the IEEE/CVF winter conference on applications of computer vision. 2023: 233-238. ↩︎

  5. Aboah A, Wang B, Bagci U, et al. Real-time multi-class helmet violation detection using few-shot data sampling technique and yolov8[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2023: 5349-5357. ↩︎

  6. Zhou D, Kang B, Jin X, et al. Deepvit: Towards deeper vision transformer[J]. arXiv preprint arXiv:2103.11886, 2021. ↩︎

  7. Parmar N, Vaswani A, Uszkoreit J, et al. Image transformer[C]//International conference on machine learning. PMLR, 2018: 4055-4064. ↩︎

标签:训练,检测,模型,舰船,YOLOv8,v5,v7,类别
From: https://www.cnblogs.com/deeppython/p/18083768

相关文章