YOLO-V5实战体验:手把手教你用Python代码实现图片目标检测
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 问题一:检测速度太慢
可能原因:
- 图片分辨率太高
- 使用了太大的模型
- 没有使用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:使用更大的模型(更准确但更慢)
model = torch.hub.load("ultralytics/yolov5", "yolov5x")
# 方案2:调整置信度阈值
model.conf = 0.4 # 降低阈值可能检测到更多物体,但可能有误检
# 方案3:使用数据增强(对于自定义训练)
# 在训练时增加数据增强可以提高模型鲁棒性
# 方案4:针对特定场景微调模型
# 如果需要检测特定类型的物体,最好使用自己的数据重新训练
7.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的完整实战体验:
- 环境搭建:学会了如何快速安装和配置YOLO-V5
- 基础使用:用几行代码实现了图片目标检测
- 结果解析:理解了检测输出的格式和含义
- 实用技巧:掌握了调整参数、批量处理等实用技能
- 实际应用:看到了在安防、交通等场景中的具体应用
- 问题解决:了解了常见问题的排查和解决方法
最重要的是,你现在已经能够用Python代码让计算机"看懂"图片了。无论是一张简单的照片,还是复杂的监控画面,YOLO-V5都能帮你快速找出其中的物体。
8.2 下一步学习建议
如果你对这个领域感兴趣,可以继续深入:
-
训练自己的模型:
- 收集和标注自己的数据集
- 使用YOLO-V5训练针对特定场景的模型
- 学习如何评估和优化模型性能
-
视频流处理:
- 将检测应用到实时视频流
- 学习使用OpenCV处理摄像头输入
- 实现实时监控和报警系统
-
模型优化:
- 学习模型压缩和加速技术
- 尝试将模型部署到移动设备
- 了解TensorRT等推理优化工具
-
高级应用:
- 结合其他技术(如跟踪、计数、行为分析)
- 开发完整的应用系统
- 探索在边缘设备上的部署
8.3 最后的建议
目标检测是一个既有趣又有用的技术领域。YOLO-V5作为当前最流行的框架之一,有着完善的文档和活跃的社区。无论你是想做一个个人项目,还是解决工作中的实际问题,它都是一个很好的起点。
记住,最好的学习方式就是动手实践。找一些你感兴趣的图片,尝试不同的参数设置,看看检测效果有什么变化。遇到问题时,查阅官方文档和社区讨论,通常都能找到解决方案。
计算机视觉的世界很大,YOLO-V5只是其中的一个工具。掌握了它,你就打开了一扇新的大门。接下来要探索什么,完全取决于你的兴趣和需求。
祝你学习愉快,编码顺利!
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)