天天看点

MTCNN+CRNN解决车牌识别问题-2

这次到CRNN部分了,CRNN网络很简单,就是CNN+RNN,因为RNN适用于时间序列类型的数据,车牌呢,其实也是有规律的,比如第一位是汉字,后面是字母+汉字;

前一部分通过MTCNN将车牌区域已经定位了,那这部分就需要拿CRNN来对其进行训练,使其能作为一个pipeline处理MTCNN输出的车牌图像;

首先是CNN+RNN的网络,这里使用的网络比较简单,CNN部分使用了浅层网络和BN层,最终输出sequence_length*512维的输出;输出正好可以输入后续的RNN网络,其中RNN网络的序列长度是可变的,根据输入特征的长度而定;

RNN的网络结构中,深度为2层,序列长度根据输入待定,隐层单元数是256,车牌的类别数量是69,所以可以认为是每个时间点的输出为一个69维的向量,对向量做softmax,获得预测的结果;当然,此时预测的结果还是不准确的,也就是CTC中B变换之前的一个序列预测,若要得到最终预测,还需要进行B变换;

序列长度的值和输入图像的宽度是有关联的,所以在使用时候,将MTCNN输入图像的宽度除以4,得到了序列的长度,当然,这个序列长度要考虑B变换前的预测长度,不能太短,太短的话,在进行CTC计算的时候,可能得到的结果还不够车牌号的规定位数。

在训练中,很简单,使用自带函数tf.nn.ctc_loss即可,使用ctcc损失函数进行计算;

通过这样的训练,我们就可以使用模型预测了;

最后,MTCNN+CRNN仅仅是一次小的尝试,目前的结果由于样本的关系,还没做大量的训练,也没做优化,流程整个跑通;后面有时间的话,可以按这个方案,用更多数据训练一下,另外,各个环节再优化一下。

继续阅读