html5 购物网站,手机端网站建站手册,百度手机导航官方新版,wordpress 树形插件#x1f680; 目标检测模型调优过程记录
在进行目标检测模型的训练过程中#xff0c;我们面对了许多挑战与迭代。从初始模型的训练结果到最终的调优优化#xff0c;每一步的实验和调整都有其独特的思路和收获。本文记录了我在优化目标检测模型的过程中进行的几次尝试#… 目标检测模型调优过程记录
在进行目标检测模型的训练过程中我们面对了许多挑战与迭代。从初始模型的训练结果到最终的调优优化每一步的实验和调整都有其独特的思路和收获。本文记录了我在优化目标检测模型的过程中进行的几次尝试并详细分析了每次调整带来的效果提升。
一开始我训练了一个目标检测器目标检测任务包括了 26个类别初始的 mAP50 在 94.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 tqdmdef 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_filesdef 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(parentsTrue, exist_okTrue)# 读取图像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(parentsTrue, exist_okTrue)# 使用部分函数固定一些参数process_func partial(process_image, root_dirROOT_DIR, output_dirOUTPUT_DIR, sizeSIZE)# 使用多进程处理图片并显示进度条with Pool(processesNUM_PROCESSES) as pool:list(tqdm(pool.imap_unordered(process_func, image_files), totallen(image_files)))print(所有图片处理完成)if __name__ __main__:main()4️⃣ 第四次尝试引入额外数据
为了进一步提升模型的识别效果我额外引入了一批新的数据并使用已经训练好的模型打出类别及置信度分数只保留置信度大于 0.9 的类别子图。这一策略显著提升了模型的准确性特别是在一些模糊的检测任务中置信度较高的预测结果帮助排除了很多误识别情况。 5️⃣ 第五次尝试调整数据预处理和关闭自动增强
接下来我调整了 YOLOv8 的预处理策略并关闭了自动数据增强auto_augmentFalse。这一调整基于数据集的实际情况考虑到某些预处理和数据增强方法可能会导致过拟合或过度处理关闭自动增强后模型在训练过程中更加专注于数据本身的特征效果得到了明显的改善。 6️⃣ 第六次尝试数据可视化与欠采样
最后在进行数据可视化分析后我发现部分类别的样本数过大导致了模型训练时出现类别不平衡问题。因此我对这些过多的类别进行了欠采样处理减少了它们在训练中的占比从而使得训练数据的分布更加均衡。
具体可以参考这篇文章图像分类实用脚本数据可视化与高数量类别截断欠采样后训练集中的数据分布更加合理模型的鲁棒性也得到了提高。
经过这些优化后模型的表现有了显著提升。最终mAP50 虽然略有提升至 99.4% 左右但最重要的是误识别率已经非常低整体性能非常稳定。 总结
通过这几轮的调优和实验我在目标检测任务中取得了较为显著的进展。从最初的 94.5% 到最终的 99.4%虽然提升幅度不算极其惊人但每一轮的调整都有其明确的目的和成效尤其是在类别不平衡、尺度差异、数据增强等方面的优化。最终模型在实际测试中的误识别问题大幅度减少几乎达到了理想状态。✨
在后续的工作中我还将继续关注数据集的多样性与模型的泛化能力进一步探索更多的调优方案。