基于V831实现车牌识别

一、车牌识别视频展示

车牌识别

二、V831介绍

V831模块主要是应用在AI+IOT+音视频处理的开发板,芯片是全志的,支持常规的Linux开发。能够实现AI图像和物体识别、AI语音识别、AI人脸识别、AI车牌识别、小车巡线以及传统OpenCV和常用的硬件外设等。
在这里插入图片描述
软件上除了支持全志提供的资料进行开发,还支持非常方便的Python SDK,本项目就是使用的Python进行开发的,非常友好和快速就完成了。

在这里插入图片描述

详细的资料也可以在这里找到。

三、所需硬件

  • V831模块目前在某宝上是286元(配有镜像卡)
  • 读卡器

四、所需软件(在本次车牌识别中用不到)

五、环境搭建和运行

5.1、模型下载

此车牌识别是直接用的官方提供的模型库,当然可以训练。
在这里插入图片描述
模型下载地址,直接点击下载即可。将下载的模型放在一个你能找到的地方,后面会用到。

5.2、将模型放入V831中

  1. 将镜像卡(SD卡)插入到V831中,官方提供的镜像卡是自带镜像的,如果没有镜像需要烧录镜像,烧录镜像的方法可以参考这里的步骤。
  2. V831有两个USB口,左侧的USB口,使用数据线连接电脑,会出现一个U盘,将上面下载的模型的所有文件解压后拷贝到U盘里的app/目录下,然后记得查看一下,app文件夹下载有没有main.py文件。
  3. 弹出U盘

5.3、运行,见证奇迹

V831上面提到有两个USB口,这时就要换成右侧也就是视频中演示的这一侧的USB口,插上之后找一张图片试一下吧。
当出现画面模糊的时候,是摄像头没有对焦,摄像头上是可以转动的,进行转动对焦即可。
在这里插入图片描述

六、所用模型

包含了 2 个模型
该模型采用检测+识别两段任务的方式完成车牌检测,完整模型包含一个检测模型和一个识别模型。
第一个阶段是该模型借鉴了Retinaface模型结构,从而完成检测图像中车牌位置
第二个阶段是采用CTC的方式进行车牌内容识别

下载的模型中的主要代码(以实际下载的模型为准)

from time import time

class LPR:
    loc_model_path = {
        "param": "/root/app/slim_awnn.param",
        "bin": "/root/app/slim_awnn.bin"
    }
    loc_model_options = {
        "model_type":  "awnn",
        "inputs": {
            "input0": (224, 224, 3)
        },
        "outputs": {
            "output0": (1, 4, 2058),
            "output1": (1, 2, 2058),
            "output2": (1, 8, 2058),
        },
        "mean": [127.5, 127.5, 127.5],
        "norm": [0.0078125, 0.0078125, 0.0078125],
    }
    reg_model_path = {
        "param": "/root/app/lpr_awnn.param",
        "bin": "/root/app/lpr_awnn.bin"
    }
    reg_model_options = {
        "model_type":  "awnn",
        "inputs": {
            "input0": (24, 94, 3)
        },
        "outputs": {
            "output0": (68, 18, 1),
        },
        "mean": [127.5, 127.5, 127.5],
        "norm": [0.0078125, 0.0078125, 0.0078125],
    }

    chars =[ "皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑",
                    "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘" , "粤",
                    "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青" , "宁",
                    "新", "警", "学", "A"  , "B" ,  "C" ,  "D" ,  "E" ,  "F"  ,  "G",
                    "H" ,   "J" ,  "K" ,  "L" , "M" , "N" ,  "P" ,  "Q" ,  "R" , "S",
                    "T" ,  "U" ,  "V" , "W", "X"  , "Y" , "Z" , "0" , "1", "2", "3",
                    "4", "5", "6", "7", "8", "9", "-"]

    variances = [0.1, 0.2]
    steps = [8, 16, 32]
    min_sizes = [12, 24, 48, 96, 192, 320]

    def __init__(self) -> None:
        from maix import nn
        self.loc_model = nn.load(self.loc_model_path , opt = self.loc_model_options)
        self.reg_model = nn.load(self.reg_model_path , opt = self.reg_model_options)

        from maix.nn import decoder
        self.loc_decoder = decoder.license_plate_location([224,224] , self.steps , self.min_sizes, self.variances)
        self.reg_decoder  = decoder.CTC((1,68,18))

    def __del__(self):
        del self.loc_model
        del self.loc_decoder

    def cal_fps(self ,start , end):
        one_second = 1
        one_flash = end - start
        fps = one_second / one_flash
        return  fps

    def  draw_fps(self,img , fps):
        img.draw_string(0, 0 ,'FPS :'+str(fps), scale=1,color=(255, 0, 255), thickness=1)

    def draw_string(self , img , x , y , string , color):
        img.draw_string( x , y , string ,color = color)

    def draw_paste(self , src ,dst):
        src.paste(dst , 0 , 0)

    def draw_rectangle(self,img, box):
        img.draw_rectangle(box[0], box[1], box[2], box[3],color=(230 ,230, 250), thickness=2)

    def draw_point(self,img,landmark):
        for i in range(4):
            x = landmark[2 * i ]
            y = landmark[2 * i + 1]
            img.draw_rectangle(x-2,y-2, x+2,y+2,color= (193 ,255 ,193), thickness =-1)

    def process(self,input):
        loc_out = self.loc_model.forward(input, quantize=1, layout = "chw") # retinaface decoder only support chw layout
        boxes , landmarks = self.loc_decoder.run(loc_out, nms = 0.2 ,score_thresh = 0.7 , outputs_shape =[[1,4,2058],[1,2,2058],[1,8,2058]])

        for i,box in enumerate(boxes):

            landmark = landmarks[i][:6]
            reg_in  = input.crop_affine(landmark , 94 , 24)
            reg_out = self.reg_model.forward(reg_in ,  quantize=1, layout = "chw")

            LP_number = self.reg_decoder.run(reg_out)
            string_LP = ''
            for id in LP_number:
                string_LP += self.chars[id]
                # string_LP += str(id)

            self.draw_string(input , box[0], box[1] , string_LP  ,color=(225,0,0))
            self.draw_paste(input , reg_in)
            self.draw_rectangle(input,box)
            self.draw_point(input , landmarks[i])

def main():
    from maix import display, camera , image
    image.load_freetype("/home/res/sans.ttf")
    app  = LPR()
    while True:
        img = camera.capture().resize(size=(224,224))
        app.process(img)
        display.show(img)
        # break

main()
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值