|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 g# {" j$ I. c/ c P) c$ M8 \) ~数据集
; ?; f6 b) N+ c/ k/ y* ~手写数字识别的MNIST数据集(网站)广泛应用于计算机视觉领域。然而,并不适合在我们的应用中训练神经网络,因为它与相机图像有很大的不同。主要区别包括:1 {9 M' n3 h3 M8 G" p
●MNIST图像是深色背景上的浅色数字,与来自摄像头的图像相反(下图中A来自MINIST,B来自普通的相机);# b3 U. Q7 g& H4 ?! E& I
●摄像头产生彩色图像,图像大小为320×240像素,而MNIST是灰度的MNIST图像大小为28×28像素;% ^) a6 _0 Y4 U3 O
●与MNIST图像中居中放置的数字和相同背景(黑色)不同,数字可以在相机图像中移动和轻微旋转,有时背景中会有噪声;4 j/ y/ d) U% c# A( [
●MNIST没有单独的数字图像类别。
# R! S: R5 h+ S8 H5 |' q5 M9 C7 M0 \3 X( e
鉴于MNIST数据集的识别性能非常高,我们将摄像机图像的大小减少到28×28像素,并将其转换为灰度。这有助于我们解决以下问题:
' F+ N+ e3 X8 t7 [●识别的准确度没有明显损失,因为即使在小图像中,数字仍然很容易被识别;- Q v! Q/ W: V& N
●对于数字识别而言,颜色信息过多,所以转换成灰度图像刚刚好;
% ]$ H6 c0 h0 S6 q0 {●通过减少和平均相邻像素,可以清除来自摄像机的噪声图像。" C# s+ w! j8 c( x, p2 W1 S" H- }6 B
由于图像变换也是在硬件级上执行的,因此必须预先考虑最小的一组算术函数,这些函数可以有效地将图像转换为所需的形式。修改摄像头图像的算法如下所示:
% g; \0 F" A# ]/ o/ c●从320×240图像中裁剪出一个中心部分,该部分测量224×224像素,由于224=28×8,因此随后可以轻松过渡到所需的图像大小。
! j# d$ g& \. ?, N/ T●然后,将裁剪的图像部分转换为灰度图像。由于人类视觉感知的特殊性,我们采用加权平均,而不是简单的平均。为了便于在硬件级别进行转换,使用以下公式:
. p! p$ S D0 z9 d) @BW=(8xG+5xR+3xB)/16: C3 S0 A, C) W9 g+ T: u
即RGB的权重为5:8:3$ T5 X" Z, `5 `2 H9 q9 l
为了便于FPGA编程实现,我们可以在FPGA中使用移位实现8的乘法和16的除法。
! Z" e4 Y2 ^$ p% T; y最后,将224×224图像分割成8×8块。我们计算每个块的平均值,在28×28图像中形成相应的像素。
! Y1 M) e& r! P由此产生的算法简单,适合FPGA实现并且速度非常快。
2 q* ?( X6 w7 E" o为了使用MNIST图像训练神经网络,需要把MINIST训练集进行修改:
. v$ @: G2 U- p, L●颜色反转;
6 R/ k- P8 l2 j& _0 T" L% \; u●在两个方向上随机旋转10度;
6 T; A0 u) }/ s9 E% A8 ~●图像随机扩展或缩小4像素;
1 Z2 {) A6 w3 p●图像强度的随机变化(从0到80);
& w, z5 a( E% f: \0 H; c" O: ]6 Q●增加0%至10%的随机噪声。) v8 R( v# X$ @9 N( f
●将来自摄像头的图像混合到训练集中。. ~3 W4 y' h8 h# ~ H1 e
上诉操作可以使用MATLAB或者python批量处理。0 p) w; u- w; b0 f% _: p0 A
( z8 F% F9 n/ XCNN设计
% o4 |+ F, D6 |' a- S6 }CNN的体系一直在发展(也就是为什么ASIC没有批量生产,还用FPGA验证一些CNN最新的算法),但是本质仍然是一样,因为我们使用的FPGA是一个入门型的,所以我们也不用最新的CNN。
: x, D/ u. X5 _+ I; ]CNN的本质:输入大小从一层到另一层减小,而过滤器的数量增加。在网络的末端,形成一组特征,这些特征被馈送到分类层,并且输出层指示图像属于特定类别的可能性。* f- x3 ^0 P4 i# v8 G! C/ o
& i7 P& W8 Y" _由于使用FPGA实现所以权重的总数对于设计来说是个瓶颈,所以需要最小化存储权重的总数(这对于移动系统至关重要),并促进向定点计算(FPGA只能进行定点计算)的转移:
% I! K: j; \) X尽可能减少完全连接层的数量,这些层消耗大量的权重;3 B. x& y& U( j8 V( G( Q
在不降低分类性能的情况下,尽可能减少每个卷积层的滤波器数量;
, h3 B- n& f! p! w+ C4 F$ b( t5 w不使用偏差,当从浮点转换为定点时,添加常数会妨碍值的监控范围,并且每层上的舍入偏差误差会累积;
6 S. Q) f: w5 H Z0 |- V使用简单类型的激活,如RELU(线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元),因为其他激活,如Sigmoid和Tahn,包含除法、求幂和其他难以在硬件中实现的运算;' f( L$ `3 |& N9 Q+ Z
尽量减少异构层的数量。7 L( ?$ \1 c6 u3 h+ |* \& w) E
在将神经网络转换为硬件之前,在准备好的数据集上对其进行训练,并保留软件实现的方式以供测试。使用Keras和TensoRFlow后端的软件实现。* ~# S& |2 A7 o3 f4 Z( [3 q# _' X( B
/ s! E& _* v0 S+ c
& d [* q: q. ^: u, @ |
|