[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-majianjia--nnom":3,"tool-majianjia--nnom":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",152630,2,"2026-04-12T23:33:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":78,"owner_twitter":77,"owner_website":79,"owner_url":80,"languages":81,"stars":90,"forks":91,"last_commit_at":92,"license":93,"difficulty_score":94,"env_os":95,"env_gpu":96,"env_ram":97,"env_deps":98,"category_tags":103,"github_topics":104,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":112,"updated_at":113,"faqs":114,"releases":144},7101,"majianjia\u002Fnnom","nnom","A higher-level Neural Network library for microcontrollers.","NNoM（Neural Network on Microcontroller）是一款专为微控制器设计的高层神经网络推理库，旨在让资源受限的嵌入式设备也能轻松运行复杂的 AI 模型。随着神经网络结构日益复杂（如 ResNet、Inception 等），传统面向 MCU 的底层库往往难以高效部署这些模型，而 NNoM 正是为了解决这一痛点而生。\n\n它允许开发者仅需一行代码即可将 Keras 训练好的模型转换为 NNoM 格式，并自动管理内存与网络结构，极大简化了部署流程。NNoM 支持多种先进网络架构，包括卷积神经网络及 RNN、LSTM、GRU 等循环网络，并提供按通道量化、预编译优化等特性，在运行时零解释器损耗，显著提升执行效率。此外，它还内置了性能分析、混淆矩阵等评估工具，方便调试与优化。\n\nNNoM 特别适合嵌入式系统开发者、物联网工程师以及希望在单片机上快速验证 AI 算法的研究人员使用。无论是进行智能传感器开发、边缘计算应用，还是教学实验，NNoM 都能提供友好且高效的解决方案。其基于 Apache 2.0 协议开源，社区活跃，文档完善，是连接深度学习与嵌入式世界的实用桥梁。","\n# Neural Network on Microcontroller (NNoM)\n[![Build Status](https:\u002F\u002Ftravis-ci.com\u002Fmajianjia\u002Fnnom.svg?branch=master)](https:\u002F\u002Fapp.travis-ci.com\u002Fgithub\u002Fmajianjia\u002Fnnom)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache%202.0-blue.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FApache-2.0)\n[![DOI](https:\u002F\u002Fzenodo.org\u002Fbadge\u002F166869630.svg)](https:\u002F\u002Fzenodo.org\u002Fbadge\u002Flatestdoi\u002F166869630)\n\nNNoM is a high-level inference Neural Network library specifically for microcontrollers. \n\n[[English Manual]](https:\u002F\u002Fmajianjia.github.io\u002Fnnom\u002F) [[中文简介]](docs\u002Frt-thread_guide.md) \n\n**Highlights**\n\n- Deploy Keras model to NNoM model with one line of code.\n- Support complex structures; Inception, ResNet, DenseNet, Octave Convolution...\n- User-friendly interfaces.\n- High-performance backend selections.\n- Onboard pre-compiling - zero interpreter performance loss at runtime. \n- Onboard evaluation tools; Runtime analysis, Top-k, Confusion matrix... \n\nThe structure of NNoM is shown below:\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_dfc55240722a.png)\n\nMore detail avaialble in [Development Guide](docs\u002Fguide_development.md)\n\nDiscussions welcome using [issues](https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues). \nPull request welcome. QQ\u002FTIM group: 763089399.\n\n## Latest Updates - v0.4.x\n\n**Recurrent Layers (RNN) (0.4.1)**\n\nRecurrent layers **(Simple RNN, GRU, LSTM)** are implemented in version 0.4.1. Support `statful` and `return_sequence` options. \n\n**New Structured Interface (0.4.0)** \n\nNNoM has provided a new layer interface called **Structured Interface**, all marked with `_s` suffix. which aims to use one C-structure to provided all the configuration for a layer. Different from the Layer API which is human friendly, this structured API are more machine friendly. \n\n**Per-Channel Quantisation (0.4.0)**\n\nThe new structred API supports per-channel quantisation (per-axis) and dilations for **Convolutional layers**. \n\n**New Scripts (0.4.0)**\n\nFrom 0.4.0, NNoM will switch to structured interface as default to generate the model header `weights.h`. The scripts corresponding to structured interfaces are `nnom.py` while the Layer Interface corresponding to `nnom_utils.py`.\n\n## Licenses\n\nNNoM is released under Apache License 2.0 since nnom-V0.2.0. \nLicense and copyright information can be found within the code.\n\n## Why NNoM?\nThe aims of NNoM is to provide a light-weight, user-friendly and flexible interface for fast deploying on MCU.\n\nNowadays, neural networks are **wider**, **deeper**, and **denser**.\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_303ded5569d7.png)\n>[1] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., ... & Rabinovich, A. (2015). Going deeper with convolutions. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1-9).\n>\n>[2] He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).\n>\n>[3] Huang, G., Liu, Z., Van Der Maaten, L., & Weinberger, K. Q. (2017). Densely connected convolutional networks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4700-4708).\n\nAfter 2014, the development of Neural Networks are more focus on structure optimising to improve efficiency and performance, which is more important to the small footprint platforms such as MCUs. \nHowever, the available NN libs for MCU are too low-level which make it sooooo difficult to use with these complex strucures. \n\nTherefore, we build NNoM to help embedded developers for faster and simpler deploying NN model directly to MCU. \n> NNoM will manage the strucutre, memory and everything else for the developer. All you need to do is feeding your new measurements and getting the results. \n\n## Installing\n\nNNoM can be installed as a Python package\n\n```\npip install git+https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom@master\n```\n\nNNoM requires [Tensorflow](https:\u002F\u002Fwww.tensorflow.org\u002F) version `\u003C= 2.14`.\nThere are multiple options for how to install this, see the TensorFlow documentation.\n\nFor example:\n```\npip install 'tensorflow-cpu\u003C=2.14.1'\n```\n\nNOTE: Tensorflow 2.14 supports up until Python 3.11.\nHowever, *Python 3.12 is not supported*.\n\n## Accessing C files\n\nThe C headers and source code in NNoM are distributed in the `nnom_core` Python package.\nYou can find its location by running the following command.\n```\npython -c \"import nnom_core; print(nnom_core.__path__[0])\"\n```\nIn your build system, add the `inc\u002F` and `port\u002F` directories as include directories,\nand compile the the `src\u002F*.c` files.\n\n## Documentations\n\n**Guides**\n\n[5 min to NNoM Guide](docs\u002Fguide_5_min_to_nnom.md)\n\n[The temporary guide](docs\u002FA_Temporary_Guide_to_NNoM.md)\n\n[Porting and optimising Guide](docs\u002FPorting_and_Optimisation_Guide.md) \n\n[RT-Thread Guide(Chinese)](https:\u002F\u002Fmajianjia.github.io\u002Fnnom\u002Frt-thread_guide\u002F)\n\n[RT-Thread-MNIST example (Chinese)](docs\u002Fexample_mnist_simple_cn.md)\n\n\n\n## Performance \n\nThere are many articles compared NNoM with other famous MCU AI tools, such as TensorFlow LiteSTM32Cube.AI .etc. \n\n**Raphael Zingg etc** from Zurich University of Applied Sciences compare nnom with tflite, cube, and e-Ai in their paper  [\"Artificial Intelligence on Microcontrollers\"](https:\u002F\u002Fgithub.com\u002FInES-HPMM\u002FArtificial_Intelligence_on_Microcontrollers\u002Fblob\u002Fmaster\u002FArtificial_Intelligence_on_Microcontrollers.pdf) blog https:\u002F\u002Fblog.zhaw.ch\u002Fhigh-performance\u002F2020\u002F05\u002F14\u002Fartificial-intelligence-on-microcontrollers\u002F\n\n![performance-comparison-tflite-cubeai-eai](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_530d71b6a9d8.png)\n\n**Butt Usman Ali** from POLITECNICO DI TORINO, did below comparison in [the thesis: On the deployment of Artificial Neural Networks (ANN) in low \ncost embedded systems](https:\u002F\u002Fwebthesis.biblio.polito.it\u002F19692\u002F1\u002Ftesi.pdf)\n\n![performance-comparison-tflite-cubeai](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_1194c1c55be1.png)\n\nBoth articles shows that NNoM is not only comparable with other popular NN framework but with faster inference time and sometime less memory footprint. \n\n**Note:** These graphs and tables are credited to their authors. Please refer the their original papers for details and copyright. \n\n\n\n## Examples\n\n**Documented examples**\n\nPlease check [examples](https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Ftree\u002Fmaster\u002Fexamples) and choose one to start with. \n\n## Available Operations\n\n[[API Manual]](https:\u002F\u002Fmajianjia.github.io\u002Fnnom\u002F)\n\n> *Notes: NNoM now supports both HWC and CHW formats. Some operation might not support both format currently. Please check the tables for the current status. *\n\n\n**Core Layers**\n\n| Layers | Struct API |Layer API|Comments|\n| ------ |-------- |------|------|\n| Convolution  |conv2d_s()|Conv2D()|Support 1\u002F2D, support dilations (New!)|\n| ConvTransposed (New!) |conv2d_trans_s()|Conv2DTrans()|Under Dev. |\n| Depthwise Conv |dwconv2d_s()|DW_Conv2D()|Support 1\u002F2D|\n| Fully-connected |dense_s()| Dense()| |\n| Lambda |lambda_s()| Lambda() |single input \u002F single output anonymous operation| \n| Batch Normalization |N\u002FA| N\u002FA| This layer is merged to the last Conv by the script|\n| Flatten|flatten_s()| Flatten()| |\n| Reshape (New!)|reshape_s()| N\u002FA| |\n| SoftMax|softmax_s()| SoftMax()| Softmax only has layer API| \n| Activation|N\u002FA| Activation()|A layer instance for activation|\n| Input\u002FOutput |input_s()\u002Foutput_s()| Input()\u002FOutput()| |\n| Up Sampling |upsample_s()|UpSample()||\n| Zero Padding | zeropadding_s()|ZeroPadding()||\n| Cropping |cropping_s() |Cropping()||\n\n**RNN Layers**\n\n| Layers | Status | Struct API |Comments|\n| ------ | ------ | ------| ------|\n| Recurrent NN Layer(New!) | Alpha | rnn_s()| Layer wrapper of RNN|\n| Simple Cell (New!) | Alpha | simple_cell_s()||\n| GRU Cell (New!) | Alpha | gru_cell_s()| Gated Recurrent Network |\n| LSTM Cell (New!) | Alpha| lstm_s()| Long Short-Term Memory |\n\n**Activations**\n\nActivation can be used by itself as layer, or can be attached to the previous layer as [\"actail\"](docs\u002FA_Temporary_Guide_to_NNoM.md#addictionlly-activation-apis) to reduce memory cost.\n\nThere is no structred API for activation currently, since activation are not usually used as a layer.\n\n| Actrivation | Struct API |Layer API|Activation API|Comments|\n| ------ |--|--|--|--|\n| ReLU  | N\u002FA |ReLU()|act_relu()||\n| Leaky ReLU (New!) | N\u002FA |LeakyReLU()|act_leaky_relu()||\n| Adv ReLU(New!) | N\u002FA |N\u002FA|act_adv_relu()|advance ReLU, Slope, max, threshold|\n| TanH | N\u002FA |TanH()|act_tanh()||\n| Hard TanH (New!)| N\u002FA |TanH()||backend only|\n|Sigmoid|N\u002FA| Sigmoid()|act_sigmoid()||\n|Hard Sigmoid (New!)|N\u002FA| N\u002FA| N\u002FA|backend only|\n\n**Pooling Layers**\n\n| Pooling | Struct API|Layer API|Comments|\n| ------ |--------|----|----|\n| Max Pooling |maxpool_s()|MaxPool()||\n| Average Pooling |avgpool_s()|AvgPool()||\n| Sum Pooling |sumpool_s()|SumPool()||\n| Global Max Pooling|global_maxpool_s()|GlobalMaxPool()||\n| Global Average Pooling |global_avgpool_s()|GlobalAvgPool()||\n| Global Sum Pooling |global_sumpool_s()|GlobalSumPool()|dynamic output shift|\n\n**Matrix Operations Layers**\n\n| Matrix |Struct API |Layer API|Comments|\n| ------ |--|--|--|\n| Concatenate |concat_s()| Concat()| Concatenate through any axis|\n| Multiple  |mult_s()|Mult()||\n| Addition  |add_s()|Add()||\n| Substraction  |sub_s()|Sub()||\n\n\n## Dependencies\n\nNNoM now use the local pure C backend implementation by default. Thus, there is no special dependency needed. \n\nHowever, You will need to enable `libc` for dynamic memory allocation `malloc(), free(), and memset()`. Or you can port to the equivalent memory method in your system.  \n\n\n## Optimization\n[CMSIS-NN\u002FDSP](https:\u002F\u002Fgithub.com\u002FARM-software\u002FCMSIS_5\u002Ftree\u002Fdevelop\u002FCMSIS\u002FNN) is an optimized backend for ARM-Cortex-M4\u002F7\u002F33\u002F35P. You can select it for up to 5x performance compared to the default C backend. NNoM will use the equivalent method in CMSIS-NN if the condition met. \n\nPlease check [Porting and optimising Guide](docs\u002FPorting_and_Optimisation_Guide.md) for detail. \n\n## Known Issues\n### The Converter do not support implicitly defined activations\nThe script currently does not support implicit act:\n~~~\nx = Dense(32, activation=\"relu\")(x)\n~~~\nUse the explicit activation instead. \n~~~\nx = Dense(32)(x)\nx = Relu()(x)\n~~~\n\n## Tips - improving accuracy\n- Attaching an BatchNormalization after each convolutional layer limit the activation range thus help quantisation. BN add no extra computation in NNoM. \n- Dont train too much epoch. Large epoch number increases extreme number in activation -> lower the quantisation resolution.\n- Leave enough data for bottleneck - do not compress data at before the output of a model, infomation will be lost when it is quantised. \n\n## Contacts\nJianjia Ma\nmajianjia@live.com\n\nAlso find me for field supports. \n\n## Citation are required in publication\nPlease contact me using above details if you have any problem. \n\nExample:\n~~~\n@software{jianjia_ma_2020_4158710,\n  author       = {Jianjia Ma},\n  title        = {{A higher-level Neural Network library on Microcontrollers (NNoM)}},\n  month        = oct,\n  year         = 2020,\n  publisher    = {Zenodo},\n  version      = {v0.4.2},\n  doi          = {10.5281\u002Fzenodo.4158710},\n  url          = {https:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.4158710}\n}\n~~~\n\n","# 微控制器上的神经网络（NNoM）\n[![构建状态](https:\u002F\u002Ftravis-ci.com\u002Fmajianjia\u002Fnnom.svg?branch=master)](https:\u002F\u002Fapp.travis-ci.com\u002Fgithub\u002Fmajianjia\u002Fnnom)\n[![许可证](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache%202.0-blue.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FApache-2.0)\n[![DOI](https:\u002F\u002Fzenodo.org\u002Fbadge\u002F166869630.svg)](https:\u002F\u002Fzenodo.org\u002Fbadge\u002Flatestdoi\u002F166869630)\n\nNNoM 是一个专为微控制器设计的高级推理神经网络库。\n\n[[英文手册]](https:\u002F\u002Fmajianjia.github.io\u002Fnnom\u002F) [[中文简介]](docs\u002Frt-thread_guide.md) \n\n**亮点**\n\n- 一行代码即可将 Keras 模型部署到 NNoM 模型。\n- 支持复杂结构；Inception、ResNet、DenseNet、八度卷积等。\n- 友好的用户接口。\n- 高性能后端选择。\n- 内置预编译——运行时无解释器性能损失。\n- 内置评估工具；运行时分析、Top-k、混淆矩阵等。\n\nNNoM 的结构如下所示：\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_dfc55240722a.png)\n\n更多详细信息请参阅 [开发指南](docs\u002Fguide_development.md)。\n\n欢迎通过 [issues](https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues) 进行讨论。也欢迎提交 Pull 请求。QQ\u002FTIM 群：763089399。\n\n## 最新更新 - v0.4.x\n\n**循环层（RNN）（0.4.1）**\n\n在 0.4.1 版本中实现了循环层 **（简单 RNN、GRU、LSTM）**，支持 `statful` 和 `return_sequence` 选项。\n\n**新的结构化接口（0.4.0）**\n\nNNoM 提供了一种名为 **“结构化接口”** 的新层接口，所有接口均以 `_s` 后缀标记。该接口旨在使用一个 C 结构体来提供层的所有配置。与对人类友好的层 API 不同，这种结构化 API 更适合机器处理。\n\n**通道级量化（0.4.0）**\n\n新的结构化接口支持 **卷积层** 的通道级量化（按轴量化）和膨胀操作。\n\n**新脚本（0.4.0）**\n\n从 0.4.0 版本开始，NNoM 将默认切换到结构化接口来生成模型头文件 `weights.h`。对应于结构化接口的脚本是 `nnom.py`，而对应于层接口的脚本则是 `nnom_utils.py`。\n\n## 许可证\n\n自 nnom-V0.2.0 起，NNoM 采用 Apache License 2.0 发布。\n许可证和版权信息可在代码中找到。\n\n## 为什么选择 NNoM？\nNNoM 的目标是为快速部署到 MCU 提供轻量级、用户友好且灵活的接口。\n\n如今，神经网络变得越来越 **宽**、**深** 和 **密**。\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_303ded5569d7.png)\n>[1] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., ... & Rabinovich, A. (2015). 更深层次的卷积。载于 IEEE 计算机视觉与模式识别会议论文集（第 1–9 页）。\n>\n>[2] He, K., Zhang, X., Ren, S., & Sun, J. (2016). 图像识别中的深度残差学习。载于 IEEE 计算机视觉与模式识别会议论文集（第 770–778 页）。\n>\n>[3] Huang, G., Liu, Z., Van Der Maaten, L., & Weinberger, K. Q. (2017). 密集连接的卷积网络。载于 IEEE 计算机视觉与模式识别会议论文集（第 4700–4708 页）。\n\n2014 年之后，神经网络的发展更加注重结构优化，以提高效率和性能，这对于 MCU 等小尺寸平台尤为重要。\n然而，目前可用于 MCU 的神经网络库大多过于底层，导致在这些复杂结构上使用起来非常困难。\n\n因此，我们开发了 NNoM，旨在帮助嵌入式开发者更快速、更简便地将神经网络模型直接部署到 MCU 上。\n> NNoM 将为开发者管理结构、内存及其他一切事宜。您只需输入新的测量数据并获取结果即可。\n\n## 安装\n\nNNoM 可以作为 Python 包安装：\n\n```\npip install git+https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom@master\n```\n\nNNoM 需要 [TensorFlow](https:\u002F\u002Fwww.tensorflow.org\u002F) 版本 `\u003C= 2.14`。\n安装方法有多种，请参阅 TensorFlow 文档。\n\n例如：\n```\npip install 'tensorflow-cpu\u003C=2.14.1'\n```\n\n注意：TensorFlow 2.14 最高支持 Python 3.11。\n但 *不支持 Python 3.12*。\n\n## 访问 C 文件\n\nNNoM 中的 C 头文件和源代码分布在 `nnom_core` Python 包中。\n您可以通过运行以下命令找到其位置：\n```\npython -c \"import nnom_core; print(nnom_core.__path__[0])\"\n```\n\n在您的构建系统中，将 `inc\u002F` 和 `port\u002F` 目录添加为包含目录，\n并编译 `src\u002F*.c` 文件。\n\n## 文档\n\n**指南**\n\n[5 分钟入门 NNoM 指南](docs\u002Fguide_5_min_to_nnom.md)\n\n[临时指南](docs\u002FA_Temporary_Guide_to_NNoM.md)\n\n[移植与优化指南](docs\u002FPorting_and_Optimisation_Guide.md) \n\n[RT-Thread 指南（中文）](https:\u002F\u002Fmajianjia.github.io\u002Fnnom\u002Frt-thread_guide\u002F)\n\n[RT-Thread-MNIST 示例（中文）](docs\u002Fexample_mnist_simple_cn.md)\n\n\n\n## 性能\n\n有许多文章将 NNoM 与其他著名的 MCU AI 工具进行了比较，如 TensorFlow Lite、STM32Cube.AI 等。\n\n**苏黎世应用科学大学的 Raphael Zingg 等人** 在他们的论文《微控制器上的人工智能》中将 NNoM 与 TFLite、Cube 和 e-AI 进行了比较。博客：https:\u002F\u002Fblog.zhaw.ch\u002Fhigh-performance\u002F2020\u002F05\u002F14\u002Fartificial-intelligence-on-microcontrollers\u002F\n\n![性能比较-TFLite-CubeAI-eAI](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_530d71b6a9d8.png)\n\n**都灵理工大学的 Butt Usman Ali** 在其论文《低成本嵌入式系统中人工神经网络（ANN）的部署》中进行了如下比较：\n\n![性能比较-TFLite-CubeAI](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_readme_1194c1c55be1.png)\n\n两篇文章都表明，NNoM 不仅可以与其他流行的神经网络框架相媲美，而且具有更快的推理速度和有时更低的内存占用。\n\n**注：** 这些图表和表格的版权归其作者所有。有关详细信息及版权问题，请参阅原始论文。\n\n\n\n## 示例\n\n**已记录的示例**\n\n请查看 [示例](https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Ftree\u002Fmaster\u002Fexamples)，并选择一个开始尝试。\n\n## 可用操作\n\n[[API 手册]](https:\u002F\u002Fmajianjia.github.io\u002Fnnom\u002F)\n\n> *注：NNoM 现在同时支持 HWC 和 CHW 格式。目前部分操作可能尚未完全支持这两种格式，请查看表格以了解当前状态。*\n\n\n**核心层**\n\n| 层 | 结构化 API | 层 API | 备注 |\n| ------ |-------- |------|------|\n| 卷积  |conv2d_s()|Conv2D()|支持 1D\u002F2D，支持空洞卷积（新！）|\n| 转置卷积（新！） |conv2d_trans_s()|Conv2DTrans()|开发中 |\n| 深度可分离卷积 |dwconv2d_s()|DW_Conv2D()|支持 1D\u002F2D|\n| 全连接 |dense_s()| Dense()| |\n| Lambda |lambda_s()| Lambda() |单输入\u002F单输出的匿名操作| \n| 批量归一化 |无| 无| 此层已被脚本合并到前一个卷积层中|\n| 展平|flatten_s()| Flatten()| |\n| 重塑（新！）|reshape_s()| 无| |\n| SoftMax|softmax_s()| SoftMax()| Softmax 仅提供层 API| \n| 激活函数|无| Activation()|用于激活的层实例|\n| 输入\u002F输出 |input_s()\u002Foutput_s()| Input()\u002FOutput()| |\n| 上采样 |upsample_s()|UpSample()||\n| 零填充 | zeropadding_s()|ZeroPadding()||\n| 裁剪 |cropping_s() |Cropping()||\n\n**RNN 层**\n\n| 层 | 状态 | 结构化 API | 备注 |\n| ------ | ------ | ------| ------|\n| 循环神经网络层（新！） | Alpha | rnn_s()| RNN 的层封装|\n| 简单细胞（新！） | Alpha | simple_cell_s()||\n| GRU 单元（新！） | Alpha | gru_cell_s()| 门控循环网络 |\n| LSTM 单元（新！） | Alpha| lstm_s()| 长短期记忆 |\n\n**激活函数**\n\n激活函数可以单独作为一层使用，也可以作为“actail”附加到前一层，以减少内存开销（详见 [NNoM 临时指南](docs\u002FA_Temporary_Guide_to_NNoM.md#addictionlly-activation-apis)）。\n\n目前没有针对激活函数的结构化 API，因为激活通常不作为独立的层来使用。\n\n| 激活函数 | 结构化 API | 层 API | 激活 API | 备注 |\n| ------ |--|--|--|--|\n| ReLU  | 无 |ReLU()|act_relu()||\n| Leaky ReLU（新！） | 无 |LeakyReLU()|act_leaky_relu()||\n| Adv ReLU（新！） | 无 |无|act_adv_relu()|高级 ReLU，包含斜率、最大值、阈值等参数|\n| TanH | 无 |TanH()|act_tanh()||\n| Hard TanH（新！）| 无 |TanH()||仅后端实现|\n|Sigmoid|无| Sigmoid()|act_sigmoid()||\n|Hard Sigmoid（新！）|无| 无| 无|仅后端实现|\n\n**池化层**\n\n| 池化 | 结构化 API|层 API|备注|\n| ------ |--------|----|----|\n| 最大池化 |maxpool_s()|MaxPool()||\n| 平均池化 |avgpool_s()|AvgPool()||\n| 求和池化 |sumpool_s()|SumPool()||\n| 全局最大池化|global_maxpool_s()|GlobalMaxPool()||\n| 全局平均池化 |global_avgpool_s()|GlobalAvgPool()||\n| 全局求和池化 |global_sumpool_s()|GlobalSumPool()|动态输出位移|\n\n**矩阵运算层**\n\n| 矩阵 |结构化 API |层 API|备注|\n| ------ |--|--|--|\n| 拼接 |concat_s()| Concat()|沿任意轴拼接|\n| 乘法  |mult_s()|Mult()||\n| 加法  |add_s()|Add()||\n| 减法  |sub_s()|Sub()||\n\n\n## 依赖项\n\nNNoM 目前默认使用本地纯 C 后端实现。因此，无需额外的特殊依赖。\n\n不过，您需要启用 `libc` 以使用动态内存分配函数 `malloc()`、`free()` 和 `memset()`。或者，您可以移植到您系统中等效的内存管理方法。  \n\n\n## 优化\n[CMSIS-NN\u002FDSP](https:\u002F\u002Fgithub.com\u002FARM-software\u002FCMSIS_5\u002Ftree\u002Fdevelop\u002FCMSIS\u002FNN) 是针对 ARM-Cortex-M4\u002F7\u002F33\u002F35P 的优化后端。选择该后端时，性能可比默认 C 后端提升高达 5 倍。当条件满足时，NNoM 会自动使用 CMSIS-NN 中的等效方法。\n\n详细信息请参阅 [移植与优化指南](docs\u002FPorting_and_Optimisation_Guide.md)。\n\n## 已知问题\n### 转换器不支持隐式定义的激活函数\n当前脚本不支持隐式激活：\n~~~\nx = Dense(32, activation=\"relu\")(x)\n~~~\n请改用显式激活：\n~~~\nx = Dense(32)(x)\nx = Relu()(x)\n~~~\n\n## 小贴士 - 提高精度\n- 在每个卷积层后添加批量归一化可以限制激活范围，从而有助于量化。在 NNoM 中，BN 不会增加额外的计算量。\n- 不要训练过多的轮次。过大的轮次会导致激活值出现极端值，从而降低量化精度。\n- 为瓶颈层保留足够的数据——不要在模型输出之前过度压缩数据，否则信息会在量化过程中丢失。\n\n## 联系方式\nJianjia Ma\nmajianjia@live.com\n\n如有现场支持需求，也欢迎联系我。\n\n## 发表论文时需引用\n如遇任何问题，请通过上述联系方式与我联系。\n\n示例：\n~~~\n@software{jianjia_ma_2020_4158710,\n  author       = {Jianjia Ma},\n  title        = {{微控制器上的高级神经网络库 (NNoM)}},\n  month        = oct,\n  year         = 2020,\n  publisher    = {Zenodo},\n  version      = {v0.4.2},\n  doi          = {10.5281\u002Fzenodo.4158710},\n  url          = {https:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.4158710}\n}\n~~~","# NNoM 快速上手指南\n\nNNoM (Neural Network on Microcontroller) 是一个专为微控制器（MCU）设计的高层神经网络推理库。它支持将 Keras 模型一键部署到 MCU，并提供了高性能的后端优化选项。\n\n## 1. 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**：Linux, macOS 或 Windows。\n*   **Python 版本**：推荐 Python 3.8 - 3.11。\n    *   ⚠️ **注意**：暂不支持 Python 3.12。\n*   **TensorFlow 版本**：必须安装 `tensorflow` 或 `tensorflow-cpu`，版本需 **\u003C= 2.14**。\n*   **C 编译环境**：用于 MCU 端的编译（如 GCC, ARMCC, IAR 等），需支持标准 C 库 (`malloc`, `free`, `memset`)。\n\n### 国内加速建议\n由于 TensorFlow 和 PyPI 源在国外访问较慢，建议使用国内镜像源进行安装。\n\n## 2. 安装步骤\n\n### 第一步：安装 TensorFlow\n首先安装兼容版本的 TensorFlow。推荐使用清华或阿里镜像源。\n\n```bash\npip install 'tensorflow-cpu\u003C=2.14.1' -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n### 第二步：安装 NNoM Python 包\n安装 NNoM 工具包，该包包含模型转换脚本和核心 C 代码。\n\n```bash\npip install git+https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom@master -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n### 第三步：获取 C 源代码\nNNoM 的 C 头文件和源码分布在 `nnom_core` 包中。运行以下命令找到其安装路径：\n\n```bash\npython -c \"import nnom_core; print(nnom_core.__path__[0])\"\n```\n\n在您的 MCU 工程构建系统中：\n1.  将上述路径下的 `inc\u002F` 和 `port\u002F` 目录添加为**包含目录 (Include Directories)**。\n2.  将 `src\u002F*.c` 下的所有文件添加到**编译源文件列表**中。\n\n## 3. 基本使用\n\nNNoM 的工作流分为两步：**PC 端模型转换** 和 **MCU 端推理**。\n\n### 步骤 A：PC 端训练与转换\n\n假设您已经有一个训练好的 Keras 模型。请使用 `nnom.py` 脚本将其转换为 NNoM 可用的 C 头文件 (`weights.h`)。\n\n**注意**：NNoM 转换器目前不支持隐式激活函数（如 `Dense(32, activation='relu')`），请使用显式层（先 `Dense` 后 `ReLU`）。\n\n创建一个转换脚本 `convert_model.py`：\n\n```python\nimport tensorflow as tf\nfrom nnom import *\n\n# 1. 加载或构建你的 Keras 模型 (示例)\n# 请替换为你自己的模型加载代码\nmodel = tf.keras.models.load_model('my_model.h5') \n\n# 2. 创建 NNoM 模型实例\n# 输入数据形状需与模型一致，这里以 (1, 28, 28, 1) 为例\ninput_data = tf.random.normal((1, 28, 28, 1))\nnnom_model = create_model(model, input_data=input_data)\n\n# 3. 导出为 C 头文件\n# 生成的 weights.h 包含了网络结构和量化权重\nnnom_model.save(\"weights.h\")\n```\n\n运行脚本生成文件：\n```bash\npython convert_model.py\n```\n执行成功后，当前目录下将生成 `weights.h`。\n\n### 步骤 B：MCU 端集成与推理\n\n将生成的 `weights.h` 复制到您的 MCU 项目中，并编写推理代码。\n\n```c\n#include \"nnom.h\"\n#include \"weights.h\" \u002F\u002F 引入由脚本生成的模型文件\n\n\u002F\u002F 定义输入输出缓冲区 (根据模型实际大小调整)\nuint8_t input_data[28 * 28 * 1];\nuint8_t output_data[10];\n\n\u002F\u002F 1. 创建模型实例\nnnom_model_t *model = nnom_model_create();\n\nif (model == NULL) {\n    \u002F\u002F 处理创建失败\n    while(1);\n}\n\n\u002F\u002F 2. 填充输入数据 (例如从传感器读取)\n\u002F\u002F memcpy(input_data, sensor_buffer, sizeof(input_data));\n\n\u002F\u002F 3. 运行推理\nnnom_status_t result = nnom_run(model, input_data, output_data);\n\nif (result == NNOM_SUCCESS) {\n    \u002F\u002F 推理成功，output_data 中包含结果\n    \u002F\u002F 对于分类任务，通常需要使用 softmax 后处理或直接取最大值索引\n}\n\n\u002F\u002F 4. 释放资源 (可选，若不再使用)\nnnom_model_delete(model);\n```\n\n### 性能优化提示\n*   **后端选择**：默认使用纯 C 后端。如果您的芯片是 ARM Cortex-M4\u002FM7\u002FM33\u002FM35P，建议在 `nnom_port.h` 中启用 **CMSIS-NN** 后端，可获得高达 5 倍的性能提升。\n*   **量化精度**：在训练时，建议在每个卷积层后添加 `BatchNormalization` 层，这有助于限制激活范围从而提高量化精度，且在 NNoM 推理时不会增加额外计算量。","某嵌入式团队正在为一款低功耗智能摄像头开发本地人脸检测功能，需要在资源受限的 MCU 上运行深度学习模型。\n\n### 没有 nnom 时\n- **模型移植极其繁琐**：开发者需手动将 Keras 训练好的复杂网络（如 ResNet）逐层转换为底层 C 代码，耗时数周且极易出错。\n- **内存管理高风险**：MCU 内存极小，人工计算每层张量大小并分配静态内存，稍有不慎就会导致栈溢出或运行时崩溃。\n- **性能优化门槛高**：缺乏针对 MCU 指令集的后端优化，推理速度慢，无法满足实时视频流的处理帧率要求。\n- **调试黑盒化**：缺少板载评估工具，无法在设备上直接查看混淆矩阵或各层耗时，排查精度下降问题如同盲人摸象。\n\n### 使用 nnom 后\n- **一键自动部署**：利用 nnom 的 Python 脚本，仅需一行代码即可将 Keras 模型自动转换为包含完整结构的 C 头文件，支持 Inception、LSTM 等复杂架构。\n- **自动化内存调度**：nnom 内部管理所有层级结构与内存复用，开发者无需关心底层细节，彻底消除手动分配带来的内存错误。\n- **预编译零损耗**：通过板载预编译技术，模型在运行时无需解释器开销，结合高性能后端选择，显著提升了推理速度。\n- **可视化板载分析**：内置运行时分析工具，可直接在 MCU 上输出 Top-k 准确率、混淆矩阵及各层耗时，让性能调优有据可依。\n\nnnom 通过将复杂的神经网络部署简化为“喂食数据、获取结果”的简单流程，让嵌入式开发者能轻松在微控制器上落地先进的 AI 算法。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmajianjia_nnom_1194c1c5.png","majianjia","Jianjia Ma","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fmajianjia_dec63f86.jpg","Independent developer, hobbyist.","University of Southampton",null,"majianjia@live.com","aircheese.me","https:\u002F\u002Fgithub.com\u002Fmajianjia",[82,86],{"name":83,"color":84,"percentage":85},"C","#555555",75.9,{"name":87,"color":88,"percentage":89},"Python","#3572A5",24.1,1151,281,"2026-04-06T03:45:00","Apache-2.0",4,"未说明 (适用于任何支持标准 C 编译器和 Python 的环境，包括嵌入式开发主机)","不需要 (专为微控制器设计，模型转换在 CPU 上进行)","未说明 (主机端取决于 TensorFlow 运行需求；目标端为微控制器，资源占用极低)",{"notes":99,"python":100,"dependencies":101},"该工具主要用于将 Keras 模型部署到微控制器 (MCU)。主机端需要安装 TensorFlow (CPU 版本即可) 用于模型转换和生成 C 代码。目标硬件需支持 C 语言环境并启用 libc (malloc\u002Ffree) 或自行移植内存管理函数。可选依赖 ARM CMSIS-NN 库以在 Cortex-M4\u002FM7 等架构上获得高达 5 倍的性能提升。模型转换脚本不支持隐式定义的激活函数，需在 Keras 模型中显式添加激活层。","3.8 - 3.11 (不支持 Python 3.12)",[102],"tensorflow\u003C=2.14",[14],[105,106,64,107,108,109,110,111],"microcontroller","mcu","neural-networks","machine-learning","embedded","iot","ml","2026-03-27T02:49:30.150509","2026-04-13T18:43:16.008780",[115,120,124,129,134,139],{"id":116,"question_zh":117,"answer_zh":118,"source_url":119},31909,"启用 CMSIS-NN 后端后，为什么模型推理性能反而下降了？","这通常是因为编译器选项 `-fno-builtin` 阻止了编译器对 `memcpy` 和 `memset` 等函数进行优化。请尝试移除该编译选项，在使用 CMSIS 5.7.0 及以上版本时，移除后通常能观察到预期的性能提升。","https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F100",{"id":121,"question_zh":122,"answer_zh":123,"source_url":119},31910,"使用 CMSIS-NN 后端时，模型的预测结果与本地后端或原始 Keras 模型不一致，该如何解决？","这可能是由于量化截断（truncate）模式的设置差异导致的。CMSIS 默认使用向下取整（floor），而 nnom 的某些配置可能使用了相反的模式。建议检查并删除 `port.h` 中相关的 `NNOM_TRUNCATE` 选项，确保量化脚本中使用的是 floor 模式，以保持两者一致。",{"id":125,"question_zh":126,"answer_zh":127,"source_url":128},31911,"如何在 STM32 等嵌入式设备上解决运行时的内存溢出或停止运行问题？","首先需要确定模型所需的内存大小。可以调用 `model_stat(model);` 函数，它会打印出一个全局变量，记录总分配的内存大小。根据这个数值，适当增加静态内存缓冲区的大小，或者在 CubeMX 中调整 Heap\u002FStack 大小。如果使用的是 RT-Thread 等系统，默认可能会将剩余内存作为栈使用，需确保分配给 nnom 的静态内存足够大。","https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F123",{"id":130,"question_zh":131,"answer_zh":132,"source_url":133},31912,"如何正确开启和使用 nnom 的静态内存支持（NNOM_USING_STATIC_MEMORY）？","开启静态内存前，建议先使用动态内存模式运行模型，查看编译日志或使用 `model_stat()` 确定模型实际需要的内存大小。然后，根据该数值分配足够大的静态内存空间。如果静态缓冲区大小不足，会导致外部变量被意外修改或清零。确保分配的静态内存大小大于模型所需的最小值。","https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F202",{"id":135,"question_zh":136,"answer_zh":137,"source_url":138},31913,"定义 `NNOM_USING_CMSIS_NN` 后，模型输出预测值始终错误（例如全为固定值），是什么原因？","这通常是 CMSIS-NN 库版本兼容性问题。有用户反馈在使用 CMSIS 5.7.0 版本时出现此问题，将其降级到 5.6.0 版本后问题解决。如果遇到类似情况，请尝试切换 CMSIS-NN 的版本进行测试。","https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F115",{"id":140,"question_zh":141,"answer_zh":142,"source_url":143},31914,"nnom 是否支持孪生网络（Siamese Network）？如何处理多输入模型的量化和部署？","支持。建议在 Keras 中联合训练好孪生网络后，利用 Keras 的功能将其拆分为子模型进行部署。可以使用代码 `layer_model = Model(inputs=model.input, outputs=layer.output)` 从已训练的模型中提取出用于图像处理的子模型和用于排序\u002F比对的子模型。先在 Python 中验证拆分后的模型效果，再使用 nnom 分别生成 C 代码进行推理。","https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F86",[145,150,155,160,165,170,175,180,185,190,195],{"id":146,"version":147,"summary_zh":148,"released_at":149},239159,"v0.4.3","**注释**\n\n自上一次发布以来已过去一年。感谢为该项目做出贡献的各位，期间积累了大量的 bug 修复和功能变更。现在正是发布 0.4.x 版本的最终版本之时。主分支将稳定在 0.4.x 版本。\n\n但这并不意味着项目就此结束。相反，新的 0.5.x 版本即将到来，并且接口方面将会有重大变化。这就是版本标签的工作方式：0.5.x 将与 0.4.x 不完全兼容。因此，我们可以移除已弃用的代码并清理库。\n\n**主要更新：**\n\n- 默认关闭 NNOM_TRUNCATE 选项 https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F100\n- 新增静态缓冲区接口。用户可以预先分配一大块内存供 nnom 使用，从而避免调用 `malloc()`。\n- 新增 API `nnom_set_static_buf()`，需在任何模型初始化之前调用。\n- 在 `nnom_port.h` 中新增宏 `NNOM_USING_STATIC_MEMORY`，用于控制内存使用类型。\n- 添加 reshape 层。\n\n**已修复的 bug：**\n\n- 修复了 `ROUND()` 函数执行不正确的问题，详情见 https:\u002F\u002Fgithub.com\u002FARM-software\u002FCMSIS_5\u002Fissues\u002F1047\n\n**其他小改进：**\n\n- 更新 SCopnstruct 以支持 Linux 构建。已在 Ubuntu WSL 18.04 上测试 @idog-ceva\n- 将 TF2.3.x 中的 “acc” 替换为 “accuracy”。\n- 在推理模式中添加高斯噪声层，该层可选择性跳过 @mle-invn\n- 在 `nnom_port.h` 中导出 `nnom_memcpy()` 和 `nnom_memset()`。\n- 由 @HadeelMabrouk 更新了 MFCC 相关示例。","2021-11-29T22:54:09",{"id":151,"version":152,"summary_zh":153,"released_at":154},239160,"v0.4.2","**重大更新：**\n\n由于引入了 RNN 层，校准方面进行了调整。\n\n- 校准数据的大小将不再自动截断为 100。\n- 不再为用户随机打乱数据。\n- 用户需自行将校准样本裁剪至指定大小（如 100），并在需要时手动打乱数据。\n- 在采用最大值-最小值量化时，允许对极小数值进行饱和处理，例如 1.00001。\n\n支持多输出模型：\n\n- 目前，输出数据缓冲区的命名格式为 nnom_output_data[]、nnom_output_data1[]、nnom_output_data2[] 等。\n\n新增类似 RNNoise 的语音增强示例：\n\n- 配备完善的文档和演示程序。\n\nDepthwise Conv 层现支持 depth_multiplier 参数。\n\n- 可直接在 Keras 中使用。\n\n**已修复的缺陷：**\n\n- 更新解决了 conv2d 1×1 且步幅不为 1 的问题，以及 cmsis-nn #84 提出的问题。\n- RNN 未能将正确的量化格式传递给下一层。\n- 删除模型时会导致段错误。\n- 编译器在处理多输出模型时会卡住。\n- DW 卷积和普通卷积在图像边缘且使用填充的情况下，无法正确计算卷积核的作用范围。\n\n**其他改进：**\n\n- 修复了硬 Sigmoid 函数，并消除了多输出场景下的编译警告。\n- 更新了 KWS 示例中的 MFCC C 代码，使其与 Python 版本的 MFCC 输出保持一致，预计准确率将大幅提升。\n- 提升了本地后端（DW 卷积）的性能。\n\n","2020-11-09T18:06:02",{"id":156,"version":157,"summary_zh":158,"released_at":159},239161,"v0.4.1","此版本的主要改动是增加了对 RNN 层的支持。\n\n**新增 RNN 层**\n- 支持的选项：`return_sequences`、`stateful` 和 `go_backwards`\n- 支持的 RNN 单元：Simple RNN、LSTM 和 GRU\n- GRU 和 LSTM 在内部以 16 位精度运行。\n\n**新增激活函数**\n- AdvanceReLU：等价于 Keras 中的 ReLU，支持任意参数，如 `slope`、`threshold` 和 `max`。同时也包括预定义的 ReLU 变体，例如 ReLU6。\n- Hard Tanh 和 Hard Sigmoid：目前仅在后端实现。\n\n**新增示例**\n- 新增 `uci-har-rnn` 示例，演示新 RNN 层的用法。\n- 在关键词检测示例中添加了一个 RNN 模型。\n\n次要改进：\n- 完成了输入\u002F输出张量的 Q 格式计算，并新增了 `model_io_format()` 方法，用于打印各层的输入输出信息。\n\n修复的 Bug：\n- 修复了对 2D 输入进行拼接时的问题。\n","2020-08-31T23:33:58",{"id":161,"version":162,"summary_zh":163,"released_at":164},239162,"v0.4.0","**重要提示：本次更新将不兼容您之前使用旧脚本生成的 `weights.h` 文件，原因在于 Conv2D 和 DW_Conv2D 层新增了一个参数 `dilation`。**\n请使用新脚本来重新生成您的旧模型。\n\n主要变更：\n- 新增一种名为“结构化 API”的接口类型，以 `_s` 后缀标识。这是一组以 C 结构体作为参数的层级 API。\n- 增加工具 `nnom.py`，用于基于 NNoM 结构化 API 生成 nnom 模型。\n- 在卷积层中新增通道级量化支持。\n- 新增数据类型：Tensor。所有运算现在均基于张量进行。\n- 权重和偏置现存储为张量。\n- 脚本已从纯 Keras 切换至 TensorFlow.Keras，支持 TF1.14 及以上版本和 TF2.1 及以上版本。\n\n层更新：\n- 为 Conv2D 和 DepthwiseConv2D 添加膨胀率（dilation）支持。\n- 添加转置卷积（目前尚未实现）。\n- 添加 LeakyReLU 支持。\n\n其他：\n- 将 `nnom_shape_t` 更改为 `nnom_3d_shaped_t`。\n- 为提高清晰度，将 `LAYER_BUF_*` 宏更改为 `NNOM_TENSOR_BUF_*`。\n\n修复的 Bug：\n- 修复 CHW 模式下张量展平函数 `tensor_chw2hwc()` 中的错误。\n- 修复 `upsampling_build()` 中的错误。\n- 修复 `global_pooling_builtd()` 中的维度计算错误。\n\n","2020-07-11T12:28:44",{"id":166,"version":167,"summary_zh":168,"released_at":169},239163,"v0.3.0","- 重新组织了文件结构。现在采用基于层的文件组织方式。  \n- `nnom_out_shape.c` 以及所有 `*_out_shape()` 函数现已改为 `*_build()`，并移至各自对应的层相关文件中。  \n- 新增了一个张量类型。现在所有算子（激活函数、卷积、全连接等）都将直接作用于张量上。  \n- 现在张量将单独创建。一个张量可以在不同层之间共享（这与之前使用的内存块机制大致相似）。","2020-04-25T11:52:12",{"id":171,"version":172,"summary_zh":173,"released_at":174},239164,"v0.2.1","- 后端全面支持 CHW 格式。已为配备硬件加速器的 MCU 做好准备。\n- Flatten 层现可将 CHW 格式展平为 HWC 格式。\n- 输入层在使用 CHW 格式时，会自动将 HWC 图像转换为 CHW 格式。\n- 实现逐层 KLD 量化（KLD 仅适用于卷积层）。\n- 激活函数量化现采用 1000 个样本进行校准，而非整个数据集。\n- `nnom_predict()` 现在输出概率值，并支持单个神经元输出。\n- 修复了 Win64 平台上的指针地址截断问题。\n- 新增示例 `auto-test`，用于 Travis CI 及所有 PC 平台。\n- 更新其他示例以适配新 API。\n- 修复了当整数位宽小于 0 时，TanH 和 Sigmoid 函数中的 bug。\n- 文档\n\n已知问题：\n- 在深度可分离卷积之后进行批归一化无法正常工作。临时解决方案：将批归一化移至逐点卷积之后（在深度可分离-逐点卷积结构中）。\n- 脚本不支持隐式定义的激活函数，例如 `Dense(32, activation='relu')`。临时解决方案：显式指定激活函数，例如：\n~~~\nDense(32)\nReLU()\n~~~\n\n注：\nKLD 量化。参考：http:\u002F\u002Fon-demand.gputechconf.com\u002Fgtc\u002F2017\u002Fpresentation\u002Fs7310-8-bit-inference-with-tensorrt.pdf","2019-07-23T10:40:46",{"id":176,"version":177,"summary_zh":178,"released_at":179},239165,"v0.2.0","- 添加示例文档\n- 重构了大部分示例\n- 添加零填充层和裁剪层\n- 新增属性 border_t\n- 修复了若干 bug。\n\n","2019-06-19T23:08:25",{"id":181,"version":182,"summary_zh":183,"released_at":184},239166,"v0.2.0-beta","更新日志\n- 从本版本起，许可证变更为 Apache-2.0。\n- 增加更多示例。（Octave 卷积、关键词检测等）\n- 更新编译接口。\n- 更改移植接口。（`LOG` -> `NNOM_LOG`）\n- 添加一个上采样层。\n- `nnom_utils.py` 现已支持 Add、Sub 和 Mult 操作，可直接从 Keras 转换。\n- Sigmoid 和 TanH 现在可以正常工作（与 https:\u002F\u002Fgithub.com\u002Fmajianjia\u002Fnnom\u002Fissues\u002F13 相关）。\n- 添加 `layer_callback()` 接口，在每一层操作完成后调用。\n- 修复了若干 bug。","2019-04-28T22:19:13",{"id":186,"version":187,"summary_zh":188,"released_at":189},239167,"v0.1.0-beta-1","修复了内存缓冲区计算错误。","2019-04-03T09:14:45",{"id":191,"version":192,"summary_zh":193,"released_at":194},239168,"v0.1.0-beta","- 修复自 Alpha 版本以来的 bug。\r\n- 完善文档。\r\n- 添加上采样层。","2019-03-31T21:05:22",{"id":196,"version":197,"summary_zh":198,"released_at":199},239169,"v0.1.0-alpha","An initial release ","2019-03-23T13:55:51"]