Plate Recognition

项目名称:车牌识别
编程语言:C++/Python

电脑配置:
name: GeForce GTX 1060 major: 6 minor: 1 memoryClockRate(GHz): 1.6705
pciBusID: 0000:01:00.0
totalMemory: 5.94GiB freeMemory: 5.86GiB


Introduction:

        该项目是本人申请的研究生创新项目中的一部分,上接行人和车辆检测,当物体检测模型检测出行人和车辆以后,会把检测到的物体切割出来,然后把这些物体中的车辆图片输送到车牌识别模型中去,让系统模型去识别车牌,获取车辆的备案登记信息。


Framework:

HyperLPR 高性能开源中文车牌识别框架,  底层是用C/C++实现,支持多平台使用,这里只介绍linux系统上的使用。可以源码安装,也可以通过pip安装库文件,如下所示:

>> sudo pip install hyperlpr  (linux system)

这里还介绍一下另一个车牌识别框架EasyPR,该框架也是C/C++实现,支持多平台,该框架与HyperLPR最大的区别在于EasyPR的实现都是通过传统的图像处理方法实现的,就最后的字符识别使用了ANN,对于初学者使用有很大的知识积累和提高。


Demo:

# -*- coding:utf-8 -*-
"""
   the program only add nms to remove duplicate license plates on the original basis
   python:3.5
"""

import sys
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import hyperlpr as pr

# 當python版本爲2.7時,使用下面語句,解決編碼問題
# reload(sys)
# sys.setdefaultencoding('utf-8')


def _interval_overlap(interval_a, interval_b):
    x1, x2 = interval_a
    x3, x4 = interval_b

    if x3 < x1:
        if x4 < x1:
            return 0
        else:
            return min(x2, x4) - x1
    else:
        if x2 < x3:
            return 0
        else:
            return min(x2, x4) - x3


def bbox_iou(box1, box2):
    intersect_w = _interval_overlap([box1[0], box1[2]], [box2[0], box2[2]])
    intersect_h = _interval_overlap([box1[1], box1[3]], [box2[1], box2[3]])
    intersect = intersect_w * intersect_h

    w1, h1 = box1[2] - box1[0], box1[3] - box1[1]
    w2, h2 = box2[2] - box2[0], box2[3] - box2[1]
    union = w1 * h1 + w2 * h2 - intersect

    return float(intersect) / union


def nms(plate, thresh):
    plate = [idx for idx in sorted(plate, key=lambda x: x[1], reverse=True)]
    nums = len(plate)
    bbox = [pt[2] for pt in plate]

    for i in range(nums):
        for j in range(i + 1, nums):
            if bbox_iou(bbox[i], bbox[j]) >= thresh:
                plate.pop(j)

    return plate

if __name__=="__main__":
    image = cv2.imread("timg.jpg")
    plate = pr.HyperLPR_PlateRecogntion(image)
    nums = len(plate)

    if nums > 0:
        plate = nms(plate, 0.5)
        for i in range(len(plate)):
            p = plate[i][0]
            # p.decode('utf-8') # python2.7使用
            box = plate[i][2]
            cv2.rectangle(image, (box[0], box[1]), (box[2], box[3]), (0, 0, 255), 2)

            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            image = Image.fromarray(image)
            draw = ImageDraw.Draw(image)
            # simsun.ttc字体包可以从wins系统C:\Windows\Fonts复制到该项目下面
            font = ImageFont.truetype("simsun.ttc", 30, encoding='utf-8')
            draw.text((box[0], box[1] - 33), p, (255, 255, 0), font=font)
            image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)

        cv2.imwrite("res.jpg", image)
    else:
        print("The code cannot detect plates in the picture !")

Test:

原始图片
预测结果

分析:大体上预测结果还行,但是最左面这辆车却没有预测出来,模型预测一般。


Question:

pycharm导模块,模块名下有横线,且鼠标放上面,显示import resolves to its containing file  问题。

Traceback (most recent call last):
File "/home/ubuntu/dir/projects/hyperlpr/hyperlpr1/hyperlpr.py", line 60, in <module>  
plate = pr.HyperLPR_PlateRecogntion(image)
AttributeError: module 'hyperlpr' has no attribute 'HyperLPR_PlateRecogntion'

解决办法:这个问题其实很简单,是因为当前程序目录下有与模块名相同的程序文件,或者自己当前程序文件的名就是该模块名。把这个程序文件名换了就行了。

注:这里有点浪了,把代码的文件名和庫的文件名搞重复了,修改代码里面文件名即可。


参考链接:

1. HyperLPR Codes
2. 问题
3. HyperLPR 使用
4. HyperLPR 代码解读
5. EasyPR Codes
6. EasyPR Blog

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Leave a Reply

Your email address will not be published. Required fields are marked *