Documentation - additions and cleanup
authorAjay Jayaraj <ajayj@ti.com>
Thu, 24 May 2018 14:23:19 +0000 (09:23 -0500)
committerAjay Jayaraj <ajayj@ti.com>
Fri, 25 May 2018 16:04:06 +0000 (11:04 -0500)
(MCT-990)

docs/source/api.rst
docs/source/conf.py
docs/source/example.rst
docs/source/faq/index.rst [new file with mode: 0644]
docs/source/faq/out_of_memory.rst [new file with mode: 0644]
docs/source/images/ssd.dot.svg [new file with mode: 0644]
docs/source/index.rst
docs/source/intro.rst
docs/source/using_api.rst
docs/source/viewer.rst

index c692b05a12284d8d67392a9ffcd9ad9f3a5e7ac2..7aa7849a9f542b8d1152cfc2184c7500d34cc0c0 100644 (file)
@@ -1,7 +1,64 @@
+.. _api-documentation:
+
 ******************
 TIDL API Reference
 ******************
 
+Configuration
+-------------
+The ``Configuration`` object is used to specify various parameters required for network execution. Applications can directly initialize fields in an instance of ``Configuration`` or use the ``ReadFromFile`` method to read the configuration from a file. The following sections describe the commonly used fields available in the ``Configuration`` class:
+
+Input image description
++++++++++++++++++++++++
+.. data::  std::string Configuration.inData
+
+    Path to the input image file. This field is not used by the TIDL API itself. It can be used by applications to load an input image into a buffer. Can be empty if the application uses frameworks such as OpenCV to read images. See ``test/main.cpp`` for example usage.
+
+.. data:: std::size_t Configuration.inHeight
+
+    Height of the input image. Used by the API, must be specified.
+
+.. data:: std::size_t Configuration.inWidth
+
+    Width of the input image. Used by the API, must be specified.
+
+.. data:: std::size_t Configuration.inNumChannels
+
+    Number of channels in the input image. Used by the API, must be specified.
+
+Output description
+++++++++++++++++++
+
+.. data::  std::string Configuration.outData
+
+    Path to the output image file. This field is not used by the TIDL API itself. It can be used by applications to write a buffer to file. Can be empty if the application uses frameworks such as OpenCV to read images. See ``test/main.cpp`` for example usage.
+
+Network
++++++++
+
+.. data:: std::string Configuration.netBinFile
+
+    Path to the TIDL network binary file. Used by the API, must be specified.
+
+.. data:: std::string Configuration.paramBinFile
+
+    Path to the TIDL parameter file. Used by the API, must be specified.
+
+Memory Management
++++++++++++++++++
+The ``Configuration`` object specifies the sizes of 2 heaps. These heaps are allocated from OpenCL global memory that is shared across the host and device. Refer section :ref:`opencl-global-memory` for steps to increase the size of the OpenCL global memory heap.
+
+.. data:: std::size_t Configuration.PARAM_HEAP_SIZE
+
+    This field is used to specify the size of the device heap used for network parameters. The size depends on the size of the parameter binary file. For example, ``jsegnet21v2``'s parameter file, ``tidl_param_jsegnet21v2.bin`` is 2.6MB. Due to alignment reasons, the parameter heap must be 10% larger than the binary file size - in this case, 2.9MB. The constructor for ``Configuration`` sets PARAM_HEAP_SIZE to 9MB. There is one parameter heap for each instance of ``Executor`` .
+
+.. data:: std::size_t Configuration.EXTMEM_HEAP_SIZE
+
+    This field is used to specify the size of the device heap used for all allocations other than network parameters. The constructor for ``Configuration`` sets EXTMEM_HEAP_SIZE to 64MB.  There is one external memory heap for each instance of ``ExecutionObject``
+
+API Reference
+-------------
+
 .. doxygennamespace:: tidl
     :project: TIDL
     :members:
index c790755e07c22d104a9acf5d848c9195e325f04c..6a1cf0a9fd848dc77687316e019c39a56dc22490 100644 (file)
@@ -52,7 +52,7 @@ source_suffix = '.rst'
 master_doc = 'index'
 
 # General information about the project.
-project = u'TI Deep Learning'
+project = u'TIDL API User\'s Guide'
 copyright = u'2018, Texas Instruments Incorporated'
 
 # The version info for the project you're documenting, acts as replacement for
@@ -60,9 +60,9 @@ copyright = u'2018, Texas Instruments Incorporated'
 # built documents.
 #
 # The short X.Y version.
-version = '0.1'
+version = '1.0'
 # The full version, including alpha/beta/rc tags.
-release = '0.1.0'
+release = '1.0.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -268,8 +268,8 @@ latex_documents = [
 #texinfo_no_detailmenu = False
 
 
-# Example configuration for intersphinx: refer to the Python standard library.
-# intersphinx_mapping = {'https://docs.python.org/': None}
+# intersphinx mapping for OpenCL sphinx documentation
+intersphinx_mapping = {'opencl' : ('http://downloads.ti.com/mctools/esd/docs/opencl/', None)}
 
 def setup(app):
     app.add_stylesheet("theme_overrides.css")
index 961e830b4968b9171b9132f68851af1c253cef85..ed6564d2dbb9fb17712509fb414f0e29f5af527d 100644 (file)
@@ -2,7 +2,7 @@
 Examples
 ********
 
-We ship three end-to-end examples within the tidl-api packge
+We ship three end-to-end examples within the tidl-api package
 to demonstrate three categories of deep learning networks.  The first
 two examples can run on AM57x SoCs with either DLA or DSP.  The last
 example requires AM57x SoCs with both DLA and DSP.  The performance
@@ -82,6 +82,8 @@ runs significantly faster on DLA than on DSP.
    DSP: 812.0 ms          818.4 ms             0.79 %
    ====================== ==================== ============
 
+.. _ssd-example:
+
 SSD
 ---
 
@@ -120,7 +122,7 @@ Running Examples
 ----------------
 
 The examples are located in ``/usr/share/ti/tidl-api/examples`` on
-the EVM filesystem.  Each example needs to be run its own directory.
+the EVM file system.  Each example needs to be run its own directory.
 Running an example with ``-h`` will show help message with option set.
 The following code section shows how to run the examples, and
 the test program that tests all supported TIDL network configs.
@@ -233,59 +235,3 @@ the test program that tests all supported TIDL network configs.
    frame[0]: Time on device:    960ms, host:  961.1ms API overhead:  0.116 %
    squeeze1_1 : PASSED
    tidl PASSED
-
-Possible runtime errors: out of memory
-""""""""""""""""""""""""""""""""""""""
-
-.. code:: shell
-
-   tidl: device_alloc.h:31: T* tidl::malloc_ddr(size_t) [with T = char; size_t = unsigned int]: Assertion `val != nullptr' failed
-
-One possible reason is that previous aborted runs didn't properly release
-allocation.  Use ti-mct-heap-check with "-c" option to clean up.
-
-.. code:: shell
-
-   root@am57xx-evm:~# ti-mct-heap-check -c
-   -- ddr_heap1 ------------------------------
-      Addr : 0xa2000000
-      Size : 0xa000000
-      Avail: 0xa000000
-      Align: 0x80
-   -----------------------------------------
-
-Another possible reason is that total memory requirement exceeds default
-memory allocated for OpenCL.  See below how to patch device tree to
-increase OpenCL memory.
-
-.. code:: shell
-
-   $ sudo apt-get install device-tree-compiler # In case dtc is not already installed
-   $ scp root@am57:/boot/am57xx-evm-reva3.dtb .
-   $ dtc -I dtb -O dts am57xx-evm-reva3.dtb -o am57xx-evm-reva3.dts
-   $ cp am57xx-evm-reva3.dts am57xx-evm-reva3.dts.orig
-   $ # increase cmem block size
-   $ diff -u am57xx-evm-reva3.dts.orig am57xx-evm-reva3.dts
-   --- am57xx-evm-reva3.dts.orig    2018-01-11 14:47:51.491572739 -0600
-   +++ am57xx-evm-reva3.dts    2018-01-16 15:43:33.981431971 -0600
-   @@ -5657,7 +5657,7 @@
-            };
-
-            cmem_block_mem@a0000000 {
-   -            reg = <0x0 0xa0000000 0x0 0xc000000>;
-   +            reg = <0x0 0xa0000000 0x0 0x18000000>;
-                no-map;
-                status = "okay";
-                linux,phandle = <0x13c>;
-   @@ -5823,7 +5823,7 @@
-            cmem_block@0 {
-                reg = <0x0>;
-                memory-region = <0x13c>;
-   -            cmem-buf-pools = <0x1 0x0 0xc000000>;
-   +            cmem-buf-pools = <0x1 0x0 0x18000000>;
-            };
-
-            cmem_block@1 {
-   $ dtc -I dts -O dtb am57xx-evm-reva3.dts -o am57xx-evm-reva3.dtb
-   $ scp am57xx-evm-reva3.dtb root@am57:/boot/
-   # reboot to make memory changes effective (run "cat /proc/iomem" to check)
diff --git a/docs/source/faq/index.rst b/docs/source/faq/index.rst
new file mode 100644 (file)
index 0000000..c79723d
--- /dev/null
@@ -0,0 +1,8 @@
+##########################
+Frequently Asked Questions
+##########################
+
+.. toctree::
+   :maxdepth: 2
+
+   out_of_memory
diff --git a/docs/source/faq/out_of_memory.rst b/docs/source/faq/out_of_memory.rst
new file mode 100644 (file)
index 0000000..cba902c
--- /dev/null
@@ -0,0 +1,64 @@
+##################################################
+Why do I get an assertion failure from malloc_ddr?
+##################################################
+
+Application execution fails with the following error message:
+
+.. code:: shell
+
+   tidl: device_alloc.h:31: T* tidl::malloc_ddr(size_t) [with T = char; size_t = unsigned int]: Assertion `val != nullptr' failed
+
+Allocations not freed
++++++++++++++++++++++
+One possible reason is that previous runs of the application were aborted (e.g. using :kbd:`Ctrl-C`) and did not release their allocations. Use the ``ti-mct-heap-check`` command with "-c" option to clean up.
+
+.. code:: bash
+
+   root@am57xx-evm:~# ti-mct-heap-check -c
+   -- ddr_heap1 ------------------------------
+      Addr : 0xa2000000
+      Size : 0xa000000
+      Avail: 0xa000000
+      Align: 0x80
+   -----------------------------------------
+
+.. _opencl-global-memory:
+
+Insufficient OpenCL global memory
++++++++++++++++++++++++++++++++++
+Another possible reason is that total memory requirement specified in the ``Configuration`` using EXTMEM_HEAP_SIZE and PARAM_HEAP_SIZE exceeds default memory available for OpenCL.  Follow the instructions below to increase the amount of CMEM (contiguous memory available for OpenCL)
+
+.. code:: bash
+
+   $ sudo apt-get install device-tree-compiler # In case dtc is not already installed
+   $ scp root@am57:/boot/am57xx-evm-reva3.dtb .
+   $ dtc -I dtb -O dts am57xx-evm-reva3.dtb -o am57xx-evm-reva3.dts
+   $ cp am57xx-evm-reva3.dts am57xx-evm-reva3.dts.orig
+   $ # increase cmem block size
+   $ diff -u am57xx-evm-reva3.dts.orig am57xx-evm-reva3.dts
+   --- am57xx-evm-reva3.dts.orig    2018-01-11 14:47:51.491572739 -0600
+   +++ am57xx-evm-reva3.dts    2018-01-16 15:43:33.981431971 -0600
+   @@ -5657,7 +5657,7 @@
+            };
+
+            cmem_block_mem@a0000000 {
+   -            reg = <0x0 0xa0000000 0x0 0xc000000>;
+   +            reg = <0x0 0xa0000000 0x0 0x18000000>;
+                no-map;
+                status = "okay";
+                linux,phandle = <0x13c>;
+   @@ -5823,7 +5823,7 @@
+            cmem_block@0 {
+                reg = <0x0>;
+                memory-region = <0x13c>;
+   -            cmem-buf-pools = <0x1 0x0 0xc000000>;
+   +            cmem-buf-pools = <0x1 0x0 0x18000000>;
+            };
+
+            cmem_block@1 {
+   $ dtc -I dts -O dtb am57xx-evm-reva3.dts -o am57xx-evm-reva3.dtb
+   $ scp am57xx-evm-reva3.dtb root@am57:/boot/
+   # reboot to make memory changes effective (run "cat /proc/iomem" to check)
+
+For further details, refer the OpenCL User's Guide, section :ref:`Changing DDR3 Partition for OpenCL <opencl:CHANGE_DDR3_PARTITION_FOR_OPENCL>`
+
diff --git a/docs/source/images/ssd.dot.svg b/docs/source/images/ssd.dot.svg
new file mode 100644 (file)
index 0000000..c0397f2
--- /dev/null
@@ -0,0 +1,700 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.36.0 (20140111.2315)
+ -->
+<!-- Title: TIDL Network Pages: 1 -->
+<svg width="816pt" height="2388pt"
+ viewBox="0.00 0.00 816.00 2388.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2384)">
+<title>TIDL Network</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-2384 812,-2384 812,4 -4,4"/>
+<g id="clust1" class="cluster"><title>cluster1</title>
+<polygon fill="none" stroke="black" stroke-width="2" points="8,-355 8,-2306 457,-2306 457,-355 8,-355"/>
+<text text-anchor="middle" x="232.5" y="-2290.8" font-family="Arial" font-size="14.00">Group 1</text>
+</g>
+<g id="clust2" class="cluster"><title>cluster2</title>
+<polygon fill="none" stroke="black" stroke-width="2" points="82,-76 82,-325 800,-325 800,-76 82,-76"/>
+<text text-anchor="middle" x="441" y="-309.8" font-family="Arial" font-size="14.00">Group 2</text>
+</g>
+<!-- 1 -->
+<g id="node1" class="node"><title>1</title>
+<path fill="none" stroke="brown" stroke-width="2" d="M203.5,-2238C203.5,-2238 254.5,-2238 254.5,-2238 260.5,-2238 266.5,-2244 266.5,-2250 266.5,-2250 266.5,-2262 266.5,-2262 266.5,-2268 260.5,-2274 254.5,-2274 254.5,-2274 203.5,-2274 203.5,-2274 197.5,-2274 191.5,-2268 191.5,-2262 191.5,-2262 191.5,-2250 191.5,-2250 191.5,-2244 197.5,-2238 203.5,-2238"/>
+<text text-anchor="middle" x="229" y="-2252.9" font-family="Arial" font-size="12.00">BatchNorm</text>
+<text text-anchor="middle" x="188" y="-2277.9" font-family="Arial" font-size="12.00">1</text>
+</g>
+<!-- 2 -->
+<g id="node2" class="node"><title>2</title>
+<path fill="none" stroke="red" stroke-width="2" d="M191.5,-2125.5C191.5,-2125.5 266.5,-2125.5 266.5,-2125.5 272.5,-2125.5 278.5,-2131.5 278.5,-2137.5 278.5,-2137.5 278.5,-2176.5 278.5,-2176.5 278.5,-2182.5 272.5,-2188.5 266.5,-2188.5 266.5,-2188.5 191.5,-2188.5 191.5,-2188.5 185.5,-2188.5 179.5,-2182.5 179.5,-2176.5 179.5,-2176.5 179.5,-2137.5 179.5,-2137.5 179.5,-2131.5 185.5,-2125.5 191.5,-2125.5"/>
+<text text-anchor="middle" x="229" y="-2174.9" font-family="Arial" font-size="12.00">Convolution 5x5</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-2167.5 278.5,-2167.5 "/>
+<text text-anchor="middle" x="229" y="-2153.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-2146.5 278.5,-2146.5 "/>
+<text text-anchor="middle" x="229" y="-2132.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="176" y="-2192.4" font-family="Arial" font-size="12.00">2</text>
+</g>
+<!-- 1&#45;&gt;2 -->
+<g id="edge1" class="edge"><title>1&#45;&gt;2</title>
+<path fill="none" stroke="black" d="M229,-2237.66C229,-2226.8 229,-2212.33 229,-2198.71"/>
+<polygon fill="black" stroke="black" points="232.5,-2198.53 229,-2188.53 225.5,-2198.53 232.5,-2198.53"/>
+<text text-anchor="middle" x="253" y="-2210.5" font-family="Arial" font-size="10.00">3x320x768</text>
+</g>
+<!-- 3 -->
+<g id="node3" class="node"><title>3</title>
+<path fill="none" stroke="red" stroke-width="2" d="M191.5,-1979.5C191.5,-1979.5 266.5,-1979.5 266.5,-1979.5 272.5,-1979.5 278.5,-1985.5 278.5,-1991.5 278.5,-1991.5 278.5,-2064.5 278.5,-2064.5 278.5,-2070.5 272.5,-2076.5 266.5,-2076.5 266.5,-2076.5 191.5,-2076.5 191.5,-2076.5 185.5,-2076.5 179.5,-2070.5 179.5,-2064.5 179.5,-2064.5 179.5,-1991.5 179.5,-1991.5 179.5,-1985.5 185.5,-1979.5 191.5,-1979.5"/>
+<text text-anchor="middle" x="229" y="-2062.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-2055.5 278.5,-2055.5 "/>
+<text text-anchor="middle" x="229" y="-2041.9" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="229" y="-2028.9" font-family="Arial" font-size="12.00">2x2</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-2021.5 278.5,-2021.5 "/>
+<text text-anchor="middle" x="229" y="-2007.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-2000.5 278.5,-2000.5 "/>
+<text text-anchor="middle" x="229" y="-1986.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="176" y="-2080.4" font-family="Arial" font-size="12.00">3</text>
+</g>
+<!-- 2&#45;&gt;3 -->
+<g id="edge2" class="edge"><title>2&#45;&gt;3</title>
+<path fill="none" stroke="black" d="M229,-2125.26C229,-2113.67 229,-2100.09 229,-2086.84"/>
+<polygon fill="black" stroke="black" points="232.5,-2086.8 229,-2076.8 225.5,-2086.8 232.5,-2086.8"/>
+<text text-anchor="middle" x="255.5" y="-2098.5" font-family="Arial" font-size="10.00">32x160x384</text>
+</g>
+<!-- 4 -->
+<g id="node4" class="node"><title>4</title>
+<path fill="none" stroke="red" stroke-width="2" d="M191.5,-1867.5C191.5,-1867.5 266.5,-1867.5 266.5,-1867.5 272.5,-1867.5 278.5,-1873.5 278.5,-1879.5 278.5,-1879.5 278.5,-1918.5 278.5,-1918.5 278.5,-1924.5 272.5,-1930.5 266.5,-1930.5 266.5,-1930.5 191.5,-1930.5 191.5,-1930.5 185.5,-1930.5 179.5,-1924.5 179.5,-1918.5 179.5,-1918.5 179.5,-1879.5 179.5,-1879.5 179.5,-1873.5 185.5,-1867.5 191.5,-1867.5"/>
+<text text-anchor="middle" x="229" y="-1916.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1909.5 278.5,-1909.5 "/>
+<text text-anchor="middle" x="229" y="-1895.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1888.5 278.5,-1888.5 "/>
+<text text-anchor="middle" x="229" y="-1874.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="176" y="-1934.4" font-family="Arial" font-size="12.00">4</text>
+</g>
+<!-- 3&#45;&gt;4 -->
+<g id="edge3" class="edge"><title>3&#45;&gt;4</title>
+<path fill="none" stroke="black" d="M229,-1979.35C229,-1966.72 229,-1953.2 229,-1940.96"/>
+<polygon fill="black" stroke="black" points="232.5,-1940.59 229,-1930.59 225.5,-1940.59 232.5,-1940.59"/>
+<text text-anchor="middle" x="253" y="-1952.5" font-family="Arial" font-size="10.00">32x80x192</text>
+</g>
+<!-- 5 -->
+<g id="node5" class="node"><title>5</title>
+<path fill="none" stroke="red" stroke-width="2" d="M191.5,-1721.5C191.5,-1721.5 266.5,-1721.5 266.5,-1721.5 272.5,-1721.5 278.5,-1727.5 278.5,-1733.5 278.5,-1733.5 278.5,-1806.5 278.5,-1806.5 278.5,-1812.5 272.5,-1818.5 266.5,-1818.5 266.5,-1818.5 191.5,-1818.5 191.5,-1818.5 185.5,-1818.5 179.5,-1812.5 179.5,-1806.5 179.5,-1806.5 179.5,-1733.5 179.5,-1733.5 179.5,-1727.5 185.5,-1721.5 191.5,-1721.5"/>
+<text text-anchor="middle" x="229" y="-1804.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1797.5 278.5,-1797.5 "/>
+<text text-anchor="middle" x="229" y="-1783.9" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="229" y="-1770.9" font-family="Arial" font-size="12.00">2x2</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1763.5 278.5,-1763.5 "/>
+<text text-anchor="middle" x="229" y="-1749.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1742.5 278.5,-1742.5 "/>
+<text text-anchor="middle" x="229" y="-1728.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="176" y="-1822.4" font-family="Arial" font-size="12.00">5</text>
+</g>
+<!-- 4&#45;&gt;5 -->
+<g id="edge4" class="edge"><title>4&#45;&gt;5</title>
+<path fill="none" stroke="black" d="M229,-1867.26C229,-1855.67 229,-1842.09 229,-1828.84"/>
+<polygon fill="black" stroke="black" points="232.5,-1828.8 229,-1818.8 225.5,-1828.8 232.5,-1828.8"/>
+<text text-anchor="middle" x="253" y="-1840.5" font-family="Arial" font-size="10.00">64x80x192</text>
+</g>
+<!-- 6 -->
+<g id="node6" class="node"><title>6</title>
+<path fill="none" stroke="red" stroke-width="2" d="M191.5,-1609.5C191.5,-1609.5 266.5,-1609.5 266.5,-1609.5 272.5,-1609.5 278.5,-1615.5 278.5,-1621.5 278.5,-1621.5 278.5,-1660.5 278.5,-1660.5 278.5,-1666.5 272.5,-1672.5 266.5,-1672.5 266.5,-1672.5 191.5,-1672.5 191.5,-1672.5 185.5,-1672.5 179.5,-1666.5 179.5,-1660.5 179.5,-1660.5 179.5,-1621.5 179.5,-1621.5 179.5,-1615.5 185.5,-1609.5 191.5,-1609.5"/>
+<text text-anchor="middle" x="229" y="-1658.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1651.5 278.5,-1651.5 "/>
+<text text-anchor="middle" x="229" y="-1637.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1630.5 278.5,-1630.5 "/>
+<text text-anchor="middle" x="229" y="-1616.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="176" y="-1676.4" font-family="Arial" font-size="12.00">6</text>
+</g>
+<!-- 5&#45;&gt;6 -->
+<g id="edge5" class="edge"><title>5&#45;&gt;6</title>
+<path fill="none" stroke="black" d="M229,-1721.35C229,-1708.72 229,-1695.2 229,-1682.96"/>
+<polygon fill="black" stroke="black" points="232.5,-1682.59 229,-1672.59 225.5,-1682.59 232.5,-1682.59"/>
+<text text-anchor="middle" x="250.5" y="-1694.5" font-family="Arial" font-size="10.00">64x40x96</text>
+</g>
+<!-- 7 -->
+<g id="node7" class="node"><title>7</title>
+<path fill="none" stroke="red" stroke-width="2" d="M191.5,-1497.5C191.5,-1497.5 266.5,-1497.5 266.5,-1497.5 272.5,-1497.5 278.5,-1503.5 278.5,-1509.5 278.5,-1509.5 278.5,-1548.5 278.5,-1548.5 278.5,-1554.5 272.5,-1560.5 266.5,-1560.5 266.5,-1560.5 191.5,-1560.5 191.5,-1560.5 185.5,-1560.5 179.5,-1554.5 179.5,-1548.5 179.5,-1548.5 179.5,-1509.5 179.5,-1509.5 179.5,-1503.5 185.5,-1497.5 191.5,-1497.5"/>
+<text text-anchor="middle" x="229" y="-1546.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1539.5 278.5,-1539.5 "/>
+<text text-anchor="middle" x="229" y="-1525.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="179.5,-1518.5 278.5,-1518.5 "/>
+<text text-anchor="middle" x="229" y="-1504.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="176" y="-1564.4" font-family="Arial" font-size="12.00">7</text>
+</g>
+<!-- 6&#45;&gt;7 -->
+<g id="edge6" class="edge"><title>6&#45;&gt;7</title>
+<path fill="none" stroke="black" d="M229,-1609.36C229,-1597.54 229,-1583.84 229,-1571.18"/>
+<polygon fill="black" stroke="black" points="232.5,-1570.86 229,-1560.86 225.5,-1570.86 232.5,-1570.86"/>
+<text text-anchor="middle" x="253" y="-1582.5" font-family="Arial" font-size="10.00">128x40x96</text>
+</g>
+<!-- 8 -->
+<g id="node8" class="node"><title>8</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M142.5,-1399C142.5,-1399 199.5,-1399 199.5,-1399 205.5,-1399 211.5,-1405 211.5,-1411 211.5,-1411 211.5,-1423 211.5,-1423 211.5,-1429 205.5,-1435 199.5,-1435 199.5,-1435 142.5,-1435 142.5,-1435 136.5,-1435 130.5,-1429 130.5,-1423 130.5,-1423 130.5,-1411 130.5,-1411 130.5,-1405 136.5,-1399 142.5,-1399"/>
+<text text-anchor="middle" x="171" y="-1420.4" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="171" y="-1407.4" font-family="Arial" font-size="12.00">2x2</text>
+<text text-anchor="middle" x="127" y="-1438.9" font-family="Arial" font-size="12.00">8</text>
+</g>
+<!-- 7&#45;&gt;8 -->
+<g id="edge7" class="edge"><title>7&#45;&gt;8</title>
+<path fill="none" stroke="black" d="M211.847,-1497.24C208.543,-1491.21 205.136,-1484.92 202,-1479 195.981,-1467.63 189.508,-1454.97 184.042,-1444.14"/>
+<polygon fill="black" stroke="black" points="187.152,-1442.53 179.534,-1435.17 180.898,-1445.68 187.152,-1442.53"/>
+<text text-anchor="middle" x="226" y="-1470.5" font-family="Arial" font-size="10.00">128x40x96</text>
+</g>
+<!-- 16 -->
+<g id="node16" class="node"><title>16</title>
+<path fill="none" stroke="red" stroke-width="2" d="M244.5,-1385.5C244.5,-1385.5 319.5,-1385.5 319.5,-1385.5 325.5,-1385.5 331.5,-1391.5 331.5,-1397.5 331.5,-1397.5 331.5,-1436.5 331.5,-1436.5 331.5,-1442.5 325.5,-1448.5 319.5,-1448.5 319.5,-1448.5 244.5,-1448.5 244.5,-1448.5 238.5,-1448.5 232.5,-1442.5 232.5,-1436.5 232.5,-1436.5 232.5,-1397.5 232.5,-1397.5 232.5,-1391.5 238.5,-1385.5 244.5,-1385.5"/>
+<text text-anchor="middle" x="282" y="-1434.9" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-1427.5 331.5,-1427.5 "/>
+<text text-anchor="middle" x="282" y="-1413.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-1406.5 331.5,-1406.5 "/>
+<text text-anchor="middle" x="282" y="-1392.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="225.5" y="-1452.4" font-family="Arial" font-size="12.00">16</text>
+</g>
+<!-- 7&#45;&gt;16 -->
+<g id="edge8" class="edge"><title>7&#45;&gt;16</title>
+<path fill="none" stroke="black" d="M243.763,-1497.36C249.629,-1485.18 256.457,-1471.01 262.706,-1458.04"/>
+<polygon fill="black" stroke="black" points="265.944,-1459.39 267.132,-1448.86 259.638,-1456.35 265.944,-1459.39"/>
+<text text-anchor="middle" x="282" y="-1470.5" font-family="Arial" font-size="10.00">128x40x96</text>
+</g>
+<!-- 9 -->
+<g id="node9" class="node"><title>9</title>
+<path fill="none" stroke="red" stroke-width="2" d="M127.5,-1273.5C127.5,-1273.5 202.5,-1273.5 202.5,-1273.5 208.5,-1273.5 214.5,-1279.5 214.5,-1285.5 214.5,-1285.5 214.5,-1324.5 214.5,-1324.5 214.5,-1330.5 208.5,-1336.5 202.5,-1336.5 202.5,-1336.5 127.5,-1336.5 127.5,-1336.5 121.5,-1336.5 115.5,-1330.5 115.5,-1324.5 115.5,-1324.5 115.5,-1285.5 115.5,-1285.5 115.5,-1279.5 121.5,-1273.5 127.5,-1273.5"/>
+<text text-anchor="middle" x="165" y="-1322.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1315.5 214.5,-1315.5 "/>
+<text text-anchor="middle" x="165" y="-1301.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1294.5 214.5,-1294.5 "/>
+<text text-anchor="middle" x="165" y="-1280.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="112" y="-1340.4" font-family="Arial" font-size="12.00">9</text>
+</g>
+<!-- 8&#45;&gt;9 -->
+<g id="edge9" class="edge"><title>8&#45;&gt;9</title>
+<path fill="none" stroke="black" d="M170.062,-1398.81C169.304,-1384.91 168.205,-1364.75 167.224,-1346.78"/>
+<polygon fill="black" stroke="black" points="170.719,-1346.58 166.679,-1336.79 163.729,-1346.96 170.719,-1346.58"/>
+<text text-anchor="middle" x="193" y="-1358.5" font-family="Arial" font-size="10.00">128x20x48</text>
+</g>
+<!-- 10 -->
+<g id="node10" class="node"><title>10</title>
+<path fill="none" stroke="red" stroke-width="2" d="M127.5,-1127.5C127.5,-1127.5 202.5,-1127.5 202.5,-1127.5 208.5,-1127.5 214.5,-1133.5 214.5,-1139.5 214.5,-1139.5 214.5,-1212.5 214.5,-1212.5 214.5,-1218.5 208.5,-1224.5 202.5,-1224.5 202.5,-1224.5 127.5,-1224.5 127.5,-1224.5 121.5,-1224.5 115.5,-1218.5 115.5,-1212.5 115.5,-1212.5 115.5,-1139.5 115.5,-1139.5 115.5,-1133.5 121.5,-1127.5 127.5,-1127.5"/>
+<text text-anchor="middle" x="165" y="-1210.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1203.5 214.5,-1203.5 "/>
+<text text-anchor="middle" x="165" y="-1189.9" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="165" y="-1176.9" font-family="Arial" font-size="12.00">2x2</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1169.5 214.5,-1169.5 "/>
+<text text-anchor="middle" x="165" y="-1155.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1148.5 214.5,-1148.5 "/>
+<text text-anchor="middle" x="165" y="-1134.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="108.5" y="-1228.4" font-family="Arial" font-size="12.00">10</text>
+</g>
+<!-- 9&#45;&gt;10 -->
+<g id="edge10" class="edge"><title>9&#45;&gt;10</title>
+<path fill="none" stroke="black" d="M165,-1273.26C165,-1261.67 165,-1248.09 165,-1234.84"/>
+<polygon fill="black" stroke="black" points="168.5,-1234.8 165,-1224.8 161.5,-1234.8 168.5,-1234.8"/>
+<text text-anchor="middle" x="189" y="-1246.5" font-family="Arial" font-size="10.00">256x20x48</text>
+</g>
+<!-- 11 -->
+<g id="node11" class="node"><title>11</title>
+<path fill="none" stroke="red" stroke-width="2" d="M127.5,-1015.5C127.5,-1015.5 202.5,-1015.5 202.5,-1015.5 208.5,-1015.5 214.5,-1021.5 214.5,-1027.5 214.5,-1027.5 214.5,-1066.5 214.5,-1066.5 214.5,-1072.5 208.5,-1078.5 202.5,-1078.5 202.5,-1078.5 127.5,-1078.5 127.5,-1078.5 121.5,-1078.5 115.5,-1072.5 115.5,-1066.5 115.5,-1066.5 115.5,-1027.5 115.5,-1027.5 115.5,-1021.5 121.5,-1015.5 127.5,-1015.5"/>
+<text text-anchor="middle" x="165" y="-1064.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1057.5 214.5,-1057.5 "/>
+<text text-anchor="middle" x="165" y="-1043.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-1036.5 214.5,-1036.5 "/>
+<text text-anchor="middle" x="165" y="-1022.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="108.5" y="-1082.4" font-family="Arial" font-size="12.00">11</text>
+</g>
+<!-- 10&#45;&gt;11 -->
+<g id="edge11" class="edge"><title>10&#45;&gt;11</title>
+<path fill="none" stroke="black" d="M165,-1127.35C165,-1114.72 165,-1101.2 165,-1088.96"/>
+<polygon fill="black" stroke="black" points="168.5,-1088.59 165,-1078.59 161.5,-1088.59 168.5,-1088.59"/>
+<text text-anchor="middle" x="189" y="-1100.5" font-family="Arial" font-size="10.00">256x10x24</text>
+</g>
+<!-- 12 -->
+<g id="node12" class="node"><title>12</title>
+<path fill="none" stroke="red" stroke-width="2" d="M127.5,-903.5C127.5,-903.5 202.5,-903.5 202.5,-903.5 208.5,-903.5 214.5,-909.5 214.5,-915.5 214.5,-915.5 214.5,-954.5 214.5,-954.5 214.5,-960.5 208.5,-966.5 202.5,-966.5 202.5,-966.5 127.5,-966.5 127.5,-966.5 121.5,-966.5 115.5,-960.5 115.5,-954.5 115.5,-954.5 115.5,-915.5 115.5,-915.5 115.5,-909.5 121.5,-903.5 127.5,-903.5"/>
+<text text-anchor="middle" x="165" y="-952.9" font-family="Arial" font-size="12.00">Convolution 3x3</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-945.5 214.5,-945.5 "/>
+<text text-anchor="middle" x="165" y="-931.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-924.5 214.5,-924.5 "/>
+<text text-anchor="middle" x="165" y="-910.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="108.5" y="-970.4" font-family="Arial" font-size="12.00">12</text>
+</g>
+<!-- 11&#45;&gt;12 -->
+<g id="edge12" class="edge"><title>11&#45;&gt;12</title>
+<path fill="none" stroke="black" d="M165,-1015.36C165,-1003.54 165,-989.838 165,-977.18"/>
+<polygon fill="black" stroke="black" points="168.5,-976.858 165,-966.858 161.5,-976.858 168.5,-976.858"/>
+<text text-anchor="middle" x="189" y="-988.5" font-family="Arial" font-size="10.00">512x10x24</text>
+</g>
+<!-- 13 -->
+<g id="node13" class="node"><title>13</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M136.5,-805C136.5,-805 193.5,-805 193.5,-805 199.5,-805 205.5,-811 205.5,-817 205.5,-817 205.5,-829 205.5,-829 205.5,-835 199.5,-841 193.5,-841 193.5,-841 136.5,-841 136.5,-841 130.5,-841 124.5,-835 124.5,-829 124.5,-829 124.5,-817 124.5,-817 124.5,-811 130.5,-805 136.5,-805"/>
+<text text-anchor="middle" x="165" y="-826.4" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="165" y="-813.4" font-family="Arial" font-size="12.00">2x2</text>
+<text text-anchor="middle" x="117.5" y="-844.9" font-family="Arial" font-size="12.00">13</text>
+</g>
+<!-- 12&#45;&gt;13 -->
+<g id="edge13" class="edge"><title>12&#45;&gt;13</title>
+<path fill="none" stroke="black" d="M165,-903.359C165,-887.037 165,-867.129 165,-851.335"/>
+<polygon fill="black" stroke="black" points="168.5,-851.153 165,-841.154 161.5,-851.154 168.5,-851.153"/>
+<text text-anchor="middle" x="189" y="-876.5" font-family="Arial" font-size="10.00">512x10x24</text>
+</g>
+<!-- 17 -->
+<g id="node17" class="node"><title>17</title>
+<path fill="none" stroke="red" stroke-width="2" d="M244.5,-791.5C244.5,-791.5 319.5,-791.5 319.5,-791.5 325.5,-791.5 331.5,-797.5 331.5,-803.5 331.5,-803.5 331.5,-842.5 331.5,-842.5 331.5,-848.5 325.5,-854.5 319.5,-854.5 319.5,-854.5 244.5,-854.5 244.5,-854.5 238.5,-854.5 232.5,-848.5 232.5,-842.5 232.5,-842.5 232.5,-803.5 232.5,-803.5 232.5,-797.5 238.5,-791.5 244.5,-791.5"/>
+<text text-anchor="middle" x="282" y="-840.9" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-833.5 331.5,-833.5 "/>
+<text text-anchor="middle" x="282" y="-819.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-812.5 331.5,-812.5 "/>
+<text text-anchor="middle" x="282" y="-798.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="225.5" y="-858.4" font-family="Arial" font-size="12.00">17</text>
+</g>
+<!-- 12&#45;&gt;17 -->
+<g id="edge14" class="edge"><title>12&#45;&gt;17</title>
+<path fill="none" stroke="black" d="M197.591,-903.359C211.295,-890.475 227.376,-875.356 241.805,-861.791"/>
+<polygon fill="black" stroke="black" points="244.29,-864.258 249.178,-854.858 239.495,-859.158 244.29,-864.258"/>
+<text text-anchor="middle" x="252" y="-876.5" font-family="Arial" font-size="10.00">512x10x24</text>
+</g>
+<!-- 14 -->
+<g id="node14" class="node"><title>14</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M28.5,-693C28.5,-693 85.5,-693 85.5,-693 91.5,-693 97.5,-699 97.5,-705 97.5,-705 97.5,-717 97.5,-717 97.5,-723 91.5,-729 85.5,-729 85.5,-729 28.5,-729 28.5,-729 22.5,-729 16.5,-723 16.5,-717 16.5,-717 16.5,-705 16.5,-705 16.5,-699 22.5,-693 28.5,-693"/>
+<text text-anchor="middle" x="57" y="-714.4" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="57" y="-701.4" font-family="Arial" font-size="12.00">2x2</text>
+<text text-anchor="middle" x="9.5" y="-732.9" font-family="Arial" font-size="12.00">14</text>
+</g>
+<!-- 13&#45;&gt;14 -->
+<g id="edge15" class="edge"><title>13&#45;&gt;14</title>
+<path fill="none" stroke="black" d="M148.125,-804.812C130.055,-786.407 101.234,-757.053 80.8494,-736.291"/>
+<polygon fill="black" stroke="black" points="83.2599,-733.75 73.7565,-729.067 78.2649,-738.655 83.2599,-733.75"/>
+<text text-anchor="middle" x="136.5" y="-764.5" font-family="Arial" font-size="10.00">512x5x12</text>
+</g>
+<!-- 18 -->
+<g id="node18" class="node"><title>18</title>
+<path fill="none" stroke="red" stroke-width="2" d="M127.5,-679.5C127.5,-679.5 202.5,-679.5 202.5,-679.5 208.5,-679.5 214.5,-685.5 214.5,-691.5 214.5,-691.5 214.5,-730.5 214.5,-730.5 214.5,-736.5 208.5,-742.5 202.5,-742.5 202.5,-742.5 127.5,-742.5 127.5,-742.5 121.5,-742.5 115.5,-736.5 115.5,-730.5 115.5,-730.5 115.5,-691.5 115.5,-691.5 115.5,-685.5 121.5,-679.5 127.5,-679.5"/>
+<text text-anchor="middle" x="165" y="-728.9" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-721.5 214.5,-721.5 "/>
+<text text-anchor="middle" x="165" y="-707.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-700.5 214.5,-700.5 "/>
+<text text-anchor="middle" x="165" y="-686.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="108.5" y="-746.4" font-family="Arial" font-size="12.00">18</text>
+</g>
+<!-- 13&#45;&gt;18 -->
+<g id="edge16" class="edge"><title>13&#45;&gt;18</title>
+<path fill="none" stroke="black" d="M165,-804.812C165,-790.972 165,-770.941 165,-753.027"/>
+<polygon fill="black" stroke="black" points="168.5,-752.787 165,-742.787 161.5,-752.787 168.5,-752.787"/>
+<text text-anchor="middle" x="186.5" y="-764.5" font-family="Arial" font-size="10.00">512x5x12</text>
+</g>
+<!-- 15 -->
+<g id="node15" class="node"><title>15</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M28.5,-581C28.5,-581 85.5,-581 85.5,-581 91.5,-581 97.5,-587 97.5,-593 97.5,-593 97.5,-605 97.5,-605 97.5,-611 91.5,-617 85.5,-617 85.5,-617 28.5,-617 28.5,-617 22.5,-617 16.5,-611 16.5,-605 16.5,-605 16.5,-593 16.5,-593 16.5,-587 22.5,-581 28.5,-581"/>
+<text text-anchor="middle" x="57" y="-602.4" font-family="Arial" font-size="12.00">Pooling Max</text>
+<text text-anchor="middle" x="57" y="-589.4" font-family="Arial" font-size="12.00">2x2</text>
+<text text-anchor="middle" x="9.5" y="-620.9" font-family="Arial" font-size="12.00">15</text>
+</g>
+<!-- 14&#45;&gt;15 -->
+<g id="edge17" class="edge"><title>14&#45;&gt;15</title>
+<path fill="none" stroke="black" d="M57,-692.812C57,-675.215 57,-647.607 57,-627.071"/>
+<polygon fill="black" stroke="black" points="60.5001,-627.067 57,-617.067 53.5001,-627.067 60.5001,-627.067"/>
+<text text-anchor="middle" x="75.5" y="-652.5" font-family="Arial" font-size="10.00">512x3x6</text>
+</g>
+<!-- 19 -->
+<g id="node19" class="node"><title>19</title>
+<path fill="none" stroke="red" stroke-width="2" d="M127.5,-567.5C127.5,-567.5 202.5,-567.5 202.5,-567.5 208.5,-567.5 214.5,-573.5 214.5,-579.5 214.5,-579.5 214.5,-618.5 214.5,-618.5 214.5,-624.5 208.5,-630.5 202.5,-630.5 202.5,-630.5 127.5,-630.5 127.5,-630.5 121.5,-630.5 115.5,-624.5 115.5,-618.5 115.5,-618.5 115.5,-579.5 115.5,-579.5 115.5,-573.5 121.5,-567.5 127.5,-567.5"/>
+<text text-anchor="middle" x="165" y="-616.9" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-609.5 214.5,-609.5 "/>
+<text text-anchor="middle" x="165" y="-595.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="115.5,-588.5 214.5,-588.5 "/>
+<text text-anchor="middle" x="165" y="-574.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="108.5" y="-634.4" font-family="Arial" font-size="12.00">19</text>
+</g>
+<!-- 14&#45;&gt;19 -->
+<g id="edge18" class="edge"><title>14&#45;&gt;19</title>
+<path fill="none" stroke="black" d="M73.875,-692.812C88.2254,-678.196 109.356,-656.675 127.656,-638.035"/>
+<polygon fill="black" stroke="black" points="130.264,-640.375 134.772,-630.787 125.269,-635.471 130.264,-640.375"/>
+<text text-anchor="middle" x="133.5" y="-652.5" font-family="Arial" font-size="10.00">512x3x6</text>
+</g>
+<!-- 20 -->
+<g id="node20" class="node"><title>20</title>
+<path fill="none" stroke="red" stroke-width="2" d="M28.5,-455.5C28.5,-455.5 103.5,-455.5 103.5,-455.5 109.5,-455.5 115.5,-461.5 115.5,-467.5 115.5,-467.5 115.5,-506.5 115.5,-506.5 115.5,-512.5 109.5,-518.5 103.5,-518.5 103.5,-518.5 28.5,-518.5 28.5,-518.5 22.5,-518.5 16.5,-512.5 16.5,-506.5 16.5,-506.5 16.5,-467.5 16.5,-467.5 16.5,-461.5 22.5,-455.5 28.5,-455.5"/>
+<text text-anchor="middle" x="66" y="-504.9" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="16.5,-497.5 115.5,-497.5 "/>
+<text text-anchor="middle" x="66" y="-483.9" font-family="Arial" font-size="12.00">ReLU</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="16.5,-476.5 115.5,-476.5 "/>
+<text text-anchor="middle" x="66" y="-462.9" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="9.5" y="-522.4" font-family="Arial" font-size="12.00">20</text>
+</g>
+<!-- 15&#45;&gt;20 -->
+<g id="edge19" class="edge"><title>15&#45;&gt;20</title>
+<path fill="none" stroke="black" d="M58.4062,-580.812C59.5439,-566.908 61.1929,-546.753 62.6638,-528.776"/>
+<polygon fill="black" stroke="black" points="66.1538,-529.04 63.481,-518.787 59.1771,-528.469 66.1538,-529.04"/>
+<text text-anchor="middle" x="80.5" y="-540.5" font-family="Arial" font-size="10.00">512x2x3</text>
+</g>
+<!-- 21 -->
+<g id="node21" class="node"><title>21</title>
+<path fill="none" stroke="red" stroke-width="2" d="M244.5,-1284C244.5,-1284 319.5,-1284 319.5,-1284 325.5,-1284 331.5,-1290 331.5,-1296 331.5,-1296 331.5,-1314 331.5,-1314 331.5,-1320 325.5,-1326 319.5,-1326 319.5,-1326 244.5,-1326 244.5,-1326 238.5,-1326 232.5,-1320 232.5,-1314 232.5,-1314 232.5,-1296 232.5,-1296 232.5,-1290 238.5,-1284 244.5,-1284"/>
+<text text-anchor="middle" x="282" y="-1312.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-1305 331.5,-1305 "/>
+<text text-anchor="middle" x="282" y="-1291.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="225.5" y="-1329.9" font-family="Arial" font-size="12.00">21</text>
+</g>
+<!-- 16&#45;&gt;21 -->
+<g id="edge20" class="edge"><title>16&#45;&gt;21</title>
+<path fill="none" stroke="black" d="M282,-1385.36C282,-1370.11 282,-1351.74 282,-1336.52"/>
+<polygon fill="black" stroke="black" points="285.5,-1336.07 282,-1326.07 278.5,-1336.07 285.5,-1336.07"/>
+<text text-anchor="middle" x="306" y="-1358.5" font-family="Arial" font-size="10.00">256x40x96</text>
+</g>
+<!-- 23 -->
+<g id="node22" class="node"><title>23</title>
+<path fill="none" stroke="red" stroke-width="2" d="M361.5,-1284C361.5,-1284 436.5,-1284 436.5,-1284 442.5,-1284 448.5,-1290 448.5,-1296 448.5,-1296 448.5,-1314 448.5,-1314 448.5,-1320 442.5,-1326 436.5,-1326 436.5,-1326 361.5,-1326 361.5,-1326 355.5,-1326 349.5,-1320 349.5,-1314 349.5,-1314 349.5,-1296 349.5,-1296 349.5,-1290 355.5,-1284 361.5,-1284"/>
+<text text-anchor="middle" x="399" y="-1312.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="349.5,-1305 448.5,-1305 "/>
+<text text-anchor="middle" x="399" y="-1291.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="342.5" y="-1329.9" font-family="Arial" font-size="12.00">23</text>
+</g>
+<!-- 16&#45;&gt;23 -->
+<g id="edge21" class="edge"><title>16&#45;&gt;23</title>
+<path fill="none" stroke="black" d="M314.591,-1385.36C332.064,-1368.93 353.403,-1348.87 370.253,-1333.03"/>
+<polygon fill="black" stroke="black" points="372.761,-1335.47 377.649,-1326.07 367.966,-1330.37 372.761,-1335.47"/>
+<text text-anchor="middle" x="369" y="-1358.5" font-family="Arial" font-size="10.00">256x40x96</text>
+</g>
+<!-- 25 -->
+<g id="node23" class="node"><title>25</title>
+<path fill="none" stroke="red" stroke-width="2" d="M244.5,-690C244.5,-690 319.5,-690 319.5,-690 325.5,-690 331.5,-696 331.5,-702 331.5,-702 331.5,-720 331.5,-720 331.5,-726 325.5,-732 319.5,-732 319.5,-732 244.5,-732 244.5,-732 238.5,-732 232.5,-726 232.5,-720 232.5,-720 232.5,-702 232.5,-702 232.5,-696 238.5,-690 244.5,-690"/>
+<text text-anchor="middle" x="282" y="-718.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-711 331.5,-711 "/>
+<text text-anchor="middle" x="282" y="-697.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="225.5" y="-735.9" font-family="Arial" font-size="12.00">25</text>
+</g>
+<!-- 17&#45;&gt;25 -->
+<g id="edge22" class="edge"><title>17&#45;&gt;25</title>
+<path fill="none" stroke="black" d="M282,-791.359C282,-776.115 282,-757.742 282,-742.515"/>
+<polygon fill="black" stroke="black" points="285.5,-742.074 282,-732.074 278.5,-742.074 285.5,-742.074"/>
+<text text-anchor="middle" x="306" y="-764.5" font-family="Arial" font-size="10.00">256x10x24</text>
+</g>
+<!-- 27 -->
+<g id="node24" class="node"><title>27</title>
+<path fill="none" stroke="red" stroke-width="2" d="M361.5,-690C361.5,-690 436.5,-690 436.5,-690 442.5,-690 448.5,-696 448.5,-702 448.5,-702 448.5,-720 448.5,-720 448.5,-726 442.5,-732 436.5,-732 436.5,-732 361.5,-732 361.5,-732 355.5,-732 349.5,-726 349.5,-720 349.5,-720 349.5,-702 349.5,-702 349.5,-696 355.5,-690 361.5,-690"/>
+<text text-anchor="middle" x="399" y="-718.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="349.5,-711 448.5,-711 "/>
+<text text-anchor="middle" x="399" y="-697.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="342.5" y="-735.9" font-family="Arial" font-size="12.00">27</text>
+</g>
+<!-- 17&#45;&gt;27 -->
+<g id="edge23" class="edge"><title>17&#45;&gt;27</title>
+<path fill="none" stroke="black" d="M314.591,-791.359C332.064,-774.931 353.403,-754.869 370.253,-739.027"/>
+<polygon fill="black" stroke="black" points="372.761,-741.474 377.649,-732.074 367.966,-736.374 372.761,-741.474"/>
+<text text-anchor="middle" x="369" y="-764.5" font-family="Arial" font-size="10.00">256x10x24</text>
+</g>
+<!-- 29 -->
+<g id="node25" class="node"><title>29</title>
+<path fill="none" stroke="red" stroke-width="2" d="M244.5,-578C244.5,-578 319.5,-578 319.5,-578 325.5,-578 331.5,-584 331.5,-590 331.5,-590 331.5,-608 331.5,-608 331.5,-614 325.5,-620 319.5,-620 319.5,-620 244.5,-620 244.5,-620 238.5,-620 232.5,-614 232.5,-608 232.5,-608 232.5,-590 232.5,-590 232.5,-584 238.5,-578 244.5,-578"/>
+<text text-anchor="middle" x="282" y="-606.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="232.5,-599 331.5,-599 "/>
+<text text-anchor="middle" x="282" y="-585.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="225.5" y="-623.9" font-family="Arial" font-size="12.00">29</text>
+</g>
+<!-- 18&#45;&gt;29 -->
+<g id="edge24" class="edge"><title>18&#45;&gt;29</title>
+<path fill="none" stroke="black" d="M197.591,-679.359C215.064,-662.931 236.403,-642.869 253.253,-627.027"/>
+<polygon fill="black" stroke="black" points="255.761,-629.474 260.649,-620.074 250.966,-624.374 255.761,-629.474"/>
+<text text-anchor="middle" x="249.5" y="-652.5" font-family="Arial" font-size="10.00">256x5x12</text>
+</g>
+<!-- 31 -->
+<g id="node26" class="node"><title>31</title>
+<path fill="none" stroke="red" stroke-width="2" d="M361.5,-578C361.5,-578 436.5,-578 436.5,-578 442.5,-578 448.5,-584 448.5,-590 448.5,-590 448.5,-608 448.5,-608 448.5,-614 442.5,-620 436.5,-620 436.5,-620 361.5,-620 361.5,-620 355.5,-620 349.5,-614 349.5,-608 349.5,-608 349.5,-590 349.5,-590 349.5,-584 355.5,-578 361.5,-578"/>
+<text text-anchor="middle" x="399" y="-606.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="349.5,-599 448.5,-599 "/>
+<text text-anchor="middle" x="399" y="-585.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="342.5" y="-623.9" font-family="Arial" font-size="12.00">31</text>
+</g>
+<!-- 18&#45;&gt;31 -->
+<g id="edge25" class="edge"><title>18&#45;&gt;31</title>
+<path fill="none" stroke="black" d="M214.74,-682.773C217.514,-681.456 220.28,-680.189 223,-679 245.41,-669.205 252.314,-670.136 275,-661 304.514,-649.115 311.463,-645.071 340,-631 344.02,-629.018 348.174,-626.926 352.33,-624.803"/>
+<polygon fill="black" stroke="black" points="354.095,-627.83 361.378,-620.135 350.886,-621.609 354.095,-627.83"/>
+<text text-anchor="middle" x="324.5" y="-652.5" font-family="Arial" font-size="10.00">256x5x12</text>
+</g>
+<!-- 33 -->
+<g id="node27" class="node"><title>33</title>
+<path fill="none" stroke="red" stroke-width="2" d="M145.5,-466C145.5,-466 220.5,-466 220.5,-466 226.5,-466 232.5,-472 232.5,-478 232.5,-478 232.5,-496 232.5,-496 232.5,-502 226.5,-508 220.5,-508 220.5,-508 145.5,-508 145.5,-508 139.5,-508 133.5,-502 133.5,-496 133.5,-496 133.5,-478 133.5,-478 133.5,-472 139.5,-466 145.5,-466"/>
+<text text-anchor="middle" x="183" y="-494.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="133.5,-487 232.5,-487 "/>
+<text text-anchor="middle" x="183" y="-473.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="126.5" y="-511.9" font-family="Arial" font-size="12.00">33</text>
+</g>
+<!-- 19&#45;&gt;33 -->
+<g id="edge26" class="edge"><title>19&#45;&gt;33</title>
+<path fill="none" stroke="black" d="M170.014,-567.359C172.533,-551.967 175.573,-533.385 178.079,-518.073"/>
+<polygon fill="black" stroke="black" points="181.554,-518.508 179.715,-508.074 174.646,-517.377 181.554,-518.508"/>
+<text text-anchor="middle" x="193.5" y="-540.5" font-family="Arial" font-size="10.00">256x3x6</text>
+</g>
+<!-- 35 -->
+<g id="node28" class="node"><title>35</title>
+<path fill="none" stroke="red" stroke-width="2" d="M262.5,-466C262.5,-466 337.5,-466 337.5,-466 343.5,-466 349.5,-472 349.5,-478 349.5,-478 349.5,-496 349.5,-496 349.5,-502 343.5,-508 337.5,-508 337.5,-508 262.5,-508 262.5,-508 256.5,-508 250.5,-502 250.5,-496 250.5,-496 250.5,-478 250.5,-478 250.5,-472 256.5,-466 262.5,-466"/>
+<text text-anchor="middle" x="300" y="-494.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="250.5,-487 349.5,-487 "/>
+<text text-anchor="middle" x="300" y="-473.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="243.5" y="-511.9" font-family="Arial" font-size="12.00">35</text>
+</g>
+<!-- 19&#45;&gt;35 -->
+<g id="edge27" class="edge"><title>19&#45;&gt;35</title>
+<path fill="none" stroke="black" d="M202.605,-567.359C222.948,-550.783 247.832,-530.508 267.354,-514.6"/>
+<polygon fill="black" stroke="black" points="269.823,-517.104 275.364,-508.074 265.401,-511.677 269.823,-517.104"/>
+<text text-anchor="middle" x="255.5" y="-540.5" font-family="Arial" font-size="10.00">256x3x6</text>
+</g>
+<!-- 37 -->
+<g id="node29" class="node"><title>37</title>
+<path fill="none" stroke="red" stroke-width="2" d="M28.5,-364C28.5,-364 103.5,-364 103.5,-364 109.5,-364 115.5,-370 115.5,-376 115.5,-376 115.5,-394 115.5,-394 115.5,-400 109.5,-406 103.5,-406 103.5,-406 28.5,-406 28.5,-406 22.5,-406 16.5,-400 16.5,-394 16.5,-394 16.5,-376 16.5,-376 16.5,-370 22.5,-364 28.5,-364"/>
+<text text-anchor="middle" x="66" y="-392.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="16.5,-385 115.5,-385 "/>
+<text text-anchor="middle" x="66" y="-371.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="9.5" y="-409.9" font-family="Arial" font-size="12.00">37</text>
+</g>
+<!-- 20&#45;&gt;37 -->
+<g id="edge28" class="edge"><title>20&#45;&gt;37</title>
+<path fill="none" stroke="black" d="M66,-455.453C66,-443.103 66,-428.877 66,-416.529"/>
+<polygon fill="black" stroke="black" points="69.5001,-416.255 66,-406.255 62.5001,-416.255 69.5001,-416.255"/>
+<text text-anchor="middle" x="84.5" y="-428.5" font-family="Arial" font-size="10.00">256x2x3</text>
+</g>
+<!-- 39 -->
+<g id="node30" class="node"><title>39</title>
+<path fill="none" stroke="red" stroke-width="2" d="M145.5,-364C145.5,-364 220.5,-364 220.5,-364 226.5,-364 232.5,-370 232.5,-376 232.5,-376 232.5,-394 232.5,-394 232.5,-400 226.5,-406 220.5,-406 220.5,-406 145.5,-406 145.5,-406 139.5,-406 133.5,-400 133.5,-394 133.5,-394 133.5,-376 133.5,-376 133.5,-370 139.5,-364 145.5,-364"/>
+<text text-anchor="middle" x="183" y="-392.4" font-family="Arial" font-size="12.00">Convolution 1x1</text>
+<polyline fill="none" stroke="red" stroke-width="2" points="133.5,-385 232.5,-385 "/>
+<text text-anchor="middle" x="183" y="-371.4" font-family="Arial" font-size="12.00">Bias</text>
+<text text-anchor="middle" x="126.5" y="-409.9" font-family="Arial" font-size="12.00">39</text>
+</g>
+<!-- 20&#45;&gt;39 -->
+<g id="edge29" class="edge"><title>20&#45;&gt;39</title>
+<path fill="none" stroke="black" d="M101.74,-455.453C117.649,-441.856 136.218,-425.984 151.587,-412.849"/>
+<polygon fill="black" stroke="black" points="153.974,-415.413 159.301,-406.255 149.425,-410.092 153.974,-415.413"/>
+<text text-anchor="middle" x="153.5" y="-428.5" font-family="Arial" font-size="10.00">256x2x3</text>
+</g>
+<!-- 22 -->
+<g id="node31" class="node"><title>22</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M678,-257C678,-257 708,-257 708,-257 714,-257 720,-263 720,-269 720,-269 720,-281 720,-281 720,-287 714,-293 708,-293 708,-293 678,-293 678,-293 672,-293 666,-287 666,-281 666,-281 666,-269 666,-269 666,-263 672,-257 678,-257"/>
+<text text-anchor="middle" x="693" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="659" y="-296.9" font-family="Arial" font-size="12.00">22</text>
+</g>
+<!-- 21&#45;&gt;22 -->
+<g id="edge43" class="edge"><title>21&#45;&gt;22</title>
+<path fill="none" stroke="black" d="M316.69,-1283.9C324.231,-1279.97 332.269,-1276.11 340,-1273 485.642,-1214.32 680,-1334.02 680,-1177 680,-1177 680,-1177 680,-384 680,-356.247 684.284,-324.769 687.933,-302.987"/>
+<polygon fill="black" stroke="black" points="691.382,-303.585 689.652,-293.132 684.486,-302.382 691.382,-303.585"/>
+<text text-anchor="middle" x="701.5" y="-764.5" font-family="Arial" font-size="10.00">16x40x96</text>
+</g>
+<!-- 24 -->
+<g id="node32" class="node"><title>24</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M750,-257C750,-257 780,-257 780,-257 786,-257 792,-263 792,-269 792,-269 792,-281 792,-281 792,-287 786,-293 780,-293 780,-293 750,-293 750,-293 744,-293 738,-287 738,-281 738,-281 738,-269 738,-269 738,-263 744,-257 750,-257"/>
+<text text-anchor="middle" x="765" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="731" y="-296.9" font-family="Arial" font-size="12.00">24</text>
+</g>
+<!-- 23&#45;&gt;24 -->
+<g id="edge44" class="edge"><title>23&#45;&gt;24</title>
+<path fill="none" stroke="black" d="M448.657,-1299.83C521.411,-1293.04 652.806,-1278 694,-1255 734.156,-1232.58 762,-1222.99 762,-1177 762,-1177 762,-1177 762,-384 762,-356.561 762.98,-325.216 763.819,-303.388"/>
+<polygon fill="black" stroke="black" points="767.324,-303.337 764.227,-293.204 760.33,-303.056 767.324,-303.337"/>
+<text text-anchor="middle" x="783.5" y="-764.5" font-family="Arial" font-size="10.00">16x40x96</text>
+</g>
+<!-- 26 -->
+<g id="node33" class="node"><title>26</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M318,-257C318,-257 348,-257 348,-257 354,-257 360,-263 360,-269 360,-269 360,-281 360,-281 360,-287 354,-293 348,-293 348,-293 318,-293 318,-293 312,-293 306,-287 306,-281 306,-281 306,-269 306,-269 306,-263 312,-257 318,-257"/>
+<text text-anchor="middle" x="333" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="299" y="-296.9" font-family="Arial" font-size="12.00">26</text>
+</g>
+<!-- 25&#45;&gt;26 -->
+<g id="edge45" class="edge"><title>25&#45;&gt;26</title>
+<path fill="none" stroke="black" d="M318.222,-689.915C325.374,-686.155 332.873,-682.356 340,-679 390.85,-655.055 425.695,-677.681 457,-631 494.931,-574.44 388.678,-374.286 348.06,-302.154"/>
+<polygon fill="black" stroke="black" points="350.982,-300.21 343.005,-293.237 344.892,-303.663 350.982,-300.21"/>
+<text text-anchor="middle" x="470.5" y="-484.5" font-family="Arial" font-size="10.00">24x10x24</text>
+</g>
+<!-- 28 -->
+<g id="node34" class="node"><title>28</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M606,-257C606,-257 636,-257 636,-257 642,-257 648,-263 648,-269 648,-269 648,-281 648,-281 648,-287 642,-293 636,-293 636,-293 606,-293 606,-293 600,-293 594,-287 594,-281 594,-281 594,-269 594,-269 594,-263 600,-257 606,-257"/>
+<text text-anchor="middle" x="621" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="587" y="-296.9" font-family="Arial" font-size="12.00">28</text>
+</g>
+<!-- 27&#45;&gt;28 -->
+<g id="edge46" class="edge"><title>27&#45;&gt;28</title>
+<path fill="none" stroke="black" d="M448.673,-704.636C508.484,-695.105 601,-669.182 601,-600 601,-600 601,-600 601,-384 601,-355.978 607.59,-324.539 613.205,-302.84"/>
+<polygon fill="black" stroke="black" points="616.626,-303.595 615.85,-293.028 609.868,-301.773 616.626,-303.595"/>
+<text text-anchor="middle" x="622.5" y="-484.5" font-family="Arial" font-size="10.00">24x10x24</text>
+</g>
+<!-- 30 -->
+<g id="node35" class="node"><title>30</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M246,-257C246,-257 276,-257 276,-257 282,-257 288,-263 288,-269 288,-269 288,-281 288,-281 288,-287 282,-293 276,-293 276,-293 246,-293 246,-293 240,-293 234,-287 234,-281 234,-281 234,-269 234,-269 234,-263 240,-257 246,-257"/>
+<text text-anchor="middle" x="261" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="227" y="-296.9" font-family="Arial" font-size="12.00">30</text>
+</g>
+<!-- 29&#45;&gt;30 -->
+<g id="edge47" class="edge"><title>29&#45;&gt;30</title>
+<path fill="none" stroke="black" d="M310.451,-577.709C327.788,-563.497 348.398,-542.831 358,-519 368.63,-492.617 364.99,-482.572 358,-455 342.929,-395.557 303.734,-334.47 280.035,-301.27"/>
+<polygon fill="black" stroke="black" points="282.785,-299.1 274.081,-293.058 277.118,-303.209 282.785,-299.1"/>
+<text text-anchor="middle" x="371.5" y="-428.5" font-family="Arial" font-size="10.00">24x5x12</text>
+</g>
+<!-- 32 -->
+<g id="node36" class="node"><title>32</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M534,-257C534,-257 564,-257 564,-257 570,-257 576,-263 576,-269 576,-269 576,-281 576,-281 576,-287 570,-293 564,-293 564,-293 534,-293 534,-293 528,-293 522,-287 522,-281 522,-281 522,-269 522,-269 522,-263 528,-257 534,-257"/>
+<text text-anchor="middle" x="549" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="515" y="-296.9" font-family="Arial" font-size="12.00">32</text>
+</g>
+<!-- 31&#45;&gt;32 -->
+<g id="edge48" class="edge"><title>31&#45;&gt;32</title>
+<path fill="none" stroke="black" d="M439.337,-577.858C462.196,-564.338 489.285,-544.363 505,-519 547.633,-450.195 551.315,-350.713 550.31,-303.223"/>
+<polygon fill="black" stroke="black" points="553.805,-303.001 550.006,-293.11 546.808,-303.211 553.805,-303.001"/>
+<text text-anchor="middle" x="558.5" y="-428.5" font-family="Arial" font-size="10.00">24x5x12</text>
+</g>
+<!-- 34 -->
+<g id="node37" class="node"><title>34</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M174,-257C174,-257 204,-257 204,-257 210,-257 216,-263 216,-269 216,-269 216,-281 216,-281 216,-287 210,-293 204,-293 204,-293 174,-293 174,-293 168,-293 162,-287 162,-281 162,-281 162,-269 162,-269 162,-263 168,-257 174,-257"/>
+<text text-anchor="middle" x="189" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="155" y="-296.9" font-family="Arial" font-size="12.00">34</text>
+</g>
+<!-- 33&#45;&gt;34 -->
+<g id="edge49" class="edge"><title>33&#45;&gt;34</title>
+<path fill="none" stroke="black" d="M203.365,-465.982C216.932,-451.141 233.583,-429.636 241,-407 248.196,-385.038 247.632,-377.139 241,-355 237.588,-343.611 221.395,-319.825 207.974,-301.314"/>
+<polygon fill="black" stroke="black" points="210.793,-299.24 202.058,-293.244 205.147,-303.378 210.793,-299.24"/>
+<text text-anchor="middle" x="263" y="-382.5" font-family="Arial" font-size="10.00">24x3x6</text>
+</g>
+<!-- 36 -->
+<g id="node38" class="node"><title>36</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M462,-257C462,-257 492,-257 492,-257 498,-257 504,-263 504,-269 504,-269 504,-281 504,-281 504,-287 498,-293 492,-293 492,-293 462,-293 462,-293 456,-293 450,-287 450,-281 450,-281 450,-269 450,-269 450,-263 456,-257 462,-257"/>
+<text text-anchor="middle" x="477" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="443" y="-296.9" font-family="Arial" font-size="12.00">36</text>
+</g>
+<!-- 35&#45;&gt;36 -->
+<g id="edge50" class="edge"><title>35&#45;&gt;36</title>
+<path fill="none" stroke="black" d="M349.681,-475.523C373.393,-468.256 400.549,-456.298 419,-437 454.725,-399.636 468.681,-338.686 473.956,-303.473"/>
+<polygon fill="black" stroke="black" points="477.443,-303.808 475.329,-293.426 470.507,-302.86 477.443,-303.808"/>
+<text text-anchor="middle" x="479" y="-382.5" font-family="Arial" font-size="10.00">24x3x6</text>
+</g>
+<!-- 38 -->
+<g id="node39" class="node"><title>38</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M102,-257C102,-257 132,-257 132,-257 138,-257 144,-263 144,-269 144,-269 144,-281 144,-281 144,-287 138,-293 132,-293 132,-293 102,-293 102,-293 96,-293 90,-287 90,-281 90,-281 90,-269 90,-269 90,-263 96,-257 102,-257"/>
+<text text-anchor="middle" x="117" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="83" y="-296.9" font-family="Arial" font-size="12.00">38</text>
+</g>
+<!-- 37&#45;&gt;38 -->
+<g id="edge51" class="edge"><title>37&#45;&gt;38</title>
+<path fill="none" stroke="black" d="M75.4732,-363.939C83.6663,-346.589 95.5716,-321.378 104.536,-302.394"/>
+<polygon fill="black" stroke="black" points="107.816,-303.645 108.921,-293.108 101.486,-300.656 107.816,-303.645"/>
+<text text-anchor="middle" x="106" y="-336.5" font-family="Arial" font-size="10.00">16x2x3</text>
+</g>
+<!-- 40 -->
+<g id="node40" class="node"><title>40</title>
+<path fill="none" stroke="darkorange" stroke-width="2" d="M390,-257C390,-257 420,-257 420,-257 426,-257 432,-263 432,-269 432,-269 432,-281 432,-281 432,-287 426,-293 420,-293 420,-293 390,-293 390,-293 384,-293 378,-287 378,-281 378,-281 378,-269 378,-269 378,-263 384,-257 390,-257"/>
+<text text-anchor="middle" x="405" y="-271.9" font-family="Arial" font-size="12.00">Flatten</text>
+<text text-anchor="middle" x="371" y="-296.9" font-family="Arial" font-size="12.00">40</text>
+</g>
+<!-- 39&#45;&gt;40 -->
+<g id="edge52" class="edge"><title>39&#45;&gt;40</title>
+<path fill="none" stroke="black" d="M224.205,-363.991C231.693,-360.74 239.507,-357.594 247,-355 299.765,-336.733 322.576,-356.026 369,-325 377.729,-319.167 385.108,-310.47 390.87,-302.016"/>
+<polygon fill="black" stroke="black" points="393.914,-303.751 396.278,-293.424 387.989,-300.023 393.914,-303.751"/>
+<text text-anchor="middle" x="370" y="-336.5" font-family="Arial" font-size="10.00">16x2x3</text>
+</g>
+<!-- 41 -->
+<g id="node41" class="node"><title>41</title>
+<path fill="none" stroke="darkseagreen" stroke-width="2" d="M281,-171C281,-171 311,-171 311,-171 317,-171 323,-177 323,-183 323,-183 323,-195 323,-195 323,-201 317,-207 311,-207 311,-207 281,-207 281,-207 275,-207 269,-201 269,-195 269,-195 269,-183 269,-183 269,-177 275,-171 281,-171"/>
+<text text-anchor="middle" x="296" y="-185.9" font-family="Arial" font-size="12.00">Concat</text>
+<text text-anchor="middle" x="262" y="-210.9" font-family="Arial" font-size="12.00">41</text>
+</g>
+<!-- 22&#45;&gt;41 -->
+<g id="edge30" class="edge"><title>22&#45;&gt;41</title>
+<path fill="none" stroke="black" d="M678.816,-256.787C668.872,-246.004 654.607,-232.887 639,-226 637.258,-225.231 421.589,-202.941 333.168,-193.827"/>
+<polygon fill="black" stroke="black" points="333.345,-190.327 323.039,-192.783 332.627,-197.29 333.345,-190.327"/>
+<text text-anchor="middle" x="682" y="-229.5" font-family="Arial" font-size="10.00">1x1x61440</text>
+</g>
+<!-- 42 -->
+<g id="node42" class="node"><title>42</title>
+<path fill="none" stroke="darkseagreen" stroke-width="2" d="M493,-171C493,-171 523,-171 523,-171 529,-171 535,-177 535,-183 535,-183 535,-195 535,-195 535,-201 529,-207 523,-207 523,-207 493,-207 493,-207 487,-207 481,-201 481,-195 481,-195 481,-183 481,-183 481,-177 487,-171 493,-171"/>
+<text text-anchor="middle" x="508" y="-185.9" font-family="Arial" font-size="12.00">Concat</text>
+<text text-anchor="middle" x="474" y="-210.9" font-family="Arial" font-size="12.00">42</text>
+</g>
+<!-- 24&#45;&gt;42 -->
+<g id="edge31" class="edge"><title>24&#45;&gt;42</title>
+<path fill="none" stroke="black" d="M753.613,-256.618C745.739,-246.05 734.307,-233.238 721,-226 665.031,-195.559 589.547,-189.666 545.095,-189.146"/>
+<polygon fill="black" stroke="black" points="545.039,-185.646 535.028,-189.115 545.017,-192.646 545.039,-185.646"/>
+<text text-anchor="middle" x="760" y="-229.5" font-family="Arial" font-size="10.00">1x1x61440</text>
+</g>
+<!-- 26&#45;&gt;41 -->
+<g id="edge32" class="edge"><title>26&#45;&gt;41</title>
+<path fill="none" stroke="black" d="M325.334,-256.595C320.24,-245.03 313.454,-229.624 307.692,-216.543"/>
+<polygon fill="black" stroke="black" points="310.764,-214.836 303.53,-207.095 304.358,-217.658 310.764,-214.836"/>
+<text text-anchor="middle" x="338.5" y="-229.5" font-family="Arial" font-size="10.00">1x1x5760</text>
+</g>
+<!-- 28&#45;&gt;42 -->
+<g id="edge33" class="edge"><title>28&#45;&gt;42</title>
+<path fill="none" stroke="black" d="M608,-256.565C600.084,-246.754 589.334,-234.754 578,-226 567.86,-218.169 555.76,-211.245 544.494,-205.615"/>
+<polygon fill="black" stroke="black" points="545.818,-202.369 535.288,-201.198 542.79,-208.68 545.818,-202.369"/>
+<text text-anchor="middle" x="613.5" y="-229.5" font-family="Arial" font-size="10.00">1x1x5760</text>
+</g>
+<!-- 30&#45;&gt;41 -->
+<g id="edge34" class="edge"><title>30&#45;&gt;41</title>
+<path fill="none" stroke="black" d="M259.895,-256.955C259.893,-247.497 260.926,-235.717 265,-226 266.57,-222.256 268.682,-218.621 271.07,-215.192"/>
+<polygon fill="black" stroke="black" points="273.973,-217.163 277.421,-207.145 268.478,-212.826 273.973,-217.163"/>
+<text text-anchor="middle" x="286.5" y="-229.5" font-family="Arial" font-size="10.00">1x1x1440</text>
+</g>
+<!-- 32&#45;&gt;42 -->
+<g id="edge35" class="edge"><title>32&#45;&gt;42</title>
+<path fill="none" stroke="black" d="M540.505,-256.595C534.805,-244.917 527.193,-229.322 520.768,-216.159"/>
+<polygon fill="black" stroke="black" points="523.876,-214.547 516.344,-207.095 517.585,-217.617 523.876,-214.547"/>
+<text text-anchor="middle" x="552.5" y="-229.5" font-family="Arial" font-size="10.00">1x1x1440</text>
+</g>
+<!-- 34&#45;&gt;41 -->
+<g id="edge36" class="edge"><title>34&#45;&gt;41</title>
+<path fill="none" stroke="black" d="M197.481,-256.767C203.072,-246.782 211.17,-234.538 221,-226 232.232,-216.245 246.566,-208.512 259.689,-202.753"/>
+<polygon fill="black" stroke="black" points="261.07,-205.97 268.968,-198.908 258.39,-199.503 261.07,-205.97"/>
+<text text-anchor="middle" x="239.5" y="-229.5" font-family="Arial" font-size="10.00">1x1x432</text>
+</g>
+<!-- 36&#45;&gt;42 -->
+<g id="edge37" class="edge"><title>36&#45;&gt;42</title>
+<path fill="none" stroke="black" d="M475.648,-256.599C475.518,-247.248 476.336,-235.683 480,-226 481.41,-222.274 483.347,-218.622 485.55,-215.159"/>
+<polygon fill="black" stroke="black" points="488.418,-217.165 491.423,-207.005 482.739,-213.074 488.418,-217.165"/>
+<text text-anchor="middle" x="498.5" y="-229.5" font-family="Arial" font-size="10.00">1x1x432</text>
+</g>
+<!-- 38&#45;&gt;41 -->
+<g id="edge38" class="edge"><title>38&#45;&gt;41</title>
+<path fill="none" stroke="black" d="M133.928,-256.843C144.834,-246.632 159.779,-234.124 175,-226 201.393,-211.914 234.041,-202.614 258.77,-197.001"/>
+<polygon fill="black" stroke="black" points="259.811,-200.357 268.843,-194.819 258.328,-193.516 259.811,-200.357"/>
+<text text-anchor="middle" x="191" y="-229.5" font-family="Arial" font-size="10.00">1x1x96</text>
+</g>
+<!-- 40&#45;&gt;42 -->
+<g id="edge39" class="edge"><title>40&#45;&gt;42</title>
+<path fill="none" stroke="black" d="M415.116,-256.979C421.609,-247.069 430.732,-234.829 441,-226 450.138,-218.143 461.276,-211.313 471.826,-205.775"/>
+<polygon fill="black" stroke="black" points="473.502,-208.851 480.882,-201.249 470.372,-202.59 473.502,-208.851"/>
+<text text-anchor="middle" x="457" y="-229.5" font-family="Arial" font-size="10.00">1x1x96</text>
+</g>
+<!-- 43 -->
+<g id="node43" class="node"><title>43</title>
+<path fill="none" stroke="yellow" stroke-width="2" d="M327.5,-85C327.5,-85 404.5,-85 404.5,-85 410.5,-85 416.5,-91 416.5,-97 416.5,-97 416.5,-109 416.5,-109 416.5,-115 410.5,-121 404.5,-121 404.5,-121 327.5,-121 327.5,-121 321.5,-121 315.5,-115 315.5,-109 315.5,-109 315.5,-97 315.5,-97 315.5,-91 321.5,-85 327.5,-85"/>
+<text text-anchor="middle" x="366" y="-99.9" font-family="Arial" font-size="12.00">DetectionOutput</text>
+<text text-anchor="middle" x="308.5" y="-124.9" font-family="Arial" font-size="12.00">43</text>
+</g>
+<!-- 41&#45;&gt;43 -->
+<g id="edge40" class="edge"><title>41&#45;&gt;43</title>
+<path fill="none" stroke="black" d="M310.504,-170.595C320.519,-158.577 333.991,-142.41 345.154,-129.015"/>
+<polygon fill="black" stroke="black" points="348.041,-131.018 351.754,-121.095 342.663,-126.537 348.041,-131.018"/>
+<text text-anchor="middle" x="360" y="-143.5" font-family="Arial" font-size="10.00">1x1x69168</text>
+</g>
+<!-- 42&#45;&gt;43 -->
+<g id="edge41" class="edge"><title>42&#45;&gt;43</title>
+<path fill="none" stroke="black" d="M480.957,-172.003C459.026,-159.03 427.872,-140.6 403.527,-126.199"/>
+<polygon fill="black" stroke="black" points="405.284,-123.172 394.895,-121.093 401.72,-129.197 405.284,-123.172"/>
+<text text-anchor="middle" x="470" y="-143.5" font-family="Arial" font-size="10.00">1x1x69168</text>
+</g>
+<!-- 44 -->
+<g id="node45" class="node"><title>44</title>
+<ellipse fill="lightblue" stroke="lightblue" cx="366" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="366" y="-14.9" font-family="Arial" font-size="12.00">Data</text>
+</g>
+<!-- 43&#45;&gt;44 -->
+<g id="edge53" class="edge"><title>43&#45;&gt;44</title>
+<path fill="none" stroke="black" d="M366,-84.8023C366,-73.6736 366,-58.9448 366,-46.2439"/>
+<polygon fill="black" stroke="black" points="369.5,-46.1756 366,-36.1756 362.5,-46.1757 369.5,-46.1756"/>
+<text text-anchor="middle" x="384.5" y="-57.5" font-family="Arial" font-size="10.00">1x1x560</text>
+</g>
+<!-- 0 -->
+<g id="node44" class="node"><title>0</title>
+<ellipse fill="lightblue" stroke="lightblue" cx="229" cy="-2362" rx="27" ry="18"/>
+<text text-anchor="middle" x="229" y="-2358.9" font-family="Arial" font-size="12.00">Data</text>
+</g>
+<!-- 0&#45;&gt;1 -->
+<g id="edge42" class="edge"><title>0&#45;&gt;1</title>
+<path fill="none" stroke="black" d="M229,-2343.83C229,-2327.64 229,-2303.13 229,-2284.27"/>
+<polygon fill="black" stroke="black" points="232.5,-2284.2 229,-2274.2 225.5,-2284.2 232.5,-2284.2"/>
+<text text-anchor="middle" x="253" y="-2317.5" font-family="Arial" font-size="10.00">3x320x768</text>
+</g>
+</g>
+</svg>
index ce05adca18f8f9415f807653bbb7a2f2cc15466a..a094db58373504974310195c7466d07ae1e39524 100644 (file)
@@ -12,6 +12,7 @@ TI Deep Learning API User's Guide
    viewer
    example
    api
+   faq/index
    notice
    disclaimer
 
index c973aa71286c31db1e8d583dc4787c4407db2dd4..92124aa8871e25164ff486fea2ce06f1d028a64f 100644 (file)
@@ -2,76 +2,96 @@
 Introduction
 ************
 
-TI Deep Learning (TIDL) API brings Deep Learning to the edge and enables applications to leverage TI's proprietary CNN/DNN implementation on Deep Learning Accelerators (DLAs) and C66x DSPs. TIDL will initially target Vision/2D use cases.
+TI Deep Learning (TIDL) API brings deep learning to the edge by enabling applications to leverage TI's proprietary, highly optimized CNN/DNN implementation on Deep Learning Accelerator (DLA) and C66x DSP compute engines. TIDL will initially target Vision/2D use cases on AM57x SoCs.
 
-TIDL leverages the following techniques to optimize performance of CNN/DNN on TI's AM57x SoCs. For details on these techniques, refer [TODO: add link]
+This User's Guide covers the TIDL API. For information on TIDL such as the overall development flow, techniques to optimize performance of CNN/DNN on TI's SoCs,performance/benchmarking data and list of supported layers, see the TIDL section in the `Processor SDK Linux Software Developer's Guide`_.
 
-* Complexity reductions
-* Sparse convolutions
-* Quantization to fixed point (8-bit and 16-bit)
-
-TIDL consists of the following components:
-
-* A C++ API on ARM/Linux
-* Translator tool to convert TensorFlow/Caffe networks to TIDL network format
-* A graphviz based visualizer for TIDL network graphs
-
-.. note:: Only certain Caffe/Tensor flow models can be translated to TIDL. There are constraints on supported layers that must be met. This is not a universal translator. 
+.. note::
+    TIDL API is available only on AM57x SoCs. It requires OpenCL version 1.1.15.1 or higher.
 
 Key Features
 ------------
 Ease of use
 +++++++++++
-* Easily integrate TIDL APIs into other frameworks such as OpenCV
+* Easily integrate TIDL APIs into other frameworks such as `OpenCV`_
 * Provides a common host abstraction for user applications across multiple compute engines (DLAs and C66x DSPs)
 
 Low overhead
 +++++++++++++
-The execution time of TIDL APIs on the host is a fairly small percentage of the overall per-frame exection time. For example, with jseg21 network, 1024x512x3 frame size,  the APIs account for ~1.5% of overall per frame processing time of 320ms.
+The execution time of TIDL APIs on the host is a fairly small percentage of the overall per-frame execution time. For example, with jseg21 network, 1024x512 frame with 3 channels, the APIs account for ~1.5% of overall per-frame processing time.
 
-Software Architecture          
+Software Architecture
 ---------------------
-The API consists of 3 classes with simple user interfaces:
+The TIDL API leverages TI's `OpenCL`_ product to offload deep learning applications to both DLA(s) and DSP(s).  The TIDL API significantly improves the out-of-box deep learning experience for users and enables them to focus on their overall use case. They do not have to spend time on the mechanics of ARM ↔ DSP/DLA communication or implementing optimized network layers on DLA(s) and/or DSP(s).  The API allows customers to easily integrate frameworks such as OpenCV and rapidly prototype deep learning applications.
 
-* Configuration
-* Executor
-* ExecutionObject
+.. _`TIDL Development flow`:
+
+.. figure:: images/tidl-development-flow.png
+    :align: center
+    :scale: 50
 
-Figure X shows the TIDL API software architecture.
+    Development flow with TIDL APIs
 
-.. image:: images/tidl-api.png
+:numref:`TIDL Development flow` shows the overall development process. Deep learning consists to two stages: training at development stage and inference at deployment stage.  Training involves designing neural network model, running training data through the network to tune the model parameters.  Inference takes the pre-trained model including parameters, applies to new input and produces output.  Training is computationally intensive and is done using frameworks such as Caffe/TensorFlow. Once the network is trained, the TIDL converter tool can be used to translate the network and parameters to TIDL. The `Processor SDK Linux Software Developer's Guide`_ provides details on the development flow and and the converter tool. The converter tool generates a TIDL network binary file and model or parameter file. The network file specifies the network graph. The parameter file specifies the weights.
+
+:numref:`TIDL API Software Architecture` shows the TIDL API software architecture.
+
+.. _`TIDL API Software Architecture`:
+
+.. figure:: images/tidl-api.png
     :align: center
+    :scale: 60
 
+    TIDL API Software Architecture
 
-[TODO: Add text]
+TIDL APIs provide three intuitive C++ classes.  ``Configuration`` encapsulates a network configuration, including pointers to the network and parameter binary files.  ``Executor`` encapsulates on-device memory allocation, network setup and initialization.  ``ExecutionObject`` encapsulates TIDL processing on a single DSP or DLA core.  Implementation of these classes will call into OpenCL runtime to offload network processing onto DLA/DSP devices, abstracting these details from the user.
 
-OpenCL v1.2 added support for custom devices. The OpenCL runtime for a custom device implements the standard OpenCL host API functions. However, a custom device does not support OpenCL-C programs. Host programs can invoke a fixed set of kernels built into the runtime. The DLAs on AM57x SoCs are modeled as OpenCL custom devices with a fixed set of built-in kernels.
+:numref:`simple-example` illustrates how easy it is to use TIDL APIs to leverage deep learning application in user applications.  In this example, a configuration object is created from reading a TIDL network config file.  An executor object is created with two DLA devices.  It uses the configuration object to setup and initialize TIDL network on DLAs.  Each of the two execution objects dispatches TIDL processing to a different DLA core.  Because the OpenCL kernel execution is asynchronous, we can pipeline the frames across two DLAs.  When one frame is being processed by a DLA, the next frame can be processed by another DLA.
 
-Supported Layers
-----------------
 
-* Convolution
-* Pooling (Average, Max)
-* ReLU (including PReLU and ReLU6)
-* ElementWise  (Add, Max, Product)
-* Inner Product  (Fully Connected)
-* SoftMax 
-* Bias 
-* Deconvolution 
-* Concatenate 
-* ArgMax 
-* Scale 
-* Batch Normalization 
-* Crop 
-* Slice 
-* Flatten 
-* Split 
+.. code-block:: c++
+    :caption: Application using TIDL APIs
+    :name: simple-example
 
-.. note:: There are constraints on usage of these layers. See documentation for details. [TODO: add link]
+    // Read a TI DL network configuration file
+    Configuration configuration;
+    bool status = configuration.ReadFromFile(“./tidl_j11v2_net");
 
-Development Flow
-----------------
+    // Create an executor with 2 DLAs and configuration
+    DeviceIds ids = {DeviceId::ID0, DeviceId::ID1};
+    Executor executor(DeviceType::DLA, ids, configuration);
 
-.. image:: images/tidl-development-flow.png
-    :align: center
+    // Query Executor for set of ExecutionObjects created
+    const ExecutionObjects& eos = executor.GetExecutionObjects();
+    int num_eos = eos.size();  // 2 DLAs
+
+    // Allocate input and output buffers for each execution object
+    for (auto &eo : eos)
+    {
+         ArgInfo in(eo->GetInputBufferSizeInBytes());
+         ArgInfo out(eo->GetOutputBufferSizeInBytes());
+         eo->SetInputOutputBuffer(in, out);
+    }
+
+    // Pipelined processing with 2 DLA cores
+    for (int idx = 0; idx < configuration.numFrames + num_eos; idx++)
+    {
+        ExecutionObject* eo = eos[idx % num_eos].get();
+
+        // Wait for previous frame on the same eo to finish processing
+        if (eo->ProcessFrameWait())  WriteFrameOutput(*eo);
+
+        // Read a frame and start processing it with current eo
+        if (ReadFrameInput(*eo, idx))  eo->ProcessFrameStartAsync();
+    }
+
+
+``ReadFrameInput`` and ``WriteFrameOutput`` functions are used to read an input frame and write the result of processing. For example, with OpenCV, ``ReadFrameInput`` is implemented using OpenCV APIs to capture a frame. To execute the same network on DSPs, the only change to :numref:`simple-example` is to replace ``DeviceType::DLA`` with ``DeviceType::DSP``.
+
+Section :ref:`using-tidl-api` contains details on using the APIs. The APIs themselves are documented in section :ref:`api-documentation`.
+
+Sometimes it is beneficial to partition a network and run different parts on different cores because some types of layers could run faster on DLAs while other types could run faster on DSPs.  TIDL APIs provide the flexibility to run partitioned network across DLAs and DSPs. Refer the :ref:`ssd-example` example for details.
 
+.. _Processor SDK Linux Software Developer's Guide: http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/index.html
+.. _OpenCV: http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/Foundational_Components.html#opencv
+.. _OpenCL: http://software-dl.ti.com/mctools/esd/docs/opencl/index.html
index c4387e91760bb9575fe21191e4fb0c44a79ddf01..f7c4eaedaf8960b6bc6c111d46df3bda60ab4887 100644 (file)
@@ -1,8 +1,10 @@
+.. _using-tidl-api:
+
 ******************
 Using the TIDL API
 ******************
 
-This example illustrates using the TIDL API to offload deep learning network processing from a Linux application to the C66x DSPs or DLAs on AM57x devices.
+This example illustrates using the TIDL API to offload deep learning network processing from a Linux application to the C66x DSPs or DLAs on AM57x devices. The API consists of three classes: ``Configuration``, ``Executor`` and ``ExecutionObject``.
 
 Step 1
 ======
@@ -24,11 +26,11 @@ Create a Configuration object by reading it from a file or by initializing it di
     bool status = configuration.ReadFromFile(config_file);
 
 .. note::
-    Refer TIDL Translation Tool documentation for creating TIDL network and parameter binary files from TensorFlow and Caffe.
+    Refer `Processor SDK Linux Software Developer's Guide`_ for creating TIDL network and parameter binary files from TensorFlow and Caffe.
 
 Step 3
 ======
-Create an Executor with the approriate device type, set of devices and a configuration. In the snippet below, an Executor is created on 2 DLAs.
+Create an Executor with the appropriate device type, set of devices and a configuration. In the snippet below, an Executor is created on 2 DLAs.
 
 .. code-block:: c++
 
@@ -56,8 +58,6 @@ Get the set of available ExecutionObjects and allocate input and output buffers
             buffers.push_back(out.ptr());
         }
 
-
-
 Step 5
 ======
 Run the network on each input frame.  The frames are processed with available execution objects in a pipelined manner with additional num_eos iterations to flush the pipeline (epilogue).
@@ -77,16 +77,6 @@ Run the network on each input frame.  The frames are processed with available ex
                 eo->ProcessFrameStartAsync();
         }
 
+For a complete example of using the API, refer any of the examples available at ``/usr/share/ti/tidl-api/examples`` on the EVM file system.
 
-
-Putting it together
-===================
-The code snippet :ref:`tidl_main` illustrates using the API to offload a network.
-
-.. literalinclude:: ../../examples/test/main.cpp
-    :name: tidl_main
-    :caption: examples/test/main.cpp
-    :lines: 155-189,208-213,215-220
-    :linenos:
-
-For a complete example of using the API, refer ``examples/test/main.cpp`` on the EVM filesystem.
+.. _Processor SDK Linux Software Developer's Guide: http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/index.html
index c00114bde6d99ebfa15fe1457aca148e8422cf8d..bae591d1a8da0430f58bf983cdd4db65f0a1052a 100644 (file)
@@ -1,3 +1,27 @@
 **************
 Network Viewer
 **************
+
+The TIDL network viewer utility, ``tidl_viewer``, can be used to view the network graph. If the ``dot`` utility is available, ``tidl_viewer`` uses it to convert the dot file to svg. ``dot`` is included in the ``Graphviz`` Ubuntu package and typically installed to ``/usr/bin/dot``.
+
+For example, the following command will generate a dot graph description for the ``tidl_net_jdetNet_ssd.bin`` network binary in ``ssd.dot``.
+
+.. code-block:: bash
+
+    $ tidl_viewer examples/test/testvecs/config/tidl_models/tidl_net_jdetNet_ssd.bin -d ssd.dot
+
+On x86/Linux, if ``/usr/bin/dot`` is available, ``tidl_viewer`` also generates an svg file, ``ssd.dot.svg``.
+
+.. figure:: images/ssd.dot.svg
+    :align: center
+    :scale: 30
+    :width: 30%
+    :alt: SVG generated by dot
+
+    svg file generated by tidl_viewer (click to enlarge)
+
+.. note::
+    If ``dot`` is not installed in ``/usr/bin/dot``, ``tidl_viewer`` will not convert the dot to svg. The following command can be used to generate the svg file as a separate step: ``dot -Tsvg ssd.dot -o ssd.dot.svg``. Additional information on ``Graphviz`` and ``dot`` available at:
+
+    * `Graphviz <https://www.graphviz.org/>`_
+    * `Ubuntu Graphviz package <https://packages.ubuntu.com/search?keywords=graphviz>`_