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)。它的原理可以通俗地理解为:
- 内容提取:AI模型(通常是卷积神经网络,如VGG)能从一张图片中提取出"内容特征",比如房子的轮廓、树的形状。
- 风格提取:同时,模型也能从另一张画作(如梵高的《星空》)中提取出"风格特征",比如笔触、色彩搭配。
- 特征融合:算法的目标是生成一张新的图片,它既保留了原始图片的内容,又拥有了风格画作的风格。
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模型,生成艺术图片。 - 最后,将生成的结果返回给前端网页进行展示。
- Web服务器(如
这种架构在AI应用中非常普遍,它让专业的AI算法工程师可以专注于C++后端的高性能实现,而前端开发者则可以专注于用户体验的打磨。
在这个案例中,CANN的价值在于加速了风格迁移这个计算密集型任务。实时的风格转换对计算量要求很高,如果用CPU处理,可能需要几十秒甚至几分钟才能生成一张图片,这对于一个交互式应用是不可接受的。而利用昇腾硬件的强大算力,可以将这个过程缩短到几秒甚至毫秒级。
1.3. HandWrite:让机器读懂你的笔锋
手写识别是人机交互领域的一个经典问题。HandWrite 案例就为我们展示了如何利用CANN,实现一个能识别摄像头拍摄的手写文字的应用。
该案例位于 cplusplus/contrib/HandWrite。
1.3.1. 从像素到文字的旅程
手写识别通常包含两个主要步骤:
- 文本检测:首先,需要从输入的图片中找到哪里有文字。这一步通常使用一个目标检测模型(如EAST, DBNet)来框出文本区域。
- 文本识别:然后,对每一个框出的文本区域,使用另一个识别模型(如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最大的乐趣,就在于创造的过程本身。