# Introduction to the model preparator tool The QAic [model preparator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-preparation.html#network-preparation_Introduction_modelprep) is an optional tool that generates optimal AIC friendly models. It applies vario optimizations and cleaning techniques to prepare the model. You can use this tool if the exported model fails compilation. The following image shows the high-level process of the model preparator tool. Starting with a user-specified preparator configuration file (YAML), the tool applies shape inference, cleans it, applies various optimizations, handles preprocessing and postprocessing nodes in the graph, validates the model, and generates the final model. The current version supports ONNX and TensorFlow models. ![../../../../../../_images/mp.png](data:image/png;base64,UklGRoZzAABXRUJQVlA4WAoAAAAQAAAA+gUAUgMAQUxQSL8EAAABHMdtIzkSK/+0252/Z0RMgNTqrGWqLf7HkFjeQU6NJw67U2WSGVYO8/V7EIn1Yz65duMBSdUnMb9IkGc0zdbRnKdyeWKbMXbkXNu2OMq7vtvN0rmUpEKq7XDnB2yHTYn1tr4llO5uOSmpCO7umqTCYWbdvxeJJ997MjMPfBEhCZIkR4o80JpCvfQU3BlQIP7+o4gILg2K+uGxV4hEqUTw0w/PnxCYZ/znv/Gf//7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++//7Bmoh2O9SkurlRfLGxPxGdLLw91c3HWPXR5KTYLXXa5mHMvh4CZrbjYUzYsa3e5+HPbQVm7wzrktEMy22U9cm1AFlKsSyqExy6zPl2GY0tdjbhL0dhl1qnLYGzikFaGJmIxu1sr3TYWC7NehbFYTDMxLNanmT4spjSjsBjrlv/++++///7777///vv/nxlq9Gt2YbyBOOWp1Rbyc3ZYsI8S/OcCMNf/Lm9WM/+9AMrFOyiP55IvKNUtCrbTztHkDuxsylsR5pQLSvSfemWwHctZAr81pZb3M26Thd8o/yVSLiLCe6tTL0J8ieSLIN/qpItQn0UE+4iM//z333///ffff/+N/4z/WpXlOJJKOiEQI8vR45V0QiBGlmNGLemEQIwsR4pd0gmBGFn2Q0DSCYEYWbbCQdIJIRy6rJXLok4IxIiyASaSTqhkgCPnLos6IRQjybb3SDohGCPIjieJOiEYI8dmV4k6IRwjxj6HiTohICPFFreJOiEkI8Tu5ok6ISgjwsYWyjqhwJ2fsFGSuMuDPCs2+dLNKfdBBNeFa4z//Pfff//9999///3333///ffff//9999///3333///ffff//9999///3333///ffff//9999///3333///ffff9R1ddHc9PkTAvOw3pVMZ6D/ysZ//hv/+e+///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//+Y+Lo2wiP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) See the [Export the model](https://docs.qualcomm.com/doc/80-99100-3/topic/index_Export-the-model.html#export-the-model) page for more information about exporting the model from one framework to another framework, the most preferred and tested framework on the model preparator is ONNX. ## Model preparator configurations The model configuration file defines the parameters required by the tool. The file has the following main sections under `MODELS`: - `INFO`: Defines model-related parameters, such as `MODEL_TYPE`, `MODEL_PATH`, and input/output specifications. - `PRE_POST_HANDLE`: Defines preprocessing and postprocessing parameters, including `NMS_PARAMS` settings. - `ATTRIBUTES`: Defines attributes for the model chaining use case (`MODEL_TYPE==CUSTOM_OP`). Set to `None` when not used. For the full field reference, see [model preparator configuration field details](https://docs.qualcomm.com/bundle/publicresource/topics/80-PT790-993B/network-preparation.html#network-preparation_Introduction_modelprep). - `INFO` - `MODEL_TYPE`: The model category. - `INPUT_INFO`: Dictionary of input names and their corresponding shapes. - `DYNAMIC_INFO`: Dynamic information for generating dynamic models. - `EXPORT_TYPE` : `ONNX` or `TENSORFLOW` - `MODEL_PATH`: Path to the downloaded original model file. - `DESCRIPTION`: Model description. - `VALIDATE` : A boolean flag that indicates whether to check the outputs of the generated model on AIC against the native framework (for example, QAic FP16 vs OnnxRuntime FP32). - `WORKSPACE` : Workspace directory to save log files, intermediate outputs, and the final prepared model. - `PRE_POST_HANDLE` > > > - `NMS_PARAMS`: The following fields are specific to object detection > > > > models and are helpful while creating full model based on QDetect > nodes. > > > > > > > > > - `MAX_OUTPUT_SIZE_PER_CLASS` : A scalar integer representing > > the maximum number of boxes to be selected by non-max suppression > > per class. > > - `MAX_TOTAL_SIZE` : A integer representing maximum number of > > boxes retained over all classes. Note that setting this value to a > > large number may result in OOM error depending on the system > > workload. > > - `IOU_THRESHOLD` : A float representing the threshold for > > deciding whether boxes overlap too much with respect to IOU. > > - `SCORE_THRESHOLD` : A float representing the threshold for > > deciding when to remove boxes based on score. > > - `CLIP_BOXES` : A boolean flag that indicates whether to clip the resultant boxes between [0,1] or not. > > - `PAD_PER_CLASS` : If `False`, the output boxes, scores and > > classes are clipped to max\_total\_size. - `PRE_PLUGIN`: A boolean flag that indicates whether to apply any preprocessing plugin or not. - `POST_PLUGIN` : `NONE` by default. If object detection models, specify `SMARTNMS` or `QDETECT` to either generate split model or full model. - `ANCHOR_BIN_FILE`: Path to anchor bin files or `NONE`. ## Optimizations around preprocessing and postprocessing handling in preparator The `PRE_PLUGIN` field in the configuration file is a boolean flag indicating whether preprocessing optimizations are applied. Optimizations may be necessary due to the combination of the tool primarily working on static models (due to AOT) and the dynamic nature of model graphs in most computer vision models from the TensorFlow framework. The dynamic nature of the graph can cause issues in the model compilation. When `PRE_PLUGIN` is set to `True`, the tool handles preprocessing in the model graph, makes it AIC-friendly, and writes the details of any preprocessing found to the log files. The TensorFlow optimizer looks for control-flow operators inside the model and replaces them with the relevant operators. Major optimizations include the following: > > > - Switch-merge optimizer > > - This arises due to the `tf.while_loop()` and `tf.cond()` APIs. > The `prediction` flag of the switch operator is evaluated, and > the corresponding path is selected for the model. A switch > operator whose prediction flag isn’t constant can’t be > optimized. > - Loop unrolling > > - This arises due to the `tf.while_loop()` APIs. The loop is > unrolled to make a Directed Acyclic Graph (DAG) based on the > number of loop iterations. It can’t be applied in cases where > the number of loop iterations isn’t fixed or there is a nested > loop. > - TensorArray optimizations > > - This includes all tensor-array operators like (TensorArray, TensorArrayWrite, TensorArrayRead, TensorArrayGather, and TensorArrayScatter). This optimization replaces > tensor-array operators with relevant known and supported operators. For most NLP models, the host tokenizes the inputs and passes the tokenized inputs to the model. ![../../../../../../_images/model_modify.png](data:image/png;base64,UklGRogyAABXRUJQVlA4IHwyAAAQPwKdASoCBPEDPwGAulYrLyyjolOJWeAgCWdu5VART31vvM8NxFTFRNx1PAzxQvrsyHc1IHunenj/0dPvz/9CV6av770wvrQ/4bps76B88f77/Dewv4v/Mf7jxL/JPs/+V5tOau03+g/oXNJ/ReCPz00NP3zwEm2f3185Cmb69f/PY0/fP1/9IX//60n//9EbtPRGRY3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6xu9YeSQE3ZNJwnETD2FoDOE9npyRLz06cUkBOjAnRgTowJ0YE6MCdGBOjAnRgTmKxtTZ+CgJdQoa6myJ3oEtPepBS36TUdF6een3rG71jd6xu9Y3esbvWN3rG71jd6xu9Y1m3RCmBNHQ9TyEv5eQtzsTbd8icRMPXejONxRfesbvWN3rG71jd6xu9Y3esbvWN3rG71jXwuuzGjIch7WZWMFwNgQtDDc92sjokKBKSgmLwl+g4UV/+4fICtwkTgE/g7wcd4OO8HHeDjvBx3g47wcd4OO8HHeDju3UtkMiV+ecB/YCQa4wOzH7TJbjlizWb2G11OuXVWKi1ZI3c8bhPOFkJ/to3XBx3g47wcd4OO8HHeDjvBx3g47wcd4OO8HLb1hE7L6v9OnFJATowJ0YE6MCdGBOjAnRgTowJ0YE6MCdEioWN3rG71jd6xu9YdsLpfGFFd0JJEV/DdvpmaJMYydGBOjAnRgTowJ0YE6L089PvWN3rG71jd6xr4iG56kV31kqqteyY75jlpb98puJ7d4OO8HHeDjvBx3g47wQ3287PK9GnLE3JkER4SzpsMCdGBOjAnRgKFl5fxmpWXOQIcHe2SkYAp2rWgj0l0mGJDPOV9hW+wrfYVvsK32Fb6TuwApP/Be29B44RgTMdcY6MCfLBY7wcd4OO8HHeDgpK3EGOF2jUroAL/ivOCRkWN3rG71jd6xu9Y3epkQUbyIkyRGZ98Up0gZNiOaltaMdQes6dbgXwNJ1CHbAZGfgOw6cUkBOjAnRgTo0T7dmNGBOjAnRgTowJ0YEvhzr5yDrLuNPPstYHpIsL+AILSQeWfwg9IZjtRiuibdP/HMOCbf4zpNZv1TjaWOf1h8Oixu9Y3esbvWNbHnqKum9Y3esbvWN3rG7wtWFt/GwJIsr7sw2hUrxLNK5Xt+8KtjA1CPyLJFk4pICdGBOjAnReYnwGwUSHhrEKJ0ybjvBx3gjIEovrc9uwKVvHZKvpslQIw+oqOE2noUOks1oWM4jXwb4bJcDm1TpSTBA2f6AgunT/jSy9M5n3rG71jd6xu9YhyvUVzaOwp2MypKjV6S3UcAngiMjg1IkNLVt+yokIeJ7ooncH/4OO8G8Gomrs/RwDYhNYlPxTqq8SjaPLfkQSlapKZMnKiZP3f62awFMeYk0qNPaDEU54D7dUXrBudeb2Yr63aglZX2Fb7Ct9hW+wq/lMFT3AJ0YE6IqY5OI/5/8EUNeI/Q716vXmbGE3TLAyDH2rQ5Q/L2Wsm3m0IyzDj1tseHGL2Z31prT27wcd4OO8HHeDjVe+wrfYVvsK4CfT7fDwtQ3hDr06O89FBbcIydOKSAnRgTowJy1II1PdiIYE6MCdGBOiRZM3eLwlZXze4CVmEZwHHeDjvBx3boKZ27egansS7Z+K61gs9OSZhqeurjOJga4fgdYE6MCdF6Zw81toiaiPkojKEeOsvdrYF7ENEdlWfCHGzh0GA6O9ecWjvBx3g47wbsaG6lxuj7ESqcVmsRhgx4AtnVVZOR4B8ZCXYscX0/S2tbRilM9OnFJATmLApAAUQjKpk+YVYUAvspNhEhIRlJZ3qbsGeTdrjO8kienFJATowJzGu3CF3/cz801l0vqZQS0sMRBvlelzRH3/Na/FQi2/xF8dvGTowJ0Xp6RmVVpLv5mznFPvlw1mrySvr1CsBWRSQE6MCdF4/ruNQo14EHFrh06etz14d8a2H3WN3rDvFYQhITrUc19MYnwT77mH0bPMNPozyDdEEaw5wVf0qVk9DjvBx3g47Sl7Wuoqdkh/2sOyPwk/Bj9WEJJb+EtockDrSEKUaVnGRGRkoXiU3QQVqVbHSz6gGP1p8oZRcOd8Qci9OnFDUjfZiOkDp2UMeC8MqmUZYq82tYbrzQSzGIdpze0YyISJrk52k/WD1uKse5WlGTCDBhw9zaMCdGBOjAUUqnvOPgs32JkS0A4L0wK88TSoRKNS61STQ8y6Nfz3kMOjq+JUMlN2w3N3JpEFLJVh4Hlnqf+hYJJixpG71RBghdGktUtXq3mlbDJcfippPG2C7uRXK2dh6uKfZZ1XU6R5eMQ/Mc0HqKgME07iB4eYz1eKMV0ZcL3Acd4OO8HHeFK+xCdNa6Pyqw0U6G8q0YI9d4NzcRPzqCYpsRFM0xvjXzjzeZqdDxwosnnEXgn/GOwsM2psM0DP/NH6sXrEQm8Vg6cUkBOjAnRoZbQ2U7Z9ml6qF7iLG61pw2WAnXVoeaoQ58NZMrG1w47iTdRKjkf5S5TCVgRKJsSjaiWgXbYZtWEf6nzwrzwKd62X0k9Iyk8dyiBUeJhisYI9irS/8d3J9I7XfsK32FbrIpt+qyhg/0xHsYXqYmCF/eHGxhdNpAUtus+BiUODjS4ltFwvcDHWlDeBTtXE65/Eu4J6lJMgTA3cwkg753ZOi9Pr26JJg3AlW8ISSMY1jV01bCUnlvewe4D4IcCmIiRvWNooLlob38tYkGM1OzRJFmeOCWQCrZeVatDSwo9PvWOjdOv+xKjaJXp/qB9nDosRCbxWAweSpDprGrp8FETiJhuEvzgRNy/PedpiMyeyV0ML+/ImgEgV97vZesoPiP8qG8DP90+xV6BIT7qyI/EELG71h2fk6F9ayoNg8JLGPmrAaGJ1cWf+rVDdz4+QUsCxw6LEQm67dwMgXkWXfh9S3cA7XpYXkH3XYqoYZd8DRReyKgpioT2s/lPcvTikgFl8cnllvLZSHQ1nDqgcB3qQBBvg76GrnI4Z4tggS2QZUrt7RpbglDvNBfPGSQ14rChKFX9KlZPQ47wcd4OO7khtAfHh8l916yMke1hMCK+0X/IflzDbRZwXKJqSAnRea3X4dfRRpbLrLaPbOhJZvdgQXNsCAUY7qeCd98hZHW1egoYbLVkcrNoOazGCee9gscN8UJaL6uy9/VEJyxoRn6EzJvKvdcxhaBOjAnRgTovIDHptgpcVURxxbn2t0t7H3hCDb8yrJ1v6dvTfNhYvCYNJuBdNovQ47wcaUuq8pGZTvE1GMEewun+npJxfhPNRwWSMdcUBO1nPQ1cDhy1rLTeCNAQ+9F5pVzZ8oC7yBJ1ZS5dJ/BTfjgx6ibW1l7n3rG71jd6xvBoyBgPfC6WjqesbwpGMQAng47wbrjFd/E/aFpDFeiK1QST60XuYcRVEUCSmoe4r7nsoa6bsWc5OethaEk6SSkVS38rKllYN2FebxmQfcOBi9Y3esbvWN3sEpgDrqkG1jd6xu9Y4E0k2D6GOVyJXPm0nskcRwJgBj/BEpkS8vEXGOdJ0ddQdUXj0+9Y3esbvWN1Wx4O3rj8H0Q4C6aI2wJH8nkbFAsG71jd6xvPQN1Q7mUtgfKIm0ZhxinTh8kRkVNk7UB3ZLC0BRVozK7lm5NsDBoOi0d4OO8HHeDjvA/d8Q5UChwfEEL0IQA93XOlIpB42TowJ0YEutnyaKpawjY1e6jT7bi5FX9Lw17mzd6nanOWr1w3qghpsXfX14Y3lX+juM/2XQ5X4S573psm2HQVvsK32Fb7CtyC0M2XnmXKQYLy1MUi0dcuUbEU1xRY3esbvUwW3o30GqgSehmaEF+lwSgHDXH7b7Cruv715n32usB/yl3+AKw1AUMhIzjAZ8m3SobvGCsikgJ0YE6MCdEIHrfMTdbb2NyQryBGYAw+HqnTikgJ0Xg/oOkIRZx9zebNbRXtui57IHGfGiv/ZUu///xpY5/1AXD/dRMT6KgmolEDVBn7YSLJm71jd6xu9Y3esRBApICdGBOjAnLlIggz4Z04oViA0FSBrMBc9lEi+YhNNAK+y4Iz0d84dFjd6xu9Y3eFy5PJTaX4hKC22tGZ6P4vOiu1jd6xu9TjFgrpSSNWfPcq1IggGVTuuamZzV1iSscAG+uApp+MlvmBRowaLBXMP+RA7dSvAcyjQnce4nxKHmF09elUIydOKSAnRgTojCfqi0oBZrb+y54kAN6UHy0hx3FD2rGFb7Ct9eXqheTgCuaKCVJEkDl5QbORRlhhaw50TnrMFEFUCaXHpQpcPwh6uxTDox3aqHsgTr68hWABLyj5O7kHVyWg0jewHQuZtSw20eVqQ8vjr4plCfA47wcd4OO8G8HqALwCPU0T8lGASQgpxYUJJT8H9xw5SRyoT2N84g2BfNwL5z1OnE82jAnRgKQv2D5V0KhXuAT7mmxmN9R1NLWNW7LrjKCmCpSCT5Ucru58IFisDS9MmQnbdHWNOXVYHyeqLXbn0Pd658gcnpxdwLIkUHQ5qiyZu9Y3esbvWNZlRxC/608Mq+2nw8hAteAeZJjCDpGBHWKSHVno30WIXe9Y3escGc+y2fp9ntHpEu4/5od0JLVT2SkfLQS99jvSHreeESMZN378icZwHHeDjvBx3g40bHu4WfCfM1Xx9bBgXtPKzT0OO8HHeDdGGzcLdsmwBIGrDzVey4yMzssPp//zyP1yLDgd8zDb6gGs912VVUDeHkIvVZKUOCtTdaElZPQ47wcd4OO8HLRYFFgciFjd6xu9Y3ewXAooIkqqcRMhWcjZqeJJ5sb5uud6943ehCHN0Sl7AoTstdezwW4VqDjsbU3dlFL/KnUeMsINEj26b1jd6xu9YeqvyJxOImGW+50sUAxUifBQAemgSrPpsMCdGBOXafklWfbVjzY6Ba6lZZPGqzUSMEgEgRui+7eHoNyQTCg5KvGWPSHxNn5p1kt1xFN9AXvmEIJWu/YVvsK32FbojT6xxXg2qthZc8N5meIaS4FJATowJ0wiY6Y43hzIX/O+vE68HDLdx5/cfMSkjKJHt03rG71jd6xDkVOltgulyAr1ukD5bidXEj2+i8G8Pt03rG71jd7BhZaxu9YiDhsRm4ke2bqdOKSAnRgS/pLrrhZK0zkT4LI7xymIiqwDjvBx3g47wcd4OO8ER24g2qdo/WlSH6X0XrG71jd6xuvJHe0lfDnjtwaaCPDIJvd4AoatCPYA2wnM0Bs3eJRIjgkbWIZ6AaRLgUkBOjAnRgTowJ0YCWdw/UT7emULImpUVPPERzwAq6yZu9Y3esbvWHpmCnJOKCT4cjSN2cP0ROrtscGMlIXGpe0KiOiU1hQsA9pWQ9EvDS1Raem4hS7zb/vSkV8BFUtLen3rG71jd6xu9Y3eIqL05wYn15dpzQY1vPL3WBUlYatf0UIsbvWN3rG60bpGgMu6fBRE7w/bD8uO8HHeDjvBx3g47wbwZQ9bXdp7n3EprrmTtVNSVZnp9jVGJa6b1jd6xu9Y/HJlc22EuzawwJ0YE6MCdGBOjAnLdzA/PGYgrRG1IqQDCMwVFyq5MOh1b7Ct9hW+wrfYVvsK32Fb7Ct9hW+wrfYVvsKteAgKP50DyxSD9ZeXM/TesbvWN3rG71jd6xu9Y3esbvWN3rG71jd6w8kgUE99wqpmBMxLm3nz+hd/X58Sa5kAdBOl4H3Yr7Ct9hW+wrfYVvsK32Fb7Ct9hW+wrfYVvsI6Doq0zAbQKrZfM9VPlrvBZSI+QIl4q6FYM/GRUPzwrSk0sbqgAdz+Hda7JG604e+wrfYVvsK32Fb7Ct9hW+wrfYVvsK32Fb7CrtzIia2/rYBJgo/eWL7d/x7s7YDSJJd3WooLLsR8Ayt+VWpWbSeaulCk1JATowJ0YE6MCdGBOjAnRgTowJ0YE6MCdGBbN8EupNwJ0YE6MCdGBOjAnRgTowJ0YE6MCdGBOjAnRgTs/rHC+9Y3esbvWN3rG71jd6xu9Y3esbvWN3rG71jd6x0GGBOjAnRgTowJ0YE6MCdGBOjAnRgTowJ0YE6MCdGBOjAnRgTowJ0YE6MCdGBOjAnKgAP7+ldJAAATYAAAAAAACivt9p9ruNXioLoaQHYjZkwWmZqEnpOoAAM3fIb+O5VHArxPE5PXYovFOVZfafuPxfv6YruXDDCRE7iPrt5TIKhhudreokX/F8qFSaqVs57hRiRTP/gBrCcx0yigM1wxbhtqrNOKbIhO0X2UZ/aIlVTjdUn462Ddye/TMAAUcMMeJJo3dTfngqCdHmHq9G1SySYKxfO0dL+Z4EABQIzuwosqqT/xta9Vm/cxk3BA/lZswrwu0KBNqE5IsBU6EshXTqP3Uve+pqG+Xn7sSJ6Dvq5nLG3TW1og3shqktO7YzMbMEyqRavay7FwC5rtaI6XmKTqxT2loSai+8E1Te6nPp4kV3wGf/36dGMfXjvtoiiwVgPqZB9fgNdi2KtnvGlb1Cws1538PL2K12fpCLbCIlrPrCANxQp8mpSyEYQOunp9JaqWV7E73GFG5kx4F/pbTmicFL8MbkF2iUgCiAASycUy0/MIGn+sFNjvYqDhtZv6xPayKdaUAZa0TMk4ARoqSS5yKlv+9dBNh3q2B+p8XsqHbAW5uXQFP57qJegt4pXtTBO1p2KuCC9FKvkPJxuo7TrKTucZAnttIoSqkqGEhzn7RqqFwKZBDVDPgp+meSfbTLY3qgAAArD4HRwrNCtGOngChRQAAAAN1J+vPbhOIMpzKXUEdb1/0Xf1C860+C4KwuvMIEZyTAd4XCC6DHZAAAM1nDpF060HPJg6iIqaMm4K/fXQKm+Jwq0jPrnT7rjjrqIWLqF4WhHUKbKExKO03/c0sQDUOxUJlJIjmBGJq5wpDuwktDW6EezgnALfihZ8+MoAUCf8HmOddsf7Dc292/+/NpLW9DksD7mUmCLtQDHD62bGxp3cTf6JGxPs/Ifd3RC+JRJADjTfR9mYgQMRUWj0C3Q8mLaKTL04iZ8GCRPyvZaiFltqkKxQJ3WXcDqLMfCVPljQH12ApdB48QExM3RY9LkStKgc4I14Jkumt92sxMYsp2oPUXeFFCo9jOTmlyo99+7t8Cd41sHYKou20LAPxCjCKE0gZzyVnq9IDfSEGm/3rwEBF9ns3VnUfPvR+vmaRMAUXopSWCyeiogD9uoV6OyZxwVQ9WnDF2hx80zMQoDPdATnYiZ5PJXLa/SEDACfL5X6LTB0xDAjzg/N3TtM4Vil4m/K80T8SPTM4tKlHS93Y61req9vyx8k/Jp3Tr4QfQeHi0b11xqeg22KLlCi8JkUTM3PFYqCKViY6AxeMAADuVQd1SRMv2yLNoMbRD0JDampw6WCqOyqHs2lkCGOIUBYOQ7cOOuPVFNX8fkM0t3Ytk+zKJhyreVmnJQEOhBOG8g+o2cxcuNpRYLXKNTknSL1GYfT+0Wlel5npekOCu6j/DJ6Ehl1vodmACF4XG86d/lwonTwSS0NNsGY6lUGU+RYnPfxV7DyEVaViHNuV5bQgLmjBCR4IB5AxANMpjx6qLZ4zEbJs6mB3Ad8nX7BrktXyx4BzdoVf4EQySATGSpciKP9ahGPIKFZ6RqrzxoeUip9566+tJfQMGPbCCGARoifyDgkm1kD7+Mz9ohl4jQa3nDWzPRZcZl9YUc5bAZBccVAfsXEdSE0IZv9sW/EbATsJHJs9BLoP7n0XYn4F3oZAx/78Xj9vBgIGOcdMnUjtdedKRqRvMEWItVZz1WhZeYwLWfGN9EEET2vdFG3nJv0APEYE9vySYEntVOPhw1Rhk73e+Fak+coT02IOorIPYbabdiMauet+QAiwgj1QuvCjqOXq8qMoGSHJyEZ04n3YlpfUVx9i5LelInY1FX9LfCZI3y1nbdOHlz2iJS6wF/ziyPIvmm3iBCqOD8NwfqToW2e/hSEKb/mvjapVZ2Cl+0kvGxPm3nJcT8+BVzZ8AWvAcj1P7jm15xEhsatuLEN1SNLU1KCUbFmKfZWNSNCMJGhPDc8gktS5gn/FTWCIG0QH0YJO/m5KZ0ikAj2J0JtM/zUewFEdM/9eKR7o453IeWaU8R1jpbI53faCBLaEGkotwO81FfIhGPe5SsGBF0jA6p2//6ZyhfLj+DBP+kKuSN/VQVpoWF5ym0mrhb1a0p6l5/+Gwk00xbMtkpDYOTxQbAGFhc+QLiIJEoDVTF5y4tJpqx8Rh9rF50QxzxwrsAARa9htMxJWdz9/RdQmqP1I5ig/WE9Xs/neXfbIaFMO7GrEmHkO+m43ULmWhJHEa+KrMMi8K9KCXWj+Nf9O7kXVmTcGLNiLoAAGEEgwymGDg/RxhkWxAMrfrbTMHS+Pwl1m/hd3QFOGsOG2h6QRYwLIvDwuaFIxYscVxcBY/ZPrN/nuVWhHfIsv4L//b+BVwvNMAWJZDkEaJZHx0lAdgjRIT2kv9SS1clEHelqJzi1kVRV9liT7j5cZptkMxAXhOm8M0aU80Rt83FpFsd/KkEMuxld0m4QFOC52vU65XedRvGTUxKioENlR4KqkhRjwSmlcW0pHwgTkFj/5I95RuqzpOYGEQ2SbhBvzlIdfTkI/dVgIKliok7XoBLlh5iDKWuy8Mp2u33vjBHhKB8ktQLE3ABg0N1EXMewUpMg1UHC65iVHSfnPFU3IvngHK0JYbNZ7pvgvYjkP2ol5I5/7gZleYEZYIeonZbHXcPs66ZLof67XdohhR90gu9zAAeYoHpQxB+q+XILLL+CV/D4UMv0Pepj68KU0suWxwYyKDxOTdM8Did+VweCmIAVuPV28T0XOJea+ZTU8XdL0pDpRTYt3onInqOMhEinAkmqcgKqTGOm9m5R0Bl9XcdJabbBHwbNHLksxSjNR/Bdk5BvaOlqoqsWtd+Riw/p+bQJFp6E3XpO6KW7nSnZ5evN6bg+N9EYKMXV8zYuGGqF5yrjzhfBm6XKaHy3nfs9EtJLbVHzepYvDhszNl/us/qMuix7yELLgs5sqEaHl29xVr9x31mXENVrVH2Wbi6y9WWH2ogyl0hm2ssEXdGXRMCcg9ROsCMg+6nz4teW6goDDxWRzOXjNwR8S4uIRMo8nf0abDF2bDyCch7ov7GYnJuwEuaPhY9mMGQ8E9XQNFDpqc/PL3Fr4JyThByJt7hjqbaNpgyn+IDaFLKwmQdIHtau2Lg/5MXW7hSn6Y6+9NWjoB03tACK9zTf31LQl6cNhJYHgEgrVBMUCA6uq4mH2aCQ4yOPv6nSIflPgAejFzzeFdu6LGAropKqUxSSu1Hs3QgzirsMnmRWLqG10ZSqosj39ohiK3Zx8Kia8ewePDzPvYCbufnUh89MIeGQhE0jBka2V7Uk9ynUcCRAPPTLrWS3qXS1TxeZNowSJ27E9LWSQNYkDsGkYNw1eu8n9xV7R+YzUedVaMdKg9I+dvzELJysm8s8rUIwDQZpL0naLSjK52+H1YeJ/418E38WcyoXeuVmACuIrWy5u7/tBMnkn9/FbgJ1ue/0zCzOnMG02xlA/Z/aY7+zJEMOVBjxjLCOdVqLhSsPjE2ltn3zYWzb9yJoCdJT0zvjH1IumprDPOH8/F/G4C7BYHBOzJwkFRczCKWJ+8Ng3y2CwACfpYbTPrmpDm0ckjQjXB/DJaD/BHXY3Ps9xsMh6zAuZ9q3p/PqPe9pWrCYD9tfWyfYyTfyFatsbJLQRqBPVg1WI7JNBDGHWfIpVAWwCXzN+A7gAflvf9vgn37qJKAWAzVNRk9ljJUOJ2DDKN8jWIPWIked52h9/O4/SlxAb2/Cl3j9RB0TUNv2xTdh4dMPTs3OySjAT7RdPcxUK5ja35EteluBWayHD5KywRpAP5/Ivww60gn1tzbCRO8sXqKNATsyNf9pAz1qXk+9yH2RmfRD0b4uGy2NJYWojWJT7ZIWM1nNDVKay65oYRa0nD8ZsdiOhl0SmlEPLcKs4nRVlBsSqKBaXK3klalsSUDrEDmOjUJUF5NTbez87ZEAhs72XaNEJYqWHFmdHIPvmB5o2N6Ii1cW2girLracwxDff4FWDjcF24bLqfYubLSmxYdCLn5lHIiP60k6XDBqaKwNDKxjNOG6dsz/v8QaUTNmIjxCNCme2Dnkjv5ShK5ZYzQA3UzZZyjAyyUtoHRQJOPeBuZTuw8R+E38mSVOkwdhrsvycGki/KAaDk/a/076dOcu/SFkG5CVRoUzX4A1o3MKsx3MO2fnspiSeLg4yulWG5tXYXtKp5vFvuvVnAaqBJitNUyHOu1QRxMzL996Ddw9q1W3NJ23Hj2nxJ7KcGHSRVcM+/5nJOiC7M7fuL3fFy88xe1wi8ps7PN9lzJQkzoy/1kbKT/79bNPM+SI9jCzZME1+8ZUGxSx2Gh0NURX4DXv2npnms8ayCm3m/gyDORitCOZPPk1Z+e3abkG2GYdon47II7Iuik6ixpNjOUH+QhMkKJlFloxmHwq9jJsfbFls2c0QrY4Bz2bRkzaxZYd40Y3JNsIS+7YQugAjIAA5sf6NgqJfeURYV5JGeSaFSNX2aHwjTzu4FYvageMdh2VLaBcKaT2qu+9TVw2UL5yjT+rofpFGb+6r+u41S6H4VgVyi5KOji103vXA1w82SgSNeJKRhJ456gQY7R+0Gq5uScj2lqInNiBhNl9yOgKH3peUUnJPXE/yt2a/REkSO4l3hs+4YXVZNDIFhK6LT9HiThqFNiHHEhWzv5xUV2hoFoJQSp1v15Y7GQ6Qs+KuDHzBCrkh7OYzEn177npU1mJG/vihqYEz5ht/3nTdjG4zX9UcWokNFhGrtIlisglVZbn4KpP65j7Nb3WEb7gQss7fUG1AlVWVHZoiD4bNxw03C79U2w2AdBoJ82tRbn5/8jIq+TzdK6N75N7sQeU7VEjmDCalQ6b+SsbOaWMz9ks3qIW/yAiaOgn5mryTKC3P3tAta6VliCbFt1GmwoB1KCnhEQdEC/J5shtG7VILnOBdOeCU0fTajCX7U3PI4odLYy9pEDw8+765iluAExDUb2qxhmHQILeA9Yem+uMw7C0HBNrCR6pj1oISQw/HITjODD18d/A9CM2lI1I+uEpQ56cyEIRfZbeJybTqvGB6swBrkWS2AaODd6r0lctRO9elPO3/+jLvt4m+vlALxHjvQKGvQZVn6TOANdg5ULDrt5b0WVPkJry4/umVUcVM0HVzMl0sybdGZAD+JtG56Hbvf07bIG4BS9MGV25LtrhTYzDnJZrttF004vKp3687718SsXQNe9wV9TsQy6Lslvts4jF8k5hm5MUj/zsZfkFNyWYnIGhAOX8Hc4d+UryMRnx09SdiXINdYPCvb+2OfPxjCD4hByBh0OqEvVDRaHUo2rODCb5+k2OZYi3Jr/15NF+tKqiaxSPi07GDNPhRUNGvhaEJyWchnfKog5ZPGLEoZ3ZhwYnQ+iqPSty7eqErF00Kdhub5eXA7dJqPVrbShIXCVOMbI7nfGS/XA6BBDB2Qx1pfAE+K7jObPX7BE+1WFXax1SeojMLodE7DSoXH+u18B8FIoPOe5x3QvvRW8Zl4KFqOjsPRdF98oKAAp7K3RLm26gw3x7VSuTPfO8V4JtYBtYlhW4nq0K4GfjRjyAV5v3h4RkObZuos1S2zH70xvs/Ho9KXD44lA9Q7XAcIoLRlEXEj35x7eBL4lMKWkdcKdIL6b4yk/1NrFQGpMqSQlszMiFqLBljayYeV7MoQNhz1u4MemHXfhO6n05tv8z740iLZCM4t3RZXrfXNJov2HCTqQrCPiB1zyOYpr9omd18Jx5uZXfII/1vDH2JERkrgpTlE4W1qfNnKc1a+RoAxEWIfhWDqa97PeS4il+18GPt05epDf5OmIz/1dFhv4B3b3LC2HxX/wCKrc8pUDiMVf7r8OQDNrSxVeeDDvS8o0gVd/dEn3/L15Y9+a69+3zr0wplprET0whuzW5X9n1S6BzexQQobzzBFl19zrmz2EL5qJV/oyHyxjUTZiIJzt68sp5HIF2GJrJPzZSHa2rBVjgoY0g/oFpqeMnPX2V+cfczprXyWRIC40s3fS32vvbohGp+g3kZtm23In9tZAKPu4WgHCJ/ccnEYWXb3tV1Uyt7sry8nSu8B1K5gqiIyffPYjbUVGG/Ee05f7trnkU6L7Ra1Dhxqh35xURynbyafp1xi8ZCdkcChyxKdMIjno9sEocNNVt3qvBTMRuUWjs4lIJgLbND/OSZIQAN04KKAWKWUBFX8iAnuURESkRfmzRHxwrDWO3gDfNqVD2xxkCGy+KHnRbB60idoF6ls5qc4cRwbIDYPAi2GPNBx0LuITuAdNXfoL98deWFqou1O9JH2YZM32Y17LoNSGZyHu5D2SdWWGO64y58MoRhW552/XU4U3IYhlR0Q5FrqrNXo0DNGHA950AM+A/tljoAGVBB9WNx2q/AwzECjPXyd/V4aBrEtPmfLGBzUVZ1F1u4DKBqsdCjEXBQW55WEjAXrXo4A+Y1F5SC230es0GWOOZ+V399VQScGzjraqg0OEi5gBc45pmPvQJGW4ZgH7P4BR4InioyF/o5WrUqoqhomfJuoIpSa5XfsPddtFnaEqtnLxSXHZamcwNnKyKmG91La4PlBeECw1we507psTc6qvzJisv5c6zusg6tmiuEc4oFS+eO6ynqlEolSvOwXKh/QWnH2E3tA4qANvySFm7khFj9Jlf11EHI1UPnPQm1jvGjVWBDPTikev1ehWghUSFPkhVu4BmUFH1Hbn0ENmP9D0+03gQURXdV1w3cUW+1oRXi45ASIdHgpBzzetAlPz4Ut1KixB9Db2dKC6hOy+EkukAJPQS4FnrvQQ/aO00f3sw9AJJqxnJ6BhwlRlX/BEObswt2GMaMDJLwz+pUU6FfeZALDwWm9gpOpNIvNrIjWetmLelwQoWxYuQHyxLG3YNhmbftJq/jGVmwkFH5kACaXphKVGeaVQ8YPoDFu8gfr7BZqnXpwieKfQHnZrU+EZAzlu+uVJ1yu6+4V+DGdiHSgjwlBn7az4l7cDcDqEcqIR6ptGC+I2KPFnoy+y8QgVIwlSAgY2h8FIoWVVyCm2I7aqlF2RuYL9x3NL2rbucLkUkHPt7/onC7Da9aoLjP6NW71e/RM99P9xKeTasCvF3H44BbjEomLds/lnhiJT2DqVmB4ZYEgdU0EMdDqh60s3lQ6csZSL+YNWeHK5YL127aDl0BoeiowR444uhvIH9mJ2fHsgzKkMpqv0Ecb+b4V2Tne64yrWjgm3fO3IxpDXkUWPk0bLAO82Bxm5gHP5DNRJ887dXOTVG9GqiV9MDuEOj//GV8pRfzp8d3bQw0V93fNCbNfo2TZD7yoDKCrkIG6VdMMFg6Ozg4QdntCkFSuVLwi8+lfALoQIVc1mwoSrcei320meflqK1yvCEtBNTW96HyKD007D5MgxA+rDg0Tyc4VgtByUp/6TCEF9UX1WYMgCF/2sAEeXlCDJpQrzGC5zsevL23/knAy0sTFTViVZUvcBIeahBpu5PFASOwQktzsPfGthG7wMuFwc9sZuFe1AGC2kwDGzirH7A1C3e9HKhgYmcpciRXJcdojTwUTLJZ73HWRKvaZIpkIvDCX6OnxE+B6TFln+PFtdfXCkHPZoctV9F+YSLsMhOCL3JAp8UAe/mYt7WtxX2MjYySt5gVl1o1TzJ4hofDkfAWlfmmbFTzuhwVAMLo7MML/Vtb2OGXiy/FZct97SNjNB1ljoJ4ZDtoWB2FpZYBTxO9p6vd3nEBpWx2vGs1RgKABALQwN7Am86UCBsI+3LbO0y1W7qQVE8NhB+4OHVzPmtZfQ0eVufaDk6be78k6cCDNsHb1dxy7BxhTwkIMpstBIp5o87EkSkZ+Ii6mXY2aRfZZSmLsRwYIp+ArPwre3Rk2vS3bu/UZX94eD7RNVcpgIAaRDoXvtaWgcAs70bxMw++kgWprvAKT4rEDD/WIq8yB+O6T0VwDQvxV50gJHoWFvqgSOsZfrloWT6asQVq6dG2J3wALnaQNxSm3dlfbk9maT7tR2LKcG0Ffs8FxTeQJUOPrdHqFAwjWK3htx8CF/7SWAogCIoQl5ArS0qlNkPrXS8Oi8uYZak1ZG+OXD6VTpUoxowjfTUH0HMcUH3/b6zFU+vg6suCCHB5vKG8mL9XiQ/L8AHvOXZfBQKCHXRP/HnVm+GpbI0yMi+CkigUqyiye1p9A7YjeFg/Ko39+YwwRseTEavp5UFCdyC8MgzOk4ePlfZvDCnGelsPzz+Ik0YOlEtIDZCoJgvrcXQFD4/K6WYGrHm/RLYENJ7tN5KfzrEaAQFnwimdoKZDtjTgyLd9XG0hbCoyQb8NPyEy8eNOAb8f2ENQuNlvMOxpn9Y6OUgY0A/MfALkVsCPRbeZXYskeBnOl30x4ZGU7z6FDAQ/yipcg0ZNG390M2VjQD+09FbN+cIOylG6fTHFBe9g79XPc69uSjfZERnC+yjtKZdirUjNAhz+4a3lmvz4hGC0dWw/d+lUlWrtUq952Q1eUdoS1MBASUz9xDrcf7aIfjeVNFSqAq+Yc58fv3C9FDfIAUaTfHez2WaLb51NXgXlyypnNfjZEf/lYwIoQdizZvrJfiW/BvAE31gYVAALQMO+2fvM7stFTD8ZwGiizW8mztOOXus5U/t1YN5OzoQDsdKJ19sDozc8JCGLIRSLz6STVGNal3VFMGA6M3F2VhlR1vV1kRrVu7uuRhC5L65Ohoa1ppL5bHLqwUgMyYSKlgfAAAwcB1xyYDBYk5ffILcTx06I37v0Dk6V0ggz7g8ArRqTdQ5iO6s+ShK1y/h6hYD2lA7WWePpHk9INGPAHCo0QzUu+s6ai/an8PCOWPTYY1tLv/e7axEYPyrIT9t8N6jN48K7G2WoWlPnpemdaaD7RnAsE30gz0AZ6PCS0Vjje8um+41QYQgjHidl7BciP42uk7klbJS5fceAXHaIGqu6NLlrZA0hu2iJ7x3C8s20qKqC7IqROlNyFa25xMdzpXWXkOVv25m1stWUGOsvn2hZB0yFC/XtXsjAJNWGK3gBIYkCLi4G3LR6edJKbUt7S17qI4UAjaeMjeO/nfPjvIM8ZHp7FdKpU1D4vVgAeBF9A0UeVRewBIcS689clgH7ZvpnTBr2L0BLB5aJ6SnUyt0fR3TKDGN57wl8/J5b8FtMouDVjZbMwABfKQJidxwfnlm1BFUnJHALldLi4cMtq4LhYDF/fx3T4nL53QeBfuMCvEabQ1By5KZYiNJcSiRTHCnvqyGGvA0sQpQVZCIZMv5QtPkiAbV+VkR0nPaWUhyR+qVdKF0s1BdH82LsYoDI+jIICSbqE8Yi8+ytUZo3G2zjGgLRJclPExvMz9TWkUElzZAvCuYKZJ3RZpPis8GkatTSh0Qo/sUPZM+UK7Gwd99I71ShQdHG2OniTNxRZ98meu0sZSoj2hsrtBbWbPZ2U9QEJWz/JUcKWqzD4LIhPmQjnJY8nNjFDi/vvZY0QP6AI0O09Jj6Xf/f3MOJ2JH1WDYWu05IWl9FLRWRZ7VbfrD/amzTJLZaq3lLNZ4IOPnnFTjb/xBbBp6P/tmbrICYi0JTkmJkYbUAUXPpvE82oYa+K94zDA1up3yycvlvm618jEBSqcF48d5xPIksoekS4VI2Hfnr8Vgf+0vGXaJOnRSMwIHzvBlYkpdDq1v6EwBMLxyUnTUsuUmaErlEgxvOBtYrbMbAOiURLNtScGitl/DXTs5jEigofyOuxrV2LIpfAEIMDTOzFNrarTXxu9gWfJLCCrsL8pSl5wNSZPLFmZ5gPbKgFT+GiYRspg+LelasQIJUOV0KyP+GjkBIT/YNGJkTngBKBEshqt2eoZe8ytw6l9TCPmD9pjKYmY/9JE4WxlL9UMJkB6TVYoSPdYH+bZL82w10ouinjw55GWjhZA78ioVqYDEGQAk7VNTWNqsym4RlXCQd5HmMqZNRKLn623Qq7lYB0RcW2y03KyLDud+afeTZ/dYsr8nxVwZyhmXNaLj0DaGO0AfeWkO0hEJgpdERTrtP4Bxab8/wuucjLpOjiz4jXtMq+8gkpFo+XPTDHLd92jbtfQzESZUjvjVER3OAjntFbFCDSJLqkzEhPQ/8zv1/t1C9ycvO4khHy+nlB8tqmAuWNpGxMGsqFRZXVqtqkBQOuib6pSuKR6tDNzOiOiqArDkMYDVS4OxC5IXH2zBwkojCaWfyT2PQ60oj/4+NgA5UnJeDPZPZsgXPyvikZvR1IdDbw3657QgBq0fYmuYdEXTy2392XQQWWwJGGBqGk7U2RjmISyT38zG+ba/gMnwrWlKN6qEZOnAIDBFS4TuGcUTSa9lpxPKwE4eOSBx+TEoe7TNLcGXBk5E0H7omLtJAHxcsQAGrlip+NEBIHx+yP8ibdHmG4zLpkQT5Fk+rKL9hdGioLDZ/dasdkZQZXIF56zQIzaWlSyZPKCqwAaL3uYAG7st1RYbHIo9Eyehl0bdop2EhUyK1TEvf85xebYpl6S9ywx/KBXskPmsfWyzRxJueKo1SKoFu57xXylzIR0L0bYrg8L40FssBUJtYWQlAAAI1mU7R0He4Hjho1Qbpm6+xSAJNNDTEMNk5g+QLL6HFywNbY44AAAZj8rUUl+zBLW2daETmvNRglCdfHvPfaIVN8LTTwAAFMfAu7A7dws615NArMcwTrTuShv9Zk/d5s5EctmIqfWuhDleFfXQ/WgUNL14c11DHpAbP4pedLzFhWyAAUZtMrQPwvD2q2y4u8+pmD3g5o+fB+ZrKRiyDfNRRGI++GPGesDBG26+G05ZPwDL77A0fu2UuENuUEaIDH7DQpl8PdG/uH6iw2KWCmxdIc1ADu+XJ6qv4PNjg2956oSs3Q7oY7XBmfbV5sXxt4GrnvPlkgjw3VDnATHjXHTbOhBFVZfmbdZjOm8dPxCeJQLqQWDyQiHg46cg8BE4/M5adFiORmsqaU7og7NXNEdluMck91SPo2Kn1IDp+Uv72FW8l4UIo9vsyZ3w0t3Etmre5fWY97F9raXOUhP9YhclJpGUxptK588AAGzgFWowyvt7pRQCfQn2OFVpranvomrg1XrnCZY7QYOgztnOYBhWHsrUmV6zQRh9CQ9mJThKCBC/6BwAAA/U70XAAAAAAAAAAAAAAAAA=) The `POST_PLUGIN` flag specifies the postprocessing plugin to be applied to the model (applicable only to object detection (OD) models). The following options are available to run ABP and NMS: > > > - `NONE`: Default, no ABP or NMS postprocessing plugin. > - `SMARTNMS`: Provides an intelligent mechanism for identifying any postprocessing in the model and generating a SMARTNMS-specific model. > - `QDETECT`: Uses [QAic QDetect layers](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic_qdetect_layers_introduction.html) to perform NMS postprocessing on the device. For NLP networks, the postprocessing decodes the tokens generated from model. Use HuggingFace generation utils to do the postprocessing on the host. ## Single model configuration example The following example shows a sample configuration for a single model: MODEL: INFO: MODEL_TYPE: EFFICIENTDET INPUT_INFO: - - input:0 - - 1 - 512 - 512 - 3 DYNAMIC_INFO: - - input:0 - - batch_size - 512 - 512 - 3 EXPORT_TYPE: ONNX OPSET: 13 MODEL_PATH: efficientdet-d0.pb NAME: Sample Model DESCRIPTION: SSD MobileNet V1 Opset 10 Object Detection Model VALIDATE: False AIC_DEVICE_ID: 0 WORKSPACE: WORKSPACE VERBOSE: INFO INPUT_LIST_FILE: None CUSTOM_OP_INFO_FILEPATH: None PRE_POST_HANDLE: NMS_PARAMS: MAX_OUTPUT_SIZE_PER_CLASS: 100 MAX_TOTAL_SIZE: 100 IOU_THRESHOLD: 0.65 SCORE_THRESHOLD: 0.25 CLIP_BOXES: False PAD_PER_CLASS: False PRE_PLUGIN: True TRANSFORMER_PACKED_MODEL: False COMPRESSED_MASK: False POST_PLUGIN: SMARTNMS ANCHOR_BIN_FILE: None ATTRIBUTES: None Copy to clipboard ## Multiple model configuration example The following example shows a sample configuration for multiple models: MODELS: MODEL: INFO: MODEL_TYPE: CLASSIFICATION INPUT_INFO: - - model_1_input - - 1 - 100 DYNAMIC_INFO: - - model_1_input - - batch - 100 EXPORT_TYPE: ONNX OPSET: 13 MODEL_PATH: model_1.onnx NAME: Model_1 DESCRIPTION: Sample model-1 VALIDATE: True AIC_DEVICE_ID: 0 WORKSPACE: ./workspace VERBOSE: INFO INPUT_LIST_FILE: None CUSTOM_OP_INFO_FILEPATH: None PRE_POST_HANDLE: NMS_PARAMS: MAX_OUTPUT_SIZE_PER_CLASS: 100 MAX_TOTAL_SIZE: 500 IOU_THRESHOLD: 0.5 SCORE_THRESHOLD: 0.01 CLIP_BOXES: False PAD_PER_CLASS: False PRE_PLUGIN: True TRANSFORMER_PACKED_MODEL: False COMPRESSED_MASK: False POST_PLUGIN: NONE ANCHOR_BIN_FILE: None ATTRIBUTES: None MODEL: INFO: MODEL_TYPE: CLASSIFICATION INPUT_INFO: - - model_2_input - - 1 - 10 DYNAMIC_INFO: - - model_2_input - - batch - 10 EXPORT_TYPE: ONNX OPSET: 13 MODEL_PATH: model_2.onnx NAME: Model_2 DESCRIPTION: Sample model-2 VALIDATE: True AIC_DEVICE_ID: 0 WORKSPACE: ./workspace VERBOSE: INFO INPUT_LIST_FILE: None CUSTOM_OP_INFO_FILEPATH: None PRE_POST_HANDLE: NMS_PARAMS: MAX_OUTPUT_SIZE_PER_CLASS: 100 MAX_TOTAL_SIZE: 500 IOU_THRESHOLD: 0.5 SCORE_THRESHOLD: 0.01 CLIP_BOXES: False PAD_PER_CLASS: False PRE_PLUGIN: True TRANSFORMER_PACKED_MODEL: False COMPRESSED_MASK: False POST_PLUGIN: NONE ANCHOR_BIN_FILE: None ATTRIBUTES: None CHAINING_INFO: EDGES: - - Model_1::model_1_output - Model_2::model_2_input WORKSPACE: ./workspace_chaining/ EXPORT_TYPE: ONNX OPSET: 13 AIC_DEVICE_ID: 0 Copy to clipboard ## `qaic-model-preparator` options Config options: --config CONFIG Path to config file --silent Run in silent mode Copy to clipboard For more information about `qaic-model-preparator`, see the help menu in the tool: `python3 qaic-model-preparator.py --help`. The tool is located at `/opt/qti-aic/tools/qaic-pytools` in the SDK. ## Tutorial: Converting and running a YoloV5 model with QAic The following tutorial demonstrates the end-to-end usage of model preparator tool and the QAic execution, using YoloV5 as the source framework model. Starting from a trained source framework model, model preparator converts and builds it into an optimized model, which is then executed on a QAic backend. ### Tutorial setup Before running this tutorial, complete the SDK installation and environment setup. The following steps download the YoloV5 model from the Ultralytics repository, install the required dependencies, and copy the exported ONNX model to the SDK tools directory. import os cwd = os.getcwd() # Steps to generate the models from ultralytics repo. !rm -rf yolov5 # Clone the Ultralytics repo. !git clone --branch v6.0 --depth 1 https://github.com/ultralytics/yolov5.git # Install the requirements %cd yolov5 !git checkout v6.0 !pip3 install seaborn # Export the Original yolo models. !python3 -W ignore export.py --weights ./yolov5s.pt --include onnx --opset 13 # Copy the original model to the relevant paths in sdk !cp yolov5s.onnx /opt/qti-aic/tools/qaic-pytools %cd .. !rm -rf yolov5/ Copy to clipboard ### Model conversion After the model assets have been acquired, the model can be converted to optimized QAic model and subsequently built for use by an application. The following example generates the optimized QDetect model as described in the [Optimizations around preprocessing and postprocessing handling in preparator](https://docs.qualcomm.com/doc/80-99100-3/topic/index_Prepare-the-model.html#preprocess-postprocess-optimizations) section. # Path to the installed SDK apps tools %cd /opt/qti-aic/tools/qaic-pytools # Run the preparator plugin with the relevant config file !python -W ignore qaic-model-preparator.py --config /opt/qti-aic/tools/qaic-pytools/model_configs/samples/preparator/public/yolov5_ultralytics_model_info_qdetect.yaml --silent # More details on various configs can be found here: /opt/qti-aic/tools/qaic-pytools/model_configs/samples/preparator/public Copy to clipboard ### QAic backend execution Use the following commands to compile the model binary with `qaic-compile` and run it with `qaic-runner`: !rm -rf yolo-binaries-qdetect !/opt/qti-aic/exec/qaic-compile -m=/opt/qti-aic/tools/qaic-pytools/WORKSPACE/yolov5s_preparator_aic100.onnx \ -aic-hw -onnx-define-symbol=batch_size,1 -aic-binary-dir=yolo-binaries-qdetect -convert-to-fp16 Copy to clipboard !/opt/qti-aic/exec/qaic-runner -t yolo-binaries-qdetect -a 1 -d 0 --time 15 Copy to clipboard ### Plot model outputs on sample image After obtaining the performance numbers, set up the model artifacts for a sample real image. Preprocess the image, convert it to raw format, and generate model outputs using qaic-runner. Use the generated outputs to plot the decoded detections on the image. # Imports import os import time import cv2 import numpy as np import torch from PIL import Image def letterbox_image(image, size): iw, ih = image.size w, h = size scale = min(w / iw, h / ih) nw = int(iw * scale) nh = int(ih * scale) image = image.resize((nw, nh), Image.BICUBIC) new_image = Image.new("RGB", size, (128, 128, 128)) pad_left = (w - nw) // 2 pad_top = (h - nh) // 2 new_image.paste(image, (pad_left, pad_top)) return new_image, scale, pad_left, pad_top def preprocessImg(image_path, input_h, input_w): image_src = Image.open(image_path) resized, scale, pad_left, pad_top = letterbox_image(image_src, (input_w, input_h)) img_in = np.transpose(resized, (2, 0, 1)).astype(np.float32) # HWC -> CHW img_in = np.expand_dims(img_in, axis=0) img_in /= 255.0 return img_in, np.array(image_src, dtype=np.uint8), scale, pad_left, pad_top Copy to clipboard # Download the sample image and pre-process !rm -rf *.jpg !wget -c https://ultralytics.com/images/zidane.jpg img_preproc, img_orig, scale, pad_left, pad_top = preprocessImg("zidane.jpg", 640, 640) img_preproc.tofile("input.raw") Copy to clipboard # Generate the outputs !/opt/qti-aic/exec/qaic-runner -t yolo-binaries-qdetect -i input.raw --write-output-dir yolo-output-qdetect -d 0 Copy to clipboard # Model artifacts to post process and plot the outputs on the image def scale_coords( coords, img_orig_h, img_orig_w, scale, pad_left, pad_top, xy_swap=True ): # Rescale coords (xyxy) from preprocessed img to original img resolution if xy_swap: coords[:, :, [0, 2]] -= pad_top # y padding coords[:, :, [1, 3]] -= pad_left # x padding else: coords[:, :, [0, 2]] -= pad_left # x padding coords[:, :, [1, 3]] -= pad_top # y padding coords[:, :, :4] /= scale # Clip bounding xyxy bounding boxes to image shape (height, width) if xy_swap: coords[:, :, 0] = coords[:, :, 0].clip(0, img_orig_h - 1) # y1 coords[:, :, 1] = coords[:, :, 1].clip(0, img_orig_w - 1) # x1 coords[:, :, 2] = coords[:, :, 2].clip(0, img_orig_h - 1) # y2 coords[:, :, 3] = coords[:, :, 3].clip(0, img_orig_w - 1) # x2 else: coords[:, :, 0] = coords[:, :, 0].clip(0, img_orig_w - 1) # x1 coords[:, :, 1] = coords[:, :, 1].clip(0, img_orig_h - 1) # y1 coords[:, :, 2] = coords[:, :, 2].clip(0, img_orig_w - 1) # x2 coords[:, :, 3] = coords[:, :, 3].clip(0, img_orig_h - 1) # y2 return coords class_names = [ "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush", ] def drawBoxes( detections, img_orig, scale=1.0, pad_left=0, pad_top=0, xy_swap=True, filter_score=0.2, line_thickness=None, text_bg_alpha=0.0, ): detection_boxes = detections[0] # [1, N, 4] detection_scores = detections[1] # [1, N] detection_classes = detections[2] # [1, N] num_detections = detections[3] # [1] img_orig_h, img_orig_w = img_orig.shape[:2] detection_boxes = scale_coords( detection_boxes, img_orig_h, img_orig_w, scale, pad_left, pad_top, xy_swap ) tl = line_thickness or round(0.002 * (img_orig_w + img_orig_h) / 2) + 1 assert ( detection_boxes.shape[0] == 1 ), "Currently plotting for single batch size only." for i in range(num_detections[0]): box = detection_boxes[0][i] score = detection_scores[0][i] cls = detection_classes[0][i] if score < filter_score: continue if xy_swap: y1, x1, y2, x2 = map(int, box) else: x1, y1, x2, y2 = map(int, box) np.random.seed(int(cls) + 2020) color = [np.random.randint(0, 255), 0, np.random.randint(0, 255)] cv2.rectangle( img_orig, (x1, y1), (x2, y2), color, thickness=max(int((img_orig_h + img_orig_w) / 600), 1), lineType=cv2.LINE_AA, ) label = "%s %.2f" % (class_names[int(cls)], score) t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=1)[0] c2 = x1 + t_size[0] + 3, y1 - t_size[1] - 5 if text_bg_alpha == 0.0: cv2.rectangle(img_orig, (x1 - 1, y1), c2, color, cv2.FILLED, cv2.LINE_AA) else: alphaReserve = text_bg_alpha BChannel, GChannel, RChannel = color xMin, yMin = int(x1 - 1), int(y1 - t_size[1] - 3) xMax, yMax = int(x1 + t_size[0]), int(y1) img_orig[yMin:yMax, xMin:xMax, 0] = img_orig[ yMin:yMax, xMin:xMax, 0 ] * alphaReserve + BChannel * (1 - alphaReserve) img_orig[yMin:yMax, xMin:xMax, 1] = img_orig[ yMin:yMax, xMin:xMax, 1 ] * alphaReserve + GChannel * (1 - alphaReserve) img_orig[yMin:yMax, xMin:xMax, 2] = img_orig[ yMin:yMax, xMin:xMax, 2 ] * alphaReserve + RChannel * (1 - alphaReserve) cv2.putText( img_orig, label, (x1 + 3, y1 - 4), 0, tl / 3, [255, 255, 255], thickness=1, lineType=cv2.LINE_AA, ) print( f"X1:{x1}, Y1:{y1}, X2:{x2}, Y2:{y2}, Score:{score:.4f}, Cls_id:{class_names[int(cls)]}" ) return img_orig Copy to clipboard boxes = np.fromfile("yolo-output-qdetect/detection_boxes-activation-0-inf-0.bin", dtype="float32").reshape(1, 100, 4) scores = np.fromfile("yolo-output-qdetect/detection_scores-activation-0-inf-0.bin", dtype="float32").reshape(1, 100) classes = np.fromfile("yolo-output-qdetect/detection_classes-activation-0-inf-0.bin", dtype="int32").reshape(1, 100) detections = np.fromfile("yolo-output-qdetect/num_detections-activation-0-inf-0.bin", dtype="int32").reshape(1) decoded_output = [boxes, scores, classes, detections] image_src = Image.open("zidane.jpg") img_orig = np.array(image_src, dtype=np.uint8) img_orig_plotted = drawBoxes(decoded_output, img_orig, scale, pad_left, pad_top, True) img_orig_plotted = cv2.cvtColor(img_orig_plotted, cv2.COLOR_RGB2BGR) cv2.imwrite("output_qdetect.jpg", img_orig_plotted) Copy to clipboard # Plot the outputs on the image import matplotlib.pyplot as plt from matplotlib.pyplot import figure img = np.array(Image.open("output_qdetect.jpg")) fig, ax = plt.subplots(figsize=(15, 15)) ax.imshow(img) Copy to clipboard ## Next steps - Go to `/opt/qti-aic/tools/qaic-pytools/docs/preparator/examples/notebooks` for more examples on various models. - [Compile the model](https://docs.qualcomm.com/doc/80-99100-3/topic/index_model-compilation.html#reference-to-compile-the-model). Last Published: Aug 25, 2026 [Previous Topic Export the model](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_Export-the-model.md) [Next Topic Operator and data type support](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_Operator-and-Datatype-support.md)