基于Tensorflow 的人脸口罩识别系统的设计与实现
1.1题目的主要研究内容
(1)工作的主要描述
人脸口罩识别主要是可以有效检测在密集人流区域中携带和未携戴口罩的所有人脸,同时判断该者是否佩戴口罩。本系统由两个功能单元组成,可以分别完成口罩人脸的检测和口罩人脸的分类。
(2)系统流程图
1.2题目研究的工作基础或实验条件
(1)硬件环境
芯片:Apple M1
内存:8GB
批量图片数据基础卷积层
辅助卷积层预测卷积层
损失函数计算模型参数更
ssd 网络目标定位和检测
(2)软件环境
开发语言:python(版本号python3.7)
开发软件:PyCharm
1.3数据集描述
本设计所用数据集是在公开数据集上了将近8000张的人脸口罩数据和模型,主要来源于WIDER face和MAFA数据集。其中包括了4064张佩戴口罩的人脸图片,3894张未佩戴口罩的人脸图片。并将这些数据集分为测试集和验证集两部分。
带口罩的数据集:
不戴口罩的数据集:
1.4特征提取过程描述
本设计采用了ssd架构的人脸检测算法,在这基础上增加一个类别分类,即戴口罩和不戴口罩两类。在这个模型中输入是260*260大小的图片,主干网络只有8个卷积层,有五个定位和分类层,一共具有28层,且每个卷积层的通道数目基本都是32、64、128这三种。其网络结构为:
Conv+ReLu—Pooling—Conv+ReLu—Pooling—Conv+ReLu—Pooling—Conv +ReLu—Pooling—Conv+ReLu—Pooling—Conv+ReLu—Pooling—Conv+ReLu—Conv+ReLu—Conv—ReLu—Conv—Permute—Reshape—sigmoid,其中前面八个卷积层为主干网络,主要应用于特征提取,最后面为定位和分类层。在ssd的网络中原始图像经过卷积层转换后得到原图像的特征映射图,再用多个卷积层对特征映射图处理后用来定位和检测原始图像。ssd的网络结构中包含了基础网络,辅助卷积层和预测卷积层。其中基础网络用来提取低尺度的特征映射图,辅助卷积层用来提取高尺度的特征映射图。
基础网络的结构采用了vgg-16的网络架构,因为VCG-16网络包含了卷积层和全连接层(FC Layers),全连接层的任务用来分类,由于基础网络只需要提取特征映射图,因此需要对全连接层用卷积层代替。辅助卷积层连接基础网络最后的特征映射图,通过卷积神经网络输出4个高尺度的特征映射图
1.5分类过程描述
在ssd网络模型中预测卷积层用来输出特征映射图的位置信息和分类信息。训练目标检测模型,最重要的就是合理的设置anchor的大小和宽高比。所以在模型五个卷积上接出来的定位分类层其大小设置为:
第一层:特征图大小45*45,anchor大小0.04,0.056,anchor宽高比1,0.62,0.42;
第二层:特征图大小23*23,anchor大小0.08,0.11,anchor宽高比1,0.62,0.42;
第三层:特征图大小12*12,anchor大小0.16,0.22,anchor宽高比1,0.62,0.42;
第四层:特征图大小6*6,anchor大小0.32,0.45,anchor宽高比1,0.62,0.42;
第五层:特征图大小4*4,anchor大小0.64,0.72,anchor宽高比1,0.62,0.42;
预测层预测了映射图每个点的矩形框信息和分类信息,该点的损失值等于矩形框位置的损失与分类的损失之和。首先我们计算映射图每个点的先验框与真实
框的交并比,若交并比大于设置的阈值,则该先验框与真实框所标记的类相同,称为正类即戴口罩并用绿框圈起来;若小于设置的阈值,则称为负类即不戴口罩,用红框圈起来。
1.6主要程序代码(要求必须有注释)
import cv2
import argparse
from PIL import Image
from utils.anchor_generator import generate_anchors
from utils.anchor_decode import decode_bbox
s import single_class_non_max_suppression
网页设计html代码大全颜from load_model.pytorch_loader import load_pytorch_model,pytorch_inference
import sys
import numpy as np
import torch
as nn
functional as F
sys.path.append('models/')
weights_dict=dict()
#定义模型
def load_pytorch_model(model_path):
model=torch.load(model_path)
return model
def pytorch_inference(model,img_arr):
if torch.cuda.is_available():
dev='cuda:0'
else:
dev='cpu'
device=torch.device(dev)
<(device)
input_sor(img_arr).float().to(device)
y_bboxes,y_scores,=model.forward(input_tensor)
return y_bboxes.detach().cpu().numpy(),y_scores.detach().cpu().numpy()
#定义输入图片大小
def load_weights(weight_file):
if weight_file==None:
return
try:
weights_dict=np.load(weight_file).item()
except:
weights_dict=np.load(weight_file,encoding='bytes').item()
return weights_dict
#定义卷积层,池化层
class KitModel(nn.Module):
def__init__(self,weight_file):
super(KitModel,self).__init__()
global__weights_dict
__weights_dict=load_weights(weight_file)
self.cls_0_insert_conv2d=self.__conv(2,name='cls_0_insert_conv2d',in_channels=64, out_channels=64,kernel_size=(3,3),stride=(1,1),groups=1,bias=False)
self.loc_0_insert_conv2d=self.__conv(2,name='loc_0_insert_conv2d',in_channels=64, out_channels=64,kernel_size=(3,3),stride=(1,1),groups=1,bias=False)
self.cls_0_insert_conv2d_bn=self.__batch_normalization(2,'cls_0_insert_conv2d_bn', num_features=64,eps=0.0010000000474974513,momentum=0.0)
self.loc_0_insert_conv2d_bn=self.__batch_normalization(2,'loc_0_insert_conv2d_bn', num_features=64,eps=0.0010000000474974513,momentum=0.0)
self.cls_0_conv=self.__conv(2,name='cls_0_conv',in_channels=64,out_channels=8, kernel_size=(3,3),stride=(1,1),groups=1,bias=True)
self.loc_0_conv=self.__conv(2,name='loc_0_conv',in_channels=64,out_channels=16, kernel_size=(3,3),stride=(1,1),groups=1,bias=True)
self.cls_1_insert_conv2d=self.__conv(2,name='cls_1_insert_conv2d', in_channels=128,out_channels=64,kernel_size=(3,3),stride=(1,1),groups=1,bias=False) self.loc_1_insert_conv2d=self.__conv(2,name='loc_1_insert_conv2d', in_channels=128,out_channels=64,kernel_size=(3,3),stride=(1,1),groups=1,bias=False) v2d_5=self.__conv(2,name='conv2d_5',in_channels=128,out_channels=128, kernel_size=(3,3),stride=(1,1),groups=1,bias=False)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。