基于 SoC 的卷积神经网络车牌识别系统设计(1)概述
NOTES:
这是第三届全国大学生集成电路创新创业大赛 - Arm 杯 - 片上系统设计挑战赛(本人指导的一个比赛)。主要划分为以下的 Top5 重点、难点、亮点、热点以及创新点:1、通过 Arm Cortex-M3 CPU 软核 IP 在 Xilinx Artix-7 纯 FPGA 平台上构建一个 SoC 片上系统,该系统一方面能够通过 HDMI 接口,在显示屏上实时显示 OV5640 摄像头所采集的车牌视频数据(比特流的生成是通过交叉编译的方式,即 Verilog 编译与 C 编译);2、该系统另一方面能够通过基于 FPGA 设计的 AI 神经网络硬件加速 IP(协处理器),实现车牌的字符识别并显示在 LCD 上;3、利用流水、并行、行缓存、分块、乒乓、稀疏卷积等等一些硬件的优化加速策略,达到更快的识别速度的同时,减少了 FPGA 硬件资源的使用;4、利用流水并行、资源共享、状态编码、基于状态机的操作数隔离等等一些低功耗设计,来减少该 AI 协处理器的功耗。
接下来,大致讲一下整体设计流程,主要分为系统的搭建和车牌的识别:
一、系统的搭建:
首先呢,就是系统的搭建(如上所示)。当然,在系统的搭建之前,需要先确定好硬件平台,如 Xilinx Artix-7 开发板(集成了 28nm 中端芯片)、OV5640 摄像头模块、HDMI 线以及 HDMI 显示屏模块(或者 FPGA 引脚杜邦线以及 LCD 显示屏模块)、JTAG调试器(VCC、GND、TCK、TMS)。另外,需要再确定好软件平台,如 Win10、Vivado 2018.2、Arm Keil uVision(MDK525)、PyCharm(OpenCV + TensorFlow)、JLink.exe、车牌生成器。因此,这是一个软硬件协同设计的智能 SoC 系统。
搭建的系统能够通过 HDMI 接口,在 HDMI 显示屏上(或者通过 FPGA 引脚在 LCD 显示屏上)实时显示 OV5640 摄像头所采集的车牌视频数据。(当然,这个功能描述的貌似简单粗暴,其实搭建起来能把你累成 Dog,其中就有 CPU 软核 IP 的导入与测试,AXI4 总线的互联,OV5640 和 HDMI 的 IIC 的设计,OV5640 和 HDMI 寄存器的配置,OV5640 解码模块的 IP 设计,VGA 行场同步的时序协议与基于 AXI4-Stream 流协议的数据流格式的转换,VDMA 和 DDR3 MIG7 的配置,以及许多常见的 Xilinx IP 如 Vid_In、Vid_Out、VTC 等等 IP 的载入与配置,Clock Wizard 时钟分频 IP 的添加与配置,最终还有 Xilinx Vivado Verilog 代码和 ARM Keil C 代码的交叉编译等等,哎,各个模块都是一门学问啊,贴出来的是一个简化版的系统搭建,只留下了 IP 和 AXI 总线)。
总而言之,系统合理地划分了软硬件的功能,充分地展示了异构平台的优势。
二、车牌的识别:
接着,就是车牌的识别。对于车牌的识别,主要分为车牌识别预处理(RGB2HSV、HSV2Binary、形态学)、定位、分割、缩放、卷积神经网络(字符识别)五大部分。(其它文献中分为车牌定位、字符分割、字符识别)。当然,在基于 Verilog 车牌识别设计之前,我们首先需要在 PyCharm 软件平台上进行设计、训练、测试与验证(AI 芯片开发都是这样的),例如在 PC 端进行车牌识别预处理、定位、分割、以及神经网络模型的训练,这里是基于 OpenCV 的车牌识别预处理和基于 TensorFlow 的神经网络框架训练的,训练的模型准确率能够高达 99%。通过获取所有识别车牌的训练集,即 00000→99999 ,训练完毕之后,通过对测试集测试能够达到一定的识别率之后,提取网络中的权重参数(全连接层占据主要部分,卷积层占据次要部分),便完成了能够在硬件上实现的固定的网络模型与参数(当然,量化、缓存与加速策略等等还是需要自己定的啦),然后便开始你的 AI 芯片设计,这里主要是作为 CPU 的一个协处理器,一个字符识别的硬件加速 IP。
软件平台实现之后,于是就生成了如下的车牌识别框图,从头到尾分别是 OV5640 输入、基于 OpenCV 的车牌识别预处理(RGB2HSV、HSV2Binary、Morphology)、定位、分割、缩放、基于 TensorFlow 的卷积神经网络(网络输入、第一层填充 + 卷积层 + ReLU + 池化层、第二层填充 + 卷积层 + ReLU + 池化层、全连接层、Softmax、网络输出)、LCD 显示。
哎,略显复杂,王者局的生活,往往就是这么朴实无华,且枯燥。
之后,我们便开始进行基于 FPGA 的硬件实现(准备开始我们的发际线推后之旅)(我太难了)。
原文链接:https://blog.csdn.net/MicroTalent12/article/details/106586328
基于 SoC 的卷积神经网络车牌识别系统设计(1)概述的更多相关文章
- 基于 SoC 的卷积神经网络车牌识别系统设计(0)摘要
NOTES:现如今,芯片行业无比火热啊,无论是前景还是钱景,国家芯片战略的发布,公司四五十万的年薪,着实令人非常的向往,为了支持芯片设计者,集成了工作.科研.竞赛于一体的<基于 SoC 的卷积 ...
- 基于Python的卷积神经网络和特征提取
基于Python的卷积神经网络和特征提取 用户1737318发表于人工智能头条订阅 224 在这篇文章中: Lasagne 和 nolearn 加载MNIST数据集 ConvNet体系结构与训练 预测 ...
- 深度学习基础-基于Numpy的卷积神经网络(CNN)实现
本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记.本文将介绍基于Numpy的卷积神经网络(Convolutional Networks,CNN) ...
- visualization of filters keras 基于Keras的卷积神经网络(CNN)可视化
https://adeshpande3.github.io/adeshpande3.github.io/ https://blog.csdn.net/weiwei9363/article/detail ...
- cnn 卷积神经网络 人脸识别
卷积网络博大精深,不同的网络模型,跑出来的结果是不一样,在不知道使用什么网络的情况下跑自己的数据集时,我建议最好去参考基于cnn的手写数字识别网络构建,在其基础上进行改进,对于一般测试数据集有很大的帮 ...
- 卷积神经网络CNN识别MNIST数据集
这次我们将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提升到99%,读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容. 程序的开头是导入TensorFlow: impor ...
- 使用Python基于HyperLPR/Mask-RCNN的中文车牌识别
基于HyperLPR的中文车牌识别 Bolg:https://blog.csdn.net/lsy17096535/article/details/78648170 https://www.jiansh ...
- 如何用卷积神经网络CNN识别手写数字集?
前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...
- 基于cifar10实现卷积神经网络图像识别
import tensorflow as tf import numpy as np import math import time import cifar10 import cifar10_inp ...
随机推荐
- Codeforces 1483F - Exam(AC 自动机)
Codeforces 题目传送门 & 洛谷题目传送门 一道 ACAM 的 hot tea 首先建出 ACAM.考虑枚举长串,以及短串在长串中出现的最后位置 \(j\),这个复杂度显然是 \(\ ...
- CSS区分Chrome和Firefox
CSS区分Chrome和FireFox 描述:由于Chrome和Firefox浏览器内核不同,对CSS解析有差别,因此常会有在两个浏览器中显示效果不同的问题出现,解决办法如下: /*Chrome*/ ...
- 巩固javaweb第十二天
巩固内容: HTML 图像- 图像标签( <img>)和源属性(Src) 在 HTML 中,图像由<img> 标签定义. <img> 是空标签,意思是说,它只包含属 ...
- Scala【需求二:求各省市的各个指标】
需求处理步骤 原始数据->json->过滤->列裁剪 需求二:求各省市的各个指标 原始数据 文本pmt.json,每一行都是一个json字符串.里面包含ip等信息 {"se ...
- 【Reverse】每日必逆0x03
BUU-刮开有奖 附件:https://files.buuoj.cn/files/abe6e2152471e1e1cbd9e5c0cae95d29/8f80610b-8701-4c7f-ad60-63 ...
- C++基本函数的调用优化(构造、拷贝构造、赋值)
合理的函数可提升时间和空间的利用率 //Test1.h #include<iostream> using namespace std; struct ST { private: int a ...
- An internal error occurred during: “Updating Maven Project”. Unsupported IClasspathEntry kind=4解决办法
An internal error occurred during: "Updating Maven Project". Unsupported IClasspathEntry k ...
- Local Classes in C++
A class declared inside a function becomes local to that function and is called Local Class in C++. ...
- redis入门到精通系列(八):redis的高可用--主从复制详解
(一)主从复制介绍 前面所讲的关于redis的操作都属于单机操作,单机操作虽然操作简单,但是处理能力有限,无法高可用.所谓高可用性,就是指当一台服务器宕机的时候,有备用的服务器能顶替上,在单机操作上这 ...
- 【编程思想】【设计模式】【行为模式Behavioral】策略模式strategy
Python版 转自https://github.com/faif/python-patterns/blob/master/behavioral/strategy.py #!/usr/bin/env ...