手把手教学训练MTCNN模型.

本文详细介绍了使用MTCNN模型进行人脸识别的全过程,包括数据集获取、预处理、模型训练及效果评估,特别强调了WIDER_FACE数据集的使用和训练中遇到的问题。

0 背景介绍

我在学习人脸识别时,发现虽然网络上关于人脸识别理论的文章非常的多,但涉及到如何获取训练样本,如何进行预处理,以及如何去训练,并研究训练中的主要耗时情况等问题的文章非常的零散.因此在这里我结合我自己训练的步骤重头进行汇众整理并加入一些自己的理解.
此github的代码提交在: https://github.com/hlzy/caffe_mtcnn (目前代码还没整理完,我几乎是在2019-09-15日前整理完)

1.关于训练集,测试集,校验集

1.1 获取数据集

我使用的是WIDER_FACE数据集,这个数据集有32203张图片,并且标记了393703张脸,数据集共有61个大分类,如下:

0--Parade            17--Ceremony      24--Soldier_Firing       31--Waiter_Waitress  39--Ice_Skating  46--Jockey                   53--Raid                  61--Street_Battle
10--People_Marching  18--Concerts      25--Soldier_Patrol       32--Worker_Laborer   3--Riot          47--Matador_Bullfighter      54--Rescue                6--Funeral
11--Meeting          19--Couple        26--Soldier_Drilling     33--Running          40--Gymnastics   48--Parachutist_Paratrooper  55--Sports_Coach_Trainer  7--Cheering
12--Group            1--Handshaking    27--Spa                  34--Baseball         41--Swimming     49--Greeting                 56--Voter                 8--Election_Campain
13--Interview        20--Family_Group  28--Sports_Fan           35--Basketball       42--Car_Racing   4--Dancing                   57--Angler                9--Press_Conference
14--Traffic          21--Festival      29--Students_Schoolkids  36--Football         43--Row_Boat     50--Celebration_Or_Party     58--Hockey
15--Stock_Market     22--Picnic        2--Demonstration         37--Soccer           44--Aerobics     51--Dresses                  59--people--driving--car
16--Award_Ceremony   23--Shoppers      30--Surgeons             38--Tennis           45--Balloonist   52--Photographers            5--Car_Accident

这些文件夹中存放是图片文件本身,其中训练,校验,测试集的比例是40%,10%,50%,区分几个集合使用的是face_annotations文件.
在这里插入图片描述
如:wider_face_train_bbx_gt.txt 就是训练集,打开来看看,其中有

0--Parade/0_Parade_marchingband_1_799.jpg
21
78 221 7 8 2 0 0 0 0 0 
78 238 14 17 2 0 0 0 0 0 
113 212 11 15 2 0 0 0 0 0 
134 260 15 15 2 0 0 0 0 0 
163 250 14 17 2 0 0 0 0 0 
201 218 10 12 2 0 0 0 0 0 
182 266 15 17 2 0 0 0 0 0 
245 279 18 15 2 0 0 0 0 0 
304 265 16 17 2 0 0 0 2 1

第一行是图片path
第二行代表有此图片有多少人脸
之后21行,没一行分别表示x1, y1, w, h, blur, expression, illumination, invalid, occlusion, pose,其对照含义如下:

blur:
  clear->0
  normal blur->1
  heavy blur->2

expression:
  typical expression->0
  exaggerate expression->1

illumination:
  normal illumination->0
  extreme illumination->1

occlusion:
  no occlusion->0
  partial occlusion->1
  heavy occlusion->2

pose:
  typical pose->0
  atypical pose->1

invalid:
  false->0(valid image)
  true->1(invalid image)
1.2 数据集预处理
mtcnn网络结构介绍

在说明数据预处理前首先要弄清楚训练网络模型是怎样的.这里我使用可视化工具放置一个处理12*12的网络在下面:
在这里插入图片描述
我们知道MTCNN分为三个子网络:

  • Proposal Network(P-Net) 以12123为bbox进行初步预测
  • Refine Network(R-Net)
  • Output Network(O-Net)
预处理过程
  • 负样本生成过程:
    使用代码来说明:
    while neg_num < 50`
       # 截取的图片最小像素40,最大不会超过边宽的一半,基本上wider_face上也没有出现这么大的脸
       size = npr.randint(40, min(width, height) / 2)
       # 截图图片的位置是完全随机
       nx = npr.randint(0, width - size)
       ny = npr.randint(0, height - size)
       crop_box = np.array([nx, ny, nx + size, ny + size])
       # IOU选取是低于0.3作为负样本
       Iou = IoU(crop_box, boxes)

       cropped_im = img
### 使用PyTorch从零构建分类模型 为了创建一个用于分类任务的神经网络,在PyTorch中通常会经历几个阶段,包括准备数据集、定义模型结构、设置损失函数以及优化器,并执行训练循环。 #### 数据加载与预处理 在开始之前,确保安装了必要的库并导入到项目环境中。接着,获取或生成适合的任务的数据集。对于图像分类问题,可以采用`torchvision.datasets`模块提供的现成数据源,比如MNIST手写数字识别数据库[^1]。 ```python from torchvision import datasets, transforms import torch.utils.data as data_utils transform = transforms.Compose([ transforms.ToTensor(), ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) batch_size = 64 train_loader = data_utils.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = data_utils.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False) ``` #### 构建模型架构 设计合适的网络拓扑至关重要。这里展示了一个简单的全连接三层感知机的例子: ```python import torch.nn.functional as F from torch import nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(28 * 28, 512) # 输入大小取决于图片尺寸 self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, 10) # 输出类别数量 def forward(self, x): x = x.view(-1, 28 * 28) # 展平输入向量 x = F.relu(self.fc1(x)) x = F.dropout(x, p=0.5, training=self.training) x = F.relu(self.fc2(x)) x = self.fc3(x) return F.log_softmax(x, dim=1) model = Net() if torch.cuda.is_available(): model = model.cuda() # 如果GPU可用,则转移到CUDA设备上运行 ``` #### 定义损失函数和优化算法 选择交叉熵作为多类别的损失衡量标准,并应用随机梯度下降(SGD)或其他先进的优化技术如Adam来进行权重更新。 ```python criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` #### 训练过程 进入实际的学习环节,遍历整个数据集多次(即多个epochs),每轮次内逐批次传递样本给模型预测,计算误差反向传播调整参数直至收敛。 ```python num_epochs = 10 for epoch in range(num_epochs): running_loss = 0.0 for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/(i+1)}') ``` 完成上述步骤之后,还需要评估模型性能并对超参数做出相应调整以提高准确性。此外,考虑到迁移学习的优势,有时可以直接基于现有的大型预训练模型微调特定领域内的子网部分,从而节省大量时间和资源[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值