当前位置: 首页 > article >正文

windows使用python写的YOLO来实现目标识别

使用labelImg标注,YOLO进行目标训练

  • 一、labelImg工具下载及使用
    • 1、下载labelImg(目标标注工具[【点我下载】](https://github.com/HumanSignal/labelImg))
    • 2、使用labelImg
  • 二、下载及使用YOLO
    • 1、下载及使用ultralytics(volo[点击下载](https://github.com/ultralytics/ultralytics))
    • 2、训练自己的目标
      • 2-1、先创建yxml
      • 2-2、训练自己的模型
    • 3、根据自己训练的模型去进行目标识别
  • 三、追加训练 (还未测试完善...)
  • 1、优化器

一、labelImg工具下载及使用

1、下载labelImg(目标标注工具【点我下载】)

在这里插入图片描述
下载解压
在这里插入图片描述
进入到labelImg-master文件夹中,然后依次输入一下命令

pip install pyqt5

在这里插入图片描述
输入此命令不会有反应直接下一步

pyrcc5 -o libs/resources.py resources.qrc

启动labelImg 工具

python labelImg.py

在这里插入图片描述

错误提示说明你的 Python 环境中缺少 lxml 模块,这是一个用于处理 XML 的库,labelImg 依赖它。解决方法如下:
在这里插入图片描述

pip install lxml
python labelImg.py

2、使用labelImg

分别选择打开(要训练的图片)和改变的文件存放位置(框选图片写成的txt文件)
在这里插入图片描述
开启自动保存模式(我们框选完成后,点击下一个图像会自动保存txt到指定位置)
在这里插入图片描述
另外需要改成yolo的格式
在这里插入图片描述

在这里插入图片描述
最后就可以框选图片生成数据集了
在这里插入图片描述
随后需要将原始图片和labelImg生成的txt文件分别放到两个指定的文件夹labels(标签)和images(图片)

按照我的步骤走的话,只需要在labels目录同级下创建images后将原图全放到里面就可以了

重新创建目录database(目录名自己看着来,后续有用到),再将刚刚创建的labels和images目录数据,拆分成三份(YOLO数据集,即训练集、验证集和测试集)存放在database目录下,主要有以下几个原因:

  • 模型训练与优化:
    • 训练模型:训练集是模型学习和获取知识的源泉,用于调整模型的参数,让模型学习到数据中的特征和规律。模型通过对训练集中的大量样本进行学习,不断调整自身的权重和偏置,以最小化损失函数,从而逐渐拟合数据。

    • 调整超参数:验证集用于在模型训练过程中评估模型的性能和选择最优的超参数,如学习率、批大小、网络结构等。通过在验证集上观察模型的性能指标,如准确率、召回率、F1 值等,可以及时发现模型是否过拟合或欠拟合,并对超参数进行调整,以提高模型的泛化能力。

    • 防止过拟合:在训练过程中,如果只使用训练集进行训练和评估,模型可能会过度拟合训练数据,导致在新的、未见过的数据上表现不佳。验证集的存在可以作为一个独立的评估指标,帮助监控模型在未见过的数据上的表现,及时发现过拟合现象,并采取相应的措施,如提前停止训练、调整超参数等。

  • 模型评估与选择:
    • 评估模型性能:测试集用于在模型训练完成后,对模型的最终性能进行客观、无偏的评估。它提供了对模型在真实世界中未见过的数据上的表现的估计,能够反映模型的泛化能力和实际应用价值。
    • 模型比较与选择:
      当有多个不同的模型或模型变体时,可以使用相同的测试集对它们进行评估和比较,选择性能最优的模型进行实际应用。测试集的结果可以作为模型选择的重要依据,帮助确定最适合特定任务和数据的模型。

二、下载及使用YOLO

1、下载及使用ultralytics(volo点击下载)

在这里插入图片描述
再划到下面下载训练模型(我下载的YOLO11n)
在这里插入图片描述
先走一遍自带的,看看效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、训练自己的目标

2-1、先创建yxml

这里就是之前放置的database目录的数据。 训练 (train)、验证 (val) 和 测试 (test)

# dataset.yaml  训练 (train)、验证 (val) 和 测试 (test)
train: E:\cory\project\python\ultralytics-main\database\train\images
val: E:\cory\project\python\ultralytics-main\database\valid\images
test: E:\cory\project\python\ultralytics-main\database\test\images

nc: 1  # 类别数量
names: ['dog']  # 类别名称,映射到类别 ID 0

2-2、训练自己的模型

由于电脑限制,我这里用的cpu训练,电脑好的可以整整gpu

from ultralytics import YOLO
import torch

# 检查环境
print("PyTorch Version:", torch.__version__)         # 打印 PyTorch 版本
print("CUDA Version:", torch.version.cuda)          # 打印支持的 CUDA 版本
print("CUDA Available:", torch.cuda.is_available())  # 检查 CUDA 是否可用
if torch.cuda.is_available():
    print("Device Name:", torch.cuda.get_device_name(0))  # 打印 GPU 名称

# 加载预训练的 YOLOv8 Nano 模型
model = YOLO('yolov8n.pt')  # 可根据需要选择 yolov8s.pt、yolov8m.pt 等

# 开始训练
print("\n开始训练模型...")
model.train(
    data="E:/cory/project/python/ultralytics-main/dataset.yaml",  # 数据集配置路径
    epochs=60,                   # 训练轮次
    imgsz=640,                   # 输入图像大小
    batch=16,                    # 批量大小
    workers=4,                   # 数据加载线程数量
    name="dog_detection",        # 输出结果保存的目录
)

# 验证模型
print("\n验证模型性能...")
metrics = model.val()  # 自动打印验证结果
print("验证完成,结果如下:", metrics)

# 使用训练后的模型进行测试/预测
print("\n使用模型进行测试...")
results = model.predict(
    source="E:/cory/project/python/ultralytics-main/database/test/images",  # 测试图像路径
    save=True,  # 保存预测结果到 runs 目录
)

# 打印预测结果
print("预测结果:")
for result in results:
    print(result)

# 结束提示
print("\n训练、验证和测试完成!")

在这里插入图片描述
以上我们自己的模型就训练完成了,你可以去测试目录看看测试的结果准不准

3、根据自己训练的模型去进行目标识别

这里采用了python的FastAPI框架(优势:高性能易用支持自动生成 API 文档(Swagger UI)

使用框架:FastAPI
优势:高性能、易用、支持自动生成 API 文档(Swagger UI)。
安装命令:pip install fastapi uvicorn
运行命令:uvicorn yanzheng_api:app --reload --port 8919   注意main需要换成你自己的py文件名

注意FastAPI 处理表单数据时需要依赖 python-multipart,所以需要安装 pip install python-multipart
from fastapi import FastAPI, File, UploadFile
from ultralytics import YOLO
import cv2
import shutil
import os
from pathlib import Path
import yaml  # 用于加载类别名称

# 初始化 FastAPI 应用
app = FastAPI()

# 加载训练好的 YOLO 模型
model = YOLO('runs/detect/dog_detection/weights/best.pt')

# 自定义保存预测结果图像的路径
RESULTS_DIR = "C:/Users/A/Pictures/挖机"
os.makedirs(RESULTS_DIR, exist_ok=True)

# 加载类别名称
with open("E:/cory/project/python/ultralytics-main/dataset.yaml", "r", encoding="utf-8") as f:
    dataset_config = yaml.safe_load(f)
    class_names = dataset_config["names"]  # 获取类别名称列表


@app.post("/detect/")
async def detect_object(file: UploadFile):
    """
    接收上传的图片,执行目标检测,返回检测结果并保存标注后的图片
    :param file: 上传的图片文件
    :return: 检测到的目标信息
    """
    # 确保保存目录存在
    Path(RESULTS_DIR).mkdir(parents=True, exist_ok=True)

    # 将上传的文件保存到本地临时路径
    temp_file_path = f"./temp_{file.filename}"
    with open(temp_file_path, "wb") as temp_file:
        shutil.copyfileobj(file.file, temp_file)

    # 使用 YOLO 模型进行预测
    results = model.predict(source=temp_file_path, imgsz=640, conf=0.5, save=False)

    # 打开原始图片
    image = cv2.imread(temp_file_path)

    # 遍历检测结果并绘制边界框
    detection_data = []
    for result in results:
        boxes = result.boxes  # 获取所有检测框
        for box in boxes:
            # 提取边界框坐标、置信度和类别
            x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
            conf = float(box.conf[0])
            cls = int(box.cls[0])

            # 获取类别名称
            class_name = class_names[cls] if cls < len(class_names) else f"Unknown({cls})"

            # 保存检测结果
            detection_data.append({"class": class_name, "confidence": conf, "bbox": [x1, y1, x2, y2]})

            # 在图片上绘制边界框和标签
            label = f"{class_name} {conf:.2f}"
            cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 保存带标注的图片
    result_image_path = os.path.join(RESULTS_DIR, f"result_{file.filename}")
    cv2.imwrite(result_image_path, image)

    # 删除临时文件
    os.remove(temp_file_path)

    # 返回检测结果
    return {"detections": detection_data, "saved_path": result_image_path}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8919)

运行完毕可以直接在swagger中打开测试:http://127.0.0.1:8919/docs
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、追加训练 (还未测试完善…)

1、优化器

用于配置 YOLO 模型训练超参数的文件。超参数(hyperparameters)直接影响模型的训练过程,例如学习率、损失函数权重、数据增强强度等。

# 超参数配置文件 (hyp.yaml)

# 优化器参数
lr0: 0.01               # 初始学习率
lrf: 0.01               # 最终学习率 (lr0 的衰减比例)
momentum: 0.937         # 优化器的动量,通常 0.9~0.99
weight_decay: 0.0005    # 权重衰减 (L2 正则化)

# 损失函数权重
box: 0.05               # 边界框回归损失权重 (MSE 或 GIoU 损失)
cls: 0.5                # 分类损失权重
cls_pw: 1.0             # 分类损失的权重平衡
obj: 1.0                # 目标损失权重
obj_pw: 1.0             # 目标损失的权重平衡

# 数据增强参数
fliplr: 0.5             # 水平翻转概率
fliptb: 0.0             # 垂直翻转概率
degrees: 0.0            # 图像旋转范围 (±度数)
translate: 0.1          # 图像平移比例
scale: 0.5              # 图像缩放比例
shear: 0.0              # 图像剪切范围
perspective: 0.0        # 透视变换范围
hsv_h: 0.015            # HSV 色调变化范围
hsv_s: 0.7              # HSV 饱和度变化范围
hsv_v: 0.4              # HSV 明度变化范围

# 锚框调整
anchor_t: 4.0           # Anchors-matching threshold (阈值越低匹配越严格)

# 数据标签权重
labelsmoothing: 0.0     # 标签平滑,防止过拟合(一般 0.0 或 0.1)

# 数据加载参数
warmup_epochs: 3.0      # 训练初期的 warmup 阶段,逐渐增大学习率
warmup_momentum: 0.8    # warmup 阶段的初始动量
warmup_bias_lr: 0.1     # warmup 阶段的偏置学习率

# IoU 损失类型和权重
iou_t: 0.2              # IoU 损失的正样本阈值
giou: 0.05              # GIoU 损失权重
ciou: 0.0               # CIoU 损失权重
diou: 0.0               # DIoU 损失权重

# 其他参数
multi_scale: True       # 是否使用多尺度训练
rect: False             # 是否使用矩形训练
single_cls: False       # 如果只有一个类别,设为 True

1. 优化器参数 (关键超参数详细解析)

  • lr0:初始学习率,较大的学习率可以加速收敛,但可能导致不稳定。
  • lrf:学习率衰减比例,通常设置为一个小值(如 0.01),表示训练结束时学习率变为初始值的 1%。
  • momentum:动量是 SGD 优化器中的重要参数,可以减少振荡并加速收敛。
  • weight_decay:权重衰减用于 L2 正则化,防止模型过拟合。

2. 损失函数权重

  • box:边界框回归损失的权重,值越大表示更注重框的精确性。
  • cls:分类损失的权重,值越大表示更注重分类的精确性。
  • obj:目标检测损失的权重,值越大表示更注重检测目标本身。

3. 数据增强参数这些参数控制在训练时对图像进行的数据增强,适当的数据增强可以增加模型的泛化能力

  • fliplr 和 fliptb:图像水平或垂直翻转的概率。
  • degrees:随机旋转角度,值越大增强越强。
  • translate:随机平移比例。
  • scale:随机缩放比例,通常设置为 0.5,即 ±50%。
  • shear:随机剪切强度,通常设置为 0。
  • hsv_h/hsv_s/hsv_v:图像的 HSV 色彩调整范围,增加亮度和对比度变化。

4. IoU 损失权重

  • iou_t:IoU 的正样本阈值,影响正负样本划分。
  • giou、ciou、diou:不同类型 IoU 损失的权重(总和一般为 1),可以选择一种进行优化。

5. 标签平滑

  • labelsmoothing:对标签进行平滑处理,比如原本类别为 1,现在是 0.9 或 0.95,避免过拟合。

6. 数据加载参数

  • warmup_epochs:训练初期的 warmup 阶段,逐渐增大学习率,避免学习率初始过高导致训练不稳定。

http://www.kler.cn/a/443669.html

相关文章:

  • JAVAweb学习日记(三)Ajax
  • 圣诞节文化交流会在洛杉矶成功举办
  • TORCH_CUDA_ARCH_LIST
  • CSS系列(27)- 图形与滤镜详解
  • 62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)
  • Spring AOP 中记录日志
  • CRC校验例题详解
  • 页面无滚动条,里面div各自有滚动条
  • Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
  • 【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
  • 前端如何做缓存处理?
  • http的MIME类型
  • 踩准智能汽车+机器人两大风口,速腾聚创AI+机器人应用双线爆发
  • 家校通小程序实战教程10部门管理前后端连接
  • AI工具如何深刻改变我们的工作与生活
  • Java 学习之路:开启编程世界的大门
  • 2.学习TypeScript 编译选项配置
  • Appium怎样连接多台设备?
  • Java项目--仿RabbitMQ的消息队列--虚拟主机设计
  • 如何使用Selenium处理JavaScript动态加载的内容?
  • 《算法SM4》题目
  • uniapp连接蓝牙操作(蓝牙设备地锁)
  • 授权模型DAC
  • PostgreSQL 常用运维SQL整理
  • 3.zabbix中文设置
  • 洛谷 B3836 [GESP202303 二级] 百鸡问题