2026/2/20 4:06:08
网站建设
项目流程
巩义郑州网站建设,株洲网站建设服务,公司网站建设案例教程,合肥网站建设方案书YOLO11实战笔记#xff1a;从准备数据到输出结果
目标检测是计算机视觉最基础也最实用的任务之一。YOLO系列模型以速度快、精度高、部署便捷著称#xff0c;而YOLO11作为最新迭代版本#xff0c;在保持实时性的同时进一步提升了小目标识别能力与多尺度泛化性能。本文不讲抽…YOLO11实战笔记从准备数据到输出结果目标检测是计算机视觉最基础也最实用的任务之一。YOLO系列模型以速度快、精度高、部署便捷著称而YOLO11作为最新迭代版本在保持实时性的同时进一步提升了小目标识别能力与多尺度泛化性能。本文不讲抽象理论不堆砌参数而是带你从零开始走完一个完整的目标检测项目闭环从原始图片出发完成标注、格式转换、环境配置、模型训练到最后生成带框图和结构化结果——每一步都可复制、可验证、可落地。你不需要提前掌握深度学习框架细节只要会用文件夹、写几行Python、看懂终端输出就能跟着做完。所有操作均基于已预装YOLO11完整环境的镜像省去90%的环境踩坑时间。1. 数据准备从一张图到标准标签1.1 标注工具选择与实操要点我们推荐使用轻量、开源、中文支持好的Labelmev5.4.1。它不依赖复杂IDE单个Python脚本即可启动且导出JSON结构清晰便于后续转换。安装命令镜像中已预装此步仅作说明pip install labelme启动后点击【Open Dir】加载你的图像文件夹然后点击【Create Rectangle】框选目标物体在弹出输入框中填写类别名如car、person、bicycle每张图可标注多个目标支持重叠、遮挡场景标注完成后务必点击【Save】生成同名.json文件如img001.jpg→img001.json关键提醒Labelme默认保存坐标为像素值而YOLO11要求归一化坐标0~1区间。这一步不能跳过必须通过脚本转换——后面会提供稳定可用的转换代码。1.2 JSON转YOLO11标准txt一行代码解决YOLO11使用的标签格式是纯文本.txt每行代表一个目标格式为class_id x_center_norm y_center_norm width_norm height_norm其中所有坐标和尺寸均已除以图像宽高范围严格在[0,1]内。下面这段代码已在镜像中验证通过直接复制粘贴到Jupyter或.py文件中即可运行import json import os from pathlib import Path # 自定义类别映射表按需修改 label_map { person: 0, car: 1, bus: 2, truck: 3, bicycle: 4, motorcycle: 5 } def convert_labelme_to_yolo(json_path: str, output_dir: str): with open(json_path, r, encodingutf-8) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] annotations [] for shape in data.get(shapes, []): label shape[label] if label not in label_map: continue class_id label_map[label] points shape[points] if len(points) 2: continue # 取矩形左上右下两点Labelme矩形固定为2点 (x1, y1), (x2, y2) points[0], points[1] x_min, x_max min(x1, x2), max(x1, x2) y_min, y_max min(y1, y2), max(y1, y2) # 归一化计算 x_center (x_min x_max) / 2.0 / img_w y_center (y_min y_max) / 2.0 / img_h width (x_max - x_min) / img_w height (y_max - y_min) / img_h annotations.append(f{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) # 输出路径同名txt存入指定目录 txt_name Path(json_path).stem .txt output_path os.path.join(output_dir, txt_name) os.makedirs(output_dir, exist_okTrue) with open(output_path, w, encodingutf-8) as f: f.write(\n.join(annotations)) def batch_convert(input_folder: str, output_folder: str): for json_file in Path(input_folder).glob(*.json): convert_labelme_to_yolo(str(json_file), output_folder) print(f 已完成 {len(list(Path(input_folder).glob(*.json)))} 个JSON文件转换) # ▶ 执行转换请按实际路径修改 batch_convert( input_folder/mnt/data/json_labels, # 替换为你存放json的路径 output_folder/mnt/data/yolo11_labels # 转换后txt将存于此 )运行后你会在/mnt/data/yolo11_labels/下看到与图片一一对应的.txt文件例如/mnt/data/yolo11_labels/img001.txt /mnt/data/yolo11_labels/img002.txt ...验证小技巧打开任意一个txt检查是否每行都是5个数字且第2~5位都在0~1之间。若出现负数或大于1的值说明标注时坐标顺序异常需回Labelme重新框选。2. 目录结构搭建让YOLO11“认得清”你的数据YOLO11基于ultralytics 8.3.9对数据组织有明确约定。镜像中已预置ultralytics-8.3.9/工程目录你只需在其同级创建标准数据结构即可。2.1 推荐项目根目录结构your_project/ ├── ultralytics-8.3.9/ # 镜像自带勿动 ├── datasets/ # 你新建的主数据目录 │ └── my_custom_dataset/ # 自定义数据集名可改 │ ├── train/ │ │ ├── images/ # 存放训练图jpg/png │ │ └── labels/ # 存放对应txt标签与images同名 │ ├── val/ │ │ ├── images/ │ │ └── labels/ │ └── test/ # 可选推理用 ├── weights/ # 存放预训练权重镜像已含yolo11m.pt等 ├── train.py # 训练脚本你新建 └── infer.py # 推理脚本你新建提示datasets/my_custom_dataset/是你整个任务的“工作区”后续所有路径都基于它定义。2.2 创建数据集YAML配置文件在ultralytics-8.3.9/cfg/datasets/下新建文件my_custom_dataset.yaml内容如下# Ultralytics YOLO , AGPL-3.0 license train: ../datasets/my_custom_dataset/train/images # 相对于yaml文件的路径 val: ../datasets/my_custom_dataset/val/images test: ../datasets/my_custom_dataset/test/images # 可选 # 类别数量与名称顺序必须与label_map完全一致 nc: 6 names: [person, car, bus, truck, bicycle, motorcycle]注意train和val的路径是相对于该yaml文件所在位置即ultralytics-8.3.9/cfg/datasets/的相对路径。../表示向上一级再进入你的datasets/目录。3. 模型训练三步启动全程可控镜像已预装全部依赖PyTorch 1.13.1 CUDA 11.7无需额外安装。你只需专注训练逻辑。3.1 进入工作目录并确认环境cd ultralytics-8.3.9/ python -c from ultralytics import YOLO; print( YOLO11环境就绪)若输出YOLO11环境就绪说明一切正常。3.2 编写精简版训练脚本train.py在ultralytics-8.3.9/同级目录创建train.py内容如下已剔除冗余参数保留最常用12项from ultralytics import YOLO # 1⃣ 加载模型结构 预训练权重 model YOLO(yolo11m.yaml).load(weights/yolo11m.pt) # 2⃣ 定义核心训练参数中文注释版开箱即用 train_args { data: cfg/datasets/my_custom_dataset.yaml, # 指向你刚写的yaml epochs: 100, # 训练轮次小数据集建议50~100 imgsz: 640, # 输入分辨率显存紧张可降为320 batch: 8, # 每批图像数A30卡推荐8~16 name: my_custom_v1, # 实验名称结果将存于 runs/detect/my_custom_v1/ project: runs/detect, save: True, save_period: -1, # -1只存最终best.pt和last.pt device: 0, # 使用GPU 0填cpu则用CPU workers: 4, # 数据加载线程数根据CPU核数调整 cache: ram, # 将数据集缓存到内存加速训练 optimizer: auto, # 自动选择SGD/Adam小数据集建议sgd lr0: 0.01, # 初始学习率大模型可设0.001 box: 7.5, # 边界框损失权重默认值一般不调 cls: 0.5, # 分类损失权重默认值 dfl: 1.5, # 分布焦点损失权重默认值 val: True, # 训练中自动验证 plots: True, # 自动生成loss曲线、PR曲线等图表 } # 3⃣ 开始训练执行后终端将实时打印进度 if __name__ __main__: results model.train(**train_args) print( 训练完成模型已保存至, results.save_dir)3.3 运行训练并解读关键日志执行命令python train.py你会看到类似输出Transferred 649/649 items from pretrained weights Ultralytics 8.3.9 Python-3.9.16 torch-1.13.1 CUDA:0 (NVIDIA A30, 24062MiB) Starting training for 100 epochs... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 4.7G 2.102 1.587 2.311 128 640: 100%|████| 24/24 [00:0300:00, 7.2it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|████| 12/12 [00:0000:00, 15.3it/s] all 256 1842 0.752 0.698 0.771 0.523 ... 100/100 4.5G 0.821 0.4123 0.987 42 640: 100%|████| 24/24 [00:0200:00, 9.8it/s] all 256 1842 0.867 0.851 0.892 0.601 100 epochs completed in 0.042 hours. Optimizer stripped from runs/detect/my_custom_v1/weights/last.pt, 40.7MB Optimizer stripped from runs/detect/my_custom_v1/weights/best.pt, 40.7MB关键指标解读Box(P)边界框精确率PrecisionR召回率RecallmAP50IoU0.5时的平均精度工业界常用指标mAP50-95IoU从0.5到0.95步长0.05的平均值学术界标准best.pt验证集mAP最高的模型权重用于推理last.pt最后一轮训练的模型权重可用于断点续训健康训练信号mAP50从首轮0.4~0.5逐步升至0.8且box_loss持续下降若loss震荡剧烈或不降需检查标注质量或降低学习率。4. 模型推理一张图输入多种结果输出训练完成后best.pt就是你专属的检测模型。推理阶段支持图片、视频、文件夹、摄像头等多种输入源结果可可视化、可保存、可结构化提取。4.1 快速验证单图检测Jupyter友好在Jupyter中运行以下代码立即看到带框效果图from ultralytics import YOLO from IPython.display import display, Image # 加载训练好的最佳模型 model YOLO(runs/detect/my_custom_v1/weights/best.pt) # 对单张图推理自动保存带框图到 runs/detect/predict/ results model.predict( sourcedatasets/my_custom_dataset/test/images/sample01.jpg, conf0.5, # 置信度过滤0.3~0.7常用 saveTrue, # 保存带框图 save_txtTrue, # 保存检测结果txt含类别、坐标、置信度 show_confTrue,# 显示置信度数值 show_labelsTrue, line_width2 # 边框粗细 ) # 在Jupyter中直接显示结果图 display(Image(runs/detect/predict/sample01.jpg, width600))运行后你将在runs/detect/predict/下看到sample01.jpg原图叠加检测框与标签sample01.txt结构化结果每行格式为class_id center_x center_y width height confidence4.2 批量处理文件夹推理与结果解析创建infer.py脚本实现自动化批量推理from ultralytics import YOLO import os from pathlib import Path model YOLO(runs/detect/my_custom_v1/weights/best.pt) # 推理整个文件夹支持jpg/png results model.predict( sourcedatasets/my_custom_dataset/test/images/, conf0.45, iou0.6, saveTrue, save_txtTrue, save_confTrue, # 保存置信度到txt projectruns/detect, nameinference_results ) print(f 推理完成共处理 {len(results)} 张图像) print(f 结果保存在runs/detect/inference_results/) # 可选打印首张图的检测详情调试用 first_result results[0] boxes first_result.boxes print(f\n 首张图检测到 {len(boxes)} 个目标) for i, box in enumerate(boxes): cls_id int(box.cls.item()) conf float(box.conf.item()) xyxy box.xyxy[0].tolist() # [x1,y1,x2,y2] 像素坐标 print(f {i1}. 类别: {model.names[cls_id]}, 置信度: {conf:.3f}, 位置: {xyxy})运行后runs/detect/inference_results/下将生成image_001.jpg,image_002.jpg, ...带框图labels/image_001.txt,labels/image_002.txt, ...结构化文本results.csv汇总统计表含每图检测数、平均置信度等进阶提示results[0].boxes.xyxy返回的是归一化坐标0~1若需像素坐标请用results[0].boxes.xyxy * [img_w, img_h, img_w, img_h]还原。5. 效果优化与避坑指南来自真实训练经验5.1 三类高频问题与解法问题现象可能原因快速验证方式推荐解法训练loss不下降mAP始终低于0.3标注错误漏标、错标、坐标反向、类别名与yaml不一致检查yolo11_labels/中任意txt文件确认每行5个数字且第2~5位∈[0,1]对比my_custom_dataset.yaml中names顺序与label_map是否一致用脚本重跑标注转换用labelme打开原图json人工抽检10张验证时大量误检背景被框数据增强过强尤其mosaic1.0、学习率过高临时关闭mosaicmosaic0.0降低lr0至0.001在train_args中添加mosaic: 0.0, lr0: 0.001推理结果框偏移、尺寸不准训练imgsz与推理imgsz不一致、模型未收敛查看训练日志末尾mAP50是否≥0.8确保model.predict(imgsz640)与训练一致重新训练增加epochs严格统一imgsz参数5.2 性能与精度平衡建议显存不足OOM优先调小batch4imgsz320而非降低epochs小目标漏检严重启用P2层输出修改yolo11.yaml中head部分增加P2分支或使用--augment增强小目标推理速度慢导出ONNX后用ONNX Runtime推理model.export(formatonnx)速度提升2~3倍6. 总结你已掌握YOLO11工程化落地全链路回顾本文你已完成一个端到端的目标检测项目数据侧用Labelme完成标注 → 用Python脚本批量转为YOLO11标准txt → 搭建符合规范的datasets/目录配置侧编写my_custom_dataset.yaml定义数据路径与类别 → 确认yolo11m.yaml结构可用训练侧运行train.py启动训练 → 看懂日志中的loss与mAP变化 → 获取best.pt推理侧用infer.py批量处理图片 → 得到带框图、结构化txt、汇总csv → 提取坐标与置信度供业务系统调用YOLO11不是黑盒它的每个环节都透明、可干预、可调试。你不需要成为算法专家但可以成为能交付结果的CV工程师——而这正是工程实践的核心价值。下一步你可以尝试 将检测结果接入Web界面Flask/FastAPI 用model.export(formatonnx)导出模型部署到边缘设备 基于检测框坐标做计数、测距、轨迹分析等上层应用真正的AI落地始于一次可复现的训练成于一个能解决问题的结果。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。