# Build a multimodal retail restocking assistant on Armv9 with MNN

## In this learning path

- [Introduction](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/)
- [Run multimodal inference with MNN on Armv9](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/1_mnn_v9/)
- [Build MNN and prepare an Omni model on Armv9](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/2_mnn_build/)
- [Validate text-only inference with an Omni model on Armv9](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/3_mnn_text_baseline/)
- [Run a vision retail shelf audit with MNN Omni](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/4_mnn_vision/)
- [Convert spoken restock notes into structured tickets with MNN Omni](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/5_mnn_vision_audio/)
- [Build a single-shot multimodal restock ticket with MNN Omni](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/6_mnn_restock_ticket/)
- [Next Steps](https://learn.arm.com/learning-paths/cross-platform/multimodel_mnn_v9/_next-steps/)

## About this Learning Path

| Skill level:       | Advanced         |
|--------------------|------------------|
| Reading time:      | 1 hr 30 min      |
| Last updated:      | 03 Aug 2026      |

| Author:            | Odin Shen, Arm [GitHub](https://github.com/odincodeshen) [LinkedIn](https://linkedin.com/in/odin-shen-lmshen) |
|--------------------|------------------|
| Arm IP:            | [Cortex-A](https://support.arm.com/?tab=compute-ip&Product%20Type=Application%20Processors) |
| Tags:              | [ML](https://learn.arm.com/tag/ml), [Linux](https://learn.arm.com/tag/linux), [CMake](https://learn.arm.com/tag/cmake), [CPP](https://learn.arm.com/tag/cpp), [Bash](https://learn.arm.com/tag/bash) |

### Who is this for?
This Learning Path is for developers and engineers who want to run multimodal image, audio, and text models on Armv9 Linux systems using MNN as a portable, CPU-first inference runtime. It is aimed at readers who are comfortable building software from source and want a reproducible on-device workflow without quantization or heterogeneous scheduling.

### What will you learn?
Upon completion of this Learning Path, you will be able to:
- Build MNN natively on an Armv9 Linux system for multimodal inference
- Verify a CPU-only Omni model workflow with text, vision, and audio prompts
- Create a reproducible multimodal application flow that combines image and audio inputs into an actionable restock ticket

### Prerequisites
Before starting, you will need the following:
- An Armv9 Linux device with at least 32 GB of available disk space, for example a Radxa Orion O6
- Familiarity with the Linux command line, Git, and building C++ projects with CMake
- Internet access to download source code, model assets, and sample data

### Summary
You’ll build MNN natively on Armv9 Linux, prepare a prebuilt Omni multimodal model, and validate a CPU-only inference workflow. You’ll compile MNN and use `llm_demo` to establish a text-only baseline. Then, you’ll add a vision shelf audit that identifies the sparsest priority zone, and handle unclear images with `NOT_SURE`. Finally, you’ll convert an audio prompt into a reproducible, semicolon-separated restock ticket.

### Frequently asked questions
<details>
<summary>How do I know the MNN build worked and the Omni model is ready?</summary>
Use the `llm_demo` binary to load the prebuilt Omni MNN model package. If the package loads without errors and a simple prompt produces tokens, continue to the next steps.
</details>

<details>
<summary>What should I look for in the text-only baseline output?</summary>
The baseline produces a predictable response with visible token generation. Record the output so you can compare behavior after adding vision and audio inputs.
</details>

<details>
<summary>What output should the vision shelf audit produce?</summary>
The audit estimates coverage for the top, middle, and bottom shelf levels. It identifies the sparsest priority zone and gives a short reason. If the image is unclear, it returns `NOT_SURE`.
</details>

<details>
<summary>Do I need a GPU or cloud service to run these demos on Armv9?</summary>
No. The workflow uses a native CPU-only MNN build, and the vision reasoning runs locally without cloud round trips.
</details>

<details>
<summary>What does the audio-to-ticket result look like and how is it used?</summary>
The result is a single-line, semicolon-separated ticket for predictable parsing and consistent terminal display. Combine it with the vision audit’s priority zone to create an actionable restock ticket.
</details>
