父亲节祝福短语10个字基于卷积神经⽹络的⼝罩佩戴识别与检测
摘要
在当前情况下,没有⾼效的⼝罩检测应⽤程序和相关⾼质量标注数据集,因此想对运输、⼈⼝稠密地区,居民区,⼤型商场实现⾃动⼝罩佩戴检测是⼀个亟需解决且⾮常有意义的问题,⽽且,由于缺少“ 带⼝罩”图像的⼤型数据集,因此该任务更加具有挑战性。⽬标检测是复杂的⼀个过程,⾸先需要有训练数据集,但是如何在没有采⽤labelimg软件进⾏标注数据集的数据上进⾏训练模型从⽽达到⼝罩佩戴识别的效果呢?本⽂将转换思路,在前⼈已经做好⼈脸检测的基础上完成对⼝罩佩戴识别与检测。为何是识别与检测:⼀是在佩戴和没有佩戴⼝罩数据集上进⾏训练MobileNetV2模型,以达到对图标是否佩戴⼝罩进⾏识别。⼆是基于已经训练好的模型参数(既是能够进⾏⼈脸检测的模型参数,如:res10_300x300_ssd_iter_140000.caffemodel和deploy.prototxt)能够选择出⼈脸边框图像,然后再进⾏⼆分类任务,识别出⼈脸是否佩带了⼝罩。因此,本⽂将完成以下任务:
MobileNetV2模型概述与识别结果分析
MobileNet V2 是对 MobileNet V1 的改进,同样是⼀个轻量级卷积神经⽹络。
1.基础理论--深度可分离卷积(DepthWise操作)
标准的卷积过程可以看上图,⼀个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么⼀定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?
Xception⽹络就是基于以上的问题发明⽽来。我们⾸先对每⼀个通道进⾏各⾃的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps 进⾏标准的1×1跨通道卷积操作。这种操作被称为“DepthWise convolution”,缩写“DW”。
这种操作是相当有效的,在 ImageNet 1000 类分类任务中已经超过了InceptionV3 的表现,⽽且也同时减少了⼤量的参数,我们来算⼀算,假设输⼊通道数为3,要求输出通道数为256,两种做法:
1. 直接接⼀个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912
2. DW 操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,⼜把参数量降低到九分之⼀!
因此,⼀个 Depthwise 操作⽐标准的卷积操作降低不少的参数量,同时论⽂中指出这个模型得到了更好的分类效果。
2.MobileNetV1遗留的问题
什么是工商管理学1、结构问题:
MobileNet V1 的结构其实⾮常简单,论⽂⾥是⼀个⾮常复古的直筒结构,类似于VGG⼀样。这种结构的性价⽐其实不⾼,后续⼀系列的ResNet, DenseNet 等结构已经证明通过复⽤图像特征,使⽤ Concat/Eltwise+ 等操作进⾏融合,能极⼤提升⽹络的性价⽐。
2、Depthwise Convolution的潜在问题:
食用酒精Depthwise Conv确实是⼤⼤降低了计算量,⽽且N×N Depthwise +1×1PointWise的结构在性能上也能接近N×N Conv。在实际使⽤的时候,我们发现Depthwise部分的kernel⽐较容易训废掉:训练完之后发现Depthwise训出来的kernel有不少是空的。当时我们认
为,Depthwise每个kernel dim相对于普通Conv要⼩得多,过⼩的kernel_dim, 加上ReLU的激活影响下,使得神经元输出很容易变为0,所以就学废了。ReLU对于0的输出的梯度为0,所以⼀旦陷⼊0输出,就没法恢复了。我们还发现,这个问题在定点化低精度训练的时候会进⼀步放⼤。
3.MobileNet V2的创新点
1、Inverted Residual Block
MobileNet V1没有很好的利⽤Residual Connection,⽽Residual Connection通常情况下总是好的,所以MobileNet V2加上。
玫瑰代表什么先⽤1x1降通道过ReLU,再3x3空间卷积过ReLU,再⽤1x1卷积过ReLU恢复通道,并和输⼊相加。之所以要1x1卷积降通道,是为了减少计算量,不然中间的3x3空间卷积计算量太⼤。所以Residual block是沙漏形,两边宽中间窄。
但是,现在我们中间的3x3卷积变为了Depthwise的了,计算量很少了,所以通道可以多⼀点,效果更
好,所以通过1x1卷积先提升通道数,再Depthwise的3x3空间卷积,再⽤1x1卷积降低维度。两端的通道数都很⼩,所以1x1卷积升通道或降通道计算量都并不⼤,⽽中间通道数虽然多,但是Depthwise 的卷积计算量也不⼤。作者称之为Inverted Residual Block,两边窄中间宽,像柳叶,较⼩的计算量得到较好的性能。
2、ReLU6
⾸先说明⼀下 ReLU6,卷积之后通常会接⼀个 ReLU ⾮线性激活,在 MobileNet V1 ⾥⾯使⽤ ReLU6,ReLU6 就是普通的ReLU但是限制最⼤输出值为 6,这是为了在移动端设备 float16/int8 的低精度的时候,也能有很好的数值分辨率,如果对 ReLU 的激活范围不加限制,输出范围为0到正⽆穷,如果激活值⾮常⼤,分布在⼀个很⼤的范围内,则低精度的float16/int8⽆法很好地精确描述如此⼤范围的数值,带来精度损失。
本⽂提出,最后输出的 ReLU6 去掉,直接线性输出,理由是:ReLU 变换后保留⾮0区域对应于⼀个线性变换,仅当输⼊低维时ReLU 能保留所有完整信息。
在看 MobileNet V1的时候,我就疑问为什么没有把后⾯的 ReLU去掉,因为Xception已经实验证明了 Depthwise 卷积后再加ReLU 效果会变差,作者猜想可能是 Depthwise 输出太浅了, 应⽤ ReLU会带来信息丢失,⽽ MobileNet V1还引⽤了 Xception 的论⽂,但是在Depthwise 卷积后⾯还是加了ReLU。
在 MobileNet V2 这个 ReLU终于去掉了,并⽤了⼤量的篇幅来说明为什么要去掉。
总之,去掉最后那个 ReLU,效果更好。
4.本⽂⽹络结构及代码实现
这样,我们就得到 MobileNet V2的基本结构了,左边是 V1 的没有 Residual Connection并且带最后的 ReLU,右边是 V2 的带Residual Connection 并且去掉了最后的 ReLU:
⽹络的整体配置结构如下:
baseModel = MobileNetV2(weights="imagenet", include_top=False,
input_tensor=Input(shape=(224, 224, 3)))
# construct the head of the model that will be placed on top of the
# the base model
headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(7, 7))(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(128, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(2, activation="softmax")(headModel)
# place the head FC model on top of the base model (this will become
# the actual model we will train)
model = Model(inputs=baseModel.input, outputs=headModel)
model.summary()
⼤家可以⾃⼰通过model.summary()函数⾃⾏去看模型的参数个数及相关模型具体结构。
5. 实验结果分析
训练过程:
分割数据集:
with_mask:2165张图⽚
no_with_mask:1930张图⽚
(trainX, testX, trainY, testY) = train_test_split(data, labels,
test_size=0.20, stratify=labels, random_state=42)
训练损失函数及准确率图像:
输出准确率矩阵:
应⽤:⼝罩检测识别
2019年个人工作总结接着,本⽂打算使⽤MobileNet V2保存的训练参数和res10_300x300_ssd_iter_140000.caffemodel及deploy.prototxt来检测识别视频中的⼈是否佩戴了⼝罩。为此,⾸先,我们需要实现⼈脸检测。在此使⽤res10_300x300_ssd_iter_140000.caffemodel及deploy.prototxt来检测⾯部特征。最后,使⽤OpenCV库运⾏⽆限循环以使⽤我们的电脑摄像头,当检测出⾯部特征后,将其转换为
224x224图⽚,将其传递给训练MobileNet V2模型参数进⾏预测⾯部是否带有遮罩。其实现代码如下:
prototxtPath = r"face_detector\deploy.prototxt"
weightsPath = r"face_detector\res10_300x300_ssd_iter_140000.caffemodel"
faceNet = adNet(prototxtPath, weightsPath)
maskNet = load_model("del")
print("[INFO] starting ")
vs = VideoStream(src=0).start()
while True:
frame = vs.read()
frame = size(frame, width=400)
(locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
for (box, pred) in zip(locs, preds):
(startX, startY, endX, endY) = box
(mask, withoutMask) = pred
label = "Mask" if mask > withoutMask else "No Mask"
color = (0, 255, 0) if label == "Mask" else (0, 0, 255)
label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)
cv2.putText(frame, label, (startX, startY - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
英语命题作文if key == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
放⼏张图⽚的输⼊输出:
结束
2019年底见证了冠状病毒疾病(COVID-19)的爆发,即使在2020年,该疾病仍就造成数百万⼈⽣活困难和不便。随着世界从⼤流⾏病中恢复正常状态,在这次疫情中有研究证明,戴上⼝罩可⼤⼤降低病毒传播的风险并提供保护。但是,⼿动跟踪此策略的实施是不可⾏的,因此有必要引⼊深度学习⽅法实现智能检测识别。我们基于⽬前没有标注好的⼝罩检测数据集,本⽂做了两个⼯作完成⼝罩佩戴检测识别:⼀是在佩戴和没有佩戴⼝罩数据集上进⾏训练MobileNetV2模型,以达到对图标是否佩戴⼝罩进⾏识别。⼆是基于已经训练好的模型参数(既是能够进⾏⼈脸检测的模型参数,如:res10_300x300_ssd_iter_140000.caffemodel和deploy.prototxt)能够选择出⼈脸边框图像,然后再进⾏⼆分类任务,识别出⼈脸是否佩带了⼝罩。该⽅法能够检测佩戴和未佩戴⼝罩的⼈,且该⽅法可以与安装的摄像机集成使⽤。
参考⽂献
2.Kumar M , Saluja K K , Sachdeva M , et al. Face Mask Detection Using YOLOv3 and Faster R-CNN Models: COVID-19 Environment[J]. Multimedia Tools and Applications, 2021.
3. 基于MobileNetV2的⽬标检测算法研究与应⽤[D]. 2020.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论