基于YOLOv8的行人检测实战:从环境搭建到RK3588部署全流程
1. 项目缘起:为什么从YOLOv8开始做行人检测?
如果你正在寻找一个能快速上手、效果又足够好的目标检测项目来练手,或者你的业务场景里恰好需要识别监控画面、自动驾驶感知、人流统计中的行人,那么基于YOLOv8的行人检测绝对是一个黄金起点。我之所以这么说,是因为在过去几年里,我带着团队做过不下十个不同版本的目标检测项目,从早期的YOLOv3、Faster R-CNN,到后来的YOLOv5、YOLOv7,再到现在的YOLOv8。每一次技术迭代都伴随着部署效率、检测精度和易用性的提升。而YOLOv8,在我看来,是目前平衡得最好的一个版本,尤其适合个人开发者、学生和中小型项目团队。
为什么是YOLOv8?首先,它“开箱即用”的特性非常友好。Ultralytics公司提供了极其完善的PyTorch实现和预训练模型,你几乎不需要修改任何代码,就能在自己的数据集上跑起来。其次,它的性能足够强悍。在COCO数据集上的基准测试中,YOLOv8的精度和速度都达到了SOTA(State-Of-The-Art)水平,这意味着你用一个中等规模的模型,就能获得以前需要大型模型才能达到的检测效果。最后,它的生态非常活跃。从模型训练、验证、导出到部署到各种硬件平台(比如你搜索词里的RK3588),社区都有大量的教程和工具支持,这能帮你避开无数个坑。
具体到行人检测这个任务,它看似简单,实则暗藏玄机。行人目标具有高度的可变性:穿着不同、姿态各异(站立、行走、奔跑、蹲下)、存在遮挡(被车辆、树木或其他行人挡住)、光照条件复杂(逆光、夜间)、尺度变化大(近处行人很大,远处行人很小)。一个好的行人检测模型,必须能稳健地应对这些挑战。YOLOv8的骨干网络(Backbone)和颈部网络(Neck)经过精心设计,具有更强的特征提取和多尺度融合能力,这为应对上述挑战打下了坚实基础。接下来,我将带你从零开始,完整地走一遍这个项目,我会把每一步的原理、操作和踩过的坑都讲清楚。
2. 环境搭建与YOLOv8初探:避开版本依赖的“天坑”
万事开头难,而深度学习项目的“开头难”往往就难在环境配置上。网上很多教程一笔带过,结果你照着做,不是CUDA版本不对,就是PyTorch装不上,或者各种包冲突。这里,我会给你一个经过大量实战验证的、清晰无坑的配置方案。
2.1 核心环境配置:CUDA、PyTorch与Ultralytics
首先,明确你的硬件。如果你有NVIDIA显卡,那么CUDA是必须的,它能极大加速训练和推理过程。查看你的显卡支持的CUDA最高版本(例如,RTX 30系列通常支持CUDA 11.x以上)。我强烈建议使用Ubuntu 22.04 LTS作为操作系统,它在深度学习开发社区的兼容性最好,能减少很多不必要的麻烦。这也是你搜索词中“ubuntu22安装yolov8”热度高的原因。
安装步骤的核心是版本对齐:CUDA版本 → PyTorch版本 → Ultralytics版本。
- 安装CUDA和cuDNN:假设你的显卡支持CUDA 11.8。前往NVIDIA官网,按照指令安装CUDA 11.8。随后,安装对应版本的cuDNN,这是深度神经网络加速库。
- 安装PyTorch:这是最关键的一步。不要直接用
pip install torch!一定要去PyTorch官网(https://pytorch.org/get-started/locally/),使用它提供的安装命令。对于CUDA 11.8,你可能会看到类似这样的命令:
这条命令确保了PyTorch及其视觉库pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118torchvision是针对你的CUDA版本编译的,兼容性最佳。 - 安装Ultralytics YOLOv8:这是最省心的一步。直接用pip安装即可:
这个命令会自动安装YOLOv8所需的所有依赖,包括OpenCV、Pillow、Matplotlib等。安装完成后,在Python中尝试导入pip install ultralyticsultralytics,并打印版本,确认安装成功。
注意:很多人卡在PyTorch与CUDA版本不匹配上,表现为
import torch后torch.cuda.is_available()返回False。如果遇到,请彻底卸载PyTorch,严格按官网命令重装。
2.2 验证安装与模型初体验
环境装好,我们先来点“甜头”,用YOLOv8预训练模型快速检测一张图片里的行人,建立信心。
from ultralytics import YOLO import cv2 # 加载官方的预训练模型(这里是中等尺寸的模型) model = YOLO('yolov8m.pt') # 你也可以尝试 'yolov8n.pt'(最小), 'yolov8s.pt', 'yolov8l.pt', 'yolov8x.pt'(最大) # 读取一张测试图片(你可以替换成任何包含行人的图片) img = cv2.imread('test_pedestrian.jpg') # 进行推理 results = model(img) # 可视化结果 annotated_img = results[0].plot() # 这个plot方法非常方便,直接返回画好框的图片 cv2.imwrite('result.jpg', annotated_img) # 打印检测到的信息 for box in results[0].boxes: cls_id = int(box.cls) # 类别ID conf = float(box.conf) # 置信度 cls_name = model.names[cls_id] # 类别名 if cls_name == 'person': # COCO数据集中,'person'的ID通常是0 print(f"检测到行人,置信度: {conf:.2f}, 坐标: {box.xyxy}")运行这段代码,如果能看到图片上行人被框出来,并且控制台打印了信息,那么恭喜你,环境完全正确,YOLOv8已经跑起来了!这个预训练模型是在包含80个类别的COCO数据集上训练的,其中就包含“person”(行人)。所以,即使你还没有自己的数据,它已经具备不错的通用行人检测能力。
3. 数据准备:构建高质量行人检测数据集
预训练模型虽好,但要想在你的特定场景(比如高空俯拍、密集人群、特定着装)下达到最佳效果,用自己的数据训练是必不可少的。数据准备是模型效果的基石,这里面的门道一点也不比调参少。
3.1 数据集获取与选择
你有几个选择:
- 公开数据集:对于学习和初步验证,公开数据集是首选。
- COCO:包含大量标注好的行人,场景丰富,是预训练模型的基础。你可以从中提取只包含“person”类别的数据。
- CityPersons、EuroCity Persons:专注于城市街景行人的数据集,标注质量高,适合自动驾驶、监控场景。
- CrowdHuman:专注于密集、遮挡严重的行人检测,难度大,如果你想挑战高难度场景或研究“yolov8中针对小目标检测可以优化的技术”,这个数据集很有价值。
- 自建数据集:如果你的场景特殊(如工厂、仓库、特定角度的摄像头),就需要自己采集和标注。这是最耗时但最有效的办法。
3.2 数据标注:YOLO格式详解
YOLOv8使用的标注格式是经典的YOLO格式。每个图像对应一个同名的.txt文件。.txt文件中每一行代表一个标注框,格式为:
<class_id> <x_center> <y_center> <width> <height>class_id:类别的整数索引。对于纯行人检测,通常只有一类,所以class_id就是0。x_center, y_center:边界框中心点的x和y坐标,归一化到[0, 1]区间(即除以图像的宽度和高度)。width, height:边界框的宽度和高度,同样归一化到[0, 1]区间。
归一化是关键!它使得模型不受原始图像尺寸影响。计算方式如下:
x_center = (x_min + x_max) / 2 / image_width y_center = (y_min + y_max) / 2 / image_height width = (x_max - x_min) / image_width height = (y_max - y_min) / image_height标注工具推荐使用Roboflow、CVAT或LabelImg。以LabelImg为例,在设置中将其输出格式改为YOLO,然后框选行人,它会自动生成符合上述格式的txt文件。
3.3 数据集组织与配置文件
数据准备好后,需要按特定结构组织,并编写一个数据集配置文件(.yaml文件)。这是YOLOv8训练时读取数据的依据。
假设你的项目目录结构如下:
pedestrian_detection/ ├── datasets/ │ ├── images/ │ │ ├── train/ │ │ │ ├── image1.jpg │ │ │ └── ... │ │ └── val/ │ │ ├── image100.jpg │ │ └── ... │ └── labels/ │ ├── train/ │ │ ├── image1.txt │ │ └── ... │ └── val/ │ ├── image100.txt │ └── ... └── data.yaml关键的data.yaml文件内容如下:
# 数据集路径(可以是绝对路径,也可以是相对于训练脚本的路径) path: ./datasets train: images/train # 训练集图像路径(相对于path) val: images/val # 验证集图像路径(相对于path) # 类别数量 nc: 1 # 我们只有一个类别:行人 # 类别名称列表 names: ['person']这个配置文件清晰定义了数据在哪、训练验证集如何划分、有几个类别、分别叫什么名字。YOLOv8的训练脚本会直接读取这个文件。
实操心得:在划分训练集和验证集时,我通常按8:2或9:1的比例随机划分。务必确保验证集能代表你最终的应用场景。如果验证集太简单或与训练集分布差异大,训练出来的指标再高,实际部署也会拉胯。另外,检查一下标注文件,确保没有空的txt文件(即图像中无目标),YOLOv8可以处理这种情况,但显式检查一下更稳妥。
4. 模型训练:从零开始训练你的专属检测器
数据就绪,环境妥当,终于来到最核心的训练环节。YOLOv8的训练API设计得非常简洁,但背后有很多可调节的参数和技巧。
4.1 基础训练命令与参数解析
最基本的训练只需要一行命令:
yolo task=detect mode=train model=yolov8n.pt data=data.yaml epochs=100 imgsz=640逐参数解释:
task=detect:指定任务为检测。mode=train:模式为训练。model=yolov8n.pt:指定模型架构和初始化权重。这里使用最小的yolov8n(nano)模型并以官方预训练权重初始化。强烈建议使用预训练权重,这能极大加速收敛并提升最终精度,即所谓的“迁移学习”。data=data.yaml:指定我们上一步创建的数据集配置文件路径。epochs=100:训练轮数。对于中小数据集,100-300轮通常足够。你可以观察损失曲线,当验证损失不再明显下降时就可以停止了。imgsz=640:输入图像的尺寸。YOLOv8会将所有图像缩放到此尺寸进行训练。更大的尺寸(如1280)可能提升对小目标的检测能力(对应搜索词“哪个模型可以检测小目标”),但会显著增加显存消耗和训练时间。
执行命令后,Ultralytics会启动训练过程。你会在控制台看到实时打印的损失(box_loss, cls_loss, dfl_loss)和评估指标(mAP50, mAP50-95)。同时,它会在runs/detect/train/目录下生成一系列非常重要的文件:
weights/best.pt:训练过程中在验证集上表现最好的模型权重。weights/last.pt:最后一轮的模型权重。results.csv:所有训练轮次的指标日志。args.yaml:本次训练的所有参数配置。- 各种可视化图表:损失曲线、精度曲线、混淆矩阵等。“yolov8画损失函数曲线图”这个需求,在这里被自动满足了。
4.2 核心训练技巧与超参数调优
如果基础训练结果不理想,或者你想榨干模型性能,就需要调整超参数和引入一些技巧。
数据增强(Data Augmentation):这是提升模型泛化能力、防止过拟合的利器。YOLOv8内置了丰富的数据增强策略,可以通过参数控制。在你的训练命令中增加:
yolo ... hsv_h=0.015 hsv_s=0.7 hsv_v=0.4 degrees=10.0 translate=0.1 scale=0.5 shear=0.0 perspective=0.0 flipud=0.0 fliplr=0.5 mosaic=1.0 mixup=0.0 copy_paste=0.0hsv_h/s/v:调整色调、饱和度、明度。degrees,translate,scale,shear:旋转、平移、缩放、剪切。fliplr=0.5:水平翻转的概率为50%,这对行人检测非常有效,因为行人没有固定的左右朝向。mosaic=1.0:使用Mosaic数据增强,将四张图像拼成一张,有助于模型学习在不同位置识别目标。- 对于小目标检测,可以适当降低
scale的下限,减少mosaic的概率,避免目标被缩得太小。
学习率与优化器:学习率是训练中最重要的超参数之一。YOLOv8默认使用
SGD优化器。你可以尝试使用AdamW,并调整学习率。创建一个args.yaml文件(或直接修改训练命令):lr0: 0.01 # 初始学习率 lrf: 0.01 # 最终学习率因子 (lr0 * lrf) momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 box: 7.5 # 框回归损失权重 cls: 0.5 # 分类损失权重 dfl: 1.5 # 分布焦点损失权重然后使用
cfg参数引用它:yolo ... cfg=args.yaml。如果训练初期损失震荡剧烈,可以降低lr0;如果收敛很慢,可以适当增加。模型尺寸选择:YOLOv8提供了n, s, m, l, x五种尺寸。模型越大,精度通常越高,但速度越慢,显存需求越大。你需要根据你的硬件(比如搜索词中的“gtx1660ti跑yolov8”)和应用场景(实时性要求)做权衡。对于行人检测,
yolov8s或yolov8m通常是一个很好的起点。
4.3 训练过程监控与问题诊断
训练不是设好参数就放任不管。你需要学会看那些生成的图表。
- 损失曲线(
results.png):关注train/box_loss,train/cls_loss,val/box_loss,val/cls_loss。健康的曲线应该是训练损失和验证损失都平稳下降,并且两者最终差距不大。如果验证损失很早就开始上升,而训练损失持续下降,这是典型的过拟合。你需要增加数据增强的强度、使用更简单的模型、或者增加正则化(如weight_decay)。 - 精度曲线(
results.png):关注metrics/mAP50-95(B)。这是主要的评估指标,它计算了IoU阈值从0.5到0.95(步长0.05)的平均精度均值。这个值越高,模型整体性能越好。metrics/mAP50(B)则只关注IoU=0.5的精度,相对宽松。 - 混淆矩阵:查看模型是否容易将行人误检为其他类别,或者漏检。对于单类别任务,这个矩阵比较简单,主要看背景被误认为行人的情况(假阳性)。
如果训练过程中出现显存不足(OOM)错误,首先尝试减小batch-size(通过batch=16参数设置),或者减小imgsz。对于“gtx1660ti”这类6GB显存的显卡,用yolov8s模型、imgsz=640、batch=8-16通常是可行的。
5. 模型评估、验证与性能分析
训练完成后,我们得到了best.pt模型。但在高兴之前,必须对其进行严格的评估,确保它不是“纸上谈兵”。
5.1 使用验证集进行标准评估
YOLOv8提供了便捷的验证命令:
yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=data.yaml这条命令会在你的验证集上运行模型,并计算出一系列关键指标:
mAP50-95 (B):我们最关心的核心指标,值越高越好。mAP50 (B):通常这个值会高很多。Precision:精确率,即所有被预测为行人的框中,真正是行人的比例。高精确率意味着误报少。Recall:召回率,即所有真实行人框中,被模型检测出来的比例。高召回率意味着漏检少。- 此外还有每个类别的AP值,由于我们只有一类,所以就是行人的AP。
这些指标会保存到runs/detect/val/目录下。仔细分析这些数字。例如,如果你的应用场景对误报容忍度低(比如自动报警系统),那么你需要一个高Precision的模型;如果对漏检容忍度低(比如安全监控),则需要高Recall的模型。
5.2 可视化分析与错误排查
数字是抽象的,我们需要可视化结果来感性认识模型的好坏。
from ultralytics import YOLO import cv2 model = YOLO('runs/detect/train/weights/best.pt') results = model.predict(source='datasets/images/val', save=True, conf=0.25)predict方法会在验证集图像上运行推理,并把带预测框的结果保存下来。你需要一张张去查看:
- 漏检(False Negative):图片里有行人,但模型没框出来。可能原因:目标太小、遮挡严重、光照极端、姿态罕见。这指向了数据集的不足或需要针对性改进模型(如添加针对小目标的检测层)。
- 误检(False Positive):模型框出了不是行人的东西,比如路灯、树干、雕塑。可能原因:背景干扰物与训练集中的行人有局部相似特征。这需要通过数据增强增加负样本(不含行人的背景图),或者在后期处理中提高置信度阈值(
conf参数)。 - 定位不准:框的位置不准,或者大小不合适(IoU低)。可能原因:标注框本身不准,或者模型回归能力不够。可以检查标注质量,或尝试调整损失函数中框回归的权重(
box参数)。
通过这种细致的分析,你就能明确模型当前的弱点,从而指导下一步的优化方向。例如,如果小目标漏检严重,你就需要聚焦于“yolov8中针对小目标检测可以优化的技术”。
6. 模型优化与改进策略
当标准训练流程无法满足你的精度或速度要求时,就需要考虑模型优化。这包括结构改进、后处理优化和模型压缩。
6.1 针对小目标与遮挡行人的改进
这是行人检测中的经典难题。YOLOv8本身的多尺度检测头(P3, P4, P5)已经考虑了不同尺度的目标。但你可以进一步:
- 增加更浅层的检测头:YOLOv8默认输出三个尺度的特征图。对于极小目标,可以尝试修改模型结构,从更浅层(更高分辨率)的特征图引出检测头。但这需要修改模型源码,难度较大。
- 数据层面:
- 过采样小目标:在数据加载时,对包含小目标的图片给予更高的采样概率。
- 针对性数据增强:对随机裁剪(
random crop)进行限制,避免小目标被裁掉。增加复制-粘贴增强(copy_paste),将小目标复制到图像的不同位置,增加其出现频率。
- 注意力机制:这是搜索词中“ela注意力机制用于检测形状不规则目标”所指向的方向。你可以尝试将ELA(Efficient Local Attention)或其他注意力模块(如CBAM、SE)集成到YOLOv8的骨干或颈部网络中,让模型更关注行人区域,尤其是被遮挡或形状不规则的部分。这属于模型结构改进,通常需要一定的深度学习框架知识和实验能力。
6.2 模型剪枝与量化:为部署提速减负
如果你的目标是部署到资源受限的边缘设备(如RK3588开发板),那么模型压缩至关重要。
- 剪枝(Pruning):移除模型中冗余的通道或权重,在精度损失很小的前提下大幅减少模型大小和计算量。Ultralytics官方并未直接提供剪枝工具,但你可以使用第三方库如
torch-pruning。基本流程是:在训练好的模型上评估每个通道的重要性,剪掉不重要的,然后对剪枝后的模型进行微调(fine-tune)以恢复精度。“yolov8剪枝”是一个热门且实用的方向。 - 量化(Quantization):将模型权重和激活从浮点数(FP32)转换为低精度整数(INT8)。这能显著减少模型体积、提升推理速度,并降低功耗。YOLOv8支持PyTorch的静态量化和动态量化,也支持通过ONNX导出后,使用TensorRT或OpenVINO等推理引擎进行更高效的量化。
6.3 知识蒸馏:用小模型获得大模型的性能
如果你有一个精度很高但速度慢的大模型(如yolov8x),想得到一个又快又好的小模型(如yolov8n),知识蒸馏是有效手段。其核心思想是让小模型在训练时不仅学习真实标签,还学习大模型输出的“软标签”(概率分布),从而获得大模型学到的更丰富的知识关联。实现知识蒸馏需要设计额外的蒸馏损失函数,并可能修改训练流程。虽然YOLOv8官方没有内置蒸馏,但社区已有相关实现,你可以搜索“yolov8知识蒸馏”找到相关代码和教程。
7. 模型部署:从PyTorch到生产环境
模型训练优化得再好,最终价值体现在部署和应用上。YOLOv8提供了极其灵活的导出功能,支持多种终端部署格式。
7.1 模型导出:转换为通用格式
使用一行命令即可导出模型:
yolo export model=runs/detect/train/weights/best.pt format=onnx imgsz=640支持的格式包括:
onnx:开放神经网络交换格式,是转换到其他推理引擎的桥梁,应用最广。torchscript:PyTorch自带的序列化格式,适合在PyTorch环境中部署。tflite:用于部署到移动端或嵌入式设备(如安卓、树莓派)。coreml:用于部署到苹果生态系统(iOS, macOS)。ncnn:一个为移动端优化的高性能神经网络前向计算框架。
导出ONNX模型后,务必使用onnxruntime或Netron工具(可视化)验证其正确性。
7.2 服务器端部署:以阿里云ECS为例
对于云端API服务,你可以使用导出的ONNX模型,配合ONNX Runtime进行高性能推理。这里给出一个简单的Flask API示例:
from flask import Flask, request, jsonify import cv2 import numpy as np import onnxruntime as ort app = Flask(__name__) # 加载ONNX模型 session = ort.InferenceSession('best.onnx') input_name = session.get_inputs()[0].name output_names = [o.name for o in session.get_outputs()] def preprocess(img): # 保持与训练时一致的预处理 img = cv2.resize(img, (640, 640)) img = img.transpose(2, 0, 1) # HWC to CHW img = img.astype(np.float32) / 255.0 img = np.expand_dims(img, axis=0) # 添加batch维度 return img @app.route('/predict', methods=['POST']) def predict(): file = request.files['image'] img_bytes = file.read() nparr = np.frombuffer(img_bytes, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) img_processed = preprocess(img) outputs = session.run(output_names, {input_name: img_processed}) # 解析outputs (这里需要根据YOLOv8 ONNX输出格式调整) # outputs[0] 通常是 [1, 84, 8400] 的形状,需要后处理(非极大抑制NMS) # 此处省略NMS和后处理代码... detections = postprocess(outputs[0]) return jsonify({'detections': detections}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)将这个服务部署到阿里云ECS(搜索词中提到)上,你就拥有了一个行人检测的HTTP API。注意生产环境中需要考虑并发、GPU推理、负载均衡、Docker容器化等问题。
7.3 边缘设备部署:以RK3588为例
RK3588是一款性能强大的边缘计算芯片。将YOLOv8部署上去,通常需要经过RKNN模型转换这一步。这正是搜索词“yolov8 + rk3588 rknn模型转换 rknn-toolkit2-2.3.2”所指的核心流程。
- 环境准备:在x86开发机上安装RKNN-Toolkit2(如2.3.2版本)。这是一个模型转换、量化和推理的工具包。
- 模型转换:将训练好的PyTorch模型(
.pt)或ONNX模型(.onnx)转换为RKNN格式(.rknn)。这个过程通常包括:- 加载模型:使用RKNN-Toolkit2加载ONNX模型。
- 配置:设置目标平台为RK3588,指定输入输出节点,配置预编译选项。
- 量化(可选但推荐):提供一部分校准图片,进行INT8量化,以大幅提升在RK3588 NPU上的推理速度。
- 导出:生成
.rknn文件。
- 部署与推理:将
.rknn文件拷贝到RK3588开发板上,使用RKNN的C++或Python API加载模型并进行推理。你需要编写代码来处理摄像头输入、调用模型、解析输出框、并执行NMS后处理。
这个流程的细节很多,包括如何准备校准数据集、如何处理RKNN模型输出的数据格式、如何调优以达到最佳性能等。通常需要参考瑞芯微官方的RKNN文档和示例代码。成功部署后,你就能在RK3588上实现实时的行人检测,这对于智能摄像头、机器人、车载设备等边缘应用场景意义重大。
8. 项目总结与进阶思考
走完从数据准备、模型训练、评估优化到最终部署的完整流程,一个基于YOLOv8的行人检测项目就算基本完成了。回顾整个过程,我想分享几个最深切的体会:
第一,数据质量决定模型上限。无论模型多先进,训练技巧多高超,如果标注数据不准确、不全面,模型性能一定会遇到瓶颈。在项目初期,花时间清洗和整理数据,甚至重新标注,往往是性价比最高的投资。
第二,理解原理比调参更重要。知道YOLOv8的损失函数由哪几部分组成(box, cls, dfl),知道数据增强每个参数对图像做了什么改变,知道mAP指标是如何计算的,这些知识能让你在模型表现不佳时,不是盲目地乱试参数,而是有方向地进行诊断和调整。例如,当你发现召回率低时,会想到是不是置信度阈值设高了,或者分类损失权重需要调整。
第三,部署是价值的最终体现。训练出一个高精度的模型只是第一步,如何让它稳定、高效地跑在目标硬件上,满足实际业务对延迟、吞吐量的要求,是更大的挑战。这个过程中对模型格式转换、计算图优化、前后处理加速的掌握,是算法工程师不可或缺的工程能力。
这个项目还可以向很多方向延伸。比如,将检测到的行人框输入到另一个ReID(重识别)模型中进行跟踪,实现跨摄像头的行人轨迹追踪。或者,结合姿态估计模型,分析行人的行为(如摔倒、打架,对应搜索词“yolov8识别人物打架斗殴”)。又或者,将2D检测与深度信息结合,向“三维目标检测”迈进。
深度学习的实践就是一个不断遇到问题、分析问题、解决问题的循环。这个基于YOLOv8的行人检测项目,为你提供了一个坚实的起点和一套可复用的方法论。希望你在其中踩过的每一个坑,都能成为未来解决更复杂问题的垫脚石。