MTCNN部分
1. MTCNN理解
MTCNN是用在人脸识别中的人脸定位领域,使用MTCNN取得了比较好的效果,目前在人脸识别中的人脸定位阶段,很多都是使用MTCNN来完成的;
MTCNN一共有3个模型,分别为PNet,RNet,ONet;三个模型就意味着我们要训练三次,事实上也的确如此;训练过程在第三部分讲。
我们使用的训练数据不是整幅原始图像,而是从原图片抠出来的一个个固定尺寸的子图片,每幅图像可产生多个正样本,负样本以及疑难样本;
一个正样本,再加上一个偏移量,就可以作为训练样本了;为什么可以进行学习呢?像上图的样本,没有显示全,就需要通过偏移量将其显示全,大量的样本学习之后,给出一个部分图片,机器就可以知道如何移动才能包括全部车牌;
如何保证我们一定可以找到车牌呢?因为在推理的时候,整幅图进行了多次缩放,每次缩放后喂给PNet检测一次,而PNet网络检测的图片大小恒定为7*22,也就是说按7*22的窗口进行滑窗;可以想象,当原图缩放到很小的时候,那么喂给PNet的恒定的7*22的图片映射到原图将会变的很大;可以想象,把每个7*22的窗口映射回原图的话,原图上肯定布满了不同大小的框;
仅仅PNet是接受全尺寸的图片,而RNet和ONet接受的是经PNet卷积后的输出,大小是恒定的;
2. MTCNN在车牌领域的改进
在使用中,针对车牌的应用场景,进行了改造:
借鉴了yolov3的思想,对训练集的GT进行了统计,得出一个比较好的长宽比,在PNet中,输入样本img的尺寸是7*22;RNet中为14*44,;ONet的输入样本的尺寸是28*88;输入尺寸更改了,相应的网络结构也要调整;
对于ONet的输出,根据实际情况,车牌不能嵌套,就是预测的两个框是全包围的情况,一个框很大,一个框很小,小框完全在大框内部,这种情况是不可能的,所以需要把这种情况去除;NMS对于这类情况,若IOU很小,会保留两个框;
3. MTCNN训练
刚才说了,MTCNN有三个模型,所以要训练三个模型,这三个模型如何训练呢?
我们有一批样本,对于样本中的每个图片都有GT,GT框起来的就是我们希望定位的样本;
第一步:我们拿来图片之后,按规定的像素进行抠图,比如按20*20的大小(这里使用的是自定义的三个图像大小,如2中描述),那么我们就可以获得大量的子图片,根据预先标注框计算IOU,可以知道哪些是正样本,哪些是负样本,如果子图片和GT的IOU处于正样本和负样本之间的话,算作疑难样本;
第二步:拿这些子图片对PNet进行训练;
第三步:仍然拿原来的图片,喂给PNet,PNet会输出bboxes(已映射到原图)和是否车牌的预测值,对于这些bboxes集合,如果对应的类别预测低于设定阈值,这些bbox将被丢弃;留下的bboxes将根据预先的标注框,计算IOU;同理,大于某个阈值的是正样本,小于某个阈值的是负样本,中间的是疑难样本;在进行划分的时候,针对正样本和疑难样本,需要给出与标定值的偏移值;至于负样本,这些偏移值随便给一个就好了,比如【0,0,0,0】,反正在算偏移损失的时候负样本的也会过滤掉;
第四步:拿第三步的输出的样本,resize到【14,44】,单独对RNet进行训练;
第五步:仍然拿原始图片,级联喂给PNet和RNet,输出bboxes集合(已映射到原图)和是否车票的预测值;若预测值低于阈值,相对应的bbox将被丢弃;留下的bboxes将根据预先的标注框,计算IOU,根据IOU的值,划分正样本,负样本,疑难样本;
第六步:拿第五步的数据resize到[28,88],喂给ONet进行训练,训练完即可;
CRNN部分
使用CRNN,也就是CNN+RNN(双向LSTM),使用CTC损失,下次再说。