Showing Posts From

YOLO

6000 张图做 YOLO 辅助标注:一个大模型还是拆多个

数据集里 6000 张图,想训一个 YOLO 做预标注(不是最终部署)——是把所有类别塞一个模型,还是按大类拆多个?答案要看你的类别怎么分。 场景 1:类别相近 → 一个大模型 比如都是路面场景:person、car、bus、truck、traffic_light——目标形态接近、上下文相似,塞一个模型没问题: # data.yaml nc: 20 names: - person - car - bus - truck - traffic_light - ...优点:只维护一个模型 推理一次拿全部结果 6000 张图对 YOLOv8s / YOLO11s 一点都不多,一晚上跑完 类别之间可能有互相约束(比如"斑马线附近容易有 person"),单模型能学到场景 2:类别跨度大 → 拆多个模型 要标的东西差别巨大: 交通标志:限速 / 禁停 / 左转 / 右转 车辆:car / bus / truck 家具:chair / table / sofa三个域完全不同的时候,一个模型很容易顾此失彼——训到最后 mAP 只是 balance 出的中间值。每个域一个小模型:交通标志检测模型 车辆检测模型 家具检测模型优点:新加一个大类不用重训全部 小模型训练快、精度高 误检更少(不会拿"椅子"当"汽车")缺点:推理跑多个模型 管理麻烦(模型 → 类别 → 版本)场景 3:类别很多且分层 → 分级流水线 CVAT / LabelStudio 等专业标注平台常用的做法——粗定位 + 细分类: 一级:粗定位(找目标) │ ├─ person ├─ vehicle ├─ animal ├─ traffic_sign └─ building二级:细分类(每个粗类一个小模型) ├─ traffic_sign │ ├─ speed_limit │ ├─ stop │ ├─ turn_left │ └─ turn_right ├─ vehicle │ ├─ car / bus / truck / bike └─ ...粗模型只负责"找到候选框",细分类器(可以是分类模型不是检测)判定具体类别。这套结构对增加新细类特别友好——只改对应二级分类器就行。 配合 SAM 类分割模型:SAM 出 mask → YOLO 分类头判定 → 输出精细标注。这是当前自动标注前沿方案。 6000 张的容量参考YOLOv8n / YOLO11n:几百到几千张就能有效果,训练几十分钟 YOLOv8s / YOLO11s:6000 张的甜蜜点,训练 1-3 小时 YOLOv8m / YOLO11m:需要至少 1 万张才发挥优势 YOLOv8l / YOLOv8x:几万张起步6000 张选 s / m,别上 l 或 x——过拟合概率大。 类别不平衡怎么办 6000 张里可能某些类别几百张、某些类别几十张。方法:加数据增强:mixup、mosaic、hsv、rotation——Ultralytics 默认就开 加权采样:class_weights 让少数类被多次采样 合并罕见类:训不动的类临时合并成"其它",先跑通再迭代 cascade:稀有类先由粗模型定位,再单独训一个二分类判定辅助标注 vs 最终部署 辅助标注模型要求:Recall 优先(宁多勿少,人工再删) Precision 差点没事 速度不用极致最终部署模型要求:Precision + Recall 都要 速度 / 显存有约束 需要严格评测两者训练策略也不一样。辅助标注可以 confidence 阈值调低(比如 0.15),把所有可疑目标都框出来,让人复核。 推荐做法 如果类别 <= 30、都是相似的场景:一个 YOLOv8s / YOLO11s 模型,配合置信度 0.15-0.25 做辅助标注,人工审核补漏。 类别 >= 50 或者跨大类:每个大类一个模型,或者上"检测 + 分类"分级流水线。 一句话总结 类别相近 → 一个大模型;跨度大 → 拆多个;类别多且分层 → 检测 + 分类分级。辅助标注就调低 confidence 让人复核,比追求高 precision 更实用。

SAM3 标注交通牌主体:正负点提示策略

用 SAM3 标注交通标志时,默认分割经常会把灯杆、支架、阴影一起圈进来。关键在于提示点的位置和正负样本的配合。 单点提示(最简方案) 把提示点打在牌面中央,SAM 通常只会分割牌面:牌型 提示点位置圆形限速牌 圆心三角警示牌 三角形中间矩形指示牌 牌面中央points = [[x_center, y_center]] labels = [1] # 1 = foreground正点 + 负点过滤杆子 如果单点还是把杆子带入,加负样本点排除: points = [ [牌面中心x, 牌面中心y], # 正样本 [杆子中间x, 杆子中间y], # 负样本 ] labels = [1, 0] # 1=前景, 0=背景实际调用: masks, scores, logits = predictor.predict( point_coords=np.array(points), point_labels=np.array(labels), multimask_output=True, )# 取得分最高的 mask best_mask = masks[np.argmax(scores)]检测框缩小(配合 Grounding DINO) Grounding DINO 给出的 bbox 通常包含了灯杆,传给 SAM 时手动收缩: def shrink_box(box, ratio=0.85): x1, y1, x2, y2 = box cx, cy = (x1 + x2) / 2, (y1 + y2) / 2 w, h = (x2 - x1) * ratio, (y2 - y1) * ratio return [cx - w/2, cy - h/2, cx + w/2, cy + h/2]tight_box = shrink_box(dino_box, ratio=0.8)masks, scores, _ = predictor.predict( point_coords=None, point_labels=None, box=np.array(tight_box), multimask_output=False, )缩小 15~20% 通常能去掉杆子区域。 mask 面积过滤 有时 SAM 返回多个候选 mask,按面积过滤掉太大或太小的: img_area = image.shape[0] * image.shape[1]valid_masks = [] for mask in masks: area = mask.sum() ratio = area / img_area if 0.01 < ratio < 0.4: # 占图片面积 1%~40% valid_masks.append(mask)交通牌通常不超过画面的 40%,过滤掉背景误判。 完整管线(Grounding DINO + SAM3) from groundingdino.util.inference import load_model, predict from segment_anything import SamPredictor# Step 1: DINO 定位交通牌 boxes, logits, phrases = predict( model=gd_model, image=image, caption="traffic sign", box_threshold=0.35, text_threshold=0.25, )# Step 2: 收缩框 tight_boxes = [shrink_box(b) for b in boxes]# Step 3: SAM 精确分割 predictor.set_image(image) for box in tight_boxes: masks, scores, _ = predictor.predict( box=np.array(box), multimask_output=False, ) # 保存 mask...调参建议 杆子还是出现 → 加负样本点在杆子上,或再缩小 bbox 5% 牌面被切掉 → bbox 缩小太多,调回 ratio=0.9 误检到路面标线 → 提高 DINO 的 box_threshold(0.35 → 0.45) 多块牌聚在一起 → multimask_output=True 后手动选面积最合适的 mask

目标检测辅助标注:GroundingDINO、SAM2 与 Florence-2 实用指南

为什么需要辅助标注 手动标注几万张图片耗时数周,且容易出现漏标和错标。开放词汇检测(Open-Vocabulary Detection)模型可以:输入文字描述的类别 直接输出检测框 人工只做最终校验流程: 原始图片 ↓ GroundingDINO(文字→检测框) ↓ 人工检查 + 修正 ↓ YOLO 训练GroundingDINO:文字驱动检测 不需要预先训练,直接用类别名称描述来检测: from groundingdino.util.inference import load_model, load_image, predictmodel = load_model("groundingdino_swint_ogc.pth", "config.py") image_source, image = load_image("image.jpg")boxes, logits, phrases = predict( model=model, image=image, caption="car . truck . person . traffic light", box_threshold=0.35, text_threshold=0.25 )caption 用英文句点分隔类别,box_threshold 控制检测置信度。返回的 boxes 是归一化的 (cx, cy, w, h) 格式,可直接转为 YOLO 标签。 3060Ti 8G 可运行:GroundingDINO-SwinT(轻量,速度快) GroundingDINO-SwinB(更准,显存要求更高)SAM2:检测框转 Mask SAM2(Segment Anything Model 2)在 GroundingDINO 输出的框基础上生成精确分割轮廓: from sam2.build_sam import build_sam2 from sam2.sam2_image_predictor import SAM2ImagePredictorsam2 = build_sam2("sam2_hiera_small.pt", device="cuda") predictor = SAM2ImagePredictor(sam2)predictor.set_image(image_np)# 用 GroundingDINO 的框作为 prompt masks, scores, _ = predictor.predict( box=boxes_xyxy, # [x1, y1, x2, y2] multimask_output=False )组合效果: GroundingDINO(框)+ SAM2(Mask)= 实例分割标注适合标注车辆、行人等需要精确轮廓的场景。 Florence-2:一键生成多种格式 微软的 Florence-2 是视觉语言模型,支持多种任务: from transformers import AutoProcessor, AutoModelForCausalLMmodel = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-large") processor = AutoProcessor.from_pretrained("microsoft/Florence-2-large")# 开放词汇检测 inputs = processor( text="<OPEN_VOCABULARY_DETECTION>car", images=image, return_tensors="pt" ) outputs = model.generate(**inputs) result = processor.decode(outputs[0], skip_special_tokens=False)支持的任务标签:<OD> — 通用目标检测 <CAPTION> — 图像描述 <OPEN_VOCABULARY_DETECTION>类别 — 指定类别检测 <OCR> — 文字识别Qwen2.5-VL:标注质量审核 GroundingDINO 标注后,用 Qwen2.5-VL 批量审核: # 伪代码示例 for image, label in dataset: response = qwen_vl.chat( image=image, question="图中的标注框是否正确?是否有漏标?" ) if "错误" in response or "漏标" in response: flag_for_review(image)批量过滤低质量标注,减少人工检查量。 推荐工具:X-AnyLabeling X-AnyLabeling 是集成了上述模型的图形化标注工具: pip install x-anylabeling x-anylabeling内置 GroundingDINO、SAM2、YOLO 等模型,支持:点击即分割 批量自动预标注 导出 YOLO、COCO、VOC 格式标注流程建议 1. 用 GroundingDINO 批量预标注(自动化) 2. X-AnyLabeling 打开,批量审查明显错误 3. SAM2 对需要 Mask 的目标细化边界 4. Qwen2.5-VL 辅助审核复杂场景 5. 导出 YOLO 格式,开始训练第一轮训出小模型后,用模型自身的预测结果辅助后续标注,形成正向循环(主动学习)。

RTX 3060 Ti 能跑哪些 AI 模型:LLM、OCR、YOLO 全景

RTX 3060 Ti(8GB 显存)是个甜点卡,覆盖了 LLM 推理、YOLO 训练、OCR、图像生成等主要本地 AI 场景。 LLM 大语言模型 流畅运行(推荐) 量化后直接跑,速度可接受:模型 4bit 显存Qwen3-4B 2~3 GBQwen3-8B(4bit) 4~6 GBLlama 3.2 3B 2~3 GBGemma 3 4B 2~3 GB勉强可用Qwen3-14B(需要部分层卸载到 CPU) Llama 3.1 8B(长上下文时速度明显下降)不推荐Qwen3-32B、DeepSeek-R1 原版、70B 级模型——需要 24GB+ 显存或多卡。工具推荐:Ollama(最简单)、LM Studio(有 GUI)、vLLM(高吞吐推理)。 OCR工具 适用场景PaddleOCR / PP-OCRv5 中文、表格、票据,CPU 也能跑Surya 复杂文档,精度高EasyOCR 部署最简单Qwen2.5-VL-7B 复杂界面截图,可输出结构化 JSON对于包含布局和表格的文档,PaddleX 的 PP-StructureV3 可以直接输出 HTML 或 Excel。 YOLO + OCR 组合是工业自动化常见方案: 截图 → YOLO 找目标框 → PaddleOCR 读文字 → 业务逻辑这比直接上 VL 大模型快几十倍。 YOLO 训练型号 状态YOLOv8n / YOLO11n 完全没问题YOLOv8s / YOLO11s 完全没问题YOLOv8m / YOLO11m 可以,batch 调小YOLOv8l / YOLOv8x 较吃力,batch=1~2 或降图片尺寸自动标注:GroundingDINO + SAM2 GroundingSAM2 是最强的自动标注组合: 文字提示("car", "person") → GroundingDINO 找框 → SAM2 生成分割轮廓 → 自动生成标注文件优点:开放词汇检测,不需要重新训练类别。 各模型比较:模型 支持任意类别 自动标注质量GroundingSAM2 ✅ ⭐⭐⭐⭐⭐⭐GroundingDINO SwinB-QInt8 ✅ ⭐⭐⭐⭐⭐GroundingDINO SwinT-QInt8 ✅ ⭐⭐⭐⭐DEIMv2-DINOv3(COCO) ❌ 只支持训练类别 ⭐⭐⭐如果数据量很大(几万张),先用 SwinT 批量跑,再人工抽查修正。 多模态 VLMQwen2.5-VL-7B:图片问答、OCR、表格识别、UI 截图分析 Qwen2.5-VL-3B:更轻量,3060Ti 跑很轻松 MiniCPM-V 4.5:轻量多模态用途:图片问答、自动生成标注描述、分析网页截图。 图像生成Stable Diffusion 1.5 / SDXL(低分辨率):512×512 很舒服 FLUX.1-dev:需要量化版,显存刚好够用语音Whisper:视频转字幕,中文效果强 CosyVoice / GPT-SoVITS:语音克隆,几秒样本就能复刻声线IndexedDB 中提取图片 如果标注数据存在浏览器 IndexedDB 里,可以用控制台导出: const req = indexedDB.open("数据库名");req.onsuccess = () => { const db = req.result; const store = db.transaction("Video2DImage", "readonly").objectStore("Video2DImage"); store.getAll().onsuccess = e => { e.target.result.forEach((item, i) => { const blob = item.image || item.data || item.blob; if (!blob) return; const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `${i}.jpg`; a.click(); setTimeout(() => URL.revokeObjectURL(url), 1000); }); }; };数量很多时建议用 JSZip 打包成 zip 后统一下载,避免浏览器拦截大量弹窗。 推荐配置(32GB 内存 + 3060Ti) Qwen3-8B → 代码助手、日常问答 Qwen2.5-VL-7B → 看图、OCR、标注辅助 Whisper large → 语音转文字 GroundingDINO + SAM2 → 自动标注 YOLO11s → 目标检测训练这套组合基本把 8GB 显存榨干,覆盖开发、标注、OCR、视觉分析全场景。

YOLO 标注工具选型:X-AnyLabeling / LabelMe / PaddleX

YOLO 训练项目中,标注工具的选择影响效率,特别是在自动预标注和多种格式导出方面差异很大。 X-AnyLabeling(推荐,功能最全) 国内团队维护,目前更新最活跃的智能标注工具。 核心优势:内置 SAM 自动分割(点击目标自动生成 mask) 集成 GroundingDINO 文本驱动检测 支持 YOLOv8 预标注(先训一个小模型,用它预标注剩余数据) 支持矩形、多边形、关键点、旋转框等多种标注类型 支持 YOLO、COCO、VOC 格式导出pip install x-anylabeling x-anylabeling适合:需要 AI 辅助加速标注,或做实例分割。 LabelMe(经典稳定) Python 实现,教程资料最多,适合新手入门。 pip install labelme labelme特点:支持矩形、多边形、圆形、线段标注 JSON 格式保存,可转换为 YOLO/COCO 格式 社区资料丰富不足:纯手动标注,没有 AI 辅助,标注效率相对低。 PaddleX(无代码完整流程) 百度飞桨出品,从标注到训练到部署的一站式平台。 pip install paddlepaddle paddlex完整流程: 数据上传 → 标注 → 训练(可视化监控)→ 评估 → 导出模型 → 部署特点:图形化界面,不需要写代码 支持目标检测、图像分类、OCR、语义分割 自带数据增强 支持 GPU 分布式训练适合:不熟悉深度学习代码的工程师,或做快速验证。 Label Studio(团队协作) 功能最完整的企业级标注平台。 pip install label-studio label-studio start特点:多用户任务分配和审核 支持图片、文本、音频、视频 REST API,可集成到训练流水线 支持 YOLO、COCO 等格式导出 社区版免费,企业版收费适合:团队协作标注大数据集,或需要标注审核流程。 工具对比工具 AI 辅助 团队协作 学习成本 适用场景X-AnyLabeling ✅ SAM+DINO ❌ 低 智能辅助标注LabelMe ❌ ❌ 极低 个人小数据集PaddleX 部分 ❌ 低(有 GUI) 无代码训练Label Studio ✅ ✅ 中 团队大规模标注YOLO 格式快速说明 标注完成后导出为 YOLO 格式(.txt 文件): # 每行格式:class_id cx cy width height 0 0.5 0.3 0.2 0.15 1 0.7 0.6 0.1 0.08坐标均为相对图片尺寸的归一化值(0~1)。class_id 从 0 开始,对应 data.yaml 中的类别列表。 预标注加速工作流 效率最高的策略:手动标注 200~500 张 训练一个初版 YOLOv8 模型 用该模型对剩余数据预标注 人工审核+修正(只改错误的框) 合并数据重新训练通常从第二轮开始,实际手工修改量减少 60~80%。

YOLO11 预训练模型指南:Ultralytics、Roboflow Universe 与 HuggingFace

Ultralytics 官方预训练模型 YOLO11 由 Ultralytics 维护,提供五档大小(n/s/m/l/x),覆盖四类主要任务:任务 示例权重 用途目标检测 yolo11n.pt ~ yolo11x.pt 输出 bbox + 类别实例分割 yolo11n-seg.pt ~ yolo11x-seg.pt 输出精确 Mask姿态识别 yolo11n-pose.pt ~ yolo11x-pose.pt 人体关键点旋转框(OBB) yolo11n-obb.pt ~ yolo11x-obb.pt 遥感/倾斜目标默认基于 COCO 80 类训练,可直接检测人、车、猫狗、手机、键盘等常见目标: from ultralytics import YOLOmodel = YOLO("yolo11m.pt") results = model("image.jpg")推理返回的 results 包含 bbox 坐标(xywh 或 xyxy)、置信度和类别 ID。 实例分割 model = YOLO("yolo11m-seg.pt") results = model("image.jpg")# 获取多边形点集(可直接转 YOLO 分割格式) for r in results: for mask in r.masks.xy: print(mask) # [[x, y], ...]垂直场景预训练权重 不需要从头训练的常见场景权重可在以下平台获取: Roboflow Universe:提供数千个社区训练好的 YOLO 权重,支持直接下载或 API 调用。常见方向:安全帽检测(工地、工厂) 烟火检测 跌倒检测 车牌识别 PCB 缺陷检测 路面裂缝HuggingFace:搜索 "yolo11" 或 "yolov8" 可找到专有领域微调版本,包含医学图像、农业、无人机航拍等方向。 更多可用模型 除 YOLO11 外,以下模型各有优势:模型 特点 适用场景YOLO-World 文本描述直接检测任意目标 零样本检测YOLO12 Attention 架构,精度更高 精度优先RT-DETR Transformer 检测器,速度快 部署优先RF-DETR 小数据集效果好 数据少的场景YOLOX 无 AGPL 协议争议 商业部署PP-YOLOE 百度飞桨出品 国内生态YOLO-World 示例 from ultralytics import YOLOmodel = YOLO("yolov8s-worldv2.pt")# 设置类别(无需重新训练) model.set_classes(["car", "person", "safety helmet"])results = model("image.jpg")输入类别名称即可检测,适合快速验证和标注辅助。 推荐工作流 没有垂直场景数据时: 1. 从 Roboflow Universe 找现有权重 2. 用预训练权重对自己数据集预标注 3. 人工审核 + 修正 4. 在预训练权重基础上微调(而非从头训练)微调比从头训练所需的数据量少 3~5 倍,收敛速度也更快。

YOLO 推理结果解读:置信度阈值、NMS 调参与工程部署建议

YOLO 推理输出结构 标准 YOLO API 输出格式(以 Ultralytics 为例): { "class": "vehicle", "class_id": 1, "confidence": 0.91, "bbox": { "x1": 156.15, "y1": 487.68, "x2": 653.12, "y2": 690.16, "width": 496.97, "height": 202.47 } }判断结果质量时关注两点:置信度分布:主要目标是否集中在 0.7 以上 框的空间分布:是否存在高度重叠的框四类常见问题 1. 重复框(NMS 不净) 同一辆车被检测 2~3 次,框坐标相近但不完全重合。原因是 IOU 阈值偏低,NMS 未能合并相似框。 # 默认 0.45 偏低,调高到 0.55~0.60 results = model(img, iou=0.55)2. 低置信度噪声 大量 confidence < 0.4 的框混入结果,尤其是行人、远处小目标。默认 conf=0.25 会保留大量噪声。 # 推荐生产阈值 results = model(img, conf=0.45)效果:去掉垃圾框,结果更干净,后续处理负担更小。 3. 小目标识别差 行人、远处目标置信度普遍偏低(< 0.5),框也不稳定。可能的原因:输入分辨率不够(模型内部将图缩放到 640×640 后,远处目标只占几个像素) 训练数据中远距离目标样本少优化方向: # 提高推理分辨率 results = model(img, imgsz=1280)或使用更适合小目标的模型(yolo11x 或 RT-DETR)。 4. 类别冲突(person vs two_wheel) 人骑车时同时触发 person 框和 two_wheel 框,两框高度重叠。后处理规则: def resolve_conflict(detections, iou_thresh=0.7): persons = [d for d in detections if d["class"] == "person"] bikes = [d for d in detections if d["class"] == "two_wheel"] to_remove = set() for p in persons: for b in bikes: if compute_iou(p["bbox"], b["bbox"]) > iou_thresh: # 保留置信度高的 if p["confidence"] < b["confidence"]: to_remove.add(id(p)) else: to_remove.add(id(b)) return [d for d in detections if id(d) not in to_remove]工程状态推荐参数参数 实验值 推荐生产值conf_threshold 0.25 0.45iou_threshold 0.45 0.55后处理 Pipeline results = model(img, conf=0.45, iou=0.55) detections = parse_results(results)# 1. 过滤极小框(去远处误检) detections = [d for d in detections if d["bbox"]["width"] * d["bbox"]["height"] > min_area]# 2. 类别冲突解决 detections = resolve_conflict(detections)# 3. 业务逻辑处理模型"能用"和"可上线"之间的差距主要就是以上这几个阈值和后处理步骤。