口罩识别—分类
一、问题背景
(最重要的目的就是熟悉卷积神经网络进行分类的各个环节)新冠肺炎的爆发,配戴口罩成为防控疫情保护自己的必需措施。不佩戴口罩严禁进入小区、学校、工厂,严禁乘坐公交、地铁等交通工具。但随着近日来,疫情逐渐好转,可能会有一部分降低了对新冠疫情的警惕性,不佩戴口罩出入公众场所,对此我们设计了一个口罩识别系统,把口罩识别问题当做一个分类问题,去检测人脸是否佩戴口罩。(对于口罩识别问题大多都是目标检测问题,其实这里为了只是为了更好的学习深度学习各个部分,就把这当做简单的一个分类问题)。
其实左图才是正常的口罩识别,但是如右图来说,对于特定的情况下,可以是把问题转换为分类问题,但是数据的话应该大多区域都是人脸。
二、数据处理
(一部分爬虫爬大的,一部分截图截的(留下了没技术的眼泪))首先在网络上获取200张图片,然后对获取的数据集进行筛选,最终确定了100张图片,其中50张佩戴口罩的图片,50张未佩戴口罩的图片。(尽量选择人脸占大多部分区域)由于获取的图片大小,文件名都不统一,故对100张图片进行预处理,大小重新调整为250*250,并让图片命名规范。
1、对图片进行重命名
# -*- coding:utf8 -*-
# coding:UTF-8
import os
class BatchRename():
'''
批量重命名文件夹中的图片文件
'''
def __init__(self):
self.path = 'C:\CBSD68'
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 1
for item in filelist:
if item.endswith('.png'):
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), str(i) + '.png')
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
print('total %d to rename & converted %d jpgs' % (total_num, i))
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
2、图片进行调整大小
# coding:UTF-8
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile, outdir, width=260, height=260):
img = Image.open(jpgfile)
try:
new_img = img.resize((width, height), Image.BILINEAR)
new_img.save(os.path.join(outdir, os.path.basename(jpgfile)))
except Exception as e:
print(e)
for jpgfile in glob.glob(r"C:\Users\86150\Desktop\datasets\ImageNet400\*.png"): # 读取文件
convertjpg(jpgfile, r"C:\Users\86150\Desktop\datasets\IMage280") # 保存文件位置
其次将100张图片进行扩充,对100张图片使用7种变换,分别是左右变换、向左旋转20度、向右旋转20度、颜色增强、对比度增强、亮度增强和随机颜色,通过扩充获得了一共800张图片(其中包括400张佩戴口罩、400张未佩戴口罩)。变换效果如下所示。
然后我们将数据进行划分为训练集、验证集和测试集。
训练集的作用是用来拟合模型,通过设置分类器的参数,训练分类模型。后续结合验证集作用时,会选出同一参数的不同取值,拟合出多个分类器。
验证集的作用是当通过训练集训练出多个模型后,为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数,即用来调整模型参数。
测试集通过训练集和验证集得出最优模型后,使用测试集进行模型预测。用来衡量该最优模型的性能和分类能力。即可以把测试集看做从来不存在的数据集,当已经确定模型参数后,使用测试集进行模型性能评价。
from PIL import Image
from PIL import ImageEnhance
import os
import cv2
import numpy as np
def flipLF(root_path,img_name): #左右翻转图像
img = Image.open(os.path.join(root_path, img_name))
filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
# filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
return filp_img
def flipTP(root_path,img_name): #上下翻转图像
img = Image.open(os.path.join(root_path, img_name))
filp_img = img.transpose(Image.FLIP_TOP_BOTTOM)
# filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
return filp_img
def rotation20(root_path, img_name):
img = Image.open(os.path.join(root_path, img_name))
rotation_img = img.rotate(20) #旋转角度
# rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
return rotation_img
def rotation340(root_path, img_name):
img = Image.open(os.path.join(root_path, img_name))
rotation_img = img.rotate(340) #旋转角度
# rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
return rotation_img
def randomColor(root_path, img_name): #随机颜色
"""
对图像进行颜色抖动
:param image: PIL的图像image
:return: 有颜色色差的图像image
"""
image = Image.open(os.path.join(root_path, img_name))
random_factor = np.random.randint(0, 31) / 10. # 随机因子
color_image = Im