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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1概述    8 o6 Q9 G# T$ X2 L( ~# t7 S( C

9 h8 x  Q* X4 {. b0 F        在图像处理中,卷积、窗口运算是非常基础且常用的操作。这些基于图像滑动窗口的运算非常适合在FPGA中进行流水线实时高效处理,也是FPGA图像算法实现的一个热点。其中,最基础的工作就是在FPGA中设计一个滑动窗口模块。. m6 ?9 W( G5 J
        设计一个完备的滑动窗口模块首先要解决以下3个问题:
" O1 c( \: Q( z  _" K  v! Q% T, K  I5 ~
9 i& W9 ?! G! F: J$ ]. g- ~图像行缓存机制
! R' D$ y) Z  L' w/ }- I4 B* `. _0 ?1 m& ^! i6 h
行、场等同步信号的延迟
: w8 r& L8 a8 f; y' |4 Z$ E: V0 i* @# m' @& G% ]; Z) K
图像边界的扩展
. V$ J' v0 {) i1 d' N4 a: f- p' G# [& r7 I! R5 @9 k. \: W
2 图像行缓存机制
! w$ g2 W$ B( i) I9 n
& I, l+ v% F9 \1 W; @        有2种实现方案:
2 {9 \1 a, q1 S( O& N
7 [: O" h; A( p6 Q: y+ K        (1)使用FIFO或RAM按行缓存图像。3 S$ N- v. |3 Q6 }8 F6 \& d

) S7 `& d8 m6 x# g9 E% u        网上很多的博客和教程都是采用这种方案。例如,生成3×3的窗口需要缓存2行图像,消耗2个FIFO/RAM,FIFO/RAM最终都是消耗FPGA的块存储资源,消耗量与缓存行数成正比。每个FIFO/RAM都需要通过逻辑单独控制读写。FIFO/RAM都可在FPGA开发软件中例化IP核实现。
! a4 P& S: [  ~5 V2 m, i
0 X" p# }# D7 a        (2)使用单个RAM缓存所有行5 f; H- E9 W( {: I! V* Q. c1 i

2 N' n" g5 ~; N2 c2 H; y        例如,3×3的窗口通过1个RAM缓存2行图像。这种方案有2个优点。4 T0 }  N0 L* f: U- K
+ j+ i- S' L) P3 j
        首先,可以简化逻辑设计,因为无论需要缓存多少行图像,FPGA都只需要操作1个RAM的读写。# J& G4 I% n7 s, j( G) }7 Z
( \( j- ?4 k6 P
        另外,充分利用FPGA块存储器位宽和深度的可变性。当位宽和总缓存量在单个块存储器的范围内,则仅使用1个块存储器就可以缓存多行图像,从而降低块存储器资源的消耗,尤其是当窗口尺寸较大时效果明显。! r* c' K$ ]! f' V) g

. |! @  D" L, T; j, h        例如,Xilinx 7系列FPGA的块存储器block ram可配置为1K×36bit的模式,可以缓存4行像素深度为8bit,宽为1024的图像,实现5×5滑动窗口的行缓存。2个1K×36bit模式的block ram就可以最多缓存9行8bit×1024的图像,以此类推。% [( |; @" v. F& h) r

! q4 ^' [, a3 I5 E4 v        所以,推荐使用这种方案。+ Y6 S7 S" A9 W. w1 T! [

* v$ Y# M/ r5 `) X, S' [3 行、场等同步信号的延迟
: p4 V0 C, u3 j. ~/ M5 M6 k+ L4 c! E5 C) V4 d: F
        由于滑动窗口行缓存机制的存在,滑动窗口的输出相对于图像的输入存在一部分固定行数的延时,其对应的行、场同步信号也需要与之保持一致的延时。例如,3×3滑动窗口的输出至少会延时1行图像的时间,5×5窗口输出至少延时2行图像,以此类推,至少延时(窗口尺寸-1)/2行图像。* w3 z7 P. \* |
( L+ L/ b- W* c, c$ P, `) b
        同步信号的延时方法通常有2种。

! M; Q4 P: v' ?! ?1 J9 g        (1)与行缓存方式类似,通过FIFO或RAM将输入的同步信号整体延时。4 Y& O* @6 q" C- Q; c5 o  f

  ~+ L; h5 I' W( F9 l) e8 k        这种方案的优点在于,输入和输出同步信号可以保持完全一致。缺点是需要消耗额外的FPGA块存储资源。
6 C3 r5 L/ r8 g2 H  t2 T! {1 E
, k  F" H" H* i' y( |        (2)通过逻辑生成延时的同步信号。* k1 M# f" Y% j5 D' k" @- F

  \/ m  Y+ x6 o( o0 H1 A        这样不需要消耗FPGA块存储资源,但是需要设计单独的逻辑,而且也无法保证输出和输入同步信号完全一致。' b5 Z! A1 O' c. C4 @- G

4 t, \8 g' ?# a! M        对于大多数应用场景,输入和输出同步信号不一致并不影响数据流和处理结果,对于FPGA而言块存储器资源比逻辑资源更稀缺。因此,实际应用中第2种方法更为常用。如果对同步信号时序有严格要求,那只能采用第1种方案。
! T0 s( N0 ~6 J- Y. {$ ~
$ A* A4 I2 V6 I4 W1 S) h+ J4 图像边界的扩展; K+ h2 z$ J9 d% U0 K% a" V+ G. A4 l4 I

1 F6 `2 f9 t8 }+ Y( h- H( F+ `4.1 边界扩展原理
' J, `1 Y( `+ g, D4 i' {. V+ v7 a, i, i+ v6 h) M
        图像卷积或窗口运算,在涉及图像4周边界点位置的滑动窗口会出现部分像素点缺失,需要进行特殊处理。常用的策略包括忽略,补固定值,边界复制,边界镜像等等。
4 h& D) q1 j; r/ \: [+ Q' [; K3 |6 l! B+ K. s, q; N* d- f' W
        (1)忽略
( ~( _, R& d+ F2 J- ]: W" e+ P' r# J9 s' ^0 ?
        就是不对滑动窗口中缺失的像素点进行处理,直接用来进行计算,由于缺失像素点对应的FPGA触发器可能为任意值,所以边界像素点区域的运算结果会受到影响。但对于小窗口来说,影响较小,不容易察觉,可以采用。, c  r/ b; p5 B6 B7 a+ {' Y! G

. [4 ?5 }3 ]/ L5 X# u- J        (2)补固定值
+ }7 L  B, w- a" C1 I* e6 M/ P9 G" U! s9 @& P
        同样会直接影响边界像素点区域的运算结果。但对于小窗口或者某些特定场景来说,也可以采用。
; y3 z, d* j, B# R- C4 l: I4 p: j" F4 z) U# |6 J2 z- Y) C
        (3)边界复制
5 |0 O1 J; _& ?9 T' {5 r
" y0 f: b& `, u# S$ w, ?        就是直接复制4个边界的像素点到缺失的位置,对应的行列位置缺多少个就复制多少次。这是最常用的一种方法,matlab和opencv里也经常被使用。这种方式对边界点的计算结果影响很小。& s5 I5 z, y8 {% o

" n# Y: D0 `( b% Q9 Q        (4)边界镜像
. y9 K" l4 A  Y" Q: |
' Q7 K5 S& k/ i# W        就是以边界为对称轴,以镜像的方式复制边界区域的像素点。这种方式同样对边界点的计算结果影响很小,在matlab和opencv里也会被使用。+ k; B, R0 |3 v3 \6 S
4 q* X% S+ ~. P5 ^; ?0 r
4.2 FPGA实现图像边界扩展
5 |; a$ c3 A" R- L( w0 A4 \" [+ q. b7 D4 {2 ^4 g& ]1 A2 ]' ^+ ]# J  F
        在FPGA中进行边界像素点扩展有2种方式。* e6 M, ?0 H6 L1 @( T
6 a5 L1 A7 g  _6 }6 U
        (1)动态扩展。  q4 o# ?+ s- X
8 `( W# _# ~5 U2 r' z1 {
        就是当窗口在边界滑动时,动态补全缺失的像素点,整个操作是在原图上直接进行的。这种方法有个明显的缺点,当窗口比较大时,动态补全部分会使用很多组合逻辑,资源消耗量大,且不利于时序收敛,一般不推荐使用这种方法。
( i" S2 e- j5 o& v  k5 o- s0 s! O' A0 j' b
        (2)先扩展后滑动。
2 e) d& I. f2 I6 z4 o/ [7 q6 C8 b$ y$ Z  i+ l; E( B1 F
        就是先对图像进行边界扩展,然后在扩展后的图像上进行滑动窗口输出。边界扩展需要在图像进行行缓存时完成。这种方式在滑动窗口生成时无需对边界像素点作判断和处理,不需要消耗逻辑资源。缺点是,边界扩展会增大输入图像的尺寸,同时改变输入行、场同步信号的时序关系,行间和帧间的消隐期被压缩。如果窗口尺寸较大或输入图像消隐时间较短,导致扩展的列数超过行间消隐时间,或图像下方扩展的行数超过了帧间消隐时间,则无法使用这种方案。但是在绝大多数场景下,第这种方案完全可用。2 W! L4 {' B) s. u

- ~* h, x" u3 B0 O7 g        从FPGA实现角度和窗口运算结果而言,边界复制是最佳的选择。既能保证运算结果,又便于在FPGA中实现。边界镜像方法由于镜像复制机制设计更为复杂,会消耗更多的FPGA资源,因此不作为首选。' n2 n3 h+ K9 I. Z/ U1 Q
6 c0 {% U# ~$ q. u; b/ t
5 进阶设计
4 U/ v1 t4 b9 {$ ]: ~- t% D7 y+ G5 R8 G/ U& ?* F
        滑动窗口模块在FPGA图像算法实现中会被经常使用,若将其设计成一个通用模块,则可以有效提高代码编写效率。设计成通用模块时可以考虑以下几个功能的实现。
+ ]# ^$ h) g& U! j8 X! Z
3 W+ C! |* n1 ~8 m/ k0 C像素bit位宽可配置4 U9 g1 f# O3 V/ P) R! a2 d
& e. k/ A' l, ]
窗口大小可配置,且长宽尺寸可不同
& W# `: o/ ?: O4 V3 }( P- W+ T  Z( w( ^( X
输入图像尺寸可动态改变4 }* ?0 @& e7 i+ y2 A+ s

7 `* G8 C- I0 L1 y行缓存所消耗的存储资源量可配置
1 n4 p( Y, E) F3 x0 n! S( q
9 t. D! q. s' v0 ]4 C2 A支持单时钟周期多个相邻像素点并行输入输出,且并行像素点数可配置

9 S& Q0 G, X# z
$ v5 ~8 z! w) z2 ?# H6 u. Z

该用户从未签到

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

该用户从未签到

3#
发表于 2021-10-9 13:16 | 只看该作者
滑动窗口模块在FPGA图像算法实现中会被经常使用,若将其设计成一个通用模块,则可以有效提高代码编写效率
: [2 Q. w1 b2 \6 j. p/ i4 |

该用户从未签到

4#
发表于 2021-10-9 13:30 | 只看该作者
基于图像滑动窗口的运算非常适合在FPGA中进行流水线实时高效处理,也是FPGA图像算法实现的一个热点, F$ S" z* q/ |* H" i3 A

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 21:48 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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