上面這張圖配合文字,展示了行緩存(line buffer)在圖像卷積中的工作方式:
-
上半部分是一個按行掃描輸入的圖像塊(示例為 9×9,編號 1–81)。
藍色表示已被寫入行緩存并按隊列等待的數據,綠色是當前這一步卷積所需的 3×3 鄰域像素。此刻選中的 3×3 為像素 {2,3,4 / 11,12,13 / 20,21,22}。 -
下半部分畫的是行緩存結構:三條“行 FIFO”(對應 3×3 卷積核的三行)。AXI4-Stream 按順序把新像素從右側送入(虛線箭頭,正在進入的是 23、24、25),緩存里的數據整體向左“移位”。
當某個像素被移到最左上角位置時,它已經“過窗”,會從緩存中丟棄(刪除)。 -
對應當前位置,行緩存能同時讀出 9 個像素(綠色塊),與 3×3 卷積核的 9 個系數并行相乘,再經過加法樹求和,得到新的輸出像素(圖中標成 N2)。只要行緩存支持9路并發讀(通過多端口/分區/多BRAM實現),9 次乘法就能完全并行。
-
當需要并行進行多路卷積(例如多個卷積核/輸出通道)時,行緩存的容量與分區必須相應調整或復制,以提供足夠的并發訪問端口,避免端口沖突。
一句話:圖示的是一個隨輸入像素流滾動的三行緩存,它不斷滑動3×3窗口,支持九值并行乘加,從而高效地產生連續的卷積輸出。
像素 {2,3,4 / 11,12,13 / 20,21,22}被選中的原因:
行緩存在做的是“滑動 3×3 窗口”。
- 像素按行順序 1、2、3、… 進入緩存,3×3 卷積需要同時讀出 三行 × 三列 的 9 個像素。
- 這時緩存中三行的數據分別是(從左往右):
第1行:2…10;第2行:11…19;第3行:20…25(新像素從右側持續進入,整行一起向左移)。三行在列方向上是對齊的。 - 硬件把每行最左邊的三個位置作為當前卷積窗口的三列,于是得到:
上:2、3、4;中:11、12、13;下:20、21、22 —— 這就是圖中標綠的 3×3。 - 這個 3×3 的中心是 12,對應輸出像素 N2(第一行的第 2 個輸出)。
之后每到一個新像素(例如 26),窗口整體右移一列,讀到的 3×3 會變成 {3,4,5 / 12,13,14 / 21,22,23},輸出 N3,以此類推。
所以,從 2–25 中選出的就是在當前時刻位于三行“頭部”的 3×3 對齊像素。
Reference:
F. K?stner, B. Jan?en, F. Kautz, M. Hübner and G. Corradi, “Hardware/Software Codesign for Convolutional Neural Networks Exploiting Dynamic Partial Reconfiguration on PYNQ,” 2018 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW), Vancouver, BC, Canada, 2018, pp. 154-161, doi: 10.1109/IPDPSW.2018.00031.