【VGG】口罩人脸分类
1. 项目准备
1.1. 问题导入
新冠肺炎病毒在全球肆虐,武汉大学率先公开了口罩遮挡人脸数据集。我们从中选取了6000余张戴口罩的人脸图片和6000余张正常的人脸图片作为实验数据集,以训练改进版的VGG16模型,使其能够实现对人脸是否佩戴口罩的判定。
1.2. 数据集简介
本次实验采用的是武汉大学口罩遮挡人脸数据集(RMFD)的一部分,它包含6000余张戴口罩的人脸图片和6000余张正常的人脸图片。
这是数据集的下载链接:人脸口罩分类数据集 - AI Studio
2. VGG模型
VGG
是由 Simonyan和Zisserman(2014)在论文中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写,它是2014年ILSVRC竞赛的第二名(第一名是GoogLeNet
),但是VGG
在多个迁移学习任务中的表现要优于GoogLeNet
。
作者在论文中证明了小尺寸(3×3)卷积核的深层网络要优于大尺寸卷积核的浅层网络,因此VGG
模型采用3×3的卷积核代替了其他的大尺寸卷积核。VGG
中根据卷积核大小和卷积层数目的不同,可分为A
、A-LRN
、B
、C
、D
、E
共6个配置(ConvNet Configuration),其中以D
和E
两种配置较为常用,分别称为VGG16
和VGG19
。本实验使用的是VGG16
模型(如下图D
所示)。
3. 实验步骤
3.0. 前期准备
- 导入模块
注意:本案例仅适用于
PaddlePaddle 2.0+
版本
python
1 | import os |
- 设置超参数
python
1 | BATCH_SIZE = 64 # 每批次的样本数 |
3.1. 数据准备
- 解压数据集
由于数据集中的数据是以压缩包的形式存放的,因此我们需要先解压数据压缩包。
python
1 | if not os.path.isdir(DATA_PATH["0"]) or not os.path.isdir(DATA_PATH["1"]): |
- 划分数据集
我们需要按1:9比例划分测试集和训练集,分别生成两个包含数据路径和标签映射关系的列表。
python
1 | def get_data_list(lab_no, path): # 划分path路径下的数据集 |
python
1 | train_lt1, test_lt1 = get_data_list(0, DATA_PATH["0"]) # 划分“正常人脸” |
- 数据增强
由于实验模型较为复杂,直接训练容易发生过拟合,故在处理实验数据集时采用数据增强的方法扩充数据集的多样性。数据増广(Data Augmentation),即数据增强,数据增强的目的主要是减少网络的过拟合现象,通过对训练图片进行变换可以得到泛化能力更强的网络,更好地适应应用场景。本实验中用到的数据增强方法有:随机改变亮度,随机改变对比度,随机改变饱和度,随机改变清晰度,随机翻转图像,随机加高斯噪声等。
python
1 | def random_brightness(img, low=0.5, high=1.5): |
- 数据预处理
我们需要对数据集图像进行缩放和归一化处理。
python
1 | class MyDataset(Dataset): |
python
1 | train_dataset = MyDataset(train_list, data_mapper, image_augment) # 训练集 |
- 定义数据提供器
我们需要分别构建用于训练和测试的数据提供器,其中训练数据提供器是乱序、按批次提供数据的。
python
1 | train_loader = DataLoader(train_dataset, # 训练数据集 |
3.2. 网络配置
- 模型改进
原始的VGG16包含13个卷积层、5个池化层、3个全连接层,它常常被用于分类问题。由于本实验的数据集并不是特别大,而实验模型又比较复杂,因此需要改进VGG16模型。为了减少模型的复杂程度,我们选择用一层全局池化层来取代VGG16模型的前两层全连接层(模型结构如下图所示),这样可以大大减少我们需要训练的参数。这对于简化实验模型、防止出现过拟合、提升模型训练速度等,均有很大的帮助。
python
1 | class ConvBN2d(nn.Layer): |
python
1 | class ConvPool(nn.Layer): |
python
1 | class VGG(nn.Layer): |
- 实例化模型
python
1 | model = VGG(in_channels=3, n_classes=CLASS_DIM, |
3.3. 模型训练
python
1 | model.train() # 开启训练模式 |
模型训练结果如下:
plaintext
1 | Epoch:0,Batch: 0,Loss:0.65380,Acc:0.59375 |
- 可视化训练过程
python
1 | fig = plt.figure(figsize=[10, 8]) |
3.4. 模型评估
python
1 | model.eval() # 开启评估模式 |
模型评估结果如下:
plaintext
1 | Eval Loss:0.03680,Acc:0.98849 |
3.5. 模型预测
python
1 | model.eval() # 开启评估模式 |
模型预测结果如下:
plaintext
1 | 图1的预测结果为:没戴口罩 |
plaintext
1 | 图2的预测结果为:没戴口罩 |
plaintext
1 | 图3的预测结果为:戴了口罩 |
plaintext
1 | 图4的预测结果为:戴了口罩 |
写在最后
- 如果您发现项目存在问题,或者如果您有更好的建议,欢迎在下方评论区中留言讨论~
- 这是本项目的链接:实验项目 - AI Studio,点击
fork
可直接在AI Studio运行~- 这是我的个人主页:个人主页 - AI Studio,来AI Studio互粉吧,等你哦~
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 倾珞珈蓝!
评论
ValineTwikoo