Wider Face+YOLOV8人脸检测

news2024/12/26 13:47:11

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'

模型训练过程

模型验证过程

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java -- 14 多态、内部类、常用API

自动类型转换:多态下引用数据类型的类型转换强制类型转换案例:定义usb接口:定义鼠标和键盘的usb实现类,并有自己特有的方法,重写usb接口的方法,里面穿插了多态创建电脑类,把usb接口揉和进去&…

如何改变视频的MD5值?一分钟让你学会操作

肯定很多不是从事自媒体的朋友对MD5不是很熟悉,但其实它类似于人的身份证,只不过我们的身份证是一串数字,而它则是视频的后台编码,所以这也是一些平台用MD5来判断视频是否重复的依据。那么有人会问了,既然MD5这么特殊&…

Java实战:使用Hutool中的MailUtil实现邮件的发送

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️荣誉: CSDN博客专家、数据库优质创作者🏆&…

EasyExcel的导入导出使用

1、说明 EasyExcel是阿里出的一款基于Java的、快速、简洁、解决大文件内存溢出的处理Excel的开源工具,本文主要是使用这个工具对Excel导入导出进行讲解。 官网: https://easyexcel.opensource.alibaba.com/github: https://github.com/alib…

达梦主备之备库失联后在线恢复加入集群

一、主库故障重启(备库接管前重启) 主库故障后立即重启,此时主库的守护进程变成 Startup 状态,重新进入守护进程的 启动流程,将数据一致的备库归档设置为有效状态,其余备库归档设置成无效状态,并…

一些工具软件的使用

文章目录010 Editor设置16进制编辑时每行显示的字节数使用列模式编辑VS Code基础操作定义快捷键配置导出/导入列模式将文件中的tab键转换为空格关闭插件自动更新博文链接Beyond Compare文件内容相同依然显示差异过滤文件或文件夹Excel使用组合,进行行、列的折叠使用…

【DX-BT24蓝牙模块-AT命令与手机透传教程】

【DX-BT24蓝牙模块-AT命令与手机透传教程】1. 前言1.1.串口基本参数1.2.AT命令模式和透传模式1.3.模块数据吞吐量2. 接线2.1 模块线序定义2.2 相关AT命令详解2.2.1 命令格式说明2.2.2 回应格式说明2.2.3 AT命令举例说明3. AT命令详解3.1 基础指令3.2 AT指令测试3.3 手机测试4. …

英华特在创业板提交注册:拟募资约5亿元,股权结构较为分散

近日,苏州英华特涡旋技术股份有限公司(下称“英华特”)在上海证券交易所递交注册。据贝多财经了解,英华特的上市申请于2021年6月30日获得受理,2022年8月25日获得创业板上市委会议通过。 本次冲刺上市,英华特…

智合同丨你还在为填写合同台账犯愁吗?

最近有朋友问我有没有什么智能化手段处理合同台账问题?对方表示合同台账管理实在是太麻烦了,工作量大,占用时间多。答案肯定是有的,那么首先我们来了解下合同台账。合同台账一般指合同台帐,包括合同登记台帐、合同检查…

Solidity 中的数学(第 1 部分:数字)

本文开启了一系列关于在 Solidity 中进行数学运算的文章。第一个要讨论的话题是:数字。 介绍 以太坊是一个可编程的区块链,其功能可以通过将称为智能合约的可执行代码片段发布到区块链本身来扩展。这将以太坊与第一代区块链区分开来,在第一代…

PointNet.pytorch点云三维深度学习论文与代码复现

PointNet.pytorch1. 概要1.1 文章1.2 点云和三维深度学习,PointNet 网络结构1.3 复现说明2. 代码2.1 代码逻辑2.2 思路详解3. 解析组会2023.1.18远程arcivdailyonedb1. 概要 1.1 文章 链接: 论文 1.2 点云和三维深度学习,PointNet 网络结构 链接: 三…

程序员必备素质:代码整洁之道

本次分享的内容是《代码整洁之道》,书中是以现实案例,以讲故事形式来总结归纳问题,并给出解决方案,很容易与我们产生共鸣。文中会有大量书中内容摘抄,都是个人认为很值得分享的内容。当然,也会有个人感悟&a…

【C++】从0到1入门C++编程学习笔记 - 基础入门篇:C++初识

文章目录一、第一个C程序1.1 创建项目1.2 创建文件1.3 编写代码1.4 运行程序二、注释三、变量四、常量五、关键字六、标识符命名规则一、第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1.1 创建项目 Visual Studio是我们用来编写C程序的主要…

【C语言课程设计】通讯录(2.0版本)

前言 在前面的博客中,我们已经了解了通讯录的基本写法。当然那个通讯录是不够完善的。我们本小节对前面的通讯录做一次小升级,添加动态增容模块与利用枚举来优化选择语句 【C语言课程设计】通讯录(1.0版本)_青色_忘川的博客-CSDN博…

JVM-内存模型详解

JVM 把内存分为若干个不同的区域,这些区域有些是线程私有的,有些则是线程共享的,Java 内存区域也叫做运行时数据区,它的具体划分如下: 虚拟机栈 Java 虚拟机栈是线程私有的数据区,Java 虚拟机栈的生命周期…

word查看技巧:如何快速找到文档的修改痕迹

不知道大家在工作中有没有遇到过这类的工作场景:当初步拟好一份合作协议或是项目策划书后,发给老板或其他同事审阅和修订,通常会不断地来回修改文档。此时,如果你想要查看文档哪里被修改过?你会怎么操作?很…

SpringBoot集成Elasticsearch7.4 实战(二)

1、前言本篇文章主要讲的是:在Springboot环境下,利用JAVA环境操作索引,集成SpringBoot等相关知识2. SpringBoot集成开发工具,这里选择的是IDEA 2019.2,构建Maven工程等一堆通用操作,不清楚的自行百度。2.1. POM配置我这边选择 ela…

协程应用——aiohttp异步爬虫实战

aiohttp异步爬虫实战1. 案例介绍2. 准备工作3. 页面分析4. 实现思路5. 基本配置6. 爬取列表页7. 爬取详情页8. 总结1. 案例介绍 本例要爬取的网站是https://spa5.scrape.center/,数据量相对大,所以用到了异步爬虫,主要学习这种方法是如何提高效率的。网…

Maven学习(三):纯手撸一个Maven项目

纯手撸一个Maven项目一、创建Maven工程目录二、Maven项目构建命令三、插件创建工程1、创建java工程2、创建web工程3、对比java工程和web工程区别一、创建Maven工程目录 按照下图所示的结构创建项目所需文件夹: 在Demo.java文件内输入以下代码: package…

数据库被勒索删除,解决方法

突然数据库被黑了,有一条勒索信息: To recover your lost Database send 0.018 Bitcoin (BTC) to our Bitcoin address: bc1qe4yefrptv2k8shawu3h84j0n8kyvxfk4wwate5 After this, contact us by email with your Server IP or Domain Name and a Proof of Payment …