Quartus Streaming Conv, Pooling & Image layers
Created by: bo3z
Description
- Adds support for image-related layers (Conv 1D & 2D, Avg & Max Pooling, Global Pooling, Zero Padding, Upsampling) in
io_stream
in a similar manner to Vivado- Conv 1D & 2D implemented using line buffer, similar to Vivado. Main difference is in the implementation of padding for Conv layers - Vivado inserts a padding layer; Quartus performs padding in the Conv layer. This approach stays in line with the Keras model graph and the total number of layers.
- Same padding is not supported for Pooling layers.
- Written a custom struct to act as a shift register in hardware (Intel HLS does not offer an out-of-the-box shift register). However, any struct with a similar implementation (and meeting certain time / loop requirements) will be synthesised as a shift register. This can be verified by viewing the synthesis report in report.html > Area Analysis of System
- Upsampling and Zero Padding layers written in a largely similar way to Vivado
- Resource usage and latency results coming soon.
- Transpose layer to be added soon.
- Bug fix introduced by PR #561 for parallel transpose layers
- It is recommended to review this PR commit by commit, as each commit adds a single piece of functionality, is self-contained and the project can be compiled individually
Type of change
-
Bug fix (non-breaking change that fixes an issue) -
New feature (non-breaking change which adds functionality)
Tests
All of the existing tests were expanded to include tests for Quartus in io_stream
. No new tests were written. A summary of the tests is given below.
test_keras_api.py
- Ensures correct parsing of the layers inio_stream
and correct syntax (no compilation errors) of Conv 1D & Conv 2D layers.test_cnn_mnist.py
,test_cnn_mnist_qkeras.py
,test_conv1d.py
- Verify the numerical accuracy and compilation of Conv 1D, Conv 2D, Max & Avg Pooling layers.test_upsampling.py
andtest_zeropadding.py
- Ensures numerical accuracy and successful compilation of Zero Padding and Upsampling layers.test_globalpooling.py
Ensures numerical accuracy and successful compilation of Global Pooling layers.
Synthesis results
Below are results obtained through full Quartus synthesis of Conv2D layers for a fixed input (32x32x3) when varying the number of filters and the reuse factors. Other layers were tested for correct synthesis.
Checklist
-
I have read the guidelines for contributing. -
I have commented my code, particularly in hard-to-understand areas. -
I have made corresponding changes to the documentation. -
My changes generate no new warnings. -
I have added tests that prove my fix is effective or that my feature works.B