知乎专栏 |
目标检测任务
模型规格
x,y是目标的中心坐标,width,height是目标的宽和高。
<object-class> <x> <y> <width> <height>
VOC与YOLO之间的格式转换
# size是原图的(w,h), box是坐标 def voc_to_yolo(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def yolo_to_voc(size, box): x = box[0] * size[0] w = box[2] * size[0] y = box[1] * size[1] h = box[3] * size[1] xmin = int(x - w/2) xmax = int(x + w/2) ymin = int(y - h/2) ymax = int(y + h/2) return (xmin, ymin, xmax, ymax)
from ultralytics import YOLO # 指定模型 mode = YOLO('yolo11n-seg.pt') # 让模型开始训练 mode.train(data='dataset.yaml',workers=0,epochs=10,batch=10) # 验证模型 mode.val()
训练设置所有参数详解
YOLO 模型的训练设置包括在训练过程中使用的各种超参数和配置。这些设置会影响模型的性能、速度和准确性。关键的训练设置包括批量大小、学习率、动量和权重衰减。此外,优化器的选择、损失函数和训练数据集的组成也会影响训练过程。仔细调整和实验这些设置对于优化性能至关重要。
参数 默认值 描述 model None 指定训练模型文件。接受 .pt 预训练模型或 .yaml 配置文件的路径。对定义模型结构或初始化权重至关重要。 data None 数据集配置文件的路径(如 coco8.yaml)。该文件包含数据集特定参数,包括训练和验证数据的路径、类别名称和类别数量。注意:该yaml文件中必须至少包含训练集和验证集数据路径。 epochs 100 总训练 epochs 数。每个 epoch 代表完整遍历整个数据集一次。调整此值会影响训练时长和模型性能。 time None 最大训练时间(小时)。如果设置,将覆盖 epochs 参数,允许在指定时间后自动停止训练。适用于时间受限的训练场景。 patience 100 在验证指标没有改进的情况下等待的 epochs 数,之后提前停止训练。通过在性能停滞时停止训练来防止过拟合。 batch 16 批量大小,有三种模式:设置为整数(如 batch=16),自动模式为 GPU 内存利用率的 60%(batch=-1),或指定利用率分数的自动模式(batch=0.70)。当你不会根据图像大小计算所需内存时,后面两种模式很有用。 imgsz 640 训练的目标图像大小。所有图像在输入模型前都将调整为此尺寸。影响模型准确性和计算复杂性。 save True 启用训练检查点和最终模型权重的保存。对于恢复训练或模型部署非常有用。 save_period -1 模型检查点保存频率,以 epochs 为单位。值为 -1 禁用此功能。在长时间训练期间保存中间模型非常有用。 cache False 启用数据集图像缓存到内存(True/ram)、磁盘(disk)或禁用(False)。通过减少磁盘 I/O 提高训练速度,但增加内存使用。 device None 指定训练的计算设备:单个 GPU(device=0),多个 GPU(device=0,1),CPU(device=cpu),或 Apple 芯片的 MPS(device=mps)。 workers 8 数据加载的工作线程数(如果是多 GPU 训练,则按 RANK 计算)。影响数据预处理和输入模型的速度,尤其在多 GPU 设置中。 project None 保存训练输出的项目目录名称。允许有组织地存储不同实验。 name None 训练运行的名称。用于在项目文件夹内创建子目录,保存训练日志和输出。 exist_ok False 如果为 True,允许覆盖现有的项目/名称目录。适用于无需手动清理先前输出的迭代实验。 pretrained True 决定是否从预训练模型开始训练。可以是布尔值或字符串路径,指定从哪个模型加载权重。增强训练效率和模型性能。 optimizer 'auto' 训练的优化器选择。选项包括 SGD、Adam、AdamW、NAdam、RAdam、RMSProp 等,或根据模型配置自动选择。影响收敛速度和稳定性。 verbose False 启用详细输出,在训练期间提供详细日志和进度更新。适用于调试和密切监控训练过程。 seed 0 设置训练的随机种子,确保在相同配置下结果的可重复性。 deterministic True 强制使用确定性算法,确保可重复性,但可能因限制非确定性算法而影响性能和速度。 single_cls False 在训练期间将多类数据集中的所有类视为单一类。适用于二分类任务或专注于对象存在而非分类时。 rect False 启用矩形训练,优化批次组成以最小化填充。可以提高效率和速度,但可能影响模型准确性。 cos_lr False 使用余弦学习率调度器,按余弦曲线调整学习率。帮助更好地管理学习率以实现更好的收敛。 close_mosaic 10 在最后 N 个 epochs 中禁用马赛克数据增强,以在完成前稳定训练。设置为 0 禁用此功能。 resume False 从上次保存的检查点恢复训练。自动加载模型权重、优化器状态和 epoch 计数,继续无缝训练。 amp True 启用自动混合精度(AMP)训练,减少内存使用并可能加快训练速度,对准确性的影响最小。 fraction 1.0 指定用于训练的数据集的比例。允许在数据集的子集中进行训练,适用于实验或资源有限时。 profile False 启用训练期间 ONNX 和 TensorRT 速度的分析,优化模型部署。 freeze None 冻结模型的前 N 层或按索引指定的层,减少可训练参数数量。适用于微调或迁移学习。 lr0 0.01 初始学习率(如 SGD=1E-2,Adam=1E-3)。调整此值对优化过程至关重要,影响模型权重的更新速度。 lrf 0.01 最终学习率作为初始率的分数 = (lr0 * lrf),与调度器一起使用以随时间调整学习率。 momentum 0.937 SGD 的动量因子或 Adam 的 beta1,影响当前更新中过去梯度的合并。 weight_decay 0.0005 L2 正则化项,惩罚大权重以防止过拟合。 warmup_epochs 3.0 学习率预热的 epochs 数,从低值逐渐增加到初始学习率,以在早期稳定训练。 warmup_momentum 0.8 预热阶段的初始动量,在预热期内逐渐调整到设定动量。 warmup_bias_lr 0.1 预热阶段偏置参数的学习率,有助于在初始 epochs 中稳定模型训练。 box 7.5 损失函数中 box 损失组件的权重,影响准确预测边界框坐标的重要性。 cls 0.5 总损失函数中分类损失的权重,影响正确类别预测相对于其他组件的重要性。 dfl 1.5 分布焦点损失的权重,用于某些 YOLO 版本的细粒度分类。 pose 12.0 在姿态估计训练的模型中姿态损失的权重,影响准确预测姿态关键点的重要性。 kobj 2.0 姿态估计模型中关键点对象性的损失权重,平衡检测置信度与姿态准确性。 label_smoothing 0.0 应用标签平滑,将硬标签软化为目标标签和标签间的均匀分布的混合,可以改善泛化。 nbs 64 用于损失归一化的名义批大小。 overlap_mask True 决定在训练期间分割掩码是否应重叠,适用于实例分割任务。 mask_ratio 4 分割掩码的下采样率,影响训练期间使用的掩码分辨率。 dropout 0.0 分类任务的正则化丢弃率,通过在训练期间随机忽略单元来防止过拟合。 val True 启用训练期间的验证,允许定期评估模型在单独数据集上的性能。 plots False 生成并保存训练和验证指标的图表以及预测示例,为模型性能和学习进展提供视觉洞察。
参数 类型 默认值 范围 描述 hsv_h float 0.015 0.0 - 1.0 调整图像的色调,增加颜色变化,有助于模型在不同光照条件下泛化。 hsv_s float 0.7 0.0 - 1.0 改变图像的饱和度,影响颜色的强度。用于模拟不同的环境条件。 hsv_v float 0.4 0.0 - 1.0 修改图像的亮度,有助于模型在各种光照条件下表现良好。 degrees float 0.0 -180 - +180 随机旋转图像,提升模型识别不同方向物体的能力。 translate float 0.1 0.0 - 1.0 水平和垂直平移图像,帮助模型学会检测部分可见的物体。 scale float 0.5 >=0.0 按比例缩放图像,模拟不同距离的物体。 shear float 0.0 -180 - +180 按指定角度剪切图像,模拟从不同角度观看物体的效果。 perspective float 0.0 0.0 - 0.001 对图像应用随机透视变换,增强模型理解三维空间中物体的能力。 flipud float 0.0 0.0 - 1.0 以指定概率上下翻转图像,增加数据多样性而不影响物体特性。 fliplr float 0.5 0.0 - 1.0 以指定概率左右翻转图像,有助于学习对称物体,并增加数据集多样性。 bgr float 0.0 0.0 - 1.0 以指定概率将图像通道从 RGB 翻转为 BGR,提高对错误通道顺序的鲁棒性。 mosaic float 1.0 0.0 - 1.0 将四张训练图像组合成一张,模拟不同场景构图和物体交互。非常有效的复杂场景理解。 mixup float 0.0 0.0 - 1.0 将两张图像及其标签混合,创建复合图像。通过引入标签噪声和视觉变化,提高模型的泛化能力。 copy_paste float 0.0 0.0 - 1.0 将一个图像中的物体复制并粘贴到另一个图像中,有助于增加物体实例并学习物体遮挡。 auto_augment str randaugment - 自动应用预定义的增强策略(randaugment、autoaugment、augmix),通过多样化视觉特征优化分类任务。 erasing float 0.4 0.0 - 0.9 在分类训练期间随机擦除图像的一部分,鼓励模型关注较不明显的特征。 crop_fraction float 1.0 0.1 - 1.0 将分类图像裁剪为其大小的一部分,以强调中心特征并适应物体尺度,减少背景干扰。
用户可以根据自身的需求,设置数据集和任务的具体参数。通过不同值的调整,找到最佳的策略,从而达到最佳的模型训练效果。
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 64/100 0.679G 0.5564 0.5321 1.084 9 320: 100%|██████████| 231/231 [00:25<00:00, 8.97it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 34/34 [00:05<00:00, 6.49it/s] all 1068 1068 0.958 0.943 0.984 0.944
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
训练过程中的迭代次数,在机器学习和深度学习中,一个epoch是训练过程中的一个完整周期,包括了训练数据集中的所有样本,以逐渐优化其性能。
GPU显存的使用情况,也就是图形处理器在训练过程中所使用的显存量。
Class Images Instances Box(P R mAP50 mAP50-95):
打开 weights 文件夹里面有两个文件,分别是:best.pt和last.pt。
best.pt 是整个训练过程中,性能最好的模型权重文件。
last.pt 是最后一次训练的模型权重文件。
一般我们选择 best.pt 文件,用于生产环境。
task: detect mode: train model: tongue.yaml data: datasets/test/YOLODataset/dataset.yaml epochs: 100 time: null patience: 100 batch: 16 imgsz: 320 save: true save_period: -1 cache: false device: 0 workers: 8 project: null name: train9 exist_ok: false pretrained: true optimizer: auto verbose: true seed: 0 deterministic: true single_cls: false rect: false cos_lr: false close_mosaic: 10 resume: false amp: true fraction: 1.0 profile: false freeze: null multi_scale: false overlap_mask: true mask_ratio: 4 dropout: 0.0 val: true split: val save_json: false save_hybrid: false conf: null iou: 0.7 max_det: 300 half: false dnn: false plots: true source: null vid_stride: 1 stream_buffer: false visualize: false augment: false agnostic_nms: false classes: null retina_masks: false embed: null show: false save_frames: false save_txt: false save_conf: false save_crop: false show_labels: true show_conf: true show_boxes: true line_width: null format: torchscript keras: false optimize: false int8: false dynamic: false simplify: true opset: null workspace: null nms: false lr0: 0.01 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1 box: 7.5 cls: 0.5 dfl: 1.5 pose: 12.0 kobj: 1.0 nbs: 64 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 bgr: 0.0 mosaic: 1.0 mixup: 0.0 copy_paste: 0.0 copy_paste_mode: flip auto_augment: randaugment erasing: 0.4 crop_fraction: 1.0 cfg: null tracker: botsort.yaml save_dir: D:\workspace\netkiller\runs\detect\train
先看前三列是 loss 损失率图表,X轴表示训练轮次,Y轴表示损失值。推理结果和人工标注的答案之间的差异,称为“损失”。损失越小越好,损失为0则说明推理和正确答案之间没有差异,即预测100%命中。
train 训练集,val 验证集
精度/召回率
mAP50是重合度以50%为界限的平均精度。而mAP50-95则是IoU阈值从50%到95%范围内的平均值
X轴是训练轮次,Y表示精度,取值0.0 ~ 1.0(100%)越接近1.0效果越好。
如果训练过程异常中断,可以通过设置 resume=True 选项,读取训练过程,断点信息存储在 ‘path/to/last.pt’ 文件中,启动后会从之前的断点恢复训练,
from ultralytics import YOLO # 加载模型 model = YOLO("path/to/last.pt") # 加载训练的模型 # 恢复训练 results = model.train(resume=True)
from ultralytics import YOLO def main(): # 加载模型 model = YOLO('yolo11m.pt') # 你可以使用预训练的模型权重 # 设置超参数 hyperparameters = { 'epochs': 1, # 训练轮数 'imgsz': 640, # 输入图像大小 'batch': 8, # 批次大小 'device': 0, # 使用的GPU设备编号,-1表示使用CPU 'lr0': 0.01, # 初始学习率 'lrf': 0.01, # 最终学习率 'momentum': 0.937, # 动量 'weight_decay': 0.0005, # 权重衰减 'warmup_epochs': 3.0, # 预热轮数 'warmup_momentum': 0.8, # 预热动量 'warmup_bias_lr': 0.1, # 预热偏置学习率 'box': 7.5, # box 损失增益 'cls': 0.5, # cls 损失增益 'dfl': 1.5, # dfl 损失增益 'hsv_h': 0.015, # HSV 色调增益 'hsv_s': 0.7, # HSV 饱和度增益 'hsv_v': 0.4, # HSV 值增益 'degrees': 0.0, # 旋转度数 'translate': 0.1, # 平移增益 'scale': 0.5, # 尺度增益 'shear': 0.0, # 剪切度数 'perspective': 0.0, # 透视度数 'flipud': 0.0, # 上下翻转概率 'fliplr': 0.5, # 左右翻转概率 'mosaic': 1.0, # 马赛克增强 'mixup': 0.0, # MixUp增强 'copy_paste': 0.0, # 复制粘贴增强 'auto_augment': 'randaugment', # 自动增强策略 'erasing': 0.4, # 随机擦除增强 'crop_fraction': 1.0, # 裁剪比例 'cfg': None, # 模型配置文件 'tracker': 'botsort.yaml', # 跟踪器配置文件 'save_dir': 'runs/train', # 保存目录 'rect': False, # 是否使用矩形训练 'cos_lr': False, # 是否使用余弦学习率 'close_mosaic': 10, # 关闭马赛克增强的epoch 'resume': False, # 是否恢复训练 'amp': True, # 是否使用混合精度 'fraction': 1.0, # 数据集使用比例 'profile': False, # 是否性能分析 'freeze': None, # 冻结层 'multi_scale': False, # 是否使用多尺度训练 'overlap_mask': True, # 是否使用重叠掩码 'mask_ratio': 4, # 掩码比例 'dropout': 0.0, # Dropout 概率 'val': True, # 是否进行验证 'split': 'val', # 验证集拆分 'save_json': False, # 是否保存为JSON 'save_hybrid': False, # 是否保存混合模型 'conf': None, # 置信度阈值 'iou': 0.7, # IOU 阈值 'max_det': 300, # 最大检测数量 'half': False, # 是否使用半精度 'dnn': False, # 是否使用DNN 'plots': True, # 是否绘制图表 'source': None, # 数据源 'vid_stride': 1, # 视频步长 'stream_buffer': False, # 是否使用流缓冲 'visualize': False, # 是否可视化 'augment': False, # 是否数据增强 'agnostic_nms': False, # 是否使用类别无关NMS 'classes': None, # 使用的类别 'retina_masks': False, # 是否使用视网膜掩码 'embed': None, # 嵌入 'show': False, # 是否显示 'save_frames': False, # 是否保存帧 'save_txt': False, # 是否保存为TXT 'save_conf': False, # 是否保存置信度 'save_crop': False, # 是否保存裁剪结果 'show_labels': True, # 是否显示标签 'show_conf': True, # 是否显示置信度 'show_boxes': True, # 是否显示边界框 'line_width': None, # 线宽 'format': 'torchscript', # 格式 'keras': False, # 是否使用Keras 'optimize': False, # 是否优化 'int8': False, # 是否使用int8量化 'dynamic': False, # 是否动态 'simplify': False, # 是否简化 'opset': None, # ONNX opset版本 'workspace': 4, # 工作空间 'nms': False # 是否使用NMS } # 训练模型 model.train( data=r'D:\PycharmProjects\netkiller\datasets\mydata.yaml', # 数据集配置文件 **hyperparameters ) # 评估模型 results = model.val() # 使用模型进行推理 results = model(r'netkiller.jpg') # 输入图片路径 # 打印结果 print(results) if __name__ == "__main__": main()
from ultralytics import YOLO # ---------- 加载模型 ---------- model = YOLO('runs/detect/train/weights/best.pt') # ---------- 模型评估 ---------- model.val(data='captcha/images/YOLODataset/dataset.yaml')
split='test' 可以选择数据集,默认是 val
from ultralytics import YOLO # Load a model model = YOLO('yolov11n.pt') # load an official model model = YOLO('runs/detect/train/weights/best.pt') # load a custom model # Validate the model metrics = model.val(split='test') # no arguments needed, dataset and settings remembered metrics.box.map # map50-95 metrics.box.map50 # map50 metrics.box.map75 # map75 metrics.box.maps # a list contains map50-95 of each category
参数 类型 默认值 描述 data str None 指定数据集配置文件的路径(例如,coco8.yaml)。这个文件包括验证数据的路径、类名和类的数量。 imgsz int 640 定义输入图像的大小。所有图像在处理前都调整到这个尺寸。 batch int 16 设置每个批次的图像数量。使用 -1 表示自动批量(AutoBatch),它会根据 GPU 内存可用性自动调整。 save_json bool False 如果为 True,将结果保存到 JSON 文件中,以便进一步分析或与其他工具集成。 save_hybrid bool False 如果为 True,保存标签的混合版本,将原始注释与额外的模型预测相结合。 conf float 0.001 设置检测的最小置信阈值。丢弃置信度低于这个阈值的检测。 iou float 0.6 设置非极大值抑制(NMS)的交并比(IoU)阈值。有助于减少重复检测。 max_det int 300 限制每张图像的最大检测数量。在密集场景中用于防止过度检测。 half bool True 启用半精度(FP16)计算,减少内存使用,并可能在最小影响准确性的情况下提高速度。 device str None 指定验证的设备(cpu, cuda:0 等)。允许灵活使用 CPU 或 GPU 资源。 dnn bool False 如果为 True,使用 OpenCV DNN 模块进行 ONNX 模型推理,作为 PyTorch 推理方法的替代。 plots bool False 当设置为 True 时,生成并保存预测与真实值的对比图,以便直观评估模型的性能。 rect bool False 如果为 True,使用矩形推理进行批处理,减少填充,可能提高速度和效率。 split str val 确定用于验证的数据集划分(val, test, 或 train)。允许灵活选择用于性能评估的数据段。
from ultralytics import YOLO # 加载预训练的YOLOv11n模型 model = YOLO("yolo11n.pt") # yolo11n.pt, yolo11s.pt, yolo11m.pt, yolo11x.pt # 对'bus.jpg'图像进行推理,并获取结果 https://ultralytics.com/images/bus.jpg results = model.predict("https://ultralytics.com/images/bus.jpg", save=True, imgsz=320, conf=0.5) # 处理返回的结果 for result in results: boxes = result.boxes # 获取边界框信息 probs = result.probs # 获取分类概率 result.show() # 显示结果型的架构 print(boxes) print(probs)
换一个模型,试试 yolo11n-seg.pt
from ultralytics import YOLO model = YOLO("yolo11n-seg.pt") results = model.predict("https://ultralytics.com/images/bus.jpg", save=True, imgsz=320, conf=0.5) # 处理返回的结果 for result in results: boxes = result.boxes # 获取边界框信息 probs = result.probs # 获取分类概率 print(boxes) print(probs) result.show() # 显示结果型的架构
推理参数
参数 类型 默认值 描述 source str ‘ultralytics/assets’ 指定推理的数据源。可以是图像路径、视频文件、目录、URL 或实时流的设备 ID。支持多种格式和来源,使不同类型的输入都能灵活应用。 conf float 0.25 设置检测的最小置信度阈值。低于此阈值的检测对象将被忽略。调整此值有助于减少误报。 iou float 0.7 非极大值抑制(NMS)的交并比(IoU)阈值。较低的值会通过消除重叠的框来减少检测数量,对于减少重复检测很有用。 imgsz int/tuple 640 定义推理的图像大小。可以是一个整数 640,用于方形缩放,也可以是一个(高度,宽度)元组。适当的尺寸可以提高检测准确性和处理速度。 half bool False 启用半精度(FP16)推理,可以在支持 GPU 上加速模型推理,同时对准确度的影响最小。 device str None 指定推理的设备(例如,cpu, cuda:0 或 0)。允许用户在 CPU、特定 GPU 或其他计算设备之间选择模型执行。 max_det int 300 每张图像允许的最大检测数量。限制模型在单个推理中可以检测到的总对象数量,以防止在密集场景中产生过多的输出。 vid_stride int 1 视频输入的帧间跳过。允许在视频中跳过帧以提高处理速度,但代价是时间分辨率。值为 1 时处理每个帧,更高的值跳过帧。 stream_buffer bool False 确定在处理视频流时是否应缓冲所有帧(True),或者模型是否应返回最新的帧(False)。对于实时应用很有用。 visualize bool False 激活推理期间模型特征的可视化,提供模型“看到”的洞察。对于调试和模型解释非常有用。 augment bool False 启用预测的测试时间增强(TTA),可能会提高检测的鲁棒性,但代价是推理速度。 agnostic_nms bool False 启用类无关的非极大值抑制(NMS),合并不同类的重叠框。在多类检测场景中,当类之间经常有重叠时非常有用。 classes list [int] None 过滤预测到一组类 ID。只有属于指定类的检测结果才会被返回。对于在多类检测任务中关注相关对象非常有用。 retina_masks bool False 如果模型中可用,则使用高分辨率的分割掩码。这可以增强分割任务的掩码质量,提供更细的细节。 embed list [int] None 指定要从哪些层提取特征向量或嵌入。对于下游任务,如聚类或相似度搜索非常有用。
可视化参数
参数 类型 默认值 描述 show bool False 如果为 True,则在窗口中显示标注的图像或视频。在开发或测试期间,这对于立即获得视觉反馈非常有用。 save bool False 启用将标注的图像或视频保存到文件。这对于文档、进一步分析或分享结果非常有用。 save_frames bool False 在处理视频时,将单独的帧保存为图像。这对于提取特定帧或进行详细的逐帧分析非常有用。 save_txt bool False 将检测结果保存为文本文件,格式为 [class] [x_center] [y_center] [width] [height] [confidence]。这对于与其他分析工具集成非常有用。 save_conf bool False 在保存的文本文件中包含置信度分数。增强了可用于后处理和分析的详细信息。 save_crop bool False 保存检测的裁剪图像。这对于数据增强、分析或创建特定对象的聚焦数据集非常有用。 show_labels bool True 在视觉输出中显示每个检测的标签。提供了对检测到的对象立即的理解。 show_conf bool True 在标签旁边显示每个检测的置信度分数。为每个检测提供了模型确定性的洞察。 show_boxes bool True 在图像或视频帧中检测到的对象周围绘制边界框。这对于视觉识别和定位图像或视频帧中的对象至关重要。 line_width int None 指定边界框的线条宽度。如果为 None,线条宽度将根据图像大小自动调整。为清晰度提供了视觉定制。
from yolov8 import YOLO # 加载预训练模型 model = YOLO('yolov8.pt') # 执行预测 results = model.predict( source='path/to/image.jpg', # 输入源,可以是图像路径、视频路径、摄像头索引等 conf=0.5, # 置信度阈值,滤除低于该置信度的检测结果。 iou=0.45, # NMS的交并比阈值,用于消除重叠的检测框。 device='cuda', # 使用GPU imgsz=(640, 640), # 输入图像的尺寸,可以是单个整数(长宽相等)或元组(长和宽)。 half=False, # 不使用半精度浮点数 save_txt=True, # 保存预测结果为文本文件 save_conf=True, # 在保存的文本文件中包含置信度 save_crop=False, # 不保存裁剪后的检测结果 save_img=True, # 保存带有检测框的图像 classes=[0, 1, 2], # 仅检测指定的类 agnostic_nms=False, # 不使用类别无关的NMS augment=False, # 不使用数据增强 visualize=False, # 不可视化特征图 project='runs/detect', # 保存预测结果的项目目录 name='exp', # 保存预测结果的子目录名称 exist_ok=False, # 不允许项目目录存在 line_thickness=3, # 绘制检测框的线条粗细 hide_labels=False, # 显示检测框的标签 hide_conf=False # 显示检测框的置信度 ) # 输出预测结果 print(results)
返回结果通常包含以下主要属性和方法:
1.boxes: 包含检测到的边界框信息的对象。
2.scores: 包含每个检测目标的置信度分数。
3.classes: 包含每个检测目标的类别索引。
4.masks: 如果使用实例分割模型,包含分割掩码。
5.keypoints: 如果使用关键点检测模型,包含关键点信息。
6.orig_img: 原始输入图像。
7.plot(): 用于可视化检测结果的方法。
boxes:
1.boxes.xyxy: 返回每个检测目标的边界框坐标,格式为 [x_min, y_min, x_max, y_max]。
2.boxes.conf: 返回每个检测目标的置信度分数。
3.boxes.cls: 返回每个检测目标的类别索引。
from ultralytics import YOLO # 加载模型 # model = YOLO("yolo11n.pt") # model = YOLO('weights/last.pt') model = YOLO('weights/best.pt') # 模型预测,save=True 的时候表示直接保存yolov8的预测结果 results = model('images/0_5902.png') # View results for result in results: # 处理结果 boxes = result.boxes # 边界框结果 masks = result.masks # 分割掩码结果 names = result.names keypoints = result.keypoints # 关键点检测结果 probs = result.probs # 分类概率结果 obb = result.obb # 方向边界框结果(OBB) print(boxes) for box in boxes: print(names[int(box.cls)]) result.show() # 显示结果
@app.post("/netkiller") async def netkiller(file: bytes = File()): try: filename = f"tmp/{uuid.uuid4()}.png" print(filename) with open(filename, "wb") as f: f.write(file) results = model(filename) # , conf=0.45 for result in results: boxes = result.boxes # 获取边界框信息 # probs = result.probs # 获取分类概率 names = result.names data = result.boxes.data print(boxes) # print(probs) if names is not None: labels = [] for box in boxes: label = names[int(box.cls)] labels.append(label) print(label) # result.show() # 显示结果型的架构 result.save(filename="tmp/test.png") if boxes is not None: image = Image.open(filename) # x0, y0, x1, y1 = map(int, boxes.xyxy[0]) crop = tuple(map(int, boxes.xyxy[0])) region = image.crop(crop) region.save('tmp/neo.jpg') return {"label": labels} except Exception as e: log.error(e) return {"label": None}
tensor([ 59.0264, 88.7340, 367.5180, 420.6993]) 转 list [ 59.0264, 88.7340, 367.5180, 420.6993]
xyxy = boxes.xyxy[0].tolist()
boxes.data 数据,YOLO 边界框格式:[x1, y1, x2, y2, confidence, class]
boxes = result.boxes.data.cpu().numpy() print(result.boxes.data.tolist())
def boxes(self, source:str,target:str): if not os.path.exists(source): return None try: image = cv2.imread(source) if image is None: return None results = self.model(source,verbose=False) for result in results: # 提取检测到的目标的边界框 boxes = result.boxes.data.cpu().numpy() # YOLO 边界框格式:[x1, y1, x2, y2, confidence, class] # print(result.boxes.data.tolist()) if self.args.output: result.save(filename=os.path.join(self.args.output, os.path.basename(source))) result.save_crop(save_dir=os.path.join(self.args.output,'crop'), file_name="detection") # print(boxes) for idx, box in enumerate(boxes): x1, y1, x2, y2, conf, cls = map(int, box[:6]) cropped = image[y1:y2, x1:x2] output = os.path.join(self.args.target, f"{os.path.splitext(os.path.basename(source))[0]}_{idx}.jpg") cv2.imwrite(output, cropped) # print(f"Saved cropped image: {output}") except Exception as e: # log.error(e) print("boxes: ",e) exit() return None
默认会输出
image 1/1 /Users/neo/PycharmProjects/netkiller/tmp/test/20150917_082555.jpg: 320x192 1 shebei, 11.2ms Speed: 0.5ms preprocess, 11.2ms inference, 0.5ms postprocess per image at shape (1, 3, 320, 192)
关闭输出
model(img, save=True, verbose=False)
from ultralytics import YOLO model = YOLO("../model/Classify/weights/best.pt") # 加载训练好的模型 results = model.predict(source='../datasets/1206/20150924_100741.jpg', # 推理图像路径 save=True, show=True) # print(results) result = results.pop() names = model.names print("names:",names) # print(result.probs) print("data:",result.probs.data) print("top1:",result.probs.top1, " top1conf: ",result.probs.top1conf) print("class: %s, conf: %s" % (names[result.probs.top1], result.probs.top1conf.cpu()))
D:\workspace\netkiller\.venv\Scripts\python.exe D:\workspace\netkiller\test\classify.py image 1/1 D:\workspace\netkiller\test\..\datasets\1206\20150924_100741.jpg: 320x320 yiyuzheng 0.72, xinnaoxieguan 0.28, 6.0ms Speed: 21.1ms preprocess, 6.0ms inference, 0.0ms postprocess per image at shape (1, 3, 320, 320) Results saved to D:\workspace\netkiller\runs\classify\predict31 names: {0: 'xinnaoxieguan', 1: 'yiyuzheng'} data: tensor([0.2792, 0.7208], device='cuda:0') top1: 1 top1conf: tensor(0.7208, device='cuda:0') class: yiyuzheng, conf: tensor(0.7208)
(.venv) neo@Neo-Mac-mini netkiller % pip install onnx onnxslim -i https://pypi.tuna.tsinghua.edu.cn/simple
from ultralytics import YOLO model = YOLO("yolo11n.pt") model.export(format="onnx") # 预测看下效果 onnx_model = YOLO("yolo11n.onnx", task="detect") results = onnx_model("https://ultralytics.com/images/bus.jpg") results[0].show()