YOLO-V5实战体验:手把手教你用Python代码实现图片目标检测

1. 引言:从零开始,让计算机“看懂”世界

你有没有想过,让计算机像人一样,一眼就能认出图片里有什么?比如,在一张街景照片中,它能不能立刻告诉你:这里有一辆车,那边有个人,远处还有个交通灯?

这就是目标检测技术要解决的问题。而今天我们要聊的YOLO-V5,就是实现这个目标最流行、最实用的工具之一。

YOLO这个名字很有意思,它代表“You Only Look Once”——只看一次。传统的检测方法可能需要反复扫描图片,而YOLO只需要一次前向传播就能完成所有检测,速度非常快。想象一下,你眨眼的时间,它就能完成检测,这就是为什么YOLO在需要实时处理的应用中如此受欢迎。

在这篇文章里,我不会讲太多复杂的数学公式和网络结构。我的目标很简单:让你在10分钟内,用几行Python代码,亲手体验YOLO-V5的强大能力。无论你是刚入门的新手,还是有一定经验的开发者,都能跟着步骤做出自己的第一个目标检测程序。

准备好了吗?让我们开始吧。

2. 环境准备:快速搭建你的检测平台

2.1 系统要求与准备工作

在开始写代码之前,我们需要确保环境已经准备好。好消息是,YOLO-V5对硬件的要求并不苛刻:

  • 操作系统:Windows、Linux、macOS都可以
  • Python版本:建议使用Python 3.8或更高版本
  • 内存:至少8GB RAM(处理大图片时需要更多)
  • 显卡:有NVIDIA显卡更好(可以加速),但没有也能运行

如果你使用的是CSDN星图镜像,那么恭喜你——环境已经预装好了,可以直接跳到代码部分。如果没有,也不用担心,安装过程很简单。

2.2 一键安装YOLO-V5

打开你的命令行工具(Windows上是CMD或PowerShell,macOS/Linux上是Terminal),输入以下命令:

# 克隆YOLO-V5的官方仓库
git clone https://github.com/ultralytics/yolov5.git

# 进入项目目录
cd yolov5

# 安装依赖包
pip install -r requirements.txt

等待几分钟,所有必要的包都会自动安装完成。这个过程可能会下载一些比较大的文件,请确保网络连接稳定。

小贴士:如果你在国内,可能会遇到下载慢的问题。可以尝试使用国内的镜像源,比如:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,你可以运行一个简单的测试来验证是否安装成功:

import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA是否可用: {torch.cuda.is_available()}")  # 如果有GPU会显示True

如果看到版本号并且没有报错,说明环境已经准备好了。

3. 快速上手:你的第一个检测程序

3.1 最简单的检测代码

让我们从一个最基础的例子开始。新建一个Python文件,比如叫first_detection.py,然后输入以下代码:

import torch

# 加载预训练的YOLO-V5模型
# 这里我们使用yolov5s,它是速度最快、体积最小的版本
# 其他可选版本:yolov5n(更小)、yolov5m(中等)、yolov5l(大)、yolov5x(最大)
model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# 准备要检测的图片
# 你可以使用网络图片URL,也可以使用本地文件路径
img_url = "https://ultralytics.com/images/zidane.jpg"  # 官方示例图片

# 执行检测
results = model(img_url)

# 显示结果
results.show()  # 会弹出一个窗口显示检测结果

运行这个程序,你会看到一个弹窗,显示检测结果。图片中的人和物体都被框出来了,旁边还有标签和置信度分数。

代码解释

  • torch.hub.load():这是PyTorch的模型加载函数,它会自动从GitHub下载预训练好的模型
  • "yolov5s":指定要加载的模型版本,s代表small(小)
  • results.show():可视化显示检测结果

3.2 检测本地图片

当然,我们更多时候是检测自己的图片。假设你有一张名为my_photo.jpg的图片,代码只需要稍作修改:

import torch

# 加载模型
model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# 使用本地图片
img_path = "my_photo.jpg"  # 你的图片路径

# 执行检测
results = model(img_path)

# 保存结果到文件
results.save()  # 默认保存到 runs/detect/exp 目录

print("检测完成!结果已保存。")

运行后,你会在当前目录下看到一个runs/detect/exp文件夹,里面就是带检测框的结果图片。

4. 深入探索:理解检测结果

4.1 查看详细的检测信息

除了显示图片,我们还可以查看更详细的信息。修改一下代码:

import torch

model = torch.hub.load("ultralytics/yolov5", "yolov5s")
img = "https://ultralytics.com/images/bus.jpg"  # 换一张有公交车的图片

results = model(img)

# 打印检测结果到控制台
results.print()  # 显示检测到的物体数量、类别等信息

# 获取Pandas格式的结果,方便进一步分析
pandas_results = results.pandas().xyxy[0]
print("\n详细的检测结果:")
print(pandas_results)

# 获取检测到的物体数量
print(f"\n总共检测到 {len(pandas_results)} 个物体")

运行后,你会看到类似这样的输出:

image 1/1: 640x480 4 persons, 1 bus
Speed: 10.2ms pre-process, 12.3ms inference, 1.2ms NMS per image at shape (1, 3, 640, 480)

详细的检测结果:
      xmin    ymin    xmax    ymax  confidence  class    name
0   72.50  182.75  299.25  473.00      0.8923      0  person
1  338.25  168.00  505.00  473.00      0.8601      0  person
2  469.00   72.75  531.50  178.00      0.6705      0  person
3   10.00   55.00  524.00  473.00      0.9372      5     bus

总共检测到 4 个物体

结果解读

  • xmin, ymin, xmax, ymax:边界框的坐标
  • confidence:置信度,数值越高表示模型越确定
  • class:类别编号(0代表人,5代表公交车等)
  • name:类别名称

4.2 只检测特定类别的物体

有时候我们只关心某些特定的物体。比如在监控场景中,可能只关心人和车。YOLO-V5可以很方便地实现这个功能:

import torch

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# 设置只检测人和车
# 在COCO数据集中,0是person,2是car,5是bus,7是truck
model.classes = [0, 2, 5, 7]  # 只检测这些类别

img = "street_scene.jpg"
results = model(img)

# 显示结果
results.show()

# 查看检测到了什么
detections = results.pandas().xyxy[0]
if len(detections) > 0:
    print(f"检测到 {len(detections)} 个目标:")
    for _, row in detections.iterrows():
        print(f"  - {row['name']} (置信度: {row['confidence']:.2%})")
else:
    print("没有检测到指定类别的物体")

5. 实用技巧:提升检测效果

5.1 调整检测阈值

置信度阈值决定了模型多"自信"才认为检测到了物体。默认是0.25,我们可以根据需要调整:

import torch

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# 调整置信度阈值
model.conf = 0.5  # 只显示置信度大于50%的检测结果

# 调整IOU阈值(用于非极大值抑制)
model.iou = 0.45  # 默认是0.45,值越小检测框越少

img = "crowded_scene.jpg"
results = model(img)

print(f"使用阈值 conf={model.conf}, iou={model.iou}")
print(f"检测到 {len(results.pandas().xyxy[0])} 个物体")

参数说明

  • conf:置信度阈值,值越高要求越严格,检测到的物体越少但更准确
  • iou:交并比阈值,值越小,重叠的检测框被合并得越少

5.2 处理多张图片

YOLO-V5可以批量处理图片,这对于实际应用非常有用:

import torch
import glob

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# 获取所有jpg图片
image_files = glob.glob("images/*.jpg")  # 假设图片都在images文件夹下

if len(image_files) > 0:
    print(f"找到 {len(image_files)} 张图片,开始批量检测...")
    
    # 批量检测
    results = model(image_files)
    
    # 保存所有结果
    results.save()
    
    # 显示统计信息
    for i, img_result in enumerate(results):
        detections = img_result.pandas().xyxy[0]
        print(f"图片 {image_files[i]}: 检测到 {len(detections)} 个物体")
else:
    print("没有找到jpg图片")

5.3 使用不同的模型版本

YOLO-V5提供了多个版本的模型,适合不同的需求:

import torch
import time

# 测试不同模型的速度和效果
model_names = ["yolov5n", "yolov5s", "yolov5m", "yolov5l", "yolov5x"]
img = "test_image.jpg"

for model_name in model_names:
    print(f"\n测试模型: {model_name}")
    
    # 加载模型
    start_time = time.time()
    model = torch.hub.load("ultralytics/yolov5", model_name)
    load_time = time.time() - start_time
    
    # 执行检测
    start_time = time.time()
    results = model(img)
    infer_time = time.time() - start_time
    
    # 统计结果
    num_detections = len(results.pandas().xyxy[0])
    
    print(f"  加载时间: {load_time:.2f}秒")
    print(f"  推理时间: {infer_time:.2f}秒")
    print(f"  检测到物体数: {num_detections}")
    
    # 清理内存
    del model
    torch.cuda.empty_cache() if torch.cuda.is_available() else None

模型选择建议

  • yolov5n:最快、最小,适合移动设备或实时性要求极高的场景
  • yolov5s:平衡性好,大多数场景的首选
  • yolov5m/l/x:精度更高,但速度更慢,适合对准确性要求极高的场景

6. 实际应用案例

6.1 案例一:安全监控中的人数统计

假设我们要监控一个入口,统计进出的人数:

import torch
import cv2

# 加载模型,只检测人
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
model.classes = [0]  # 0代表person

def count_people_in_image(image_path):
    """统计图片中的人数"""
    results = model(image_path)
    detections = results.pandas().xyxy[0]
    
    people_count = len(detections)
    
    # 在图片上标注人数
    img = results.imgs[0]
    cv2.putText(img, f"People: {people_count}", (10, 30),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    
    # 保存结果
    cv2.imwrite(f"result_{image_path}", img)
    
    return people_count

# 测试
image_path = "entrance.jpg"
count = count_people_in_image(image_path)
print(f"图片 {image_path} 中检测到 {count} 个人")

6.2 案例二:交通场景中的车辆检测

对于交通监控,我们可能更关心车辆:

import torch

# 加载模型,只检测车辆相关类别
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# COCO数据集中:2=car, 5=bus, 7=truck, 3=motorcycle
vehicle_classes = [2, 5, 7, 3]
model.classes = vehicle_classes

def analyze_traffic(image_path):
    """分析交通图片中的车辆情况"""
    results = model(image_path)
    detections = results.pandas().xyxy[0]
    
    # 统计各类车辆数量
    vehicle_counts = {}
    for _, row in detections.iterrows():
        vehicle_type = row['name']
        vehicle_counts[vehicle_type] = vehicle_counts.get(vehicle_type, 0) + 1
    
    # 显示结果
    print(f"\n交通分析结果 ({image_path}):")
    print("-" * 30)
    for vehicle_type, count in vehicle_counts.items():
        print(f"{vehicle_type}: {count}辆")
    
    total_vehicles = sum(vehicle_counts.values())
    print(f"总计: {total_vehicles}辆车")
    
    # 保存带标注的图片
    results.save()
    
    return vehicle_counts

# 使用示例
traffic_image = "highway.jpg"
analysis = analyze_traffic(traffic_image)

6.3 案例三:批量处理图片并生成报告

对于需要处理大量图片的场景:

import torch
import glob
import pandas as pd
from datetime import datetime

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

def batch_process_images(folder_path, output_csv="detection_report.csv"):
    """批量处理文件夹中的所有图片并生成报告"""
    
    # 获取所有图片
    image_patterns = ["*.jpg", "*.jpeg", "*.png", "*.bmp"]
    image_files = []
    for pattern in image_patterns:
        image_files.extend(glob.glob(f"{folder_path}/{pattern}"))
    
    if not image_files:
        print(f"在 {folder_path} 中没有找到图片")
        return
    
    print(f"找到 {len(image_files)} 张图片,开始处理...")
    
    all_results = []
    
    for i, img_path in enumerate(image_files):
        print(f"处理中: {img_path} ({i+1}/{len(image_files)})")
        
        # 执行检测
        results = model(img_path)
        detections = results.pandas().xyxy[0]
        
        # 统计信息
        detection_count = len(detections)
        
        # 按类别统计
        class_counts = detections['name'].value_counts().to_dict()
        
        # 保存结果图片
        results.save()
        
        # 记录结果
        all_results.append({
            "图片文件": img_path,
            "检测时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "检测总数": detection_count,
            "检测详情": str(class_counts)
        })
    
    # 生成报告
    df = pd.DataFrame(all_results)
    df.to_csv(output_csv, index=False, encoding='utf-8-sig')
    
    print(f"\n处理完成!报告已保存到 {output_csv}")
    
    # 显示摘要
    total_detections = df["检测总数"].sum()
    print(f"总共处理 {len(image_files)} 张图片")
    print(f"总共检测到 {total_detections} 个物体")
    
    return df

# 使用示例
# batch_process_images("监控图片", "每日检测报告.csv")

7. 常见问题与解决方案

7.1 问题一:检测速度太慢

可能原因

  1. 图片分辨率太高
  2. 使用了太大的模型
  3. 没有使用GPU加速

解决方案

import torch

# 方案1:使用更小的模型
model = torch.hub.load("ultralytics/yolov5", "yolov5n")  # 最小的模型

# 方案2:调整图片大小
model.imgsz = 320  # 默认是640,减小可以加快速度但可能降低精度

# 方案3:启用GPU(如果有的话)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = torch.hub.load("ultralytics/yolov5", "yolov5s").to(device)

# 方案4:批量处理时调整批次大小
model.batch_size = 4  # 根据内存调整

7.2 问题二:检测结果不准确

可能原因

  1. 图片质量差(太暗、模糊等)
  2. 物体太小或遮挡严重
  3. 模型不适合当前场景

解决方案

# 方案1:使用更大的模型(更准确但更慢)
model = torch.hub.load("ultralytics/yolov5", "yolov5x")

# 方案2:调整置信度阈值
model.conf = 0.4  # 降低阈值可能检测到更多物体,但可能有误检

# 方案3:使用数据增强(对于自定义训练)
# 在训练时增加数据增强可以提高模型鲁棒性

# 方案4:针对特定场景微调模型
# 如果需要检测特定类型的物体,最好使用自己的数据重新训练

7.3 问题三:内存不足

可能原因

  1. 图片太大或批量太大
  2. 模型太大
  3. 显存/内存不足

解决方案

# 方案1:减小图片尺寸
model.imgsz = 416  # 减小输入尺寸

# 方案2:减小批量大小
model.batch_size = 1  # 一次处理一张图片

# 方案3:使用更小的模型
model = torch.hub.load("ultralytics/yolov5", "yolov5n")

# 方案4:及时清理内存
import gc
del model  # 删除不再使用的模型
gc.collect()  # 强制垃圾回收
if torch.cuda.is_available():
    torch.cuda.empty_cache()  # 清理GPU缓存

7.4 问题四:如何保存和加载检测结果

有时候我们需要保存检测结果供后续分析:

import torch
import json

model = torch.hub.load("ultralytics/yolov5", "yolov5s")
img = "sample.jpg"

# 执行检测
results = model(img)

# 方法1:保存为JSON文件
detections = results.pandas().xyxy[0]
json_data = detections.to_dict(orient='records')

with open("detection_results.json", "w") as f:
    json.dump(json_data, f, indent=2)

print("结果已保存为JSON文件")

# 方法2:保存为CSV文件
detections.to_csv("detection_results.csv", index=False)
print("结果已保存为CSV文件")

# 方法3:保存带标注的图片
results.save("annotated_images/")  # 保存到指定文件夹
print("带标注的图片已保存")

8. 总结与下一步建议

8.1 学习回顾

通过这篇文章,我们完成了YOLO-V5的完整实战体验:

  1. 环境搭建:学会了如何快速安装和配置YOLO-V5
  2. 基础使用:用几行代码实现了图片目标检测
  3. 结果解析:理解了检测输出的格式和含义
  4. 实用技巧:掌握了调整参数、批量处理等实用技能
  5. 实际应用:看到了在安防、交通等场景中的具体应用
  6. 问题解决:了解了常见问题的排查和解决方法

最重要的是,你现在已经能够用Python代码让计算机"看懂"图片了。无论是一张简单的照片,还是复杂的监控画面,YOLO-V5都能帮你快速找出其中的物体。

8.2 下一步学习建议

如果你对这个领域感兴趣,可以继续深入:

  1. 训练自己的模型

    • 收集和标注自己的数据集
    • 使用YOLO-V5训练针对特定场景的模型
    • 学习如何评估和优化模型性能
  2. 视频流处理

    • 将检测应用到实时视频流
    • 学习使用OpenCV处理摄像头输入
    • 实现实时监控和报警系统
  3. 模型优化

    • 学习模型压缩和加速技术
    • 尝试将模型部署到移动设备
    • 了解TensorRT等推理优化工具
  4. 高级应用

    • 结合其他技术(如跟踪、计数、行为分析)
    • 开发完整的应用系统
    • 探索在边缘设备上的部署

8.3 最后的建议

目标检测是一个既有趣又有用的技术领域。YOLO-V5作为当前最流行的框架之一,有着完善的文档和活跃的社区。无论你是想做一个个人项目,还是解决工作中的实际问题,它都是一个很好的起点。

记住,最好的学习方式就是动手实践。找一些你感兴趣的图片,尝试不同的参数设置,看看检测效果有什么变化。遇到问题时,查阅官方文档和社区讨论,通常都能找到解决方案。

计算机视觉的世界很大,YOLO-V5只是其中的一个工具。掌握了它,你就打开了一扇新的大门。接下来要探索什么,完全取决于你的兴趣和需求。

祝你学习愉快,编码顺利!


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐