声明:整个流程不要求任何代码能力,仅需要一个帮你编码的大模型,我用的GLM,兄弟们信我试试这个方案,从头开始跑,两天时间效果很好

这个是Deepseek给我出的好主意,下一个轻量的预训练图片检测模型,自己标注一些广告图片进行训练,大约50-100张就可以了,然后导出模型文件,本地调用模型检测。

告诉你的AI你要基于YOLOV11训练一个本地模型,然后在现有自动化哪个地方调用。让AI实现本地训练和调用的代码,并且指导你标注和训练。

我的AI先给我写了个项目结构和训练代码,然后它这么跟我说:

50 多张图已经够训练了!按以下步骤操作:

第1步:同步图片到训练目录

python yolo_tools/prepare_batch.py

这会把 raw/ 中的新图复制到 images/train/,并显示统计。没啥意义,只是帮我复制了下文件,属于AI对我的关怀型代码,这个还能随机按比例复制图片。

第2步:启动 labelImg 标注

注意!!!我python3.1.3运行这个labelImg会崩溃,deepseek建议降级。实测降到3.9!!没办法搞个新的虚拟环境再跑下,PyQt5也得降级5.15.4

conda create -n labelimg python=3.9
conda activate labelimg
pip install labelImg -i https://mirrors.aliyun.com/pypi/simple/
pip install PyQt5==5.15.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install labelImg -i https://mirrors.aliyun.com/pypi/simple/

cd yolo_tools
labelImg datasets/close_button/images/train datasets/close_button/classes.txt datasets/close_button/labels/train

classes.txt是类别文件,里面只有一行close_button

labelImg 操作要点,笔记本装上鼠标能加速打标

  1. 切换格式:打开后左侧点 PascalVOC 按钮切换为 YOLO
    在这里插入图片描述
  2. 创建类别:首次提示输入类别名,输入 close_button
  3. 画框:按 W 键,用鼠标拖拽矩形框住关闭按钮(框住整个可点击区域,包括背景圆/方框)
  4. 保存Ctrl+S
  5. 下一张D
  6. 多关闭按钮:同一画面有多个X/跳过按钮时,全部标注
  7. 无广告图:直接 D 跳过,不需要标注(自动作为负样本)

标注完后,调用labelimgae时传入的标签文件夹datasets/close_button/labels/train里面就有txt了。

第3步:标注完成后划分验证集

python yolo_tools/prepare_batch.py --split-val 0.2

自动把 20% 已标注图片移到 val/

第4步:训练

AI叫我运行下面的命令,不过不是很放心,叫它给我解释下,看完发现自己想多了。AI说这点数据量,不需要装显卡环境,你机器也没有显卡,直接运行脚本,用CPU训练就行。代码设了一堆参数,指定了github预训练参数yolo11n.pt。直接切到act模式,相信AI。另外如果网不好,记得手动下yolo11n.pt。

注意到AI装了ultralytics失败了,一直不肯放弃猛猛重试,赶紧叫停,让它直接用刚刚labelimage的python 3.9!!不要用3.1.3了,numpy也得降级到1.x

pip install ultralytics 2>&1 | tail -5
pip install "numpy<2" -i https://pypi.tuna.tsinghua.edu.cn/simple

试试环境

conda run -n labelimg39 python -c "from ultralytics import YOLO; print('Import OK')"

导入成功,开训。

cd yolo_tools
python train_close_button.py

等着训练结果的时候还是叫AI总结了下它的代码

train_close_button.py 代码详解

整体流程

解析参数 → 检查数据集 → 加载预训练模型 → 训练 → 输出结果

4.1. 解析参数

parser.add_argument("--pretrained", type=str, default="yolo11n.pt")

关键参数:

参数 默认值 作用
--pretrained yolo11n.pt 预训练权重,首次运行自动从GitHub下载
--epochs 100 训练轮数,每轮遍历所有训练图片一次
--batch 16 每次同时处理16张图(CPU建议8,减少内存压力)
--imgsz 640 输入图片统一缩放到640×640
--device cpu 训练设备
--patience 20 早停:连续20轮验证集没改善就停止

4.2. 检查数据集

def check_dataset(data_yaml):
    # 检查 data.yaml 是否存在
    # 检查 images/train/ 和 labels/train/ 目录
    # 统计训练图片和标注文件数量

确保数据集就绪,防止训练到一半才发现缺文件。

4.3. 加载预训练模型(迁移学习)

model = YOLO("yolo11n.pt")

这是关键——不是从零开始训练,而是基于 COCO 数据集(80类通用物体)的预训练权重做微调(fine-tune)

  • 预训练模型已经学会了"边缘、纹理、形状"等底层视觉特征
  • 微调只需要教会它"关闭按钮长什么样"
  • 所以 50 张图就够了,否则从零训练需要上万张

类比:预训练 = 学会了画画的基本功,微调 = 学画特定风格的画

4.4. 训练核心参数

results = model.train(
    data=args.data,        # 数据集配置(指向 data.yaml)
    epochs=args.epochs,    # 训练100轮
    imgsz=args.imgsz,      # 图片缩放到640×640
    batch=args.batch,      # 每批16张
    device=args.device,    # CPU训练
    patience=args.patience,# 20轮没改善就停止
4.5数据增强参数(对少样本友好)
    mosaic=1.0,       # 马赛克增强:4张图拼成1张,增加多样性
    mixup=0.1,        # 混合增强:两张图叠加混合
    copy_paste=0.1,   # 复制粘贴:把关闭按钮复制到其他位置
    degrees=10.0,     # 随机旋转±10度
    translate=0.1,    # 随机平移10%
    scale=0.5,        # 随机缩放50%
    fliplr=0.5,       # 50%概率水平翻转
    hsv_h=0.015,      # 色调微调
    hsv_s=0.7,        # 饱和度变化
    hsv_v=0.4,        # 亮度变化

为什么需要数据增强? 50 张图太少,增强可以让模型看到更多变化:

  • 同一个关闭按钮,旋转一下、变暗一点、换个位置,模型都要能识别
  • 相当于把 50 张图"变"出几百张的效果
4.6训练过程

每轮(epoch)的训练过程:

1. 读取 train/ 中的图片(打乱顺序)
2. 每批16张,送入模型预测
3. 计算预测和标注的差异(损失函数)
4. 反向传播,更新模型权重
5. 每轮结束后,用 val/ 图片评估准确率
6. 如果连续20轮 val 准确率没提升 → 早停
7. 保存最佳权重到 best.pt

4.7. 输出

runs/detect/train/
├── weights/
│   ├── best.pt     ← 最佳模型(验证集表现最好的那一轮)
│   └── last.pt     ← 最后一轮的模型
├── results.csv     ← 每轮训练指标
└── confusion_matrix.png  ← 混淆矩阵

训练完成后用 best.pt 导出 ONNX,不用 last.pt(因为 best 是验证集表现最好的,last 可能已经过拟合了)。

第5步:导出 ONNX

python export_onnx.py

提示:50 张图标完大约需要 15~30 分钟。标注时注意框要完整包含整个可点击区域,不要只框X线条。

训练中指标

可以窗口里有下面这样的输出

  Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
 74/100         0G      1.135      1.199     0.8149          1        640: 100% ━━━━━━━━━━━━ 4/4 6.9s/it 27.6s
             Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 1/1 1.4s/it 1.4s
               all         11         11      0.986          1      0.995      0.686

顺便让AI分析各种指标的含义,


一、训练损失(Training Losses)

这些值只反映模型在训练集上的拟合程度,越低越好,但不能完全代表真实检测能力(可能过拟合)。

指标 含义 可投入使用的参考值
box_loss 定位损失:预测框与真实框的位置、大小误差。 通常降到 0.5 ~ 1.0 左右,说明框的位置基本学准了。
cls_loss 分类损失:是否准确识别出“关闭按钮”这个类别 需要降到 1.0 以下,最好 0.5 以下,说明模型已经能确信地区分按钮和背景。
dfl_loss 分布焦点损失 (Distribution Focal Loss):用于精细调整框的边缘。 一般降到 0.8 ~ 1.2 左右即可,对 CPU 训练的小模型不用过于追求极致低。

注意:如果你的训练集和验证集完全一样(你目前是 11 张验证集 = 训练集?),这些损失即使很低也不代表模型真的好,必须看验证集指标。


二、验证集评估指标(核心关注)

这些直接反映模型对从未见过的新图片的检测能力,是判断能否投入使用的决定性依据。

指标 含义 可投入使用的参考值
Precision § 精确率:模型预测出的框中有多少是对的。P 低 → 乱画框,误点率高。 一般要求 ≥ 0.7。对于广告关闭这种“不能误点”的场景,最好能到 0.8 以上
Recall ® 召回率:所有真实的关闭按钮有多少被模型找到了。R 低 → 漏过广告。 至少 ≥ 0.7。如果要求不高,0.6 也可接受,但会漏掉一些广告。
mAP50 最重要的综合指标:在“预测框与真框重叠 ≥50%”就算对的标准下,平均检测精度。 ≥ 0.7 可初步试用,≥ 0.85 可放心使用。这是你判断模型是否“学会”的核心指标。
mAP50-95 更严格的综合指标:要求重叠度从 50% 到 95% 都很好。 小数据集训练通常只能到 0.4 ~ 0.6,不必强求。mAP50 过关即可投入试用。

  • 如果训练结束时(100 epoch)能接近以下数值,就可以集成到 Airtest 中试用:

    • cls_loss < 0.8
    • box_loss < 0.8
    • Precision ≥ 0.7
    • Recall ≥ 0.7
    • mAP50 ≥ 0.75
  • 实际使用中,你还可以通过提高推理时的置信度阈值(conf)来牺牲部分召回率换取极高的精确率,避免误触其他按钮,这也是广告关闭场景的常用技巧。

照这个标准74轮成绩感觉已经可以了啊!赶紧导出让它干活。但是报错了,得装依赖项,路径也嵌套了,但是问题不大先导出吧

pip install onnx==1.16.1 onnxslim onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

python export_onnx.py --weights runs/detect/runs/detect/train/weights/best.pt

引入工程

让AI写吧,没啥建议,记得在主工程里也安装onnxrunner,主工程可以和训练环境是两个虚拟环境,安装不同的py版本。因为我还有其它检验方法,所以把置信度阈值设得很低。效果很好。快去试试。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐