行人检测(人体检测)2:YOLOv5实现人体检测(含人体检测数据集和训练代码)

行人检测(人体检测)2:YOLOv5实现人体检测(含人体检测数据集和训练代码)

目录

行人检测(人体检测)2:YOLOv5实现人体检测(含人体检测数据集和训练代码)

1. 前言

2. 人体检测数据集说明

(1)人体检测数据集

(2)自定义数据集

3. 基于YOLOv5的人体检测模型训练

(1)YOLOv5安装 

(2)准备Train和Test数据

(3)配置数据文件

(4)配置模型文件

(5)重新聚类Anchor(可选)

(6)开始训练

(7)可视化训练过程

(8)常见的错误

4. Python版本人体检测效果

5. Android版本人体检测效果

6.项目源码下载


1. 前言

 这是项目《行人检测(人体检测)》系列之《YOLOv5实现人体检测(含人体检测数据集和训练代码)》;项目基于开源YOLOv5项目,实现一个高精度的人体检测(行人检测)算法( Person Detection, Pedestrian Detection);

目前,基于YOLOv5s的人体检测精度平均值mAP_0.5=0.98432,mAP_0.5:0.95=0.84354。为了能部署在手机Android平台上,本人对YOLOv5s进行了简单的模型轻量化,并开发了一个轻量级的版本yolov5s05_416和yolov5s05_320模型;轻量化模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。下表格给出轻量化模型的计算量和参数量以及其检测精度

模型input-sizeparams(M)GFLOPsmAP_0.5mAP_0.5:0.95
yolov5s640×6407.216.50.984320.84284
yolov5s05416×4161.71.80.970040.76103
yolov5s05320×3201.71.10.964480.73216

先展示一下人体检测效果:

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/128954588


更多项目《行人检测(人体检测)》系列文章请参考:

  1. 行人检测(人体检测)1:人体检测数据集(含下载链接):https://blog.csdn.net/guyuealian/article/details/128821763
  2. 行人检测(人体检测)2:YOLOv5实现人体检测(含人体检测数据集和训练代码):https://blog.csdn.net/guyuealian/article/details/128954588
  3. 行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测):https://blog.csdn.net/guyuealian/article/details/128954615
  4. 行人检测(人体检测)4:C++实现人体检测(含源码,可实时人体检测):https://blog.csdn.net/guyuealian/article/details/128954638

​ 如果需要进行人像分割,实现一键抠图效果,请参考文章:《一键抠图Portrait Matting人像抠图 (C++和Android源码)


2. 人体检测数据集说明

(1)人体检测数据集

目前收集了约10W+的人体检测数据集,数据集主要来源于VOC,COCO和MPII的人体数据集,关于人体数据集说明,请参考《行人检测(人体检测)1:人体检测数据集(含下载链接)》:https://blog.csdn.net/guyuealian/article/details/128821763

(2)自定义数据集

如果需要增/删类别数据进行训练,或者需要自定数据集进行训练,可参考如下步骤:

  1. 采集图片,建议不少于200张图片
  2. 使用Labelme等标注工具,对目标进行拉框标注:labelme工具:GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).
  3. 将标注格式转换为VOC数据格式,参考工具:labelme/labelme2voc.py at main · wkentaro/labelme · GitHub
  4. 生成训练集train.txt和验证集val.txt文件列表
  5. 修改engine/configs/voc_local.yaml的train和val的数据路径
  6. 重新开始训练

​​​


3. 基于YOLOv5的人体检测模型训练

(1)YOLOv5安装 

训练Pipeline采用YOLOv5: GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite , 原始官方代码训练需要转换为YOLO的格式,不支持VOC的数据格式。为了适配VOC数据,本人新增了LoadVOCImagesAndLabels用于解析VOC数据集,以便正常训练。另外,为了方便测试,还增加demo.py文件,可支持对图片,视频和摄像头的测试。

推荐使用Python3.8或Python3.7,更高版本可能存在版本差异问题,Python依赖环境,使用pip安装即可,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应


matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow
PyYAML>=5.3.1
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0
tensorboard>=2.4.1
seaborn>=0.11.0
pandas
thop  # FLOPs computation
pybaseutils==0.7.0

 项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

(2)准备Train和Test数据

下载人体检测数据集,  关于人体数据集说明,请参考《行人检测(人体检测)1:人体检测数据集(含下载链接)》:https://blog.csdn.net/guyuealian/article/details/128821763

(3)配置数据文件

  • 修改训练和测试数据的路径:engine/configs/voc_local.yaml
  • 注意数据路径分隔符使用【/】,不是【\】
  • 项目不要出现含有中文字符的目录文件或路径,否则会出现很多异常!!!!!!!!
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
# 数据路径
path: ""  # dataset root dir

# 数据路径不要含有中文字符,否则有很多异常,分隔符使用【/】

train:
  - 'D:/dataset/VOC/VOC2007/trainval.txt'
  - 'D:/dataset/VOC/VOC2012/trainval.txt'
  - 'D:/dataset/MPII/trainval.txt'
  - 'D:/dataset/COCO/trainval.txt'

val:
  - 'D:/dataset/MPII/test.txt'

test:  # test images (optional)
data_type: voc

# 1.设置类别个数,和要训练的类别名称,ID号从0开始递增
nc: 1  # number of classes
names: { 'person': 0 } # 仅训练person检测


# 2.如果你想合并所有类别为一个大类,进行训练: unique表示合并所有类为单独一个类别
#nc: 1  # number of classes
#names: { "unique": 0 }

(4)配置模型文件

官方YOLOv5给出了YOLOv5l,YOLOv5m,YOLOv5s等模型。考虑到手机端CPU/GPU性能比较弱鸡,直接部署yolov5s运行速度十分慢。所以本人在yolov5s基础上进行模型轻量化处理,即将yolov5s的模型的channels通道数全部都减少一半,并且模型输入由原来的640×640降低到416×416或者320×320,该轻量化的模型我称之为yolov5s05。轻量化后的模型yolov5s05比yolov5s计算量减少了16倍,参数量减少了7倍。下面是yolov5s05和yolov5s的参数量和计算量对比:

模型input-sizeparams(M)GFLOPs
yolov5s640×6407.216.5
yolov5s05416×4161.71.8
yolov5s05320×3201.71.1

(5)重新聚类Anchor(可选)

官方yolov5s的Anchor是基于COCO数据集进行聚类获得(详见models/yolov5s.yaml文件)

 ​​​ 

考虑到人体检测数据集,目标框几乎都是竖状的矩形框;原始Anchor是在输入640×640聚类获得的,直接复用原始COCO的Anchor效果可能不太好;因此,这需要我们根据已有的数据集的标注框进行重新聚类获得新的Anchor;这里为了简单,yolov5s直接复用原始Anchor,而yolov5s05_416和yolov5s05_320由于输入分辨率变小,其Anchor也进行等比例缩小下表给出yolov5s,yolov5s05_416和yolov5s05_320重新调整后Anchor结果:

yolov5s.yamlyolov5s05_416.yamlyolov5s05_320.yaml
​​​​​​

一点建议:

  • 官方yolov5s的Anchor是基于COCO数据集进行聚类获得,不同数据集需要做适当的调整,其最优Anchor建议重新进行聚类 。
  • 当然你要是觉得麻烦就跳过,不需要重新聚类Anchor,这个影响不是特别大。如果你需要重新聚类,请参考engine/kmeans_anchor/demo.py文件

(6)开始训练

整套训练代码非常简单操作,用户只需要填写好对应的数据路径,即可开始训练了。

  • 修改训练超参文件: data/hyps/hyp.scratch-v1.yaml (可以修改训练学习率,数据增强等方式,使用默认即可,可不修改)
  • Linux系统终端运行,训练yolov5s或轻量化版本yolov5s05_416或者yolov5s05_320 (选择其中一个训练即可)
#!/usr/bin/env bash

#--------------训练yolov5s--------------
# 输出项目名称路径
project="runs/yolov5s_640"
# 训练和测试数据的路径
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="models/yolov5s.yaml"
# 训练超参数文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 预训练文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 640 --workers 4 --project $project


#--------------训练轻量化版本yolov5s05_416--------------
# 输出项目名称路径
project="runs/yolov5s05_416"
# 训练和测试数据的路径
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="models/yolov5s05_416.yaml"
# 训练超参数文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 预训练文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 416 --workers 4 --project $project


#--------------训练轻量化版本yolov5s05_320--------------
# 输出项目名称路径
project="runs/yolov5s05_320"
# 训练和测试数据的路径
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="models/yolov5s05_320.yaml"
# 训练超参数文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 预训练文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 320 --workers 4 --project $project


  • Windows系统终端运行,训练yolov5s或轻量化版本yolov5s05_416或者yolov5s05_320 (选择其中一个训练即可) 
#!/usr/bin/env bash

#--------------训练yolov5s--------------
python train.py --data engine/configs/voc_local.yaml --cfg models/yolov5s.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 640 --workers 4 --project runs/yolov5s_640


#--------------训练轻量化版本yolov5s05_416--------------
python train.py --data engine/configs/voc_local.yaml --cfg models/yolov5s05_416.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 416 --workers 4 --project runs/yolov5s05_416



#--------------训练轻量化版本yolov5s05_320--------------
python train.py --data engine/configs/voc_local.yaml --cfg models/yolov5s05_320.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 320 --workers 4 --project runs/yolov5s05_320

  • 开始训练:

​​​

  • 训练数据量比较大,训练时间比较长,请耐心等待哈
  • 训练完成后,在模型输出目录中有个results.csv文件,记录每个epoch测试的结果,如loss,mAP等信息

训练模型收敛后,yolov5s人体检测的mAP指标大约mAP_0.5=0.98432;而,yolov5s05_416 mAP_0.5=0.97004左右;yolov5s05_320 mAP_0.5=0.96448左右;

轻量化后的模型yolov5s05比yolov5s计算量减少了16倍,参数量减少了7倍;相比而言,yolov5s05比yolov5s mAP减小了2%,对于性能比较弱鸡的手机而言,这个精度是还是可以接受的。

模型input-sizeparams(M)GFLOPsmAP_0.5mAP_0.5:0.95
yolov5s640×6407.216.50.984320.84284
yolov5s05416×4161.71.80.970040.76103
yolov5s05320×3201.71.10.964480.73216

(7)可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法,在终端输入:

# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir=./data/model/yolov5s_640
​​​
​​​
​​​
​​​

 当然,在输出目录,也保存很多性能指标的图片

  • 这是训练epoch的可视化图,可以看到mAP随着Epoch训练,逐渐提高(见result.png

  • 这是每个类别的F1-Score分数(见F1_curve.png

​​​

  • 这是模型的PR曲线(见PR_curve.png

​​​

  • 这是混淆矩阵(见confusion_matrix.png):

​​​

(8)常见的错误


4. Python版本人体检测效果

demo.py文件用于推理和测试模型的效果,填写好配置文件,模型文件以及测试图片即可运行测试了

  • 测试图片
# 测试图片(Linux系统)
image_dir='data/test_image' # 测试图片的目录
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/test-result" # 保存检测结果
python demo.py --image_dir $image_dir --weights $weights --out_dir $out_dir

Windows系统,请将$image_dir, $weights ,$out_dir等变量代替为对应的变量值即可,如

# 测试图片(Windows系统)
python demo.py --image_dir data/test_image --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/test-result
  • 测试视频文件
# 测试视频文件(Linux系统)
video_file="data/test-video.mp4" # path/to/video.mp4 测试视频文件,如*.mp4,*.avi等
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/test-result" # 保存检测结果
python demo.py --video_file $video_file --weights $weights --out_dir $out_dir
# 测试视频文件(Windows系统)
python demo.py --video_file data/test-video.mp4 --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/test-result

  •  测试摄像头
# 测试摄像头(Linux系统)
video_file=0 # 测试摄像头ID
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/test-result" # 保存检测结果
python demo.py --video_file $video_file --weights $weights --out_dir $out_dir
# 测试摄像头(Windows系统)
python demo.py --video_file 0 --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/test-result

先展示一下人体检测效果:

​​​​
​​​​

 如果想进一步提高模型的性能,可以尝试:

  1. ​增加训练的样本数据: 目前有30W+的数据量,建议根据自己的业务场景,采集相关数据,提高模型泛化能力
  2. 使用参数量更大的模型: 本教程使用的YOLOv5s,其参数量才7.2M,而YOLOv5x的参数量有86.7M,理论上其精度更高,但推理速度也较慢。
  3. 尝试不同数据增强的组合进行训练


5. Android版本人体检测效果

已经完成Android版本人体检测算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。详细说明请查看:行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)https://blog.csdn.net/guyuealian/article/details/128954615

人体检测Android Demo体验:https://download.csdn.net/download/guyuealian/87441942

   


6.项目源码下载

整套项目源码内容包含:人体检测数据集 + YOLOv5训练代码和测试代码

如需下载项目源码,请WX关注【AI吃大瓜】,回复【人体检测】即可下载

项目源码包含内容:

(1)人体检测数据集:

  1. VOC人体检测数据集:VOC2007共9963张图片,VOC2012共17125张图片,已经标注了人脸框(face)和人体框(person)
  2. COCO人体检测数据集:总共66697张含有人体的图片,已经标注了人脸框(face)和人体框(person)
  3. MPII人体检测数据集:总共21430张含有人体的图片,已经标注了人脸框(face)和人体框(person)
  4. 详细说明,请查看《行人检测(人体检测)1:人体检测数据集(含下载链接)》:https://blog.csdn.net/guyuealian/article/details/128821763

(2)YOLOv5训练代码和测试代码(Pytorch)

  1. 整套YOLOv5项目工程,含训练代码train.py和测试代码demo.py
  2. 支持高精度版本yolov5s训练和测试
  3. 支持轻量化版本yolov5s05_320和yolov5s05_416训练和测试
  4. 根据本篇博文说明,简单配置即可开始训练:train.py
  5. 源码包含了训练好的yolov5s,yolov5s05_416和yolov5s05_320模型,配置好环境,可直接运行demo.py
  6. 测试代码demo.py支持图片,视频和摄像头测试

 Android人体检测APP Demo体验:https://download.csdn.net/download/guyuealian/87441942

<think>好的,我现在需要帮助用户使用YOLOv5实现人体识别。首先,用户提到了YOLOv5的教程,所以我应该先提供基本的步骤资源。记得按照系统级指令,所有数学公式用$...$,独立公式用$$...$$,同时用中文回答,生成相关问题,并正确引用提供的参考资料。 首先,我需要确认用户的需求。用户想使用YOLOv5行人检测,可能需要从环境配置到模型部署的整个流程。根据引用[1],YoloFace-50k是一个相关的人脸检测模型,但用户需要的是人体检测,可能需要调整模型或使用预训练人体检测权重。不过YOLOv5本身有预训练的COCO模型,其中包人体类别,所以应该建议用户使用官方模型。 接下来,按照步骤,环境配置是第一步。需要安装PyTorchYOLOv5的依赖库。然后,下载预训练模型,比如yolov5s.pt,这个模型在COCO数据集训练过,可以检测包括人在内的多个类别。代码示例方面,用户可能需要加载模型、处理图像、进行推理结果解析。这里需要确保代码正确,可能需要参考YOLOv5的官方文档。 然后,数据准备部分,用户可能需要标注自己的数据集,如果COCO的数据不够的话。这里需要提到数据集格式,比如YOLO格式的txt文件,以及如何转换其他格式的数据集。数据增强部分,YOLOv5内置了一些方法,可以简要提及。 训练模型时,命令行参数是关键,需要解释如何修改yaml文件,配置数据集路径模型参数。可能还需要调整超参数,比如学习率、批次大小等。评估部分,用户需要验证模型在测试集上的表现,计算mAP等指标。 部署部分,用户可能想将模型应用到实际场景,比如视频流处理。这里可以结合引用[2]中的OpenVINO部署方法,提到使用C# API或OpenCV进行部署,但用户使用Python的话,可以建议使用ONNX转换或TorchScript优化推理速度。此外,引用[3]中的动作捕捉可能涉及关键点检测,但用户当前的需求是人体检测,所以暂时不需要深入。 在注意事项里,需要强调硬件要求,GPU加速的重要性,以及模型大小速度的权衡。比如yolov5s适合边缘设备,而yolov5x可能更准确但更慢。 相关问题部分,需要生成与YOLOv5人体检测相关的问题,比如性能优化、模型对比、部署方法、与其他技术结合等。同时要确保引用正确,比如引用[2]提到行人摔倒检测,可以关联到应用场景的问题。 最后,检查是否符合所有格式要求,数学公式是否正确使用,引用是否在适当的位置添加。例如,在提到模型优化时,引用[1][2]可能相关。确保没有使用Markdown格式,代码块正确,没有语法错误。</think>### YOLOv5人体检测实现教程 #### 一、环境配置 1. 安装依赖库: ```bash pip install torch torchvision git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt ``` 2. 下载预训练模型(COCO数据集训练): ```python import torch model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # 可替换为yolov5m/yolov5l/yolov5x ``` #### 二、代码实现 ```python import cv2 # 加载模型 model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) # 图像处理 img = cv2.imread("test.jpg") results = model(img) # 推理计算 # 结果解析 detections = results.pandas().xyxy[0] human_df = detections[detections['name'] == 'person'] # 筛选人体检测结果 # 可视化标注 results.render() cv2.imshow("Detection", results.imgs[0]) cv2.waitKey(0) ``` #### 三、数据准备 1. 数据集格式要求: ``` ├── images │ ├── train │ └── val └── labels ├── train └── val ``` 每个标签文件格式为:$class\_id\ x\_center\ y\_center\ width\ height$,坐标需归一化到$[0,1]$区间[^1] 2. 数据增强策略: - 随机裁剪(Random Crop) - 色彩抖动(Color Jitter) - 马赛克增强(Mosaic Augmentation) $$ \text{最终精度} = \frac{TP}{TP + FP + FN} $$ #### 四、模型训练 ```bash python train.py --img 640 --batch 16 --epochs 100 --data custom.yaml --weights yolov5s.pt ``` 建议训练参数: - 初始学习率:$1e^{-3}$ - 动量参数:0.9 - 权重衰减:$5e^{-4}$ #### 五、性能评估 使用COCO评估指标: $$ AP = \int_{0}^{1} p(r) dr $$ 在COCO val2017数据集上,yolov5s的AP@0.5:0.95达到37.4 #### 六、部署优化 1. OpenVINO加速(参考[^2]): ```python from openvino.runtime import Core ie = Core() onnx_model = model.export(format="onnx") # 转换为ONNX格式 compiled_model = ie.compile_model(onnx_model, "CPU") ``` 2. TensorRT加速: ```bash python export.py --weights yolov5s.pt --include engine --device 0 ``` #### 注意事项 1. 硬件建议:至少4GB显存的NVIDIA GPU 2. 模型选择建议: | 模型类型 | 参数量 | 推理速度 | mAP | |---------|-------|---------|-----| | yolov5n | 1.9M | 45fps | 28.4| | yolov5s | 7.2M | 30fps | 37.4| | yolov5x | 86.7M | 8fps | 50.1| 3. 视频流处理示例: ```python cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() results = model(frame) # 添加摔倒检测逻辑(参考[^2]) ```
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI吃大瓜

尊重原创,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值