基于YOLOv8的儿童与成人目标检测系统实战详解
简介这是一份基于Python和YOLOv8的儿童与成人目标检测系统源码面向计算机视觉入门及进阶学习者适用于智能监控、智能家居等需要区分与统计儿童和成人目标的场景。系统支持图片、视频、摄像头三种实时识别模式识别结果可自动保存并导出Excel同时内置Web前端界面可自定义标题与背景方便二次开发与演示。资源压缩包共24个文件以Python源码train.py、predict.py、val.py、ui.py为核心辅以19张界面与效果截图及1份说明文档包体大小约3.17MB结构简洁、便于直接运行和修改。已有38人学习下载。除了完整项目代码外资源还包含70余种YOLOv8改进点说明可一键加载改进模型配置帮助学习者提升检测精度适合课程设计、毕业设计或实际项目落地参考。1. 项目思路与方案选型1.1 为什么要做儿童与成人目标检测目标检测这个方向在CV领域算是最接地气的一块了。安防监控、智能相册、商场客流分析、教育场景里的人脸考勤与行为分析……凡是涉及“画面里到底有谁、在哪、大概多大”的问题都逃不开目标检测。儿童与成人目标检测和普通的人体检测最大的区别在于——它不只是画出所有人的框还要在同一类别体系里把“person”这一大类拆出年龄属性。这也是很多实际项目的真实需求商场想知道儿童区的滞留人数教育机构想统计课堂中的低龄学员占比智能设备要做家长管控甚至某些公共场所需要对儿童异常徘徊做预警。如果直接拿COCO预训练权重跑一遍出来的全是person信息量并不够用。这个基于Python和YOLOv8的检测系统本质上就是在YOLOv8框架下训练一个二分类或细分多类的检测模型把场景中的人区分为 child 和 adult 两个类别同时输出每个目标的边界框和置信度。源码包自带完整的工程结构从数据组织、模型训练到推理脚本都给你配好了对于正在入门YOLO系列或者需要一个可落地的检测项目模板的人来说参考价值比较大。1.2 为什么选YOLOv8而不是其他方案现在目标检测模型可选的范围很广Faster R-CNN、SSD、YOLOv5、YOLOv8甚至最新的YOLOv9、v10、v11都陆续出来了。但我个人在类似项目里还是优先用YOLOv8原因有几个上手成本低ultralytics这个官方库把训练、验证、导出、推理全部封装成了Python API和命令行一个pip install ultralytics就能跑通不需要像用Detectron2那样手动搭一堆配置文件。检测精度与速度的平衡YOLOv8在COCO上的mAP表现优秀推理速度在GPU上能做到实时级别GTX 1660 Ti这种卡也能流畅跑部署到Jetson或者RK3588这类边缘设备都不是问题。内置数据增强与训练策略Mosaic增强、自动学习锚框、余弦退火调度这些都已经内置在训练流程里了不用自己折腾。社区生态成熟遇到问题随便一搜就有解决方案对于学习者来说这点比什么都重要。在“儿童/成人”这种细粒度分类任务上YOLOv8的C2f模块和SPPF结构能提取到足够丰富的语义特征配合合理的训练数据识别效果是能实际落地的这个后面细说。2. 环境准备与依赖安装2.1 Python环境与CUDA选型拿到这个源码第一步就是把环境跑起来。我的建议是用Python 3.8到3.11之间的版本太老或太新都可能和PyTorch版本产生兼容性问题。我自己平时用Python 3.10实测下来最稳。# 创建虚拟环境避免污染系统Python conda create -n yolo_detect python3.10 -y conda activate yolo_detectGPU版本就一句话有N卡就装CUDA版PyTorch没有就老老实实用CPU版。很多新手在CPU机器上硬装CUDA版结果torch.cuda.is_available()返回False然后就开始怀疑人生。其实CPU版跑推理完全够用只是训练会慢很多。# GPU版根据自己的CUDA版本选择对应命令这里以CUDA 11.8为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # CPU版 pip install torch torchvision注意安装前先确认显卡驱动支持的最高CUDA版本。可以用nvidia-smi查看右上角的CUDA Version别盲目装最新的。然后是YOLOv8核心依赖pip install ultralytics pip install opencv-python pip install labelimg # 数据标注用2.2 快速验证环境是否就绪装完之后建议先跑一段极简代码验证环境别等到训练时才暴雷from ultralytics import YOLO # 加载预训练权重 model YOLO(yolov8n.pt) # 跑一张测试图片 results model.predict(https://ultralytics.com/images/bus.jpg, saveTrue) print(results[0].boxes.cls)如果能看到检测结果说明环境没问题。接下来就进入数据环节。这个项目里常见的坑是源码在Windows上可以跑到了Linux上路径分隔符出问题或者中文字符串编码报错。建议代码仓库统一用/路径标注文件和配置文件里的路径也尽量用绝对路径省得后面排查半天。3. 数据准备与标注3.1 数据集的获取与组织方式儿童与成人的检测数据集没有现成大规模公开集可以直接拿来用COCO的person不会区分年龄所以需要自己组装数据。常用的思路有两种从公开数据集中筛选重标或者自己爬图/拍图标注。源码的数据组织方式遵循YOLO的标准格式也就是dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/每张图片对应一个同名txt文件每行内容依次是类别id 归一化中心x 归一化中心y 归一化宽度 归一化高度。类别ID从0开始0代表child1代表adult。数据集的数量上我的经验是每个类别至少准备800~1500张真实场景图片。如果只有几百张YOLOv8也能训练但泛化能力会很差换个场景就满载而归。如果是学习演示用500张/类也能跑通整个流水线但心里要清楚模型的精度上限在哪里。3.2 标注工具的使用与标注规范源码配套的标注脚本一般用LabelImg安装完直接启动labelimg使用时有几个小技巧值得注意标注模式务必选择PascalVOC或YOLO模式LabelImg默认是VOC格式xml记得切换。YOLO模式会直接生成txt文件省一步转换。标注框要紧贴人体轮廓。儿童和成人一起出现时儿童个子小、容易被忽略但恰恰这种小目标是最需要标准的。遮挡处理如果一个人被遮挡超过50%建议不标或者只标可见部分交给模型去学习。儿童骑在大人肩上、婴儿车里这种极端情况源码的类别定义里可能没有对应处理建议标注时统一归类到child。标注规范直接影响模型的定位和分类效果。我见过很多新手把所有任务框都画得特别大把行人周围的自行车、花坛也框进去结果模型收敛后预测框一直偏大。框一定要贴合目标宁可略紧不可太松。做完标注后分出一个验证集val用来评估模型效果通常按 9:1 或 8:2 划分。可以写个小脚本随机划分但记得保持train和val中的类别分布大致均衡。4. 模型训练与效果评估4.1 训练脚本的核心配置源码中训练入口一般长这样from ultralytics import YOLO model YOLO(yolov8m.yaml) # 或直接加载预训练权重 results model.train( datadataset.yaml, epochs100, imgsz640, batch16, device0, # 0表示用第一张GPUCPU就写devicecpu lr00.01, patience20, save_period10, )这里有几个参数值得重点关注model选择YOLOv8有n/s/m/l/x五个尺寸。源码项目如果对速度要求高用yolov8s或yolov8n如果对精度有追求且设备性能够用yolov8m。我做的儿童成人检测项目里最终落在yolov8s上——在GTX 1660 Ti上推理速度约35ms/帧精度够用。imgsz默认640。如果画面中儿童目标普遍很小可以试试1024或1280但显存占用会显著上升。也可以后续再去加一个小目标检测头这个在源码改进版里会提到。batch根据显存调。显存不够就跑小batch或者用梯度累积。8GB显存跑yolov8s、640分辨率batch16是可行的16GB可以上batch32。device没有CUDA必须写devicecpu不然会报错找不到GPU。数据集配置文件 dataset.yaml 长这样path: /absolute/path/to/dataset train: images/train val: images/val nc: 2 names: [child, adult]path建议写绝对路径因为YOLO在解析相对路径时经常因为运行目录不同而找不到文件这个坑踩的人不少。4.2 训练过程中评价标准怎么看训练过程中输出的指标很多新手一脸懵我解释一下核心几个box_loss / cls_loss / dfl_loss三项损失的加权和整体趋势应当下降。如果训练损失下降但验证损失上升说明过拟合了可以加大数据增强或减小模型容量。Precision精确率预测为正样本的框中有多少是真正的人。class: 0 (child)那一行的Precision表示预测为child的框中确实为child的比例。Recall召回率所有真实目标中有多少被检测出来了。漏检多的时候Recall就低。mAP50 / mAP50-95mAP50是IoU阈值0.5下的平均精度通俗理解是“检测框大概位置对了就算对”的分数mAP50-95更严苛对框的贴合程度要求高是行业更通用的评价指标。只看mAP50不够一定要看mAP50-95这才是模型定位精度的试金石。训练过程中可以打开results.png看损失曲线和指标曲线。如果曲线的mAP50在训练后期还在稳步上升说明模型没有收敛完可以适当增加epochs如果曲线已经走平那就该停了。5. 推理与部署实践5.1 图片、视频、摄像头三种推理方式源码里的推理脚本一般支持三种输入from ultralytics import YOLO # 加载训练好的权重 model YOLO(best.pt) # 图片推理 results model.predict(test.jpg, conf0.35, saveTrue) # 视频推理 results model.predict(test.mp4, conf0.35, saveTrue) # 摄像头实时推理 model.predict(source0, showTrue, conf0.35)conf是置信度阈值这个值的设定完全看场景。对儿童走失预警这种宁可误报也不能漏报的场景conf设低一些0.25~0.3对商场客流统计这种追求准确率的场景设在0.4左右更合理。我项目中最终用的是0.35误检和漏检相对平衡。如果你要自己写循环推理YOLOv8的API也很直接import cv2 from ultralytics import YOLO model YOLO(best.pt) cap cv2.VideoCapture(0) while cap.isOpened(): ret, frame cap.read() if not ret: break result model(frame)[0] annotated result.plot() cv2.imshow(YOLOv8 Detect, annotated) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()5.2 关于目标重复识别与跟踪热搜词里有一条“运动的物体经过摄像头只识别一次yolov8 seg”这其实是没有加跟踪器导致每帧都做独立检测的表现。目标检测本身是逐帧的每一帧都会重新检测画面里的目标所以同一个行人出现在视频中会被连续几十帧甚至上百帧识别这是正常现象不是Bug。如果你只想“一个目标只计数一次”比如统计儿童进出人数那就需要在检测基础上叠加目标跟踪ByteTrack / BoT-SORT。YOLOv8内置了跟踪能力model.track(test.mp4, persistTrue, saveTrue)配合persistTrue可以让跟踪ID跨帧保持。计数逻辑则可以基于每个track ID首次出现的位置或区域来判断进出方向。这个小扩展不难但对实际业务落地至关重要。5.3 模型导出与边缘设备部署训练好的best.pt可以导出成多种格式。项目中如果需要部署到RK3588、Jetson等嵌入式设备一般导出为ONNX或者进一步转成RKNN、TensorRTyolo export modelbest.pt formatonnx imgsz640导出ONNX后再接OpenCV DNN或ONNX Runtime推理可以脱离PyTorch环境部署自由度大大提高。需要注意的坑导出时imgsz要和训练尺寸一致否则推理结果可能会异常此外ONNX对部分自定义算子支持不完善如果真的遇到算子不支持优先用formattorchscript再转能绕开部分坑。6. 常见问题与排查技巧实录下面整理一下这个项目里最容易踩的坑都是我实际遇到过、或者帮别人debug时高频出现的问题。问题现象可能原因解决思路训练时报错CUDA out of memorybatch太大或imgsz太高调小batch到4/8或减小imgsz到512/480训练时loss不下降学习率太高/数据没归一化/标注格式错误把lr0调到0.001检查标注txt的坐标是否在0~1之间推理时把所有框都识别成adult数据类别不平衡child样本太少增加child图片或用数据增强扩充flip/mosaic对类别平衡帮助很大检测小目标远处儿童总是漏检模型下采样倍数大小目标特征丢失切图训练、提升输入分辨率或更换带P2小目标检测头的结构摄像头推理很卡没开GPU推理/像素太高等确认torch.cuda.is_available()frame缩放处理后再进模型训练产出results.csv里全是0验证集图片和标签不匹配检查验证集txt文件是否为空或类别编号越界CPU训练太慢正常现象CPU只适合推理训练用GPU没有GPU就租云端算力或直接用Colab独家避坑技巧训练完后的best.pt和last.pt务必用best.pt做推理。last.pt是最后一个epoch的权重可能已经过拟合了用它在验证集上效果通常不如best。数据增强里有个hsv_h、hsv_s参数默认的调色增强有时会导致儿童衣物颜色失真影响分类。如果你发现训练集上精度很高、验证集上很差试试调低这些参数比如hsv_s0.2让模型更依赖形状特征而非颜色。源码里如果自带requirements.txt装依赖的时候不要用pip install -r requirements.txt无脑装看清楚每个库的版本尤其是torch和torchvision不匹配会直接报错或训练时Crash。提示如果你是在Windows上跑项目路径中出现反斜杠\时Python字符串记得用原生字符串rE:\dataset\images或双反斜杠E:\\dataset\\images否则转义字符会闹出幺蛾子。最后的经验补充我在实际做儿童成人检测项目的过程中最大的体会是模型结构本身其实不是瓶颈数据才是。YOLOv8作为开源框架已经把训练流程打磨得很成熟了同一套代码A团队跑出来的mAP50可能80B团队可能只有50差距基本都在数据质量、标注规范、类别平衡这些“苦功夫”上。建议你跑通这个源码之后下一步可以尝试做两件事一是把检测结果接入一个简单的计数逻辑做成一个完整的人数统计demo二是尝试用TensorRT加速把推理速度压到20ms以内。这两件事做完你对整个目标检测落地流程的理解就会上一个台阶。先把手头的环境跑起来把best.pt跑出来比研究一百篇论文都有用。本文还有配套的精品资源点击获取