基于MAX78000的车牌识别终端
基于ADI公司的MAX78000 Feather开发板,设计了一套大陆地区普通蓝牌、普通黄牌(包括教练车)和新能源小型车的车牌号识别终端。
标签
嵌入式系统
人工智能
MAX78000应用设计大赛
3254545660
更新2024-01-10
东南大学
1260

1 项目摘要

基于ADI公司的MAX78000 Feather开发板,设计了一套适用于大陆地区普通蓝牌、单层黄牌和新能源小型车的车牌号识别系统,系统包含硬件——Feather开发板和屏幕拓展板;和软件——C编写的主控程序、MATLAB图像处理算法和CNN训练与综合过程使用的python脚本。该系统识别准确率高,实时性好,适合应用于国内绝大多数小型车停车场的车牌识别场景。


2 设计方案

下面从硬件和软件两部分介绍项目的实现过程。

2.1 硬件部分

硬件包括两个部分:MAX78000 FTHR开发板(核心);一个和FTHR开发板适配的屏幕拓展板(可选)。硬件部分组成如下图所示。

Fq4rMxGr3BqRXvY7gUGjN0g2tYl0

图 2. 1 硬件部分

2.1.1 MAX78000 Feather Board

MAX78000是ADI公司的一颗面向边缘人工智能的低功耗双核微控制器,一颗ARM Cortex-M4F核心工作在最大100MHz,支持硬件浮点运算,可以运行轻量的图形处理程序。而另一颗RISC-V协处理器则赋能了MAX78000智能DMA和丰富的外设控制接口。

MAX78000FTHR将图像和音频传感器集成在板上,为边缘人工智能常见应用场景提供了快速落地的条件。此外,还有板上Debuger,PMIC,外部SRAM等外设可用。

2.1.2 TFT屏幕拓展板

为了更加便利地与用户交互,本项目中设计制作了一款Pin2Pin适配Feather Board针脚的TFT屏幕拓展模块。使用的屏幕为一片0.96寸彩色TFT屏幕,驱动IC为NV3022B。这款小型屏幕不仅可以高帧率显示彩色图像,而且功耗小,显示时静态电流大小约为20mA。

为了降低项目的复现难度,作者编写了一个基于pythond的上位机程序用于替代这部分硬件,你可以在项目工程文件夹中的pc_utility中找到它和它的使用说明。但是,使用串口与上位机通信的速率不如直接显示到TFT屏幕上流畅,因此仍然建议在有条件时使用此拓展板。

此TFT拓展板还设计了一个使用ADM4073H电流感应放大器配合一个100mΩ的高侧分流电阻实现系统功率测量的电路。在编译固件时启用宏 POWER_MEASUREMENT 并借助示波器,可以测量系统在待机、图像处理、启动CNN这些不同阶段的消耗的功率信息。详细说明在第4章节。

2.1.3 其他

  • 锂电池:普通3.7V锂电池(充电电压4.2V),建议尺寸:宽度小于20mm,长度小于50mm。
  • SD卡(更确切地说,TF卡):能支持exFAT系统的TF卡即可(一般都可以),自备读卡器。
  • 线缆:锂电池连接板上的连接器需要PH2.0mm公头线端子。如果使用TFT拓展板上测量功率的功能,还额外需要一根PH2.0mm公对公的电线,用于连接TFT拓展板的Bat out和FTHR的电池输入。(请仔细检查不要接反!)

SD卡被用来记录成功识别的车牌图片,以及它的识别结果、被拍摄的时间(通过MAX78000的RTC功能实现)等信息。可以随时将SD卡取出,连接电脑并使用工程目录下的  ./pc_utility/SD_reader.py 读取图片信息。详见第3.3章节。

这部分硬件为非必须,不安装并不影响核心功能。

2.2 软件部分

软件方案如图 2. 2 所示。

zfcwJEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrKb37zfwCnFDDY6kfLzAAAAABJRU5ErkJggg==

图 2. 2 软件方案框图

将软件开发主要分为三个部分:

  • 图像形态学处理——主要基于MATLAB平台进行开发,在验证算法可行性后,使用MATLAB coder将生成的C代码嵌入到系统中。
  • 卷积神经网络训练与部署——在Linux环境下使用ADI提供的ai8x-training和ai8x-synthesis进行训练和部署。
  • 外设控制和流程逻辑——使用Analog-Devices-MSDK提供的GCC编译链和OpenOCD调试工具,利用VSCode协同开发和调试。

2.2.1 图像形态学处理

这一步的目的是从摄像头采集的数据中提取得到单个车牌字符的图片,将每个字符的灰度图处理成符合CNN网络输入要求的规格,以便于后续识别。

在这一部分中,单片机中以行优先存储的RGB888格式的一维图像数组,会整理成矩阵的形式,并利用传统的图形学算法进行图像处理,主要处理过程如下:

1. 通过RGB转HSV格式,对图像的Hue通道分别在黄色、绿色、蓝色色域内积分,比较积分结果大小判断车牌类型。(普通黄牌的Hue值在40°附近;新能源车牌的Hue值在160°附近;普通蓝牌的Hue值在200°附近。)

2. 通过将图像二值化后进行开闭运算,得到车牌字符所在的区域,用一个BBox [左端点, 上顶点, 宽, 高] 表示。此过程的结果如图 2. 3 所示。

xuNuk1lZuUEowAAAABJRU5ErkJggg==

图 2. 3 一个BBox的示例

3. 对BBox内区域按列求和得到宽度方向上的灰度直方图,通过分析零点位置分割得到每个字符的左边界和右边界。

bq2yCxdewRAAAAABJRU5ErkJggg==

图 2. 4 一个典型的BBox内图像的空域灰度直方图

4. 根据得到的左边界和右边界位置,从原灰度图像中单独提取出字符的图像,并将其统一填充到25x45像素——符合后续CNN处理的图像尺寸。

2.2.2 数据集LPchars_66的制作

本次项目使用的数据集是在CBLPRD_330k数据集的基础上,使用类似2.2.1节中的图像形态学算法提取字符,然后辅以人工筛选得到的。我制作的这个数据集具有17733个样本、涵盖10个数字+24个字母(不含”I”、”O”)+32个汉字(31地区简称+"学",不含"警"、"挂"、"领"、"使"、"临"),数据集中的车牌字符均为高45宽25像素的灰度图,以.png格式保存。该数据集命名为LPchars_66。

CBLPRD_330k在github上开源:https://github.com/SunlifeV/CBLPRD-330k,它是使用GANs网络生成的一个含有330,000张国内不同种类车牌图片的数据集。它覆盖的种类包括”黑色车牌”, “单层黄牌”, “双层黄牌”, “普通蓝牌”, “拖拉机绿牌”, “新能源大型车”, “新能源小型车”;覆盖的地域包括除中国台湾省外的所有国内地区。

制作本次项目的数据集,只需要使用CBLPRD_330k中的单层黄牌、普通蓝牌和新能源小型车。在本项目的开源链接中可以找到生成LPchars_66数据集的MATLAB脚本。

该脚本使用的字符提取算法与2.2.1节中略有区别,这些不同是为了提取CBLPRD_330k中的一些识别难度较高的车牌图片而设计的。具体有如下几点:

  1. CBLPRD_330k中的图片尺寸(48x128)与摄像头拍摄的图片尺寸(80x160)的长宽比不同,为了保证字符在图片尺寸变换中不变形失真,需要先将CBLPRD_330k中的图片在高度方向上插值到64像素(或简单地在上下各填充9x128像素的区域),再插值到80x160像素,进行后续形态学处理。
  2. 为了应对CBLPRD_330k中部分车牌歪斜角度较大的情况,使用连通区域的最小外接矩形算法,而非简单的矩形外框来锁定字符区域。在确定最小外接矩形后,计算矩形的长边从水平方向向逆时针方向倾斜的角度,再将整个图片向顺时针方向旋转这个角度修正得到水平的字符区域,便于后续字符提取处理。
  3. 在查找每个字符的左右边界时,自适应地调整图像二值化阈值,在连续提取失败次数超过设定值时,函数再退出。这样做能最化字符提取成功的概率。但是,在一些情况下——例如原图片对比度过低,或车牌外区域存在类似字符状的纹理对车牌形成干扰——仍然可能导致提取字符出错的情况,因此需要辅以人工筛除出错的数据。

iZgAiZgAiZgAiZgAo0SsMPaKG6fzARMwARMwARMwARMIJWAHdZUYt7fBEzABEzABEzABEygUQJ2WBvF7ZOZgAmYgAmYgAmYgAmkErDDmkrM+5uACZiACZiACZiACTRK4P8Dw292YLzkrOkAAAAASUVORK5CYII=

图 2. 5 本项目制作的LPchars_66数据集中字符”8”的部分展示

使用LPchars_66的注意事项:

  • 由于数据集已按照图片label命名文件夹的形式来组织数据样本,因此推荐使用torchvision.datasets类的ImageFolder()方法加载数据集。
  • 读取.png文件时,ImageFolder()默认加载为3通道图像,因此要使用transforms.Grayscale()将其灰度化。
  • 此次开源的LPchars_66为v1版本,仍然可能有极少数被错误分类的数据没有在人工筛除时被发现。

2.2.3 卷积神经网络训练过程与结果

本次项目的卷积神经网络” ai85licenseplaterecog”参考了SimpleNet_v1的架构,但是在Padding以及核的尺寸上有一定区别。该车牌字符识别网络的结构如图 2. 6所示(其中每个中间结果的尺寸以HWC顺序描述)。

wHPGWXDmf+KBAAAAABJRU5ErkJggg==

图 2. 6 ai85licenseplaterecog的网络结构

这个网络定义在”ai8x-training/models/ai85net-LicensePlateRecog.py”中。

为了便于后续模型参数的量化,训练使用量化感知训练(QAT),除了动态调整学习率需要准备的 compresssion policy外,训练还需要 QAT policy,用来指定训练过程中各个层的参数如何量化。

./policies/schedule-LicensePlateRecog.yaml:

---
lr_schedulers:
  training_lr:
    class: MultiStepLR
    milestones: [80, 110, 150]
    gamma: 0.25

policies:
  - lr_scheduler:
      instance_name: training_lr
    starting_epoch: 0
    ending_epoch: 200
    frequency: 1

./policies/qat_LicensePlateRecog.yaml:

---
start_epoch: 80
shift_quantile: 0.985
weight_bits: 2
overrides:
  conv1:
    weight_bits: 8
  conv2:
    weight_bits: 4
  conv11:
    weight_bits: 4
  conv12:
    weight_bits: 4
  conv13:
    weight_bits: 4
  conv14:
    weight_bits: 4

train.py已由官方写好,只需要在./scripts/下新建我们的训练脚本train_LicensePlateRecog.sh:

#!/bin/sh
python train.py --epochs 200 --optimizer Adam --lr 0.001 --wd 0 --compress policies/schedule-LicensePlateRecog.yaml --model ai85licenseplaterecog --dataset LPchars_66 --device MAX78000 --batch-size 128 --print-freq 10 --validation-split 0 --qat-policy policies/qat_LicensePlateRecog.yaml --use-bias "$@" --gpus 0

训练完成后,./logs下会保存训练的日志和CheckPoint文件:

./logs/2023.11.02-194315/

├── 2023.11.02-194315.log

├── best.pth.tar

├── checkpoint.pth.tar

├── configs

│   └── schedule-LicensePlateRecog.yaml

├── qat_best.pth.tar

└── qat_checkpoint.pth.tar

其中”qat_best.pth.tar”是使用QAT得到的权重文件,它将被用于后续的量化。

在正式开始量化之前,我们使用下面的脚本来评估该模型的训练结果,./scripts/evaluate_LicensePlateRecog.sh:

#!/bin/sh
python train.py --model ai85licenseplaterecog --dataset LPchars_66 --confusion --evaluate --device MAX78000 --exp-load-weights-from ../ai8x-synthesis/trained/ai85-licenseplaterecog-qat8-q.pth.tar -8 --use-bias --save-sample 1 "$@"

使用--save-sample 1将测试集的第一个样本保存为.npy文件,用于之后的网络验证。此处的评估结果显示在具有692个样本的测试集中,我们训练的模型达到了99.57%的正确率。Confuse Matrix如图 2. 7所示。

FgSALUPqk9g50ulbMFAZ0SaZt8o-

图 2. 7 评估结果的Confuse Matrix

2.2.4 卷积神经网络的量化与部署

在开始量化之前,需要一个.yaml文件来描述网络结构,并指定每个卷积层中各个通道由MAX78000器件中的哪个CNN加速器单元负责运算。即./networks/licenseplaterecog-hwc.yaml :

---
# HWC (little data) configuration for CIFAR-100
# Simple Model

arch: ai85licenseplaterecog
dataset: LPchars_66

layers:
  - out_offset: 0x2000
    processors: 0x0000000000000001  # 1
    operation: conv2d
    kernel_size: 3x3
    pad: 0
    activate: ReLU
    data_format: HWC
  - out_offset: 0x0000
    processors: 0x00000000000ffff0  # 2
    operation: conv2d
    kernel_size: 3x3
    pad: 0
    activate: ReLU
  - out_offset: 0x2000
    processors: 0x000000fffff00000  # 3
    operation: conv2d
    kernel_size: 3x3
    pad: 1
    activate: ReLU
  - out_offset: 0x0000
    processors: 0x0fffff0000000000  # 4
    operation: conv2d
    kernel_size: 3x3
    pad: 1
    activate: ReLU
  - max_pool: 2
    pool_stride: 2
    pad: 1
    operation: conv2d
    kernel_size: 3x3
    activate: ReLU
    out_offset: 0x2000
    processors: 0x00000000000fffff  # 5
  - out_offset: 0x0000
    processors: 0x000000fffff00000  # 6
    operation: conv2d
    kernel_size: 3x3
    pad: 0
    activate: ReLU
  - out_offset: 0x2000
    processors: 0x0fffff0000000000  # 7
    operation: conv2d
    kernel_size: 3x3
    pad: 1
    activate: ReLU
  - max_pool: 2
    pool_stride: 2
    pad: 1
    operation: conv2d
    kernel_size: 3x3
    activate: ReLU
    out_offset: 0x0000
    processors: 0x00000fffffffffff  # 8
  - out_offset: 0x2000
    processors: 0x0000ffffffffffff  # 9
    operation: conv2d
    kernel_size: 3x3
    pad: 1
    activate: ReLU
  - max_pool: 2
    pool_stride: 2
    pad: 1
    operation: conv2d
    kernel_size: 3x3
    activate: ReLU
    out_offset: 0x0000
    processors: 0x0000ffffffffffff   # 10
  - max_pool: 2
    pool_stride: 2
    pad: 0
    operation: conv2d
    kernel_size: 1x1
    activate: ReLU
    out_offset: 0x2000
    processors: 0x00ffffffffffff00  # 11
  - out_offset: 0x0000
    processors: 0xffffffffffffffff  # 12
    operation: conv2d
    kernel_size: 1x1
    pad: 0
    activate: ReLU
  - max_pool: [2,1]
    pool_stride: 1
    pad: 1
    operation: conv2d
    kernel_size: 3x3
    activate: ReLU
    out_offset: 0x2000
    processors: 0xffffffffffffffff  # 13
  - out_offset: 0x0000
    processors: 0xffffffffffffffff  # 14
    operation: conv2d
    kernel_size: 1x1
    pad: 0
    output_width: 32
    activate: None

然后使用下面的脚本进行量化。./scripts/quantize_licenseplaterecog.sh:

#!/bin/sh
python quantize.py trained/ai85-licenseplaterecog-qat8.pth.tar trained/ai85-licenseplaterecog-qat8-q.pth.tar --device MAX78000 -v -c networks/licenseplaterecog-hwc.yaml "$@"

得到量化之后的权重文件"ai85-licenseplaterecog-qat8-q.pth.tar"后,就可以用它来生成最后的C工程代码了。

./scripts/gen_licenseplaterecog_max78000.sh:

#!/bin/sh
DEVICE="MAX78000"
TARGET="sdk/Examples/$DEVICE/CNN"
COMMON_ARGS="--device $DEVICE --timer 0 --display-checkpoint --verbose --fifo --boost 2.5 --compact-data --mexpress --overwrite"

python ai8xize.py --test-dir $TARGET --prefix licenseplaterecog --checkpoint-file trained/ai85-licenseplaterecog-qat8-q.pth.tar --config-file networks/licenseplaterecog-hwc.yaml --sample-input './tests/sample_lpchars_66.npy' --softmax $COMMON_ARGS "$@"

2.2.5 外设控制与流程逻辑

这个部分的主要工作包括与外设的通信(调试OVM7692图像传感器和TFT的驱动程序),和设计一个合理的代码流程,使得拍摄过程能尽可能流畅地显示到屏幕上,同时使得SRAM占用尽量小——一张80x160的RGB图片将占用近40KB的空间,不合理的流程设计带来额外的SRAM占用将使得图像处理算法无法运行。程序流程图如图 2. 8所示。

wEgDFoIBe2hvwEgDFAF4ywEsAFAN4yQAvAVAM4CUDvARAMYCXDPASAMUAXjLASwAUA3jJAC8BUAzgJQO8BEAxgJcM8BIAxQBeMsBLABQDeMkALwFQDOAlA7wEQDGAlwzwEgDFAF4ywEsAFAPy0j8Dmv8FvARAISAvAQO8BEAB4OMRaOAlAArAPwCbv+VqAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAYfPgwf8ADmweJgQVpjkAAAAASUVORK5CYII=

图 2. 8 程序流程图

其中形态学处理和BBox提取的过程需要针对SRAM占用进行特别优化,尽量使用原位计算。在所有的函数中应当尽量避免使用静态存储区,尤其是应当将大型数组分配在堆栈上,或者使用动态内存分配。


3 项目展示

3.1 使用TFT Extension Board进行户外识别测试

FntHI4zUPFzMenUIEu5qfpCpd17P

图 3. 1 普通蓝牌测试结果(拍摄于户外,下午4:24)

FsxBSfAwxJrVk4irOIQczEWYXxMd

图 3. 2 小型新能源测试结果(拍摄于地下停车场)

 

3.2 使用上位机软件(LicensePlateRecog.py)

如果条件有限,没有此项目的TFT拓展板,但仍希望在不进行任何代码移植的情况下复现项目,可以使用 项目工程目录下 ./pc_utility/ 下的 LicensePlateRecog.py 来接收来自MAX78000的图像和文本信息。使用前确保烧录的固件是未定义 TFT_ENABLE 的情况下编译的。

这是一个基于tkinter的图形界面程序。在使用之前,请阅读 ./pc_utility/ 目录下的自述文件readme.md,并按照要求安装python环境。

使用USB连接MAX78000FTHR与电脑,找到对应的COM端口号,即可以运行上位机程序。

FtJEapI93W6tzkmXcX02qbn-nGgJ

图 3. 3 使用上位机接收图片和识别结果

但是,限于串口通信速率,使用上位机传输图片具有较高的延时(数百毫秒级),因此还是推荐在有条件的情况下使用TFT拓展板来显示图像。并且,在有TFT拓展板的情况下,这个上位机程序仍然是有用的,它可以用来接收识别结果的文字信息,还有MAX78000的RTC时间信息。除此之外,也可以当做一个串口用来调试。

3.3 读取SD卡中的图片数据(SD_reader.py)

在检测到有SD卡正确插入时,MAX78000会将识别的图片的相关信息以二进制格式保存在SD卡中。其中包含拍摄的时间信息,该时间来自于MAX78000的RTC外设,由于脱机校时十分麻烦(尤其是系统硬件按键数量有限,软件UI较简陋时),我把校时功能放在了此程序(SD_reader.py)中。这个python程序会根据上一次编译烧录的时间,和MAX78000保存在SD卡中的RTC时间,计算出真实的拍摄时间。前提是MAX78000在使用过程中没有被复位(包括掉电、重新烧录、手动复位)。

将SD卡插入电脑,修改程序中SD卡对应的盘符并运行。该程序会读取SD卡内的所有由MAX78000写入的图片数据,并在 ./pc_utility/SD_imgs 中以png格式生成拍摄的图片。

图片文件名将会被命名为下面的格式:

img<序号> <车牌类型> <车牌号> <拍摄日期> <拍摄时间>.png

例如:

img0003 普通蓝牌 京N8P8F8 2023-11-20 22_59_13.png

FoHhRh1r8Ft_b0Fcw6mU3aGMSZ1-

图 3. 4 使用SD_reader.py读取SD卡


4 系统功耗

在TFT拓展板上设计了一个使用高侧电流感应放大器ADM4073用来测量电池电流的电路,如图4.1所示。

ADM4073是ADI公司的一款紧凑型、低成本的高侧电流感应放大器,能够支持2-28V的宽共模电压输入,并且供电电压可低至3V,非常适合此类电池应用。它的供电电流仅需0.5mA。

由于此处要测量的电流含有高频成分(来自后级开关电源MAX20303内部MOS管的开关操作),因此为了得到更精确的瞬态电流测量,要求电流感应放大器具有足够大的带宽。ADM4073具有1.8MHz的宽带宽,可以满足本次测量的需求。

Fh3dxJhEXhwtO924IkywfK54YmLx

图 4. 1 电流检测电路

通过在编译工程源码时使能 main.h 中的POWER_MEASUREMENT 宏,MAX78000会通过引脚P2.7的电平指示其运行的各个阶段,这是为了便于观察系统在初始化、分割字符以及开启CNN这几个不同阶段的功耗。

使用示波器的三个表笔分别连接放大器输出,电池正极,以及P2.7引脚输出。连接方式可见图4.2。

FiUJppxOBibzHIwoRoQssKVxCjQ4

图 4. 2 借助示波器测量系统功率(无需昂贵的电流探头)

其中注意:

  • 检流放大器输出的是幅度较小且含有高频成分的模拟信号,应使用接地弹簧确报最小接地回路,减小干扰;
  • 测量电池电压的C2通道可以限制输入带宽20MHz或更小来减小噪声。C1和C3通道则使用全带宽。
  • ADM4073的输出阻抗为12kΩ,示波器表笔输入阻抗为1MΩ,因此真实的放大器输出电压应当在C1测量的电压基础上乘以 (12k + 1M)/(1M) 来修正结果。

触发通道选择C3,调整好时基参数和各通道后即可通过单次触发得到运行例程时的功耗信息。

编写一个MATLAB程序处理示波器数据,得到图4.3所示的曲线。

本次例程中采集的波形,以及MATLAB程序将一并开源在 "./Software/MATLAB/PowerMeasurement/"中。

FijjPx0h_lLDV8WZchJ2ef4xbRzp

图 4. 3 识别"藏ADM6441"例程中各阶段的功耗信息

对每一个采样点的电池电流与电压之积相加求和,再除以采样点数,就可以得到这段采样时间内的平均功耗。据此,可以计算出:

 

初始化阶段

平均值

提取字符阶段

平均值

CNN阶段

平均值

提取字符与CNN两阶段平均值

全过程

峰值 *

电流 (mA) 32.87 52.05 58.90 52.78 134.09 *
功率 (mW) 126.74 200.25 226.43 203.03 514.01 *

 * 电流峰值出现在CNN阶段。由于电池输入端为一个开关电源,电流含有高频尖峰脉冲,因此峰值功率的参考意义有限。

从以上图表中可以直观地得出MAX78000搭载的CNN加速器不仅速度快,而且功耗低(仅比静态时高出13.08%),尤其是考虑到板上的TFT屏幕仅背光就需要消耗近20mA的电流时,更显其低功耗的特性。

假设系统始终工作在最耗能的“CNN阶段”,则本项目搭载的一颗650mAh的微型锂电池可以支持系统持续运行约11.2小时;若以后两个阶段的平均功耗来估算,则可支持系统运行12.32小时,而识别一张车牌不超过343ms,因此在连续识别的情况下能支持识别 12.32*3600*1000 (ms) / 343 (ms) ≈ 12.922 万张车牌图片。

而且,这是一个保守估计。因为识别新能源车牌CNN需要启动8次,而识别单层黄牌和普通蓝牌只需要启动7次,CNN耗时只有约18ms。所以实际能耗会比上面的估算更低。


5 后续改进方向

系统实现了三种车牌的高准确率识别,但是对拍摄角度、清晰度有一定要求。这一方面是为了简化图像处理算法,另一方面是更大尺寸的彩色图片无法直接存放在片上RAM中,为了支持更加复杂的拍摄情形,除了需要设计图像矫正算法外,还需要考虑使用外部SRAM或者利用CNN加速器中的缓存区来存放图片和中间结果。

根据系统功耗的测试结果,主要能耗存在于反复采集图像以及字符提取的过程中,因为它们的耗时太长。可以通过改进算法,尝试训练一个U-Net模型识别车牌位置,提高处理速度,进一步减小功耗。


最后,我想感谢硬禾学堂提供的这次平台和机会,也感谢ADI工程师的对参赛选手的答疑和支持!我学到了很多新知识,也亲自体验到了边缘AI计算的强大之处。谢谢大家!

物料清单
附件下载
LicensePlateRecog.zip
硬件:TFT拓展板的KiCad工程。软件:Linux环境下的训练和综合脚本;项目用到的MATLAB代码;被修改过的MaximSDK库文件(请直接复制并替换原来的库文件);VSCode工程。
LPchars_66.7z
我制作的车牌字符数据集,含有66种字符,包括32个中文字符,10个数字字符,24个字母字符。已经划分好了训练集和测试集(同时也用作验证集)。
团队介绍
东南大学学生
团队成员
3254545660
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号