声明:整个流程不要求任何代码能力,仅需要一个帮你编码的大模型,我用的GLM,兄弟们信我试试这个方案,从头开始跑,两天时间效果很好
这个是Deepseek给我出的好主意,下一个轻量的预训练图片检测模型,自己标注一些广告图片进行训练,大约50-100张就可以了,然后导出模型文件,本地调用模型检测。
告诉你的AI你要基于YOLOV11训练一个本地模型,然后在现有自动化哪个地方调用。让AI实现本地训练和调用的代码,并且指导你标注和训练。
我的AI先给我写了个项目结构和训练代码,然后它这么跟我说:
50 多张图已经够训练了!按以下步骤操作:
第1步:同步图片到训练目录
bash
python yolo_tools/prepare_batch.py
这会把 raw/ 中的新图复制到 images/train/,并显示统计。没啥意义,只是帮我复制了下文件,属于AI对我的关怀型代码,这个还能随机按比例复制图片。
第2步:启动 labelImg 标注
注意!!!我python3.1.3运行这个labelImg会崩溃,deepseek建议降级。实测降到3.9!!没办法搞个新的虚拟环境再跑下,PyQt5也得降级5.15.4
bash
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
bash
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 操作要点,笔记本装上鼠标能加速打标
- 切换格式 :打开后左侧点
PascalVOC按钮切换为YOLO

- 创建类别 :首次提示输入类别名,输入
close_button - 画框 :按
W键,用鼠标拖拽矩形框住关闭按钮(框住整个可点击区域,包括背景圆/方框) - 保存 :
Ctrl+S - 下一张 :
D键 - 多关闭按钮:同一画面有多个X/跳过按钮时,全部标注
- 无广告图 :直接
D跳过,不需要标注(自动作为负样本)
标注完后,调用labelimgae时传入的标签文件夹datasets/close_button/labels/train里面就有txt了。
第3步:标注完成后划分验证集
bash
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
bash
pip install ultralytics 2>&1 | tail -5
pip install "numpy<2" -i https://pypi.tuna.tsinghua.edu.cn/simple
试试环境
bash
conda run -n labelimg39 python -c "from ultralytics import YOLO; print('Import OK')"
导入成功,开训。
bash
cd yolo_tools
python train_close_button.py
等着训练结果的时候还是叫AI总结了下它的代码
train_close_button.py 代码详解
整体流程
解析参数 → 检查数据集 → 加载预训练模型 → 训练 → 输出结果
4.1. 解析参数
python
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. 检查数据集
python
def check_dataset(data_yaml):
# 检查 data.yaml 是否存在
# 检查 images/train/ 和 labels/train/ 目录
# 统计训练图片和标注文件数量
确保数据集就绪,防止训练到一半才发现缺文件。
4.3. 加载预训练模型(迁移学习)
python
model = YOLO("yolo11n.pt")
这是关键 ------不是从零开始训练,而是基于 COCO 数据集(80类通用物体)的预训练权重做微调(fine-tune):
- 预训练模型已经学会了"边缘、纹理、形状"等底层视觉特征
- 微调只需要教会它"关闭按钮长什么样"
- 所以 50 张图就够了,否则从零训练需要上万张
类比:预训练 = 学会了画画的基本功,微调 = 学画特定风格的画
4.4. 训练核心参数
python
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数据增强参数(对少样本友好)
python
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
bash
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.8box_loss< 0.8Precision≥ 0.7Recall≥ 0.7mAP50≥ 0.75
-
实际使用中 ,你还可以通过提高推理时的置信度阈值(
conf)来牺牲部分召回率换取极高的精确率,避免误触其他按钮,这也是广告关闭场景的常用技巧。
照这个标准74轮成绩感觉已经可以了啊!赶紧导出让它干活。但是报错了,得装依赖项,路径也嵌套了,但是问题不大先导出吧
bash
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版本。因为我还有其它检验方法,所以把置信度阈值设得很低。效果很好。快去试试。