精准提升:从94.5%到99.4%——目标检测调优全纪录

news2024/12/21 8:26:25

🚀 目标检测模型调优过程记录

在进行目标检测模型的训练过程中,我们面对了许多挑战与迭代。从初始模型的训练结果到最终的调优优化,每一步的实验和调整都有其独特的思路和收获。本文记录了我在优化目标检测模型的过程中进行的几次尝试,并详细分析了每次调整带来的效果提升。🔧

一开始,我训练了一个目标检测器,目标检测任务包括了 26个类别,初始的 mAP5094.5% 左右。尽管初步结果较为理想,但在混淆矩阵中仍然能看到一些类别之间存在较大的误识别和混淆,尤其是在类别间数据不平衡的情况下,部分小类别的识别效果较差。为了进一步提升模型性能,减少误识别,后续进行了几轮迭代和优化。
在这里插入图片描述

接下来的调优尝试,我采取了不同的策略,每次都根据前一次的分析结果,针对性地进行调整。以下是我尝试的几种方法,以及每次尝试的详细效果记录。📊


1️⃣ 第一次尝试:将目标检测拆解为单目标检测 + 图像分类

在最初的尝试中,我将原本的单一目标检测器拆解为单目标检测与图像分类的结合方式。具体可以参考我这篇文章:联合目标检测与图像分类提升数据不平衡场景下的准确率,方法的核心是将每个目标先单独识别,然后通过图像分类进一步确认类别。🎯

经过调整后,虽然 Top1的准确率 提高至 99%,但是从混淆矩阵来看,部分类别仍然存在较多的混淆,尤其是一些相似类别之间的错误识别仍然较为显著。🧐

第一次尝试结果


2️⃣ 第二次尝试:统一缩放目标区域

在第一次尝试后,我发现将目标区域进行标准化处理可能会对模型训练有所帮助。因此,我采用了将目标检测出来的子图强制缩放至统一大小的策略。使用 cv2.resize(object_region, (classification_size, classification_size)) 对每个检测到的目标区域进行缩放。🔄

经过训练后,模型在一些类别上的识别效果有所改善,尤其是在一些小物体的检测上,误差略有减少。📉


3️⃣ 第三次尝试:统一缩放原始子图

在第二次尝试的基础上,我进一步扩大了缩放操作的范围,将原始图像中的所有子图按统一的缩放尺寸进行训练。这一操作提高了模型在不同尺度上的泛化能力,特别是对于不同尺寸的目标检测表现有所提升,训练过程中也能更好地对齐各类别的特征分布。📏

import os
from pathlib import Path
import cv2
from multiprocessing import Pool
from functools import partial
from tqdm import tqdm

def find_image_files(root_dir, image_extensions={'.jpg', '.jpeg', '.png', '.bmp', '.gif'}):
    """
    递归查找根目录下所有图片文件
    """
    root_path = Path(root_dir)
    image_files = [p for p in root_path.rglob('*') if p.suffix.lower() in image_extensions]
    return image_files

def process_image(image_path, root_dir, output_dir, size=(224, 224)):
    """
    处理单张图片:读取、调整大小、保存到目标目录
    """
    try:
        # 计算相对路径并构造目标路径
        relative_path = image_path.relative_to(root_dir)
        target_path = Path(output_dir) / relative_path

        # 创建目标文件夹(如果不存在)
        target_path.parent.mkdir(parents=True, exist_ok=True)

        # 读取图像
        img = cv2.imread(str(image_path))
        if img is None:
            raise ValueError("图像无法读取,可能是文件损坏或格式不支持。")

        # 调整大小
        resized_img = cv2.resize(img, size)

        # 保存图像,保持原始格式
        success = cv2.imwrite(str(target_path), resized_img)
        if not success:
            raise IOError("图像保存失败。")
    except Exception as e:
        print(f"处理图片 {image_path} 时出错: {e}")

def main():
    """
    主函数:查找图片并使用多进程处理
    """
    # 设置根目录和输出目录
    ROOT_DIR = "datasets/device_cls_merge_manual_with_21w_1218_train_val"       # 替换为你的根目录路径
    OUTPUT_DIR = "datasets/device_cls_merge_manual_with_21w_1218_train_val_224"   # 替换为你想保存的目标目录路径
    SIZE = (224, 224)                         # 调整后的图片大小
    NUM_PROCESSES = 16                        # 使用的进程数

    # 查找所有图片文件
    image_files = find_image_files(ROOT_DIR)
    print(f"找到 {len(image_files)} 张图片。")

    if len(image_files) == 0:
        print("未找到任何图片文件,请检查根目录路径和图片格式。")
        return

    # 确保输出目录存在
    Path(OUTPUT_DIR).mkdir(parents=True, exist_ok=True)

    # 使用部分函数固定一些参数
    process_func = partial(process_image, root_dir=ROOT_DIR, output_dir=OUTPUT_DIR, size=SIZE)

    # 使用多进程处理图片,并显示进度条
    with Pool(processes=NUM_PROCESSES) as pool:
        list(tqdm(pool.imap_unordered(process_func, image_files), total=len(image_files)))

    print("所有图片处理完成!")

if __name__ == "__main__":
    main()

4️⃣ 第四次尝试:引入额外数据

为了进一步提升模型的识别效果,我额外引入了一批新的数据,并使用已经训练好的模型打出类别及置信度分数,只保留置信度大于 0.9 的类别子图。这一策略显著提升了模型的准确性,特别是在一些模糊的检测任务中,置信度较高的预测结果帮助排除了很多误识别情况。📈


5️⃣ 第五次尝试:调整数据预处理和关闭自动增强

接下来,我调整了 YOLOv8 的预处理策略,并关闭了自动数据增强(auto_augment=False)。这一调整基于数据集的实际情况,考虑到某些预处理和数据增强方法可能会导致过拟合或过度处理,关闭自动增强后,模型在训练过程中更加专注于数据本身的特征,效果得到了明显的改善。💡


6️⃣ 第六次尝试:数据可视化与欠采样

最后,在进行数据可视化分析后,我发现部分类别的样本数过大,导致了模型训练时出现类别不平衡问题。因此,我对这些过多的类别进行了欠采样处理,减少了它们在训练中的占比,从而使得训练数据的分布更加均衡。📉

具体可以参考这篇文章:图像分类实用脚本:数据可视化与高数量类别截断,欠采样后,训练集中的数据分布更加合理,模型的鲁棒性也得到了提高。🔍

经过这些优化后,模型的表现有了显著提升。最终,mAP50 虽然略有提升至 99.4% 左右,但最重要的是,误识别率已经非常低,整体性能非常稳定。🎉
在这里插入图片描述


总结

通过这几轮的调优和实验,我在目标检测任务中取得了较为显著的进展。从最初的 94.5% 到最终的 99.4%,虽然提升幅度不算极其惊人,但每一轮的调整都有其明确的目的和成效,尤其是在类别不平衡、尺度差异、数据增强等方面的优化。最终,模型在实际测试中的误识别问题大幅度减少,几乎达到了理想状态。✨

在后续的工作中,我还将继续关注数据集的多样性与模型的泛化能力,进一步探索更多的调优方案。🔮

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM8单片机学习笔记·GPIO的片上外设寄存器

目录 前言 IC基本定义 三极管基础知识 单片机引脚电路作用 STM8GPIO工作模式 GPIO外设寄存器 寄存器含义用法 CR1:Control Register 1 CR2:Control Register 2 ODR:Output Data Register IDR:Input Data Register 赋值…

国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异

在现代安防视频监控系统中,国标GB28181协议作为公共安全视频监控联网系统的国家标准,该协议不仅规范了视频监控系统的信息传输、交换和控制技术要求,还为不同厂商设备之间的互联互通提供了统一的框架。EasyGBS平台基于GB28181协议&#xff0c…

如何使用checkBox组件实现复选框

文章目录 概念介绍使用方法示例代码我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍Checkbox Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Checkbox也是叫复选框,没有选中时是一个正方形边框,边框内容是空白的,选中时会…

基于“2+1 链动模式商城小程序”的微商服务营销策略探究

摘要:本文探讨在竞争激烈的市场经济与移动互联网时代背景下,微商面临的机遇与挑战。着重分析“21 链动模式商城小程序”如何助力微商改变思路,通过重视服务、提升服务质量,以服务营销放大利润,实现从传统微商模式向更具…

1-1 STM32-0.96寸OLED显示与控制

1.0 模块原理图 2.0 0.96OLED简介 资料下载:https://jiangxiekeji.com/download.html 程序介绍:https://jiangxiekeji.com/tutorial/oled.html SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显…

在Visual Studio 2022中配置C++计算机视觉库Opencv

本文主要介绍下载OpenCV库以及在Visual Studio 2022中配置、编译C计算机视觉库OpenCv的方法 1.Opencv库安装 ​ 首先,我们需要安装OpenCV库,作为一个开源库,我们可以直接在其官网下载Releases - OpenCV,如果官网下载过慢&#x…

QT:QDEBUG输出重定向和命令行参数QCommandLineParser

qInstallMessageHandler函数简介 QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) qInstallMessageHandler 是 Qt 框架中的一个函数,用于安装一个全局的消息处理函数,以替代默认的消息输出机制。这个函数允许开发者自定义 Qt 应用…

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

OpenGL ES 03 加载3张图片并做混合处理

OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号,目的是为了告诉纹理采样器,从哪个纹理单元采集数据2.如果你没有显式地设置采…

临床外显子组测序分析中的那些坑(上)

大规模并行测序技术或下一代测序已成为基因诊断和研究的标准技术,尤其是外显子组和基因组测序现在已经在世界范围内广泛应用于患者的分子诊断。在过去几年中,许多实验室都在努力应对基于全新技术建立基因检测工作流程的挑战。测序技术中持续引入新的仪器…

【Tomcat】第六站(最后一站啦!):数据的返回

1. 引言 前端资源比如html页面,进行返回。截止到目前我们写的项目架构不支持前端页面(静态资源 )。 2. 数据的返回 2.1 准备 为了能够写前端页面,新建一个项目。选择Maven项目,下一步,下一步。 加载完…

ai论文生成器:分享8款AI一键生成论文的写作软件

在撰写毕业论文的过程中,高效利用各类软件工具可以极大地提升写作效率与质量。以下是八个免费的神器软件工具,它们各自在论文撰写、文献管理、语法校对、数据可视化等方面发挥着重要作用。希望这些推荐能帮助你顺利完成毕业论文的写作。 千笔AI论文&…

【Ubuntu 20.04】notepad++的安装与汉化

一,简介 本文介绍如何在Ubuntu虚拟机中安装notepad,供参考。 二,操作步骤 2.1 notepad的安装 sudo snap install notepad-plus-plus

Cherno C++学习笔记 P45 拷贝与拷贝构造函数

在这一篇文章当中,我们会学习一下C当中的复制以及复制构造函数,当然,还会用一个相对比较完整的代码类作为例子。这也是我们第一次写一个相对比较长的和完整的代码。 对于C来说,理解复制是非常重要的,因为整个C变成可以…

uniapp入门 01创建项目模版

0安装 hbuilder x 标准版 1.创建模版工程 2.创建官方 案例工程 index.uvuewen 文件解析 <!-- 模版 标签 --> <template><view></view></template><!-- 脚本 --> <script>export default {data() {return {}},onLoad() {},methods:…

kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装

系列文章目录 1.kubeadm安装K8s高可用集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s高可用集群之集群初始化及master/node节点加入集群calico网络插件安装 kubeadm安装K8s高可用集群之集群初始化及master/node节点加入ca…

【NLP】序列到序列(seq2seq)建模工具fairseq使用详解

文章目录 一、fairseq简介二、安装方式2.1 pip安装2.2 源码安装 三、fairseq命令工具3.1 fairseq-preprocess3.2 fairseq-train3.3 fairseq-generate3.4 fairseq-interactivate3.5 fairseq-score3.6 fairseq-eval-lm 4. 常见报错报错1 参考资料 一、fairseq简介 fairseq 是 Fa…

28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强

A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法&#xff1a;无模型水下图像增强方法&#xff1a;基于深度学习的水下图像增强方法&#xff1a; 论文方法概述像素分布…

ArkTs组件的学习

一. AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件 参数名类型必填说明arrayValueArray<string>是字母索引字符串数组&#xff0c;不可设置为空selectednumber是初始选中项索引值若超出索引值范围则取默认值0 class Lxr{tImg:Resource…

Python读取Excel批量写入到PPT生成词卡

一、问题的提出 有网友想把Excel表中的三列数据&#xff0c;分别是&#xff1a;单词、音标和释义分别写入到PPT当中&#xff0c;每一张PPT写一个单词的内容。这种批量操作是python的强项&#xff0c;尤其是在办公领域&#xff0c;它能较好地解放双手&#xff0c;读取Excel表后…