卷积神经网络之关键点回归——车牌16个关键点回归和车牌识别

CNN在图像处理两大基础问题——分类和回归。

将分类和回归组合在一起就有常见的目标检测,单独的回归问题相比分类不太常见,这里单独重点介绍一下CNN在回归问题中的基础应用。

用CNN做回归最朴素的思想就是多层卷积提取特征,然后输出层使用线性操作去归回标签值,损失函数一般用smoothL1:

损失函数优点https://www.zhihu.com/question/58200555

这里使用700+张车牌数据(训练集693,验证集41张),每个车牌标注了16个关键点和车牌号,如图:

数据集标签给出了16个关键的坐标和车牌号:

这里仿照VGG结构,搭建一个全卷积网络,输入为64*128的矩形图片,网络结构如下:

VGGRegNet(
  (conv1_0): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv1_1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2_0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2_1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv3_0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv3_1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv4_0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv4_1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv5_0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv5_1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv6_0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv6_1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (loc): Conv2d(512, 16, kernel_size=(1, 1), stride=(1, 1))
)

最后一层的输出大小为(batch,16, 1, 2),并且添加一个分支用于车牌字符识别,车牌识别采用multi-label方式处理,联合两个loss同时训练出一个端到端车牌识别和关键点定位模型.

其中16个通道用于预测16个关键点,1*2的feature map预测一个点的x和y。

模型的收敛:

最终识别效果如图:

编辑代码不容易,所有代码和流程参考我的jupyter notebook:https://github.com/midasklr/PlateKeyPointRegression

数据集:链接: https://pan.baidu.com/s/13PDEadsQO8L_1mV5TZVz7Q 提取码: i7fi

おすすめ

転載: blog.csdn.net/IEEE_FELLOW/article/details/107398325