现在是大三的下学期,已经到了四月份,最近在搞一个华为云的“揭榜挂帅”挑战杯的项目。

项目的初赛阶段是用model arts(华为云的一个ai开发平台)去做一个云端的疲劳/分神检测的算法包,并且部署到ai平台上。最终由平台给出测试,检验模型所需时长和模型精度,最终给出排名。

可以说是从零开始接触这个计算机视觉方面的比赛,很久之前想过做一款家用的全方位检测机器,用于家人的体检,室内安全和一个c9的同学探讨过,如何去检查出有人摔倒,比如说老人在家里摔倒了。我的想法是有一个老年人手环,上面有一个功能模块就是测试加速度和压力,当摔倒时可能会触发这个从而发出报警。我的同学有过计算机视觉方面的知识,从中第一次接触到了目标检测这个视觉技术,从而引发了我对计算机视觉方面的深入的兴趣。

可以说,整个过程异常的艰难,没有人领进门。完全是摸瞎的走路。先从GitHub上搜了很多疲劳驾驶的检测模型,一开始我认为整个过程应该是会用到一些算法,比如说人的眼睛,这个是怎么识别出来的,后来知道了dlib关键点这个现成的包,不用我们再去想很多很难做到的算法。再随着深入,我发现,这个识别系统,它是基于一个模型,是一个由机器学习训练出来的模型,恰好我们的一门新开的课程叫机器学习在量化金融的应用第一次接触到了线性模型,那么这个图片的训练同样是基于这一流程:

首先我们需要准备数据集,然后对数据集进行切分,切成训练集,测试集,验证集。一般来说,训练集的量要大,测试集顾名思义是看模型是否正确,验证集则是去检验模型的精度。

然后就是训练模型了。一开始这个地方死活入不了手,因为这里有岔路口,监督学习还是无监督学习。一开始傻乎乎的认为直接把图片(数据)让机器去学习,后来了解到标注,那么标注就是监督的一个过程。这次比赛官方也要求的是监督学习,精度高。

岔路口又来了,有的数据得预处理有的没有这一步,最后我们才发现,主流的两个训练方法,yolo是不需要预训练,FasterRcnn这个需要,而且发现官方文档最后也是用yolov7来做的。

在本地,我学着使用yolov5里的yolos模型,精度和速度居中。这个下篇文章再做介绍。

官方文档的分析从这里开始: 《yolov7人脸+手机检测模型训练》

文章链接:yolov7人脸+手机检测模型训练 (huaweicloud.com)

本案例代码基于yolov7,实现人脸+手机识别。

注意:本案例必须使用GPU运行,请查看《ModelArts JupyterLab 硬件规格使用指南》了解切换硬件规格的方法

拉取代码、配置环境

1.拉取代码

import moxing as mox
mox.file.copy_parallel('obs://obs-aigallery-zc/clf/code/yolov7', 'yolov7')

注意

这段代码使用了华为云的ModelArts Open API工具箱中的mox工具,是将一个OBS桶(理解为数据库)中的yolov7代码目录复制到当前的工作目录下的yolov7文件夹中。(yolo这是git上主流的一个机器学习框架之前有提到过,后面的训练工作就在这个文件夹里做修改就行)

具体来说,'obs://obs-aigallery-zc/clf/code/yolov7'是源路径,指的是华为云上名为obs-aigallery-zc的桶(公共的数据库)下面的clf/code/yolov7目录;'yolov7'是目标路径,表示当前的工作目录下的yolov7文件夹。(我是在华为云notebook这个类似与jupyter的环境下运行的,因此当我执行完之后会在根目录下出现一个名为yolov7的文件夹)

2.使用

%cd yolov7

给大家看看里面有什么:

值得一提:(可以忽略)

在Jupyter Notebook或IPython环境中,以百分号(%)开头的命令被称为“魔法命令”(magic command)。这些命令扩展了IPython的功能,并且仅在IPython内核中有效。魔法命令可用于处理文件、计时代码执行时间、运行外部脚本、调试等。常用的魔法命令包括:

  • %run: 运行脚本文件
  • %timeit: 测量代码执行时间
  • %load: 载入外部代码到notebook
  • %debug: 进入调试模式
  • %matplotlib: 配置matplotlib库

可以通过在Notebook中输入 %lsmagic 命令查看可用的魔法命令列表。

3.下载依赖项

!pip install -r requirements.txt

依赖项还挺多:

主要用到了opencv(一个计算机视觉常用的库)和pytorch(机器学习的框架,与tensflow类型一样)的一些内容

查看数据集

# 导入所需的库
import random
import cv2
import numpy as np
from  matplotlib import pyplot as plt
%matplotlib inline#%matplotlib inline 是Jupyter Notebook的一个魔法命令,用于在Jupyter Notebook里显示matplotlib绘制的图像。# 读取训练数据的路径
with open("datasets/Fatigue_driving_detection/train.txt", "r") as f:img_paths = f.readlines()# 随机选择8张图片
img_paths = random.sample(img_paths, 8)
img_lists = []# 循环处理每张图片
for img_path in img_paths:img_path = img_path.strip()  # 去除路径中的空格img = cv2.imread(img_path)  # 读取图片h, w, _ = img.shape  # 获取图片的高度和宽度tl = round(0.002 * (h + w) / 2) + 1  # 线条的宽度color = [random.randint(0, 255) for _ in range(3)]  # 随机生成颜色if img_path.endswith('.png'):with open(img_path.replace("images", "txt_labels").replace(".png", ".txt")) as f:labels = f.readlines()  # 读取对应的标签文件if img_path.endswith('.jpeg'):with open(img_path.replace("images", "txt_labels").replace(".jpeg", ".txt")) as f:labels = f.readlines()# 循环处理每个标签for label in labels:l, x, y, wc, hc = [float(x) for x in label.strip().split()]  # 解析标签内容# 画矩形框
#代码中使用了标记数据时的框信息。具体来说,代码通过读取每个图像对应的标签文件(txt_labels)中的框信息,然后将框绘制到图像上,形成物体检测框。
#每个标签文件中可能包含多个框,因此代码通过循环遍历每个标签中的框信息,依次将每个框绘制到对应的图像上。cv2.rectangle(img, (int((x - wc / 2) * w), int((y - hc / 2) * h)), (int((x + wc / 2) * w), int((y + hc / 2) * h)), color, thickness=tl, lineType=cv2.LINE_AA)img_lists.append(cv2.resize(img, (1280, 720)))  # 将处理后的图片加入到列表中# 将所有图片拼接在一起
image = np.concatenate([np.concatenate(img_lists[:4], axis=1), np.concatenate(img_lists[4:], axis=1)], axis=0)# 设置图像大小并显示图像
plt.rcParams["figure.figsize"] = (20, 10)
plt.imshow(image[:,:,::-1])
plt.show()

这一步工作我认为在训练我自己的模型时可以不做改动,它仅供一个检查数据路径和检验标注数据的正确性的功能。

数据增强

%pycat data/hyp.scratch.tiny.yaml

做出解释:

在使用YOLOv7进行目标检测模型训练时,数据增强策略可以在训练配置文件中进行设置。在本段代码中,使用的是yolov7/data/hyp.scratch.tiny.yaml配置文件,该文件中包含了一些数据增强的参数设置,例如:

  • flip_ud:上下翻转的概率
  • hsv_h:H通道色调偏移的最大值
  • hsv_s:S通道饱和度偏移的最大值
  • shear:剪切的最大值

通过这些参数的设置,可以增加训练数据的多样性,提高模型的泛化能力。在代码中,对标注数据中的每个目标,根据目标的坐标信息,使用cv2.rectangle函数绘制对应的检测框。

我认为这个板块也可以不做修改。

查看增强后的图片数据:

import yaml
import argparse
import torch
from utils.datasets import create_dataloader
from utils.general import colorstr
from utils.plots import plot_images
%matplotlib inlineparser = argparse.ArgumentParser()
parser.add_argument('--data', type=str, default="data/coco.yaml", help='*.data path')
parser.add_argument('--hyp', type=str, default="data/hyp.scratch.tiny.yaml")
parser.add_argument('--batch-size', type=int, default=16, help='size of each image batch')
parser.add_argument('--gs', type=int, default=32)
parser.add_argument('--img-size', type=int, default=320, help='inference size (pixels)')
parser.add_argument('--task', default='train', help='train, val, test, speed or study')
parser.add_argument('--single-cls', action='store_true', help='treat as single-class dataset')
opt = parser.parse_args(args=['--task', 'train'])
print(opt)with open(opt.data) as f:data = yaml.load(f, Loader=yaml.SafeLoader)with open(opt.hyp) as f:hyp = yaml.load(f, Loader=yaml.SafeLoader)dataloader = create_dataloader(data[opt.task], opt.img_size, opt.batch_size, opt.gs, opt, hyp=hyp, augment=True, pad=0.5, rect=True, prefix=colorstr(f'{opt.task}: '))[0]for img, targets, paths, shapes in dataloader:nb, _, height, width = img.shapetargets[:, 2:] *= torch.Tensor([width, height, width, height])result = plot_images(img, targets)breakplt.rcParams["figure.figsize"] = (20, 10)
plt.imshow(result)
plt.show()

这段代码的作用是加载训练数据,并对其中一批数据进行可视化。具体实现步骤如下:

  1. 使用 argparse 库创建一个解析器,并添加一些命令行参数,比如 '--data'、'--hyp'、'--batch-size'、'--gs'、'--img-size'、'--task' 和 '--single-cls',并默认设置一些参数值。
  2. 使用解析器解析命令行参数,并将解析结果存储在 opt 变量中。
  3. 打印 opt 变量,以便查看解析结果。
  4. 使用 yaml 库加载数据集信息文件和训练超参数文件,并将加载结果存储在 data 和 hyp 变量中。
  5. 调用 create_dataloader 函数创建数据加载器,并传入数据集信息、图片大小、批量大小、图像缩放因子、opt、超参数、数据增强等参数。
  6. 遍历数据加载器,获取一批数据。
  7. 将图像和标注框的坐标值转换为可视化的格式,然后使用 plot_images 函数将图像和标注框可视化。
  8. 将可视化结果展示在图像上,并使用 plt.show() 函数显示图像

需要调整的地方暂时不清楚

训练模型

from utils.autoanchor import kmean_anchors
kmean_anchors(path='data/coco.yaml', n=9, img_size=320, thr=4.0, gen=1000, verbose=False)

YOLOv7是anchor-based的方法,它需要预定义一组anchor boxes,用于预测不同尺度和纵横比的目标框。在YOLOv7中,anchor boxes是通过使用KMeans聚类算法自动计算的。

计算anchor boxes的函数在utils/autoanchor.py中提供。它使用KMeans聚类算法从一组ground-truth目标框中自动计算anchor boxes。该函数将返回一组anchor boxes,这些anchor boxes的大小和纵横比与ground-truth目标框相似,从而提高了模型的准确性。

可以理解为,在 YOLOv7 中,anchor 的选择和调整对于检测性能非常重要。

这也反映出目标检测领域中 anchor-based 方法的重要性。anchor-based 方法是指在网络训练前需要先确定一些先验框(即 anchor),并且这些先验框需要与真实目标框匹配。anchor-based 方法通常包含两个步骤:1)先生成一些 anchor,2)在训练中通过匹配算法学习如何调整这些 anchor 来更好地适应数据集。

相对于 anchor-free 方法,anchor-based 方法通常具有更高的精度,但需要额外的计算来生成 anchor 并调整其位置和大小。因此,根据任务和数据集的不同,我们需要选择最合适的方法和技术,以达到最优的性能。

当从头开始训练模型时,如果数据集和业务场景与预训练模型的数据集和场景有较大差异,就可能需要重新计算 anchor,使其更适配新的数据集和业务场景。这样可以帮助模型更快地收敛,提高检测性能。

查看模型配置文件

%pycat cfg/lite/yolov7-tiny.yaml

我们看到了anchors的候选值

我们可以构建模型,查看模型flopsparams参数:

from models.yolo import Model
import thopmodel = Model("cfg/lite/yolov7-tiny.yaml", ch=3, nc=2, anchors=hyp.get('anchors'))
inputs = torch.randn(1, 3, 288, 352)
flops, params = thop.profile(model, inputs=(inputs,))
print('flops:', flops / 900000000 * 2)
print('params:', params)

查看模型的flops和params参数可以帮助我们估算模型的计算量和内存消耗,这对于选择合适的硬件设备以及进行模型压缩和优化都非常重要。如果模型计算量太大或者内存占用过高,可能会导致训练或者推理速度慢,或者在低端设备上无法运行。因此,在进行模型设计和优化时,需要充分考虑模型的flops和params参数。

训练结束,可以看到outputs文件夹下保存了训练结果,加载best.pt查看推理结果:

!python detect.py --weights outputs/c-32029/weights/best.pt --source images --img-size 640 --device 0 --name c-32029 --no-trace

文件路径

结果展示:

import cv2
from  matplotlib import pyplot as plt
%matplotlib inlineimg = cv2.imread("runs/detect/c-32029/day_man_001_30_1_176.png")
plt.imshow(img[:,:,::-1])
plt.show()

因此,yolo的训练部分就到此结束,流程为:

yolov7版本的文件夹安装,相关依赖型的安装,数据集的存放和路径对应,数据增强,训练模型,微调(通过调整anchor,查看flops,params),查看结果。

分析《 yolov7人脸+手机检测模型训练》相关推荐

  1. Tensorflow2实现人脸关键点检测算法PFLD——一个精度高,速度快,模型小的人脸关键点检测模型

    1. 前言 最近,学了人脸关键点检测算法,发现一个比较好的人脸关键点检测模型,打算学一学,让我们来看看算法是如何实现的吧! 论文地址:https://arxiv.org/pdf/1902.10859. ...

  2. YOLOV3目标检测模型训练实例

    YOLOV3目标检测 从零开始学习使用keras-yolov3进行图片的目标检测,比较详细地记录了准备以及训练过程,提供一个信号灯的目标检测模型训练实例,并提供相关代码与训练集. DEMO测试 YOL ...

  3. 车牌检测模型训练(含源码和数据集)

    车牌检测模型训练(含源码和数据集) 本教程利用NVIDIA TAO进行车牌检测模型的训练: 模型框架:SSD 数据集: CRPD, 连接:https://github.com/yxgong0/CRPD ...

  4. Metis异常检测模型训练源码深入刨析

    Metis异常检测模型训练源码深入刨析 模型训练 数据集说明 process_train 方法(detect_service.py) __generate_model方法(detect_service ...

  5. python opencv生成tf模型_基于TensorFlow+ Opencv 的人脸识别 和模型训练

    一.准备工作 本次实例的anaconda 环境 (有需要的自己导入anaconda) 链接:https://pan.baidu.com/s/1IVt2ap-NYdg64uHSh-viaA 提取码:g7 ...

  6. Tensorflow + OpenCV4 安全帽检测模型训练与推理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 开发环境 软件版本信息: Windows10 64位 Tensor ...

  7. 基于Yolov5的烟火检测——模型训练与C++实现部署

    前言 1.系统环境是win10,显卡RTX3080;cuda10.2,cudnn7.1;OpenCV4.5;yolov5用的是5s的模型,2020年8月13日的发布v3.0这个版本; ncnn版本是2 ...

  8. java opennlp_OpenNLP中语言检测模型训练和模型的使用

    因为项目的原因,需要使用到NLP的相关技术.语言检测模型cld3是python要与项目集成也不太方便,后来找到OpenNLP,发现它相对来说,对于亚洲的语言有一些支持. 下面是OpenNLP的训练相关 ...

  9. Qt5.7+Opencv2.4.9人脸识别(四)模型训练

    [注意]本博文的档次适合OpenCV初学者,和要做本科生毕业设计这类档次. 源码的下载地址和原理理论部分请走下面连接 http://blog.csdn.net/qq78442761/article/d ...

最新文章

  1. mahout相关笔记
  2. 小程序中点击input控件键盘弹出时placeholder文字上移
  3. 硕博就业:引进博士40万;硕士20万;本科15万
  4. 多个线程访问共享对象和数据的方式
  5. 用ironpython驱动你的计算公式
  6. C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
  7. wikioi 1017--乘积最大
  8. C++算法一些常用的stl函数
  9. 吴恩达机器学习(十四)推荐系统(基于梯度下降的协同过滤算法)
  10. 数字信号处理5:FIR滤波器设计
  11. 使用Autodesk Vault插件向导轻松创建Vault插件
  12. 计算机视觉的专家和网站
  13. 创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型
  14. 波士顿大学 计算机专业,波士顿大学计算机科学专业波士顿大学计算机科学专业.pdf...
  15. java 矩阵求逆_详解用java描述矩阵求逆的算法
  16. web网页设计期末课程大作业——简单的学生网页作业源码 基于HTML仿唯品会电商项目的设计与实现
  17. 两个方法做APP界面展示图片
  18. VS Code 必须要安装的插件(超详细)
  19. git commit 规范及 changelog
  20. Pycharm专业版下载、安装、与Anaconda配置、中文化及字体设置、Cracking(自行翻译)方法

热门文章

  1. 不可抗力条款_否则,如果条款
  2. C语言 ~ 取反操作
  3. 数据库中的参照完整性(Foreign Key)
  4. 运放中不使用引脚正确处理方式
  5. 个人微信机器人开发,微信IPAD协议
  6. 套现15亿的摩拜创始人胡玮炜,后来怎么样了?
  7. 性能优化还不会?吃掉这五个类别,摆平性能优化~
  8. 通过git的方式使用SVN(附原SVN命令)
  9. 美丽的清晨,美好的开始
  10. 什么是外汇跟单?外汇MT4自动跟单系统靠谱吗?