FakeLPR车牌识别(2) ----- 车牌角点定位

本文介绍了FakeLPR项目中车牌角点检测的步骤,包括生成车牌数据、训练LMDB文件及模型训练。通过将定位问题转化为多标签分类问题,使用Caffe实现模型训练,最终实现车牌的精确矫正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

前面一篇文章介绍了我这个 FakeLPR 大体的框架,基本上可归纳为三步

1.粗定位

2.角点检测矫正

3.端到端识别字符

 

第一步粗定位不需要特别准,能大体定位到就可以了,因为后面会把粗定位的结果按比例扩展,扩展出来的图包含了车牌在里面,要比粗定位结果大上几圈,以便于检测车牌角点。

本项目中没有训练车牌的粗定位模型,直接使用了 HyperLPR 的粗定位模型及相关代码。https://github.com/zeusees/HyperLPR

粗定位模型可以自行替换,自己训练个ssd,mobilenet-ssd,mtcnn都可以

 

本文主要介绍第二步,角点检测,模型主要思路是将定位问题转换为分类问题,利用 caffe 实现多标签分类来定位车牌角点


主要步骤

1.先生成车牌角点检测的训练数据和lmdb文件

# 从项目主目录里
cd train/datasets

# 生成角点检测训练数据
python creat_keypoint_data.py

# 生成角点检测lmdb文件
python creat_keypoint_lmdb.py

注:要是某个包导不进去,先注释掉试试,可能是我 import 多了,后同

2.启动训练

# 从项目主目录里
cd train

# 需要caffe环境
sh ./train_keypoint.sh

以上两步就可以训练出角点检测模型,模型文件保存在 .../FakeLPR/train/keypoint_snapshot

下面详细介绍一下


生成车牌数据

进入本项目文件夹,cd 到 train/datasets 文件夹,所有的生成数据都会在这个 datasets  文件夹下面进行

# 项目目录里
cd train/datasets

运行  creat_keypoint_data.py 生成角点检测训练数据

# 生成角点检测训练数据
python creat_keypoint_data.py

生成出来的文件夹有两个 keypoint_train_data 和 keypoint_test_data ,分别是训练和测试用,以 keypoint_train_data 为例

keypoint_train_data/data 下保存的是生成的图片,图片生成出来的样子是这样的,尺寸为 [748,280] 

生成出来的数据保存在 keypoint_train_data/plate.db 当中,数据结构如下

表名都叫 train,要看的话就

select * from train;

filename是主键,其他4个点就是八个数,分别保存,LU就是left UP,以此类推

 

其他说明

这个图片生成脚本主要分三个部分

第一个 class 生成一张蓝底的普通车牌的

第二个 class 对普通车牌进行随机变换,变得更像真的,变换部分代码参考了 Hyperlpr 的一个车牌变换程序

https://github.com/LCorleone/hyperlpr-train_e2e/blob/master/PlateCommon.py

最后一个就是随机生成车牌字符。

 

你可以在 creat_keypoint_data.py 的 main 函数中修改你需要生成的数据数量,

后面的 e2e 检测也是基于这里的数据来的,你可以多弄一些,不过生成速度堪忧

# 根据自己的需求设置
def main():

    ############# 生成图片数 ############
    creat_train_num = 100000
    creat_test_num = 1000
    #####################################

 

对于中文显示和保存的问题,取了个折中的办法,用拼音,拼音和省份的转换工具在脚本也有,在class Tool 中

province_change = [
        [u"京",'jing'], [u"沪",'hu'], [u"津",'jin'], [u"渝",'yu'], [u"冀",'jii'], [u"晋",'jinn'], 
        [u"蒙",'meng'], [u"辽",'liao'], [u"吉",'ji'], [u"黑",'hei'], [u"苏",'su'], [u"浙",'zhe'], 
        [u"皖",'wan'],  [u"闽",'min'], [u"赣",'gann'], [u"鲁",'lu'], [u"豫",'yuu'], [u"鄂",'e'], 
        [u"湘",'xiang'], [u"粤",'yue'], [u"桂",'gui'], [u"琼",'qiong'], [u"川",'chuan'], [u"贵",'guii'], 
        [u"云",'yun'], [u"藏",'zang'],[u"陕",'shan'], [u"甘",'gan'], [u"青",'qing'], [u"宁",'ning'], 
        [u"新",'xin'] ]

生出角点检测 LMDB 文件

生成完数据,现在要生成用于 caffe 训练的 LMDB 文件,这里要先讲一下这个模型思路

其实很简单,将定位问题转换为一个分类问题,再用多标签分类实现,我会将训练图像数据压缩到 [90,30] ,以宽为例,角点的y坐标经过压缩就在 [0,29] 之间,分类模型的输出设为30类,就能得到y坐标了。一共有4个点8个坐标,如此反复8次就得到了4个角点的坐标,实验结果在生成数据集上效果很好,而且这还有一个优点,就算没有准确分到那个类上,在准确值附近也是可以,类数越多定位越精确

本来这个思路需要8个模型,但是使用多标签分类的办法就可以一个模型搞定

另一个问题是 caffe 不支持多标签分类,如果不换框架的话网上的办法基本是改 caffe 源码,做hdf5文件或者用两个lmdb+Slice Laye的方法,因为我是在服务器上运行,源码改不了,hdf5又存在一个内存占用大的问题,所以用了两个lmdb+Slice Laye的方法来做 caffe 多标签分类,后面的端到端识别模型也是如此

 

运行  creat_keypoint_lmdb.py 生成角点检测训练用的两个lmdb文件

# 生成角点检测lmdb文件
python creat_keypoint_lmdb.py

生成的 lmdb 文件存在 .../FakeLPR/train/datasets/lmdb 文件夹下,两个 lmdb 分别对应着数据和标签

 

其他说明

多标签的 LMDB 生成代码参考自

https://blog.youkuaiyun.com/u013010889/article/details/53098346

 

这个脚本分两步,第一步会先读取 plate.db 文件,将需要的数据处理后,生成为一个 keypoint_label.txt 保存数据,txt 里面的格式为

就是文件名和4个点的坐标,顺序是左上,右上,左下,右下

然后再读取 txt 中的数据生成两个 LMDB

为什么不连在一起,这样做是因为方便从其他形式来导入数据训练,假如有小伙伴搞到了1w真实车牌的角点数据,就可以按照 txt 中的数据格式导,直接就能导成 LMDB文件了

    # 生成lmdb文件的两步
    def get_lmdb(self,db_path,img_path,pause):
        self.writeTXT_from_db(db_path,img_path) # db文件到txt文件
        self.totwolmdb(img_path,pause)  # 生成 LMDB 的

如果要自己弄数据,要注意的点坐标的比例变换,图片尺寸到类的比例要根据原图和类的比例来,例如我的,生成时是 [748,280],目标是 [90,30],所以坐标转换代码是

    def resize_point(self,line):
        # 你的源图片宽高
        # 可以读取图片来确定shape
        src_w = 748
        src_h = 280

        dst_w = 90
        dst_h = 30

        scale_x = float(dst_w)/float(src_w)
        scale_y = float(dst_h)/float(src_h)

        out_line = []
        for i in range(1,9,2):
            out_line.append(float(line[i]) * scale_x)
            out_line.append(float(line[i+1]) * scale_y)

        return out_line

训练

生成完就可以训练了

启动训练

# 从项目主目录里
cd train
sh ./train_keypoint.sh

模型文件保存在  .../FakeLPR/train/keypoint_snapshot


模型调用

这没什么好说的,代码在 .../FakeLPR/py2/keypoint.py 中

检测是用 opencv 的 dnn 模块直接调用

    def opencv34_test(self,ex_plate):
        ex_plate = cv2.cvtColor(ex_plate, cv2.COLOR_BGR2RGB)
        inputBlob = cv2.dnn.blobFromImage(ex_plate,1,(90, 30),(104, 117, 123))
        self.kp_net.setInput(inputBlob)

        # 取出prob层结果
        result_point = []
        for i in range(1,9,2):
            probx = self.kp_net.forward('prob_'+str(i))
            proby = self.kp_net.forward('prob_'+str(i+1))
            result_point.append([probx.argmax(),proby.argmax()])
        return result_point

再根据结果来透视变换,得到矫正车牌

    def warp(self,star_points,src_img):
        # 目标尺寸
        height = 35
        width = 110 

        pts1 = np.float32([star_points[0],star_points[1],star_points[2],star_points[3]])
        pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])  
        M = cv2.getPerspectiveTransform(pts1,pts2)  
        dst = cv2.warpPerspective(src_img,M,(width,height))  

        return dst

下一篇:FakeLPR车牌识别(3) ----- 车牌端到端识别

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值