我目前正在研究车牌识别。我的系统包括两个阶段:(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
[训练车牌图像示例。这是区域建议图像]