使用张量流检测车牌

人工智能 卷积神经网络 图像识别 张量流 Python
2021-10-25 08:41:50

我目前正在研究车牌识别。我的系统包括两个阶段:(1)车牌区域提取和(2)车牌区域识别。

我正在 (1) 使用 Raspberry pi 3 model b我首先通过基于它们的相似性合并边界框来找到候选车牌。这样,我只有 1~7 个车牌区域提案。它只用了不到 0.3 秒。

现在我必须将区域建议的数量减少到只有 1~2 左右,以便我可以将这些图像发送到服务器以完成工作 (2)。对于车牌提取,我在 tensorflow 中制作了自己的分类器函数,代码如下。它获取建议的车牌作为输入。

首先,我将所有车牌的大小调整为 [120, 60] 并转换为灰度图像。并且有 2 个类:'plate','non_plate'。对于 non_plate 图像,我收集了可能出现在图像中的各种图像作为背景。我现在有 181 个“plate”类图像和 56 个“non_plate”图像,到目前为止我训练了大约 3000 步,当前损失为 0.53。

当我对测试集进行预测时,我遇到了一些车牌图像无法识别车牌的问题,这很明显是我眼中的车牌图像。我可以错误地将非车牌图像识别为车牌,但如果它错误地将车牌识别为 non_plate 则会出现问题,因为它不会被发送到服务器进行完全识别。

它发生在 100 个测试图像中有 10 个,这个比率比我预期的要差得多。我需要帮助来解决这个问题。我能做些什么改进吗?

(1) 我的训练集是否太小而无法在车牌和非车牌之间进行分类?还是步数太少?

(2) 我的图结构不好吗?我需要一个小的图形结构让我的树莓派识别不到 1 秒。如果结构不好,你能建议更好的结构吗?

(3) 将任何提议的图像调整为 [120, 60] 以用作图形的输入是不是很糟糕?我认为它丢失了一些信息。但这不是像 fast rcnn 中使用的那样接近 roi pooling 吗?

 inputs=tf.reshape(features[FEATURE_LABEL],[-1,120 , 60 ,1],name="input_node") #120 x 60 x 1, which is gray

conv1=tf.layers.conv2d(inputs=inputs,
                       filters=3,
                       kernel_size=[3,3],
                       padding='same',
                       activation=tf.nn.leaky_relu
                       )
#conv1 output shape: (batch_size,120,60,3)

pool1=tf.layers.max_pooling2d(inputs=conv1,pool_size=[2,2],strides=2,padding='valid')

#pool1 output shape: (batch_size,60,30,3)

conv2=tf.layers.conv2d(inputs=pool1,filters=6,kernel_size=[1,1],padding='same',activation=tf.nn.leaky_relu)

#conv2 output shape: (batch_size, 60,30,6)

pool2=tf.layers.max_pooling2d(inputs=conv2,pool_size=[2,2],strides=2,padding='valid')

#pool2 output shape: (batch_size, 30,15,6)

conv3=tf.layers.conv2d(inputs=pool2,filters=9,kernel_size=[3,3],padding='same',activation=tf.nn.leaky_relu)

#conv3 output shape: (batch_size, 30,15,9)

pool3=tf.layers.max_pooling2d(inputs=conv3,pool_size=[2,2],strides=2,padding='valid')

#pool3 output shape: (batch_size, 15,7,9)


#dense fully connected layer
pool2_flat=tf.reshape(pool3,[-1,15*7*9]) #flatten pool3 output to feed in dense layer

dense1=tf.layers.dense(inputs=pool2_flat,units=120,activation=tf.nn.relu)

logits=tf.layers.dense(dense1,2) #input for softmax layer

训练非车牌图像示例 [训练非车牌图像示例] [ 训练板图像示例] 4 [训练车牌图像示例。这是区域建议图像]

1个回答

这样的任务越来越容易完成,但在旋转、倾斜、缩放方面仍然存在困难——仅举几例。您的网络对目标硬件具有简单性和轻便性的优点,但在上述条件下可能会受到影响。

因此,对于“通用”方法而言,237 张图像(181+56)可能很小,具体取决于数据集的代表性和多样性。此外,数据集是不平衡的(第一类有两倍的样本),这会导致学习偏差。

有几种方法可以扩展基础数据集:

  • 转换图像并将它们(如果有监督学习,使用相同的标签)添加到数据集中。许多库允许旋转、倾斜、缩放甚至模糊图像。请小心,因为转换需要是“合理的”,并且一遍又一遍地更改图像格式会产生可能混淆机器的伪影(例如,转换图像上的 JPEG 节省过多)。
  • 生成合成数据。假设车牌具有已知格式,则可能很容易生成与真实车牌具有良好保真度的图像。这并不总是可能的,但车牌是正式的,所以应该只有少数几种模式(通常是普通的、轻型的、外交的、军用车辆)。

除了数据集(潜在)问题,图表很好。但是,可能值得尝试不同的设置。这真的取决于你如何结束当前的图表。移除池化层有助于保留更多信息以及更大的输入图像。120x60 看起来很小,与 fast-RCNN 的 RoI 池化层的比较看起来很奇怪,因为 RoI位于特征图之后因此,更大的输入图像可以提供更好的结果。