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最大的乐趣,就在于创造的过程本身。

相关推荐
南龙大魔王4 小时前
spring ai Alibaba(SAA)学习(二)
java·人工智能·spring boot·学习·ai
Elastic 中国社区官方博客4 小时前
在 Google MCP Toolbox for Databases 中引入 Elasticsearch 支持
大数据·人工智能·elasticsearch·搜索引擎·ai·语言模型·全文检索
非著名架构师4 小时前
从预测到预调:疾风大模型如何驱动能源电力系统实现“气象自适应”调度?
大数据·人工智能·风光功率预测·高精度光伏功率预测模型·高精度气象数据·高精度天气预报数据·galeweather.cn
cici158744 小时前
含风电场的十机24时系统机组出力优化算法
人工智能·算法·机器学习
来荔枝一大筐4 小时前
ABB 机器人虚拟示教器基础操作教程
机器人·abb
亿坊电商4 小时前
AI数字人交互系统架构全解析:从多模态输入到实时渲染的闭环设计!
人工智能·系统架构·交互
热点速递4 小时前
AI成广告新引擎:从百度、快手到Meta,智能技术如何拯救互联网广告下滑!
人工智能·百度
fishfuck4 小时前
MMEvol: Empowering Multimodal Large Language Models with Evol-Instruct
人工智能·语言模型·自然语言处理
技术支持者python,php5 小时前
USB摄像头采集数据
人工智能·c#