# 运行推理

Source: [https://docs.qualcomm.com/doc/80-70014-54Y/topic/run-inference.html](https://docs.qualcomm.com/doc/80-70014-54Y/topic/run-inference.html)

可使用 TensorFlow Lite C++ API 创建应用程序、加载 TensorFlow Lite 模型并使用 delegate 在硬件上执行该模型。

使用 C++ API 创建的运行 TensorFlow Lite 模型的典型应用程序涉及以下步骤：

Figure : 创建应用程序和运行 TensorFlow Lite 模型的工作流程
            <?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">
<!-- 由 Microsoft Visio, SVG Export 生成 tensorflow-lite-model-application-flow.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.2639in" height="1.19444in" viewbox="0 0 883.001 85.9997" xml:space="preserve" color-interpolation-filters="sRGB" class="st7"><v:documentproperties v:langid="2052">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #f7f8fa; stroke: #f7f8fa; stroke-width: 0.999996 }
.svg-1 .st2 { fill: none; stroke: #3253dc; stroke-width: 0.999996 }
.svg-1 .st3 { fill: #000000; font-family: 黑体; font-size: 0.833336em }
.svg-1 .st4 { font-family: Arial; font-size: 1em }
.svg-1 .st5 { marker-end: url("#mrkr4-30"); stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999996 }
.svg-1 .st6 { fill: #3253dc; fill-opacity: 1; stroke: #3253dc; stroke-opacity: 1; stroke-width: 0.28409015231517 }
.svg-1 .st7 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-30" class="st6" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.5200093767791,-3.5200093767791) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="8.99997" v:shadowoffsety="-8.99997"></v:pageproperties>	<v:layer v:name="Callout" v:index="0"></v:layer>	<v:layer v:name="Connector" v:index="1"></v:layer>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(18.002,-17.9999)">		<title>工作表.1</title>		<rect x="0" y="35.9999" width="846.997" height="49.9998" class="st1"></rect>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(19.502,-19.7499)">		<title>工作表.2</title>		<desc>Load a TensorFlow Lite model</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7498" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.4999" width="141.999" height="46.4998" class="st2"></rect>		<text x="12.65" y="66" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>加载<tspan class="st4"> </tspan><tspan class="st4">TensorFlow Lite </tspan>模型</text>		</g>	<g id="shape3-8" v:mid="3" v:groupcontext="shape" transform="translate(195.001,-19.7499)">		<title>工作表.3</title>		<desc>Create a TensorFlow Lite interpreter</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7498" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.4999" width="141.999" height="46.4998" class="st2"></rect>		<text x="7.65" y="66" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>创建<tspan class="st4"> </tspan><tspan class="st4">TensorFlow Lite </tspan>解析器</text>		</g>	<g id="shape4-13" v:mid="4" v:groupcontext="shape" transform="translate(370.501,-19.7499)">		<title>工作表.4</title>		<desc>Prepare a model with a chosen delegate</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7498" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.4999" width="141.999" height="46.4998" class="st2"></rect>		<text x="4.03" y="66" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>准备一个选定<tspan class="st4"> </tspan><tspan class="st4">delegate </tspan>的模型</text>		</g>	<g id="shape5-18" v:mid="5" v:groupcontext="shape" transform="translate(546,-19.7499)">		<title>工作表.5</title>		<desc>Prepare input/output buffers</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7498" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.4999" width="141.999" height="46.4998" class="st2"></rect>		<text x="24.61" y="66" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>准备输入<tspan class="st4">/</tspan>输出缓冲区</text>		</g>	<g id="shape6-22" v:mid="6" v:groupcontext="shape" transform="translate(721.499,-19.7499)">		<title>工作表.6</title>		<desc>Run a model</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7498" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.4999" width="141.999" height="46.4998" class="st2"></rect>		<text x="51" y="66" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>运行模型</text>		</g>	<g id="shape7-25" v:mid="7" v:groupcontext="shape" v:layermember="1" transform="translate(161.501,-42.9998)">		<title>Dynamic connector</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st5"></path>	</g>	<g id="shape8-31" v:mid="8" v:groupcontext="shape" v:layermember="1" transform="translate(337.001,-42.9998)">		<title>Dynamic connector.10</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st5"></path>	</g>	<g id="shape9-36" v:mid="9" v:groupcontext="shape" v:layermember="1" transform="translate(512.5,-42.9998)">		<title>Dynamic connector.11</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st5"></path>	</g>	<g id="shape10-41" v:mid="10" v:groupcontext="shape" v:layermember="1" transform="translate(687.999,-42.9998)">		<title>Dynamic connector.12</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st5"></path>	</g></g>
</svg>

- **[加载 TensorFlow Lite 模型](https://docs.qualcomm.com/doc/80-70014-54Y/topic/load-a-tensorflow-lite-model.html)**  

TensorFlow Lite 模型是一个 FlatBuffers 文件，其中包含有关模型算子以及任何相关权重和偏差的信息。
- **[创建 TensorFlow Lite 解析器](https://docs.qualcomm.com/doc/80-70014-54Y/topic/create-a-tensorflow-lite-interpreter.html)**  

使用 TensorFlow C/C++ API，可编译一个解析器来运行模型。
- **[用选定的 delegate 准备一个模型](https://docs.qualcomm.com/doc/80-70014-54Y/topic/prepare-a-model-with-a-chosen-delegate.html)**  

创建解析器并分配运行模型所需的内存后，使用选定的 delegate 准备模型。此步骤从之前加载的模型创建执行图，并使用底层库在 delegate 硬件上执行推理。
- **[准备输入/输出缓冲区](https://docs.qualcomm.com/doc/80-70014-54Y/topic/prepare-input-output-buffers.html)**  

编译独立的 TensorFlow Lite 应用程序时，执行 TensorFlow Lite 模型的 pipeline 需要准备输入数据，例如摄像头帧。
- **[运行模型](https://docs.qualcomm.com/doc/80-70014-54Y/topic/execute-a-model.html)**  

要运行推理，使用 `Invoke()` API 调用 delegate。在调用此 API 之前，创建适当的输入和输出缓冲区并将它们提供给解析器。

**Parent Topic:** [TensorFlow Lite 开发者工作流程](https://docs.qualcomm.com/doc/80-70014-54Y/topic/tensorflow-lite-developer-workflow.html)

Last Published: Aug 06, 2024

[Previous Topic
使用离线转换工具 (CLI) 进行转换](https://docs.qualcomm.com/bundle/publicresource/80-70014-54Y/topics/convert-using-offline-converter-tool-cli.md) [Next Topic
加载 TensorFlow Lite 模型](https://docs.qualcomm.com/bundle/publicresource/80-70014-54Y/topics/load-a-tensorflow-lite-model.md)