第一次接触YOLOv5时,我被它的"开箱即用"特性惊艳到了。相比其他需要复杂配置的目标检测框架,YOLOv5的安装过程简单得让人难以置信。不过为了避免新手踩坑,我还是建议按照这个标准化流程来操作。
Python环境是第一个门槛。我强烈建议使用3.8或3.9版本,这两个版本与PyTorch的兼容性最稳定。去年我在3.10环境里折腾了半天,各种奇怪的报错让我差点放弃。安装完Python后,用这个命令检查版本:
bash复制python --version
接下来是PyTorch的安装。这里有个小技巧:先去PyTorch官网(https://pytorch.org)生成安装命令。根据你的显卡选择CUDA版本,如果没有NVIDIA显卡就直接选CPU版本。我常用的安装命令是这样的:
bash复制pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
YOLOv5的克隆和依赖安装更简单:
bash复制git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
注意:如果安装过程中出现超时错误,可以在命令后面加上
-i https://pypi.tuna.tsinghua.edu.cn/simple使用国内镜像源
验证安装是否成功时,我习惯用这个测试命令:
bash复制python detect.py --weights yolov5s.pt --source data/images/bus.jpg
如果能看到输出目录里生成了一张带检测框的bus.jpg,说明环境已经准备就绪。
构建数据集就像盖房子打地基,这个环节偷懒后面就会吃亏。我建议按照这个目录结构组织数据:
code复制VOCData/
├── images/ # 存放所有原始图片
└── labels/ # 存放标注文件(后续生成)
采集数据时要注意这些细节:
我常用的图片采集方式:
对于视频抽帧,这个Python脚本很实用:
python复制import cv2
video_path = "your_video.mp4"
output_dir = "output_frames"
interval = 10 # 每隔10帧取1张
cap = cv2.VideoCapture(video_path)
count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if count % interval == 0:
cv2.imwrite(f"{output_dir}/frame_{count}.jpg", frame)
count += 1
cap.release()
LabelImg是我最推荐的标注工具,安装方法很简单:
bash复制pip install labelImg
labelImg # 启动工具
标注时要注意这些细节:
标注完成后,你会得到一组XML文件,每个XML对应一张图片的标注信息。比如:
xml复制<annotation>
<object>
<name>cat</name>
<bndbox>
<xmin>100</xmin>
<ymin>200</ymin>
<xmax>300</xmax>
<ymax>400</ymax>
</bndbox>
</object>
</annotation>
好的数据集应该按7:2:1的比例分为:
这个Python脚本可以自动完成划分:
python复制import os
import random
def split_dataset(image_dir, train_ratio=0.7, val_ratio=0.2):
all_images = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]
random.shuffle(all_images)
total = len(all_images)
train_end = int(total * train_ratio)
val_end = train_end + int(total * val_ratio)
return {
'train': all_images[:train_end],
'val': all_images[train_end:val_end],
'test': all_images[val_end:]
}
YOLOv5需要特定的txt标注格式:
code复制<class_id> <x_center> <y_center> <width> <height>
这个转换脚本可以将XML转为YOLO格式:
python复制import xml.etree.ElementTree as ET
def xml_to_yolo(xml_path, classes):
tree = ET.parse(xml_path)
root = tree.getroot()
size = root.find('size')
img_w = float(size.find('width').text)
img_h = float(size.find('height').text)
yolo_lines = []
for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in classes:
continue
cls_id = classes.index(cls)
box = obj.find('bndbox')
xmin = float(box.find('xmin').text)
ymin = float(box.find('ymin').text)
xmax = float(box.find('xmax').text)
ymax = float(box.find('ymax').text)
# 转换为YOLO格式
x_center = (xmin + xmax) / 2 / img_w
y_center = (ymin + ymax) / 2 / img_h
width = (xmax - xmin) / img_w
height = (ymax - ymin) / img_h
yolo_lines.append(f"{cls_id} {x_center} {y_center} {width} {height}")
return yolo_lines
在data目录下创建my_data.yaml,内容模板:
yaml复制train: ../VOCData/images/train
val: ../VOCData/images/val
test: ../VOCData/images/test
nc: 3 # 类别数
names: ['cat', 'dog', 'person'] # 类别名称
启动训练的基本命令:
bash复制python train.py --img 640 --batch 16 --epochs 100 --data data/my_data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt
关键参数说明:
提示:如果遇到CUDA内存不足,尝试减小batch size或降低图像尺寸
使用TensorBoard监控训练进度:
bash复制tensorboard --logdir=runs
重点关注这些指标:
Loss不下降:
过拟合:
训练速度慢:
使用val.py脚本评估模型:
bash复制python val.py --weights runs/train/exp/weights/best.pt --data data/my_data.yaml --img 640
关键评估指标:
导出为ONNX格式便于部署:
bash复制python export.py --weights best.pt --include onnx
支持的导出格式:
检测单张图片:
bash复制python detect.py --weights best.pt --source test.jpg
实时摄像头检测:
bash复制python detect.py --weights best.pt --source 0
批量处理视频:
bash复制python detect.py --weights best.pt --source input.mp4
在Python代码中调用模型:
python复制import torch
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
results = model('test.jpg')
results.show() # 显示结果
print(results.pandas().xyxy[0]) # 打印检测结果
记得训练完成后,把最佳模型(best.pt)和类别配置文件保存好,这是你辛苦训练的成果。在实际项目中,我通常会保留以下几个文件: