Wider Face+YOLOV8人脸检测

YOLO系列的算法更新实在太快了,前些天刚学习完YOLOV7,YOLOV8就出来了。今天先理解模型的训练过程,后续再学习V8的网络结构等细节。

YOLOV8源码链接https://github.com/ultralytics/ultralytics

1 数据格式转换

Wider Face数据格式转YOLO数据格式可以参考我之前写的一篇博客:

https://blog.csdn.net/qq_38964360/article/details/128712287?spm=1001.2014.3001.5502

2 修改相关配置文件

首先是模型配置文件'ultralytics/models/v8/yolov8n.yaml',因为人脸检测是单目标检测,因此该配置文件里的nc应该改成1,部分代码如下:

# Ultralytics YOLO 🚀, GPL-3.0 license

# Parameters
nc: 1  # number of classes
depth_multiple: 0.33  # scales module repeats
width_multiple: 0.25  # scales convolution channels

随后仿照 'yolov8/ultralytics/yolo/data/datasets/coco128.yaml' 文件,新建 'yolov8/ultralytics/yolo/data/datasets/wider_face.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: /kaxier01/projects/FAS/yolov8/datasets/wider_face  # dataset root dir
train: images/train  # train images (relative to 'path') 12876 images
val: images/val  # val images (relative to 'path') 3226 images
test:  # test images (optional)

# Classes
names:
  0: face

# Download script/URL (optional)
download:

数据集文件目录如下(images以及labels均由步骤1生成):

最后修改 'yolov8/ultralytics/yolo/configs/default.yaml' 文件中的参数,如:batch size、device、lr、损失权重等,代码如下:

# Ultralytics YOLO 🚀, GPL-3.0 license
# Default training settings and hyperparameters for medium-augmentation COCO training

task: "detect" # choices=['detect', 'segment', 'classify', 'init'] # init is a special case. Specify task to run.
mode: "train" # choices=['train', 'val', 'predict'] # mode to run task in.

# Train settings -------------------------------------------------------------------------------------------------------
model: null # i.e. yolov8n.pt, yolov8n.yaml. Path to model file
data: null # i.e. coco128.yaml. Path to data file
epochs: 300 # number of epochs to train for
patience: 50  # TODO: epochs to wait for no observable improvement for early stopping of training
batch: 32 # number of images per batch
imgsz: 640 # size of input images
save: True # save checkpoints
cache: False # True/ram, disk or False. Use cache for data loading
device: 0,1,2,3 # cuda device, i.e. 0 or 0,1,2,3 or cpu. Device to run on
workers: 16 # number of worker threads for data loading
project: null # project name
name: null # experiment name
exist_ok: False # whether to overwrite existing experiment
pretrained: False # whether to use a pretrained model
optimizer: 'SGD' # optimizer to use, choices=['SGD', 'Adam', 'AdamW', 'RMSProp']
verbose: False # whether to print verbose output
seed: 0 # random seed for reproducibility
deterministic: True # whether to enable deterministic mode
single_cls: True # train multi-class data as single-class
image_weights: False # use weighted image selection for training
rect: False # support rectangular training
cos_lr: False # use cosine learning rate scheduler
close_mosaic: 10 # disable mosaic augmentation for final 10 epochs
resume: False # resume training from last checkpoint
# Segmentation
overlap_mask: True # masks should overlap during training
mask_ratio: 4 # mask downsample ratio
# Classification
dropout: 0.0  # use dropout regularization

# Val/Test settings ----------------------------------------------------------------------------------------------------
val: True # validate/test during training
save_json: False # save results to JSON file
save_hybrid: False # save hybrid version of labels (labels + additional predictions)
conf: null # object confidence threshold for detection (default 0.25 predict, 0.001 val)
iou: 0.7 # intersection over union (IoU) threshold for NMS
max_det: 300 # maximum number of detections per image
half: False # use half precision (FP16)
dnn: False # use OpenCV DNN for ONNX inference
plots: True # show plots during training

# Prediction settings --------------------------------------------------------------------------------------------------
source: null # source directory for images or videos
show: False # show results if possible
save_txt: False # save results as .txt file
save_conf: False # save results with confidence scores
save_crop: False # save cropped images with results
hide_labels: False # hide labels
hide_conf: False # hide confidence scores
vid_stride: 1 # video frame-rate stride
line_thickness: 3 # bounding box thickness (pixels)
visualize: False # visualize results
augment: False # apply data augmentation to images
agnostic_nms: False # class-agnostic NMS
retina_masks: False # use retina masks for object detection

# Export settings ------------------------------------------------------------------------------------------------------
format: torchscript # format to export to
keras: False  # use Keras
optimize: False  # TorchScript: optimize for mobile
int8: False  # CoreML/TF INT8 quantization
dynamic: False  # ONNX/TF/TensorRT: dynamic axes
simplify: False  # ONNX: simplify model
opset: 17  # ONNX: opset version
workspace: 4  # TensorRT: workspace size (GB)
nms: False  # CoreML: add NMS

# Hyperparameters ------------------------------------------------------------------------------------------------------
lr0: 0.02  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 7.5  # box loss gain
cls: 0.5  # cls loss gain (scale with pixels)
dfl: 1.5  # dfl loss gain
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
label_smoothing: 0.0
nbs: 64  # nominal batch size
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.5  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.0  # image mixup (probability)
copy_paste: 0.0  # segment copy-paste (probability)

# Hydra configs --------------------------------------------------------------------------------------------------------
cfg: null # for overriding defaults.yaml
hydra:
  output_subdir: null  # disable hydra directory creation
  run:
    dir: .

# Debug, do not modify -------------------------------------------------------------------------------------------------
v5loader: False  # use legacy YOLOv5 dataloader

3 训练及验证

参考源码中的README.md 文件,安装相关依赖库,

pip install ultralytics

模型的训练、验证及预测都有两种实现方式:

1)使用Command Line Interface (CLI)。指令如下:

# 单卡训练
yolo task=detect mode=train model=yolov8n.pt data=coco128.yaml device=0
# 多卡训练
yolo task=detect mode=train model=yolov8n.pt data=coco128.yaml device=\'0,1,2,3\'

# Syntax
yolo task=detect    mode=train    model=yolov8n.yaml      args...
          classify       predict        yolov8n-cls.yaml  args...
          segment        val            yolov8n-seg.yaml  args...
                         export         yolov8n.pt        format=onnx  args...

2)使用Python。新建一个脚本,代码如下:

# filename: python_example.py
# dir: yolov8/python_example.py
from ultralytics import YOLO


## 以下模型初始化指令选一个就行
model = YOLO("yolov8/ultralytics/models/v8/yolov8n.yaml")  # 从头开始训练
model = YOLO("yolov8/weights/yolov8n.pt")  # 或者加载预训练好的模型

# 模型训练
results = model.train(data="yolov8/ultralytics/yolo/data/datasets/wider_face.yaml", epochs=300)

# 模型验证
results = model.val()

# 模型导出
success = model.export(format="onnx")

使用以下指令便可多卡训练模型(我这里用了4卡训练,把default.yaml的device值改为0,1,2,3):

python -m torch.distributed.launch --nproc_per_node 4 --master_port 9527 yolov8/python_example.py

数据集加载相关文件:'yolov8/ultralytics/yolo/data/dataloaders/v5loader.py'

数据增强相关文件:'yolov8/ultralytics/yolo/data/dataloaders/v5augmentations.py'

模型定义相关文件:'yolov8/ultralytics/yolo/engine/model.py'

模型训练相关文件:'yolov8/ultralytics/yolo/engine/trainer.py'

模型训练过程

模型验证过程

测试结果

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
据引用所述,yolov8是一个目标检测模型,它可以用于框出整个人。然而,要想实现人脸识别,需要在yolov8的基础上进行进一步的训练。为了训练一个yolov8模型来实现人脸识别,可以采用以下步骤: 1. 数据收集:从开源人脸数据集(如celeba或wideface)中获取训练所需的人脸图像数据。 2. 训练模型:使用yolov8模型的训练详解进行具体的训练过程。这一步骤包括数据预处理、模型配置、模型训练和模型评估等。 3. 人脸框出:在经过训练的yolov8模型的基础上,使用相应的算法或技术来框出人脸。由于yolov8模型是用来检测整个物体的,所以需要根据实际需求对模型进行修改或扩展,以便能够精确框出人脸。 综上所述,要实现yolov8人脸识别,需要先训练一个yolov8模型,并在此基础上进行进一步的修改和调整,以框出人脸。具体的训练步骤和算法调整可以参考引用提供的yolov5训练详解和官方源码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [yolov5人脸识别(yolov5-facenet-svm)](https://blog.csdn.net/qq_41334243/article/details/107425492)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [YOLOv8 深度解析!一文看懂,快速上手实操(附实践代码)](https://blog.csdn.net/gzq0723/article/details/130652377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Wider Face+YOLOV8人脸检测](https://blog.csdn.net/qq_38964360/article/details/128728145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chen_znn

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值