CANN Samples(十九):特色场景:机器人 AI 绘画 手写识别等

1. 当AI不止于识别:探索CANN的趣味应用

在我们之前的文章中,我们聊了许多关于图像分类、目标检测的话题,这些都是AI在"看懂"世界方面的应用。但AI的魅力远不止于此。当它与物理世界互动,会诞生出机器人;当它被赋予创造力,可以成为艺术家;当它学会理解人类的笔迹,便能打破数字世界与物理书写的隔阂。

cplusplus/contrib 目录就是这样一个充满想象力的"创客空间"。这里的案例不再局限于传统的视觉任务,而是将CANN的能力延伸到了机器人控制、艺术生成、人机交互等多个特色领域。它们就像一个个开箱即用的"AI玩具",不仅好玩,而且背后蕴含着深刻的技术思想。

这篇文章,我们将一起探索 Ascbot(机器人)、AI_painting(AI绘画)和 HandWrite(手写识别)这三个明星项目,看看CANN是如何为这些酷炫的应用注入智能的灵魂。

1.1. Ascbot:让机器人拥有"眼"和"脑"

机器人技术的核心,是"感知-决策-行动"的闭环。Ascbot 案例就是这个闭环在昇腾平台上的一个完美实现。它是一个可以自主巡线、识别并避开障碍物、甚至能跟随特定目标的智能小车。

该案例位于 cplusplus/contrib/Ascbot

1.1.1. 机器人的"神经系统"

Ascbot 的代码结构,就像一个机器人的"神经系统",清晰地划分了各个功能模块:

复制代码
/cplusplus/contrib/Ascbot/
├── inc/              // 头文件
│   ├── camera.h      // 摄像头,机器人的"眼睛"
│   ├── model_process.h // 模型处理,机器人的"大脑"
│   ├── wheel.h       // 轮子控制,机器人的"腿"
│   ├── oled.h        // OLED屏幕,用于显示状态
│   └── ...
├── src/              // 源文件
│   ├── main.cpp      // 主程序,中枢神经
│   ├── camera.cpp
│   ├── model_process.cpp
│   ├── wheel.cpp
│   └── ...
├── model/            // 存放转换好的OM模型
└── CMakeLists.txt

这个结构体现了典型的嵌入式系统和机器人应用的设计思想:

  • 硬件抽象camera.h, wheel.h, oled.h 等文件将底层硬件操作封装成简洁的接口。上层应用不需要关心I2C、UART等具体协议,只需调用如 Wheel::Forward() 这样的高级函数。
  • AI核心model_process.h 负责加载和执行AI模型。这是机器人的"大脑",负责从"眼睛"看到的图像中,理解出"前方是道路"、"左边有障碍物"等语义信息。
  • 主逻辑控制main.cpp 是总指挥。它在一个循环中,不断地"获取图像 -> 大脑思考 -> 指挥腿脚行动",完成了"感知-决策-行动"的完整闭环。

1.1.2. "感知-决策-行动"的实现

让我们深入 main.cpp 的简化逻辑,看看这个闭环是如何运转的:

cpp 复制代码
// 位于 src/main.cpp (简化逻辑)

int main() {
    // 1. 初始化:初始化摄像头、AI模型、轮子等所有模块
    Camera camera;
    ModelProcess modelProcessor("./model/road_detect.om");
    Wheel wheel;

    // 2. 进入主循环
    while (true) {
        // 2.1. 感知 (Perception)
        // 从摄像头获取一帧图像
        ImageData image = camera.GetFrame();

        // 2.2. 决策 (Decision)
        // 将图像送入AI模型进行推理,得到决策结果
        // 比如,模型输出一个角度,告诉轮子应该向左还是向右偏
        float angle = modelProcessor.Predict(image);

        // 2.3. 行动 (Action)
        // 根据决策结果,控制轮子转动
        wheel.SetAngle(angle);
    }

    return 0;
}

这段代码虽然简单,但它精准地概括了几乎所有智能机器人的核心工作流。CANN和AscendCL在其中的ModelProcess::Predict环节扮演了关键角色,它为机器人提供了快速、低功耗的"思考"能力,让实时决策成为可能。

Ascbot 案例告诉我们,AI不仅仅能"看",更能基于"看"的结果去"做"。

1.2. AI_painting:当代码遇见梵高

如果说 Ascbot 是逻辑与控制的体现,那么 AI_painting 则完全是创造力与想象力的舞台。这个案例让你能像玩滤镜一样,将一张普通的风景照,一键转换成梵高、莫奈等大师风格的艺术画作。

该案例位于 cplusplus/contrib/AI_painting

1.2.1. 风格迁移的魔法

这个案例的核心技术是"神经网络风格迁移"(Neural Style Transfer)。它的原理可以通俗地理解为:

  1. 内容提取:AI模型(通常是卷积神经网络,如VGG)能从一张图片中提取出"内容特征",比如房子的轮廓、树的形状。
  2. 风格提取:同时,模型也能从另一张画作(如梵高的《星空》)中提取出"风格特征",比如笔触、色彩搭配。
  3. 特征融合:算法的目标是生成一张新的图片,它既保留了原始图片的内容,又拥有了风格画作的风格。

AI_painting 案例将这个复杂的过程封装成了一个易于使用的应用。

1.2.2. 前后端分离的Web应用

Ascbot 不同,AI_painting 是一个典型的Web应用,采用了前后端分离的架构。

  • 前端 (presenterserver/ui/): 使用HTML, CSS, JavaScript构建了一个漂亮的网页。用户可以在网页上上传自己的照片,选择想要的艺术风格。
  • 后端 (src/, presenterserver/中的Python部分) :
    • Web服务器(如 display_server.py)接收前端发来的请求(图片和风格选项)。
    • 它将请求转发给C++编写的核心推理程序。
    • C++程序调用AscendCL,加载并执行风格迁移的 .om 模型,生成艺术图片。
    • 最后,将生成的结果返回给前端网页进行展示。

这种架构在AI应用中非常普遍,它让专业的AI算法工程师可以专注于C++后端的高性能实现,而前端开发者则可以专注于用户体验的打磨。

在这个案例中,CANN的价值在于加速了风格迁移这个计算密集型任务。实时的风格转换对计算量要求很高,如果用CPU处理,可能需要几十秒甚至几分钟才能生成一张图片,这对于一个交互式应用是不可接受的。而利用昇腾硬件的强大算力,可以将这个过程缩短到几秒甚至毫秒级。

1.3. HandWrite:让机器读懂你的笔锋

手写识别是人机交互领域的一个经典问题。HandWrite 案例就为我们展示了如何利用CANN,实现一个能识别摄像头拍摄的手写文字的应用。

该案例位于 cplusplus/contrib/HandWrite

1.3.1. 从像素到文字的旅程

手写识别通常包含两个主要步骤:

  1. 文本检测:首先,需要从输入的图片中找到哪里有文字。这一步通常使用一个目标检测模型(如EAST, DBNet)来框出文本区域。
  2. 文本识别:然后,对每一个框出的文本区域,使用另一个识别模型(如CRNN)来将其转换成真正的字符。

HandWrite 案例将这两个模型串联起来,构成了一个完整的识别流水线(Pipeline)。

1.3.2. 模型串联与Presenter Server

HandWrite 的实现与 AI_painting 有相似之处,它也使用了 Presenter Server 来进行结果的可视化展示。但它的核心逻辑在于模型的串联

cpp 复制代码
// 简化逻辑

// 1. 加载检测模型和识别模型
ModelProcess textDetector("./model/text_detection.om");
ModelProcess textRecognizer("./model/text_recognition.om");

// 2. 获取图像
ImageData image = camera.GetFrame();

// 3. 第一阶段:文本检测
// detectorResult 是一个包含了多个文本框坐标的列表
auto detectorResult = textDetector.Predict(image);

// 4. 第二阶段:文本识别
std::vector<std::string> finalResults;
for (auto& box : detectorResult.boxes) {
    // 4.1. 从原图中裁剪出文本框区域
    ImageData croppedImage = CropImage(image, box);
    
    // 4.2. 对裁剪出的图像进行识别
    std::string text = textRecognizer.Predict(croppedImage);
    finalResults.push_back(text);
}

// 5. 将结果发送到Presenter Server进行展示
PresenterChannel::SendResult(finalResults);

这个流程清晰地展示了如何将多个AI模型组合起来,解决一个更复杂的任务。CANN在这里的作用是确保这个流水线中的每一步(特别是模型推理)都能高效运行,从而实现实时的识别效果。

2. 总结:AI的乐趣在于创造

Ascbot, AI_painting, HandWrite......这些有趣的案例向我们证明,AI技术远非高冷和遥不可及。借助CANN这样强大的开发平台,每一个开发者都有机会成为"创客",将自己的奇思妙想变为现实。

这些案例的共同点在于:

  • 始于一个有趣的想法:无论是让小车跑起来,还是让照片变成画,一个好的创意是项目的起点。
  • AI是核心驱动力:AI模型在其中扮演了"大脑"的角色,负责最核心的智能决策。
  • 工程实现是骨架:良好的软件架构、模块划分和硬件封装,是让创意落地的保障。

现在,你还在等什么呢?去 cplusplus/contrib 目录里找到你最感兴趣的那个项目,亲手把它跑起来,修改它,甚至创造一个属于你自己的全新应用。毕竟,学习AI最大的乐趣,就在于创造的过程本身。

相关推荐
NAGNIP8 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab10 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab10 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP13 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年13 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼14 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS14 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区15 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈15 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang16 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx