MATLAB开发口罩佩戴检测

python mtnn 口罩检测 该项目主要是使用mtcnn网络检测到人脸,然后将人脸截取训练进而判断是否戴口罩。下载完以后只需要运行这个文件即可。 阅读详情

MATLAB开发口罩佩戴检测

一 题目背景

1.1 实验介绍

今年一场席卷全球的新型冠状病毒给人们带来了沉重的生命财产的损失。有效防御这种传染病毒的方法就是积极佩戴口罩。我国对此也采取了严肃的措施,在公共场合要求人们必须佩戴口罩。在本次实验中,我们要建立一个目标检测的模型,可以识别图中的人是否佩戴了口罩。

1.2 实验要求

建立深度学习模型,检测出图中的人是否佩戴了口罩,并将其尽可能调整到最佳状态。

学习经典的模型MTCNN和MobileNet的结构。

学习训练时的方法。

1.3 实验环境

实验使用重要MATLAB包:

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping

由于担心平台GPU时长不够用,所以在自己电脑上搭建了配套实验环境,由于电脑显卡CUDA版本较老,所以最终本地配置如下:

MATLAB:3.8

1.4 实验思路

针对目标检测的任务,可以分为两个部分:目标识别和位置检测。通常情况下,特征提取需要由特有的特征提取神经网络来完成,如 VGG、MobileNet、ResNet 等,这些特征提取网络往往被称为 Backbone 。而在 BackBone 后面接全连接层***(FC)***就可以执行分类任务。但 ***FC*** 对目标的位置识别乏力。经过算法的发展,当前主要以特定的功能网络来代替 ***FC*** 的作用,如 ***Mask-Rcnn、SSD、YOLO*** 等。我们选择充分使用已有的人脸检测的模型,再训练一个识别口罩的模型,从而提高训练的开支、增强模型的准确率。

常规目标检测:

本次案例:

图1 实验口罩佩戴检测流程

二 实验内容

2.1 已知文件与数据集

首先,导入已经写好的MATLAB文件并对数据集进行处理。

  • image 文件夹:图片分成两类,戴口罩的和没有戴口罩的
  • train.txt: 存放的是image文件夹下对应图片的标签
  • keras_model_data文件夹:存放keras框架相关预训练好的模型

2.2 图片尺寸调整

将图片尺寸调整到网络输入的图片尺寸

2.3 制作训练时需要用到的批量数据集

图片生成器的主要方法:

  • fit(x, augment=False, rounds=1):计算依赖于数据的变换所需要的统计信息(均值方差等)。
  • flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png'):接收Numpy数组和标签为参数,生成经过数据提升或标准化后的batch数据,并在一个无限循环中不断的返回batch数据。
  • flow_from_directory(directory): 以文件夹路径为参数,会从路径推测label,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据。

结果:

Found 693 images belonging to 2 classes.

Found 76 images belonging to 2 classes.

{'mask': 0, 'nomask': 1}

{0: 'mask', 1: 'nomask'}

2.4 调用MTCNN

通过搭建 MTCNN 网络实现人脸检测

  • keras_py/mtcnn.py文件是在搭建MTCNN网络。
  • keras_py/face_rec.py文件是在绘制人脸检测的矩形框。
    这里直接使用现有的表现较好的MTCNN的三个权重文件,它们已经保存在datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data文件夹下

2.5 加载预训练模型MobileNet

# 加载 MobileNet 的预训练模型权重

weights_path = basic_path + 'keras_model_data/mobilenet_1_0_224_tf_no_top.h5'

2.6 训练模型

2.6.1 加载和保存

为了避免训练过程中遇到断电等突发事件,导致模型训练成果无法保存。我们可以通过 ModelCheckpoint 规定在固定迭代次数后保存模型。同时,我们设置在下一次重启训练时,会检查是否有上次训练好的模型,如果有,就先加载已有的模型权重。这样就可以在上次训练的基础上继续模型的训练了。

2.6.2 手动调整学习率

学习率的手动设置可以使模型训练更加高效。这里我们设置当模型在三轮迭代后,准确率没有上升,就调整学习率。

# 学习率下降的方式,acc三次不下降就下降学习率继续训练

reduce_lr = ReduceLROnPlateau(

                        monitor='accuracy',  # 检测的指标

                        factor=0.5,     # 当acc不下降时将学习率下调的比例

                        patience=3,     # 检测轮数是每隔三轮

                        verbose=2       # 信息展示模式

                    )

2.6.3 早停法

当我们训练深度学习神经网络的时候通常希望能获得最好的泛化性能。但是所有的标准深度学习神经网络结构如全连接多层感知机都很容易过拟合。当网络在训练集上表现越来越好,错误率越来越低的时候,就极有可能出现了过拟合。早停法就是当我们在检测到这一趋势后,就停止训练,这样能避免继续训练导致过拟合的问题。

early_stopping = EarlyStopping(

                            monitor='val_accuracy',  # 检测的指标

                            min_delta=0.0001,         # 增大或减小的阈值

                            patience=3,         # 检测的轮数频率

                            verbose=1            # 信息展示的模式

                        )

2.6.4 乱序训练数据

打乱txt的行,这个txt主要用于帮助读取数据来训练,打乱的数据更有利于训练。

np.random.seed(10101)

    np.random.shuffle(lines)

    np.random.seed(None)

2.6.5 训练模型

一次训练集大小设定为64,优化器使用Adam,初始学习率设定为0.001,优化目标为accuracy,总的学习轮次设定为20轮。(通过多次实验测定,在这些参数条件下,准确率较高)

# 一次的训练集大小

batch_size = 64

# 编译模型

model.compile(loss='binary_crossentropy',  # 二分类损失函数   

              optimizer=Adam(lr=0.001),   # 优化器

              metrics=['accuracy'])        # 优化目标

# 训练模型

history = model.fit(train_generator,    

                    epochs=20, # epochs: 整数,数据的迭代总轮数。

                    # 一个epoch包含的步数,通常应该等于你的数据集的样本数量除以批量大小。

                    steps_per_epoch=637 // batch_size,

                    validation_data=test_generator,

                    validation_steps=70 // batch_size,

                    initial_epoch=0, # 整数。开始训练的轮次(有助于恢复之前的训练)。

                    callbacks=[checkpoint_period, reduce_lr])

三 算法描述

3.1 MTCNN

  • 三阶段的级联(cascaded)架构
  • coarse-to-fine 的方式
  • new online hard sample mining 策略
  • 同时进行人脸检测和人脸对齐
  • state-of-the-art 性能

图2 MTCNN架构

3.2 MobileNet

图3 MobileNet架构

MobileNet的网络结构如图3所示。首先是一个3x3的标准卷积,然后后面就是堆积depthwise separable convolution,并且可以看到其中的部分depthwise convolution会通过strides=2进行down sampling。然后采用average pooling将feature变成1x1,根据预测类别大小加上全连接层,最后是一个softmax层。

四 求解结果

最终确定最佳取值为batch_size=64,lr=0.0001,epochs=20,其它参数如下,连续训练两次,可以获得最佳结果。此处仅展示两个参数条件下的结果作为对比

# 一次的训练集大小

batch_size = 64

# 编译模型

model.compile(loss='binary_crossentropy',  # 二分类损失函数   

              optimizer=Adam(lr=0.001),   # 优化器

              metrics=['accuracy'])        # 优化目标

# 训练模型

history = model.fit(train_generator,    

                    epochs=20, # epochs: 整数,数据的迭代总轮数。

                    # 一个epoch包含的步数,通常应该等于你的数据集的样本数量除以批量大小。

                    steps_per_epoch=637 // batch_size,

                    validation_data=test_generator,

                    validation_steps=70 // batch_size,

                    initial_epoch=0, # 整数。开始训练的轮次(有助于恢复之前的训练)。

                    callbacks=[checkpoint_period, reduce_lr])

条件1:

取batch_size=48, lr=0.001,epochs=20,对训练之后的模型进行测试,得到结果如下:

图4 条件1 loss曲线

由loss曲线可以看出,随着训练迭代次数的加深,验证集上的损失在逐渐的减小,最终稳定在0.2左右;而在训练集上loss始终在0附近。

图5 条件1 acc曲线

从验证集和测试集的准确率变化曲线上可以看出,随着训练轮次的增加,验证集的准确率逐渐上升,最终稳定在96%左右,效果还是不错的。

图6 条件1 测试样例1

使用样例照片进行测试,首先人脸识别部分顺利识别到了五张人脸,但是口罩识别部分将一个没有带口罩的人识别成了带着口罩的人,说明还有进步空间,实际错误率达到了20%。

图7 条件1 测试样例2

另一张样例照片的测试结果同样是人脸识别部分没有出现问题,正确识别到了四张人脸,但是同样将一个没有带口罩的人识别成了带有口罩的人。

平台测试:

后续通过调整各项参数并打乱测试集和训练集图片顺序来进行了多次实验,最终确定的最佳状态如下:

条件2:

取batch_size=64, lr=0.0001,epochs=20,对训练之后的模型进行测试,得到结果如下:

图8 条件2 loss曲线

观察准确率曲线可以看出,在该条件下,验证集上的准确率最终稳定在98%附近,效果非常的好,说明我们做出的一些优化还是具有一定效果的。

图9 条件2 acc曲线

观察此条件下的loss曲线可以看到最终验证集的loss稳定在0.2左右,训练集的loss非常小,基本趋近于0

图10 条件2 测试样例1

使用两张测试样例对模型进行检测,第一张图片所有检测点均正确,正确识别出了五张人脸并且口罩佩戴检测均正确,识别正确率100%。

第二章测试样例上,正确识别出了4张人脸并且口罩佩戴检测结果均正确。

两张测试样例上所有检测点检测结果均正确,说明在此参数条件下,模型识别效果较好,达到了口罩佩戴检测的要求。

平台测试:

条件3:

使用更多测试样例发现MTCNN人脸识别部分存在不能正确识别人脸的问题,故通过多次实验和测试,修改了mask_rec()的门限函数权重self.threshold,由原来的self.threshold = [0.5,0.6,0.8] 修改为self.threshold = [0.4,0.15,0.65]

在本地使用更多自选图片进行测试,发现人脸识别准确率有所提升。在条件2训练参数不变的情况下,使用同一模型进行平台测试,结果如下:

平台测试成绩有所提升。

条件4:

继续调整mask_rec()的门限函数权重self.threshold,通过系统测试反馈来决定门限函数的权重,通过多次测试,由原来的self.threshold = [0.4,0.15,0.65] 修改为self.threshold = [0.4,0.6,0.65]

平台测试,结果如下:

平台测试成绩有所提升,达到95分。

为了达到条件4所展示的效果,对门限函数的数值进行了大量的尝试,根据提交测试的反馈结果,最终确定数值为条件4时,可以达到最优。由于不知道后台测试图片是什么且没有反馈数据,所以最终再次修改人脸识别的门限函数或者修改参数重新训练口罩识别模型依旧没有提升。

五 比较分析

验证集准确率

测试样例结果

平台成绩

条件1

96%

7/9

77.5

条件2

98%

9/9

88.33333334

条件3

98%

9/9

90

条件4

98%

9/9

95

最终通过不断调试与优化算法,得到了95分的平台成绩。

六 心得与感想

本次实验过程中主要使用了keras方法进行训练,由于初次使用这些方法,所以前期实现的过程相对困难。最初我想通过调用GPU资源来进行训练,所以给自己的电脑配套安装了tensorflow-gpu、CUDA等等配套的软件和包,由于个人电脑的显卡版本较老,所以安装的过程也是非常的曲折。好在最终安装好了所有的东西,但是由于显卡显存比较小,所以bath_size大小一直上不去,最大只能给到32,不过影响也不大。调整参数的过程花费了很多的时间,优化算法也花费了很多的时间。之后又对门限函数进行了修改,虽然过程非常的辛苦,但最终的结果还是很不错的,最终整体达到95分,在两张给定的测试样例上所有检测点都是正确的,由于不知道平台的五张检测照片是什么,所以不知道到底出错在哪里,希望之后平台可以反馈一些修改意见~。总的来说在过程中收获还是很大的,受益匪浅。

训练源代码:

import warnings

# 忽视警告

warnings.filterwarnings('ignore')

import os

import matplotlib

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping

from tensorflow.keras.applications.imagenet_utils import preprocess_input

from tensorflow.keras import backend as K

from tensorflow.keras.optimizers import Adam

K.image_data_format() == 'channels_last'

from keras_py.utils import get_random_data

from keras_py.face_rec import mask_rec

from keras_py.face_rec import face_rec

from keras_py.mobileNet import MobileNet

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 数据集路径

basic_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/"

def letterbox_image(image, size):  # 调整图片尺寸,返回经过调整的照片

    new_image = cv.resize(image, size, interpolation=cv.INTER_AREA)

    return new_image

read_img = cv.imread("test1.jpg")

print("调整前图片的尺寸:", read_img.shape)

read_img = letterbox_image(image=read_img, size=(50, 50))

print("调整前图片的尺寸:", read_img.shape)

def processing_data(data_path, height, width, batch_size=32, test_split=0.1):  # 数据处理,batch_size默认大小为32

    train_data = ImageDataGenerator(

            # 对图片的每个像素值均乘上这个放缩因子,把像素值放缩到0和1之间有利于模型的收敛

            rescale=1. / 255,  

            # 浮点数,剪切强度(逆时针方向的剪切变换角度)

            shear_range=0.1,  

            # 随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]

            zoom_range=0.1,

            # 浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度

            width_shift_range=0.1,

            # 浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度

            height_shift_range=0.1,

            # 布尔值,进行随机水平翻转

            horizontal_flip=True,

            # 布尔值,进行随机竖直翻转

            vertical_flip=True,

            # 在 0 和 1 之间浮动。用作验证集的训练数据的比例

            validation_split=test_split  

    )

    # 接下来生成测试集,可以参考训练集的写法

    test_data = ImageDataGenerator(

            rescale=1. / 255,

            validation_split=test_split)

    train_generator = train_data.flow_from_directory(

            # 提供的路径下面需要有子目录

            data_path,

            # 整数元组 (height, width),默认:(256, 256)。 所有的图像将被调整到的尺寸。

            target_size=(height, width),

            # 一批数据的大小

            batch_size=batch_size,

            # "categorical", "binary", "sparse", "input" 或 None 之一。

            # 默认:"categorical",返回one-hot 编码标签。

            class_mode='categorical',

            # 数据子集 ("training" 或 "validation")

            subset='training',

            seed=0)

    test_generator = test_data.flow_from_directory(

            data_path,

            target_size=(height, width),

            batch_size=batch_size,

            class_mode='categorical',

            subset='validation',

            seed=0)

    return train_generator, test_generator

# 数据路径

data_path = basic_path + 'image'

# 图像数据的行数和列数

height, width = 160, 160

# 获取训练数据和验证数据集

train_generator, test_generator = processing_data(data_path, height, width)

# 通过属性class_indices可获得文件夹名与类的序号的对应字典。

labels = train_generator.class_indices

print(labels)

# 转换为类的序号与文件夹名对应的字典

labels = dict((v, k) for k, v in labels.items())

print(labels)

pnet_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/pnet.h5"

rnet_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/rnet.h5"

onet_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/onet.h5"

# 加载 MobileNet 的预训练模型权重

weights_path = basic_path + 'keras_model_data/mobilenet_1_0_224_tf_no_top.h5'

# 图像数据的行数和列数

height, width = 160, 160

model = MobileNet(input_shape=[height,width,3],classes=2)

model.load_weights(weights_path,by_name=True)

print('加载完成...')

def save_model(model, checkpoint_save_path, model_dir):  # 保存模型

    if os.path.exists(checkpoint_save_path):

        print("模型加载中")

        model.load_weights(checkpoint_save_path)

        print("模型加载完毕")

    checkpoint_period = ModelCheckpoint(

        # 模型存储路径

        model_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',

        # 检测的指标

        monitor='val_acc',

        # ‘auto’,‘min’,‘max’中选择

        mode='max',

        # 是否只存储模型权重

        save_weights_only=False,

        # 是否只保存最优的模型

        save_best_only=True,

        # 检测的轮数是每隔2轮

        period=2

    )

    return checkpoint_period

checkpoint_save_path = "./results/last_one88.h5"

model_dir = "./results/"

checkpoint_period = save_model(model, checkpoint_save_path, model_dir)

# 学习率下降的方式,acc三次不下降就下降学习率继续训练

reduce_lr = ReduceLROnPlateau(

                        monitor='accuracy',  # 检测的指标

                        factor=0.5,     # 当acc不下降时将学习率下调的比例

                        patience=3,     # 检测轮数是每隔三轮

                        verbose=2       # 信息展示模式

                    )

early_stopping = EarlyStopping(

                            monitor='val_accuracy',  # 检测的指标

                            min_delta=0.0001,         # 增大或减小的阈值

                            patience=3,         # 检测的轮数频率

                            verbose=1            # 信息展示的模式

                        )

# 一次的训练集大小

batch_size = 64

# 图片数据路径

data_path = basic_path + 'image'

# 图片处理

train_generator, test_generator = processing_data(data_path, height=160, width=160, batch_size=batch_size, test_split=0.1)

# 训练模型

history = model.fit(train_generator,    

                    epochs=20, # epochs: 整数,数据的迭代总轮数。

                    # 一个epoch包含的步数,通常应该等于你的数据集的样本数量除以批量大小。

                    steps_per_epoch=637 // batch_size,

                    validation_data=test_generator,

                    validation_steps=70 // batch_size,

                    initial_epoch=0, # 整数。开始训练的轮次(有助于恢复之前的训练)。

                    callbacks=[checkpoint_period, reduce_lr])

# 保存模型

model.save_weights(model_dir + 'temp.h5')

plt.plot(history.history['loss'],label = 'train_loss')

plt.plot(history.history['val_loss'],'r',label = 'val_loss')

plt.legend()

plt.show()

plt.plot(history.history['accuracy'],label = 'acc')

plt.plot(history.history['val_accuracy'],'r',label = 'val_acc')

plt.legend()

plt.show()

matlab终止以下代码-monitor:监视日志cpu和正在运行的应用程序的内存使用情况 matlab终止以下代码监视器 估计应用程序在执行过程中将使用的内存量通常并非易事,尤其是当使用第三方软件时。 但是,此信息很有价值,因为它有助于确定使用此应用程序的作业应在其上运行的计算节点的特征。 尽管此处介绍的工具也可以用于支持软件开发过程,但几乎可以肯定会有更好的工具。 请注意,当前仅支持单节点作业,将来的版本中可能会添加MPI支持。 先决条件 希望用户熟悉linux bash shell。 监控程序 启动程序(例如仿真)进行监视非常简单 $ monitor simulation 监控器会将模拟的CPU使用率和内存消耗写入标准错误。 值将每5秒显示一次。 这是监视器对程序指标进行采样的速率。 数据是使用ps命令获取的,因此,度量监控报告的语义与ps相同。 从手册页引用: %cpu cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime 立即下载

相关推荐

硬件之光实战篇--Boost

当开关管处于关闭状态时,由于电感中的电流在短时间内不能瞬间消失,因此它会产生一个电感电动势,在电容器上加上一个高电压,从而使输出电压变高。--------------------------------------------------------分割线----------------------------------------------------------------在应用中,升压芯片需要根据负载电路的需求,选择合适的电感和电容等元器件,以达到所需要的升压倍数和输出电压。

m0_58664890的博客 2105

监视matlab变量,在多监视器配置中确定MATLAB的监视器

我们可以使用一些Java技巧来获取当前的监视器;请参阅下面的评论代码:function mon = q37705169%% Get monitor list:monitors = get(groot,'MonitorPositions'); % also get(0,'MonitorPositions');%% Get the position of the main MATLAB screen:...

weixin_36176188的博客 813

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2106

Matlab常用命令(一)

clear:清除原有变量 clc:清除命令窗口中的内容 quit:退出matlab demo:查看帮助 help:查看帮助,后面要加参数,与不同 figure:创建图形窗口 clf:清除图形,一般在画图之前用 size(X):返回矩阵X的行数与列数 get():得到图形的属性,如位置等 set():设置图形的属性等 uicontrol();创建GUI控件,默认是pushbutt

坤的专栏 1474

Windows 11 上 WSL2 安装 Ubuntu 22.04 保姆级教程(含桌面环境配置)

本文提供在Windows 11上通过WSL2安装Ubuntu 22.04并配置桌面环境的详细教程。涵盖WSL2核心安装、性能调优、Xfce桌面环境部署以及开发环境集成,帮助开发者构建高效、无缝的Windows-Linux混合开发工作站。

Jerry的专栏 634

R语言绘制森林图

运行上述代码后,将会生成一个标题为"森林图示例"的森林图。通过以上代码示例,你可以根据自己的数据集和需求创建定制的森林图。在实际应用中,你还可以进一步调整图形的样式,添加图例、坐标轴标签等,以使森林图更加美观和易于理解。在数据可视化领域,森林图是一种常用的图形类型,用于展示多个分类变量之间的关系。本文将介绍如何使用R语言创建森林图,并提供相应的源代码示例。森林图通常由垂直的线段表示不同类别的观测值,并且线段的长度表示数值变量的大小。上述代码中,我们为不同的类别分别指定了蓝色和红色作为颜色映射关系。

TechNovaX的博客 1045

【数字信号调制】2BPSK数字信号调制解调(频谱分析和功率谱分析)【含Matlab源码 4563期】

2BPSK数字信号调制解调(频谱分析和功率谱分析) 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 1399

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

yilvyangguang520的博客 3997

深度学习之基于Mtcnn+Keras+Tensorflow口罩实时检测系统

一、项目背景随着全球公共卫生事件的频发,口罩成为了重要的防护工具。然而,在实际应用中,如何有效地检测人们是否佩戴口罩成为了一个重要的问题。为了解决这个问题,我们利用深度学习技术,特别是Mtcnn、Keras和Tensorflow框架,构建了一个口罩实时检测系统。二、项目目标本项目的目标是通过深度学习技术,实现一个能够实时检测并识别图像或视频流中人们是否佩戴口罩的系统。该系统应具有高度的准确性、实时性和稳定性,能够应对各种复杂环境和场景的挑战。

2301_79810943的博客 974

【PCIe硬件】PCIe引脚PRSNT与热插拔

热插拔的基本目的是要让PCIe设备按照规定的顺序、原则,从系统中移除或插入到系统中来,并能正常的工作,且不影响系统的正常运行。事实上,PCIe“热插拔”的关键目的就是为前面面所提到的系统RAS服务的,是提升系统RAS能力的非常重要的手段!注意,这里有两个相关概念,前面我们讲的热插拔,其实是广义的“热插拔”。这里的Hot-Plug,为了方便,我们叫做PCIe热插拔,也就是我们现在及后面将要讨论的内容。

smartvxworks的博客 2812

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 203

基于MATLAB开发的口罩佩戴检测系统智能化识别与监管功能强大

咱们先来点实际的——系统核心就三板斧:人脸定位、口罩区域识别、判定逻辑。下次如果看到地铁里的AI测温仪,说不定里面跑的就是类似逻辑的代码呢。先祭出MATLAB的大杀器vision.CascadeObjectDetector,这玩意儿是人脸检测的瑞士军刀。核心就是计算下巴区域的"干净肤色"占比,低于阈值就认为戴了口罩。正常佩戴口罩时,下巴部位会被遮挡,肤色像素会显著减少。实测发现,当该区域肤色面积小于15%时,大概率是戴了口罩。这时候如果在检测到的人脸框下半部分统计肤色像素比例,就能判断是否戴口罩。

ghxufMuht的博客 363

【Bug已解决】Failed to fetch version ECONNREFUSED 解决方案

方案适用场景推荐指数难度方案一:NODE_EXTRA_CA_CERTS代理/企业网关证书⭐⭐⭐⭐⭐低方案二:浏览器导出证书不知证书在哪⭐⭐⭐⭐中方案三:使用系统证书macOS 用户⭐⭐⭐⭐中方案四:关闭代理直连快速验证⭐⭐⭐低方案五:更新 Node.js证书列表过时⭐⭐⭐低方案六:同步系统时间时间偏差导致⭐⭐⭐低根本原因。

博客 9977

基于MATLAB开发的智能口罩佩戴检测识别系统:实现便捷与高效的安全防护监控

咱们先来点实际的——系统核心就三板斧:人脸定位、口罩区域识别、判定逻辑。下次如果看到地铁里的AI测温仪,说不定里面跑的就是类似逻辑的代码呢。先祭出MATLAB的大杀器vision.CascadeObjectDetector,这玩意儿是人脸检测的瑞士军刀。核心就是计算下巴区域的"干净肤色"占比,低于阈值就认为戴了口罩。正常佩戴口罩时,下巴部位会被遮挡,肤色像素会显著减少。实测发现,当该区域肤色面积小于15%时,大概率是戴了口罩。这时候如果在检测到的人脸框下半部分统计肤色像素比例,就能判断是否戴口罩。

2508_94216386的博客 388

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MATLAB结课大作业人脸识别是否戴口罩:实时监测,智能预警

MATLAB结课大作业人脸识别是否戴口罩:实时监测,智能预警 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在科技不断发展的今天,人脸识别技术已经被广泛应用于各种场合,例如门禁系统、支付验证等。本项目——MATLAB结课大作业人脸识别是否戴口罩,是一份结合了人脸识别和口罩佩戴检测的创新性应用。它不仅展示了MATLAB在图像处理方面的强大功能,还通过卷积神经网络技术,实...

gitblog_06713的博客 885

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基于人脸面部检测的口罩识别系统

基于人脸面部检测的口罩识别系统摘 要作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩序被严重打乱。跟普通流感不同,此次疫情可以通过人体唾沫传播,感染他人能力很强。近期,面对疫情,市面上口罩更少被抢得一个不留。因为,面对此次疫情,出门戴口罩变得尤为地重要。可以直...

m0_59833680的博客 8238

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MATLAB结课大作业:人脸识别是否戴口罩

MATLAB结课大作业:人脸识别是否戴口罩 去发现同类优质开源项目:https://gitcode.com/ 本项目为一份基于MATLAB的结课大作业,旨在实现一个实时的人脸识别与口罩佩戴检测应用。该应用通过卷积神经网络(LeNet-5)对单人或多人进行识别,判断是否佩戴口罩。 项目简介 本应用利用MATLAB强大的图像处理能力,结合卷积神经网络技术,对摄像头捕捉到的图像进行实时分析。主要功能如下...

gitblog_06707的博客 409

MATLAB口罩检测与预警系统

MATLAB口罩检测预警系统是基于MATLAB平台开发的一种人脸口罩检测系统。该系统利用计算机视觉和深度学习算法,实时监测摄像头或者视频中的人脸图像,对人脸是否佩戴口罩进行判断,并发出相应的预警信号。该系统可以广泛应用于公共场所,如机场、车站、商场、学校等,帮助监管人员实时监测人群是否佩戴口罩,提醒未佩戴口罩的人员及时佩戴口罩,以减少传染病的传播风险。

我的MATLAB学习日记 398

MATLAB口罩检测系统

传统检测口罩的方法,基本使用基于颜色的方法,即口罩基本有浅蓝色,黑色和白色为主的几种,通过RGB三原色转换为HSV等容易聚集颜色的色彩空间,得到对应颜色的像素点的方法来定位口罩。因为本文不以考虑该种算法。如果该人穿戴了口罩,那么口罩部分不属于人脸肤色,自然不会被检测为人脸肤色像素,因此该块口罩区域块呈现白色,最后通过形态学知识滤除掉白色面积块小于一定值的区域,留下面积一定的白色面积块,该面积块即为口罩区域。本文选择通过检测人脸,进而统计肤色的原理来达到口罩识别的目的,同时选择肤色作为口罩检测的主要依据。

Happyday763的博客 69

基于MATLAB的口罩识别开题报告表

可以直接从源头把关,将外接人体唾沫,气流等进行第一屏障地隔离,有效地保护了自己和他人,不给病毒以传播的机会。而往往,就有一些人不响应国家和党的号召,面对此次病毒不以为然,出门依然不爱戴口罩,给病毒有机可乘,给自己和他人的生命安全造成重大安全隐患。3—4周:掌握图像颜色识别的基本原理和典型方法,熟悉MATLAB的编程语言,完成毕业设计的前期准备工作;3、掌握MATLAB中的GUI功能,完成口罩识别的MATLAB实现,最终实现用户界面的设计;几种口罩的识别,主要是依靠口罩的颜色来进行定位和检测;

Happyday763的博客 71

基于MATLAB的口罩识别系统开通报告

可以直接从源头把关,将外接人体唾沫,气流等进行第一屏障地隔离,有效地保护了自己和他人,不给病毒以传播的机会。而往往,就有一些人不响应国家和党的号召,面对此次病毒不以为然,出门依然不爱戴口罩,给病毒有机可乘,给自己和他人的生命安全造成重大安全隐患。3—4周:掌握图像颜色识别的基本原理和典型方法,熟悉MATLAB的编程语言,完成毕业设计的前期准备工作;3、掌握MATLAB中的GUI功能,完成口罩识别的MATLAB实现,最终实现用户界面的设计;几种口罩的识别,主要是依靠口罩的颜色来进行定位和检测;

Happyday763的博客 79

MATLAB口罩穿戴检测系统

作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。而往往,就有一些人不响应国家和党的号召,面对此次病毒不以为然,出门依然不爱戴口罩,给病毒有机可乘,给自己和他人的生命安全造成重大安全隐患。本文采用基于颜色的方法,先进行人脸定位,去除无关紧要的部位。然后根据颜色,可以识别红色,黄色,蓝色等几种常见的口罩,结合形态学滤除掉一些非目标颜色的区域,可以得到精准的口罩区域,在原图基础上进行定位,输出,并且进行计数。

GGMMM123的博客 64

MATLAB口罩穿戴检测

作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。而往往,就有一些人不响应国家和党的号召,面对此次病毒不以为然,出门依然不爱戴口罩,给病毒有机可乘,给自己和他人的生命安全造成重大安全隐患。本文采用基于颜色的方法,先进行人脸定位,去除无关紧要的部位。然后根据颜色,可以识别红色,黄色,蓝色等几种常见的口罩,结合形态学滤除掉一些非目标颜色的区域,可以得到精准的口罩区域,在原图基础上进行定位,输出,并且进行计数。

GGMMM123的博客 66

基于MATLAB卷积神经网络的口罩佩戴检测系统

要:随着公共卫生安全意识的不断提高,口罩佩戴检测在疫情防控、公共场所管理等领域具有重要的应用价值。本文设计并实现了一个基于卷积神经网络(CNN)的口罩佩戴检测系统。该系统采用深度学习技术,通过训练CNN模型自动识别图像中人员是否正确佩戴口罩,实现了智能化、自动化的检测功能。

ZSW1218的博客 481
上一篇: 基于matlab的口罩识别
下一篇: MATLAB开发口罩佩戴检测
GPT_code
博客等级 码龄3年 3543粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值