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 阶段,逐渐增大学习率,避免学习率初始过高导致训练不稳定。