基于objection detection的车牌检测

一 车牌区域检测

1.1 数据集处理及相关文件准备

1.1.1 数据集准备

使用LabelImg工具标注接近578张.jpg图片(以carNO为主,标注3类:car、carNO、person)后,为了增加样本的多样性,在578张图片中挑选几十张图片进行高斯模糊、旋转、畸变、高斯噪声等操作,对新得到的图片进行标注,最终样本扩充到了713张图片。
数据集存放参照Pascal VOC2007数据目录(数据存放在VOCdevkit/VOC2007目录下):

–VOCdevkit
–VOC2007
–JPEGImages
–存储批量.jpg图片
–ImageSets
–Main
–train.txt,训练集图片名称(不带后缀.jpg,一行一个,随机643个)
–val.txt,测试集图片名称(不带后缀.jpg,一行一个,随机70个)
–Annotations
–存储批量标注.xml文件

数据集存储目录情况如上所示,其中JPEGImages文件夹存放所有图片;ImageSets文件夹下有一个Main文件夹,Main下面存放train.txt和val.txt,分别为训练、测试集的图片名称(不带后缀.jpg,一行一个),需提前准备;Annotations文件夹存放图片标注.xml文件。

1.1.2 相关文件准备

  • 创建datasetcarmore文件夹
# cd /home/users/py3_project/models/research/object_detection  # 程序全部在此目录下运行,root用户,防止权限问题
# mkdir datasetcarmore
  • 将准备好的VOCdevkit/VOC2007数据集,放到datasetcarmore目录下
  • 复制models\research\object_detection\datasetcarmore_tools\create_pascal_tf_record.py文件到datasetcarmore目录下
  • 复制models\research\object_detection\data\pascal_label_map.pbtxt文件到datasetcarmore目录下
  • 复制models\research\object_detection\samples\configs\ ssd_mobilenet_v1_pets.config到datasetcarmore目录下

1.2. 转换数据集为tf_record格式

  • 将datasetcarmore/pascal_label_map.pbtxt改为自己的标签,如下所示
    在这里插入图片描述
  • 修改datasetcarmore/create_pascal_tf_record.py第160行 :
    在这里插入图片描述
  • 在当前目录/home/users/py3_project/models/research/object_detection下,
    执行以下命令:
# mkdir datasetcarmore/image_tfrecord
# python3 datasetcarmore/create_pascal_tf_record.py \
	--data_dir=datasetcarmore/VOCdevkit \
	--label_map_path=datasetcarmore/pascal_label_map.pbtxt \
	--year=VOC2007 \
	--set=train \
	--output_path=datasetcarmore/image_tfrecord/pascal_train.record

# python3 datasetcarmore/create_pascal_tf_record.py \
--data_dir=datasetcarmore/VOCdevkit \
--label_map_path=datasetcarmore/pascal_label_map.pbtxt \
--year=VOC2007 \
--set=val \
--output_path=datasetcarmore/image_tfrecord/pascal_val.record

1.3 下载预训练模型

# wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz
# tar -xvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz

将解压好的预训练模型目录重命名为model_ssd,存入datasetcarmore目录下

1.4 修改相关配置文件

1 修改配置文件:
datasetcarmore目录下的ssd_mobilenet_v1_pets.config重命名为ssd_mobilenet_v1_pascal.config

  • 修改类别数
    在这里插入图片描述
  • 修改预训练模型路径
    fine_tune_checkpoint: “/home/users/py3_project/models/research/object_detection/datasetcarmore/model_ssd/model.ckpt”
  • 修改输入训练数据配置信息
    train_input_reader: {
    tf_record_input_reader {
    input_path: “/home/users/py3_project/models/research/object_detection/datasetcarmore/image_tfrecord/pascal_train.record”
    }
    label_map_path: “/home/users/py3_project/models/research/object_detection/datasetcarmore/pascal_label_map.pbtxt”
    }
  • 修改预测数据配置信息
    eval_input_reader: {
    tf_record_input_reader {
    input_path: “/home/users/py3_project/models/research/object_detection/datasetcarmore/image_tfrecord/pascal_val.record”
    }
    label_map_path: “/home/users/py3_project/models/research/object_detection/datasetcarmore/pascal_label_map.pbtxt”
    shuffle: false
    num_readers: 1
    }

1.5 进行模型训练

# python3 train.py \
	--logtostderr \
    --pipeline_config_path=datasetcarmore/ssd_mobilenet_v1_pascal.config \
--train_dir=datasetcarmore/train_dir

1.6 模型预测与检测

# python3 eval.py \
    --logtostderr \
    --pipeline_config_path=datasetcarmore/ssd_mobilenet_v1_pascal.config \
    --checkpoint_dir=datasetcarmore/train_dir/model.ckpt-20202 \
--eval_dir=datasetcarmore/eval_result

1.7 转换为图文件

将model.chk文件转换为graph

# python3 export_inference_graph.py \
	--input_type=image_tensor \
   --pipeline_config_path=datasetcarmore/ssd_mobilenet_v1_pascal.config \
	--trained_checkpoint_prefix=datasetcarmore/train_dir/model.ckpt-20202 \
	--output_directory=datasetcarmore/inference_graph

1.8 测试图片

1.8.1 测试修改

  • 当前目录/home/users/py3_project/models/research/object_detection下test.py文件,并重命名为test1.py:
  1. 两个路径修改为自己的路径及NUM_CLASS:
    在这里插入图片描述
  2. 修改如下调用函数,增加参数min_score_thresh=0.3,即将输出分数阈值由默认0.5改为0.3,并输出车牌carNO边框carNOboxs:
    在这里插入图片描述
  3. 增加存储车牌图片代码:将车牌carNO检测区域图片剪裁出来,存入自己的路径
    在这里插入图片描述
  • 修改目录/home/users/py3_project/models/research/object_detection/utils下visualization_utils.py文件,按照carNO给定颜色将车牌carNO的区域挑选出来(实际上是四个位置的比例情况),并把返回改为return image, carNOboxs:
    在这里插入图片描述

1.8.2 测试执行

使用 VNC-Viewer 客户端
执行依次测试多张图片:

# python3 test1.py datasetcarmore/5.jpg

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.8.3 结果分析

  1. 准确率:车牌carNO类别检测准确率能达到90%以上
  2. 检测样本多样性:以往模型对增强性(高斯模糊、高斯噪声等)样本进行测试,准确率很低;这次模型训练中加入了增强性样本后并进行测试,具有较强鲁棒性
  3. 不足:虽然能够检测倒立样本车牌,但过度倾斜的样本车牌没有检测出来,而车辆car类别能检测出来,说明可能样本的模型迭代次数较少,或者应该增加倾斜度较大的车牌样本进入训练。

二 车牌号预测

参考https://cloud.tencent.com/developer/article/1005199

2.1 模型结构

首先使用的是端到端的模型,不需对图片字母进行切割。识别的固定长度为7的车牌号,因为是固定长度,可以用七个模型按照顺序识别。由于卷积神经网络在扫描整张图片的过程中,已经对整个图像的内容以及相对位置关系有所了解,所以,七个模型的卷积层实际上是可以共享的。可以用一个一组卷积层+7个全连接层的架构。

在这里插入图片描述

2.2 模型结果

经过10轮的2000次训练之后,模型准确率达到了90%以上。

在这里插入图片描述
但是,由于模型中使用的是自动生成的车牌号样本(几十万个),用实际的车牌进行预测时发现结果并不是很理想,说明自动生成的图片与实际图片还是有很大出入,但是实际的车牌号样本数据集又很难收集到。当然,如果有足够的数据集时,也可以同样用深度学习目标检测的方法直接对车牌内的字符识别。

发布了48 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_29153321/article/details/103938331