找回密码
 注册
关于网站域名变更的通知
查看: 358|回复: 5
打印 上一主题 下一主题

FPGA图像算法实现——卷积、窗口运算之滑动窗口模块设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-9 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1概述   
+ ?) Z( \1 N, |. V) w5 ]' g0 k8 p/ m! U9 t
        在图像处理中,卷积、窗口运算是非常基础且常用的操作。这些基于图像滑动窗口的运算非常适合在FPGA中进行流水线实时高效处理,也是FPGA图像算法实现的一个热点。其中,最基础的工作就是在FPGA中设计一个滑动窗口模块。4 C+ X' s# R( @
        设计一个完备的滑动窗口模块首先要解决以下3个问题:
2 Y' O5 E1 d! g$ G4 K" q3 G
) b" E/ j" l4 R% e6 D图像行缓存机制# a5 w4 l4 l3 B5 Y/ R3 J  T
9 o! D" v; \* y( k& b) f
行、场等同步信号的延迟
: Y' v- P0 h1 J! S9 ~2 Q' f* `
% V  ]% l' t" t图像边界的扩展5 R; q; }5 s" j3 d# t
/ l/ Y5 X0 P4 B9 k- |0 ~
2 图像行缓存机制+ v& D, P. |: w7 B2 \! o' T

; W# t* M& w8 m( [        有2种实现方案:* F! x$ a, [8 e4 Q1 t4 N- m
! ?1 X6 F, B$ S: d3 v' ~8 W
        (1)使用FIFO或RAM按行缓存图像。
/ R# W6 g+ u0 F1 `
1 d! W; y0 T+ Y$ E' n1 H$ `        网上很多的博客和教程都是采用这种方案。例如,生成3×3的窗口需要缓存2行图像,消耗2个FIFO/RAM,FIFO/RAM最终都是消耗FPGA的块存储资源,消耗量与缓存行数成正比。每个FIFO/RAM都需要通过逻辑单独控制读写。FIFO/RAM都可在FPGA开发软件中例化IP核实现。9 N* P- S8 f5 i1 W! _
3 h  g! S/ t6 U0 _5 W1 m
        (2)使用单个RAM缓存所有行  Z. P, _. ^: w
( T0 O. r( U+ A( d
        例如,3×3的窗口通过1个RAM缓存2行图像。这种方案有2个优点。8 Q  E% I4 B* `  h* ^9 G

0 N' I, G" K& {/ m% f; `        首先,可以简化逻辑设计,因为无论需要缓存多少行图像,FPGA都只需要操作1个RAM的读写。' b7 x; ~5 ^/ B: \4 G- Z

3 k1 Z/ Y! m6 ~* }# ^) n        另外,充分利用FPGA块存储器位宽和深度的可变性。当位宽和总缓存量在单个块存储器的范围内,则仅使用1个块存储器就可以缓存多行图像,从而降低块存储器资源的消耗,尤其是当窗口尺寸较大时效果明显。
1 b5 i+ |/ E5 H
& x; K- l/ M* a$ S        例如,Xilinx 7系列FPGA的块存储器block ram可配置为1K×36bit的模式,可以缓存4行像素深度为8bit,宽为1024的图像,实现5×5滑动窗口的行缓存。2个1K×36bit模式的block ram就可以最多缓存9行8bit×1024的图像,以此类推。
, v! G: V/ T3 C  {0 X$ V
( L* Q6 h( d& W+ E        所以,推荐使用这种方案。! K6 l& A9 R5 l2 [6 ]
1 R0 \9 O* t! |& @
3 行、场等同步信号的延迟
0 P, J1 t0 Q& C$ h9 f; t& O. d& a4 s  y& ~/ u
        由于滑动窗口行缓存机制的存在,滑动窗口的输出相对于图像的输入存在一部分固定行数的延时,其对应的行、场同步信号也需要与之保持一致的延时。例如,3×3滑动窗口的输出至少会延时1行图像的时间,5×5窗口输出至少延时2行图像,以此类推,至少延时(窗口尺寸-1)/2行图像。$ q; `. q" a9 q/ }- `: d

+ O, C1 p4 }6 W        同步信号的延时方法通常有2种。

0 u- U/ C6 s' v" ]5 d+ x        (1)与行缓存方式类似,通过FIFO或RAM将输入的同步信号整体延时。! C/ u) d5 O5 P# f/ w5 ~( b! m  g

  u' j& j: {: f# D$ g9 B        这种方案的优点在于,输入和输出同步信号可以保持完全一致。缺点是需要消耗额外的FPGA块存储资源。
3 j; o- }8 {9 }; s
4 Q. S% L7 g3 R! T: z# _& \        (2)通过逻辑生成延时的同步信号。
. c7 w. u$ L8 m% |
: q4 ]( [3 `5 D) J1 R9 R4 {        这样不需要消耗FPGA块存储资源,但是需要设计单独的逻辑,而且也无法保证输出和输入同步信号完全一致。  Q& `; P  q9 F! n9 l9 u

+ R- ]; z- t3 D/ w8 m8 m        对于大多数应用场景,输入和输出同步信号不一致并不影响数据流和处理结果,对于FPGA而言块存储器资源比逻辑资源更稀缺。因此,实际应用中第2种方法更为常用。如果对同步信号时序有严格要求,那只能采用第1种方案。
" z  ?" ~0 I& |9 J
" U1 ~7 r0 F4 n4 图像边界的扩展
' W0 h9 n- z3 y5 A* o" a( p: y
3 `( h, \. I- _. v% P0 {) G4.1 边界扩展原理
  h5 g3 K  G- r$ d1 a% ^7 l
% I" t- t0 z) m; f1 @$ S. n        图像卷积或窗口运算,在涉及图像4周边界点位置的滑动窗口会出现部分像素点缺失,需要进行特殊处理。常用的策略包括忽略,补固定值,边界复制,边界镜像等等。
8 X- V+ `; S$ Q  {' b. o# F6 B2 ~! J& {; ]: D( G- J1 ^! _# k
        (1)忽略
, n! u4 o4 }- M$ L$ G) y* o0 G4 o5 e6 r6 ~! _* Z3 y" m/ O
        就是不对滑动窗口中缺失的像素点进行处理,直接用来进行计算,由于缺失像素点对应的FPGA触发器可能为任意值,所以边界像素点区域的运算结果会受到影响。但对于小窗口来说,影响较小,不容易察觉,可以采用。2 U) s! t" l/ N" k

5 W' t/ h9 n) F2 G. ]6 e        (2)补固定值
& ]3 U+ J: _9 E! p6 a, [6 D5 E: \
        同样会直接影响边界像素点区域的运算结果。但对于小窗口或者某些特定场景来说,也可以采用。  A) J0 o6 K; v: O% F; C

9 `7 u5 b* b  H9 |* r6 |7 \3 q        (3)边界复制
0 T0 K! `6 w2 K: G. ^2 ?9 v6 d3 \  S' s$ x
        就是直接复制4个边界的像素点到缺失的位置,对应的行列位置缺多少个就复制多少次。这是最常用的一种方法,matlab和opencv里也经常被使用。这种方式对边界点的计算结果影响很小。0 x, }1 }" d1 j5 H! W/ @" _, W
/ c) i0 k9 q; |
        (4)边界镜像0 q/ e0 U, ^- q/ Z; [6 h4 j
2 i- M6 W) M3 C2 W0 D
        就是以边界为对称轴,以镜像的方式复制边界区域的像素点。这种方式同样对边界点的计算结果影响很小,在matlab和opencv里也会被使用。# h4 h2 t/ V2 R+ w$ p! M

+ ?9 K( H. I1 Z$ v+ z/ V9 U4.2 FPGA实现图像边界扩展, A! s3 p" D+ ?3 J( p2 H3 Y8 ~
' T& {1 P4 O7 D/ E1 F
        在FPGA中进行边界像素点扩展有2种方式。1 J7 g7 S) k: q1 ^8 q* ?! e
0 F+ F$ c% Z. h& N! h' v( q
        (1)动态扩展。
6 x8 n2 E! i$ f4 o5 }
* u0 o- U/ _8 C( K. O$ y1 [3 C        就是当窗口在边界滑动时,动态补全缺失的像素点,整个操作是在原图上直接进行的。这种方法有个明显的缺点,当窗口比较大时,动态补全部分会使用很多组合逻辑,资源消耗量大,且不利于时序收敛,一般不推荐使用这种方法。7 l4 `9 O3 w% K" X4 W6 y
7 J8 x$ c- q4 Z
        (2)先扩展后滑动。5 [6 j0 r# g, c
3 L, q7 o6 D& ?% N% p, M1 l5 `# i
        就是先对图像进行边界扩展,然后在扩展后的图像上进行滑动窗口输出。边界扩展需要在图像进行行缓存时完成。这种方式在滑动窗口生成时无需对边界像素点作判断和处理,不需要消耗逻辑资源。缺点是,边界扩展会增大输入图像的尺寸,同时改变输入行、场同步信号的时序关系,行间和帧间的消隐期被压缩。如果窗口尺寸较大或输入图像消隐时间较短,导致扩展的列数超过行间消隐时间,或图像下方扩展的行数超过了帧间消隐时间,则无法使用这种方案。但是在绝大多数场景下,第这种方案完全可用。
( j4 z( D$ S/ q- S( `. v4 n# E( X+ A* \
3 D3 Y" t7 x9 _& M' k        从FPGA实现角度和窗口运算结果而言,边界复制是最佳的选择。既能保证运算结果,又便于在FPGA中实现。边界镜像方法由于镜像复制机制设计更为复杂,会消耗更多的FPGA资源,因此不作为首选。
3 O8 Q% I% a+ u- \7 M$ q1 y' F6 q0 Z- _, T8 T% z$ t
5 进阶设计
+ H5 X+ ~1 v( k
( c+ f; Z# y7 N, H: x! f) w1 {        滑动窗口模块在FPGA图像算法实现中会被经常使用,若将其设计成一个通用模块,则可以有效提高代码编写效率。设计成通用模块时可以考虑以下几个功能的实现。2 A+ n1 \) x, W9 x2 V# x

2 ?* ^3 [4 O- V$ G" w像素bit位宽可配置; d% A' C* J2 z9 o* _

7 `7 z( Y+ F9 e* x/ Z, q$ Q窗口大小可配置,且长宽尺寸可不同
+ a; {9 Q6 w4 _: e' F6 ~6 H' v* g
输入图像尺寸可动态改变, j3 e  l9 T  W  G6 g$ I
, y: n4 c  S  m
行缓存所消耗的存储资源量可配置& j$ N6 E1 n! d3 v7 Z
9 P: D6 Q8 ^' p7 r5 o  ?1 r/ l
支持单时钟周期多个相邻像素点并行输入输出,且并行像素点数可配置
3 Z) e. I( f3 H$ a4 A* `0 Z6 \
! p& J  g+ F$ D: o& D% j# ~! w

该用户从未签到

2#
发表于 2021-10-9 11:18 | 只看该作者
输入和输出同步信号不一致并不影响数据流和处理结果

该用户从未签到

3#
发表于 2021-10-9 13:16 | 只看该作者
滑动窗口模块在FPGA图像算法实现中会被经常使用,若将其设计成一个通用模块,则可以有效提高代码编写效率
$ k( U+ k, A: O, w4 V) u

该用户从未签到

4#
发表于 2021-10-9 13:30 | 只看该作者
基于图像滑动窗口的运算非常适合在FPGA中进行流水线实时高效处理,也是FPGA图像算法实现的一个热点$ c; m0 L, u( a+ `6 n& ?8 z1 H

该用户从未签到

5#
发表于 2021-10-9 13:41 | 只看该作者
图像卷积或窗口运算,在涉及图像4周边界点位置的滑动窗口会出现部分像素点缺失,需要进行特殊处理。常用的策略包括忽略,补固定值,边界复制,边界镜像等等
$ {+ G+ g) h. _

该用户从未签到

6#
发表于 2021-10-9 15:27 | 只看该作者
FPGA图像算法实现——卷积、窗口运算之滑动窗口模块设计
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 14:17 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表