【HZ-T536开发板免费体验】Cangjie Magic调用视觉语言大模型(VLM)真香,是不是可以没有YOLO和OCR了?

目录

引言

编写视觉语言大模型(VLM)程序

交叉编译Cangjie Magic到T536开发板

对cjpm.toml文件的修改

stdx库的配置

拷贝libsecurec.so到cangjie的库文件中

开始交叉编译

部署到开发板

拷贝所需要的库文件

安装curl

运行程序

结束语


本文首发于:【新提醒】【HZ-T536开发板免费体验】3 - Cangjie Magic调用视觉语言大模型(VLM)真香,是不是可以没有YOLO和OCR了? - 北京合众恒跃科技有限公司 - 电子技术论坛 - 广受欢迎的专业电子论坛!

 感谢电子发烧友和合众恒跃提供的试用机会。

引言

上次我们已经实现了交叉编译仓颉编程语言的程序在开发板上运行。今天我们会交叉编译Cangjie Magic程序到开发板上。Cangjie Magic是一个基于仓颉编程语言构建的 LLM Agent 开发框架,其主要特点包括:Agent DSL、支持 MCP 协议,支持模块化调用,支持任务智能规划。Cangjie Agent DSL 是一个用于定义和管理 Agent 的专用语言。它允许开发人员通过结构化的系统提示词、工具和各类协作策略来增强 Agent 的功能。

今天我们就尝试在开发板上利用质谱AI的视觉语言模型(VLM)模型来进行图像识别。我们的目标就是类似前几天测试Milk-V Duo S所做的识别车牌号,我们会看到VLM做这个工作简直易如反掌。

编写视觉语言大模型(VLM)程序

视觉语言大模型(VLM)已经成为智能系统的关键基石。随着真实世界的智能任务越来越复杂,VLM模型也亟需在基本的多模态感知之外, 逐渐增强复杂任务中的推理能力,提升自身的准确性、全面性和智能化程度,使得复杂问题解决、长上下文理解、多模态智能体等智能任务成为可能。智谱AI推出新版VLM开源模型 GLM-4.1V-9B-Thinking ,引入思考范式,通过课程采样强化学习 RLCS(Reinforcement Learning with Curriculum Sampling)全面提升模型能力, 达到 10B 参数级别的视觉语言模型的最强性能,在18个榜单任务中持平甚至超过8倍参数量的 Qwen-2.5-VL-72B。 同步开源基座模型 GLM-4.1V-9B-Base。我们采用的就是其免费版本:glm-4.1v-thinking-flash

有关Cangjie Magic的安装和创建工程参考官方文档即可:Install Cangjie Magic

在Cangjie Magic中调用质谱AI的视觉模型非常简单,使用下面的程序即可。

package vlm
import magic.dsl.*
import magic.prelude.*
import magic.config.Config@agent[model: "zhipuai:glm-4.1v-thinking-flash"]
class VLMAssistant {@prompt( "以JSON格式给出所找到对象")
}main() {let agent = VLMAssistant()let result = agent.chat(AgentRequest("公交车的车次和车牌号", image: "https://i1.hdslb.com/bfs/archive/d01ed6e71e53e1aa2ab3676770647ced764bf196.jpg"))println(result.content)
}

加入工程目录的名字是vlm,只要执行下面的命令就可以测试程序:

cjpm run --name vlm

交叉编译Cangjie Magic到T536开发板

目前Cangjie Magic 主要是在x86、鸿蒙、苹果电脑等几个平台进行开发和测试,缺少对嵌入式开发板的测试。本文主要讨论AARCH64的Linux平台,这个也是目前在嵌入式开发板中最多的平台之一。

我们使用的是交叉编译,虽然T536开发板的能力很强,本地编译也可以,但是程序编写还是电脑比较方便。构建仓颉语言的交叉编译环境请参考我的上一篇博文。

对cjpm.toml文件的修改

如果是交叉编译,需要在cjpm.toml中加入-B选项以指定启动文件的位置:

[target.aarch64-unknown-linux-gnu]
compile-option = "-B /usr/aarch64-linux-gnu/lib/ -B /usr/lib/gcc-cross/aarch64-linux-gnu/11 --cfg \"ohos=false\""

上面的路径有可能因为操作系统的不同而不同。

一共有两个cjpm.toml要修改,一个是CangjieMagic目录下的,另一个是vlm目录下的。

stdx库的配置

Cangjie Magic是依赖stdx库的,虽然在安装的时候,安装脚本会自动安装本机的stdx库,但是交叉编译所需要的aarch64版本还需要手工下载。

访问stdx库的主页,点击右侧的“发行版”,找到最新的版本,在其中现在aarch64的文件(例如cangjie-stdx-linux-aarch64-1.0.1.1.zip)。
 

image.png


在CangjieMagic\libs目录下建立一个cangjie-stdx-linux-aarch64-1.0.1.1目录,然后解压下载的zip文件。

在CangjieMagic目录下的cjpm.toml加入如下语句:

[target.aarch64-unknown-linux-gnu.bin-dependencies]path-option = ["./libs/cangjie-stdx-linux-aarch64-1.0.1.1/linux_aarch64_llvm/dynamic/stdx"]

拷贝libsecurec.so到cangjie的库文件中

仓颉语言的库文件里面不知道为什么少了一个动态库libsecurec.so,没有这个文件在前面我们交叉编译的时候只好使用--static选项,不过交叉编译Cangjie Magic的时候无法使用这个选项,所以需要将stdx中的libsecurec.so拷贝到D:\cangjie\runtime\lib\linux_aarch64_llvm目录中。这点很重要,否则会产生错误。

开始交叉编译

执行下面的语句就可以开始交叉编译了:

cjpm build `--target aarch64-unknown-linux-gnu`

几分钟之后,整个工程就编译完成了。

部署到开发板

拷贝所需要的库文件

编译后需要将canjie/runtime目录下aarch64的所有so文件、CangjieMagic\libs\cangjie-stdx-linux-aarch64-1.0.1.1\linux_aarch64_llvm\dynamic\stdx下的所有so文件和vlm\target\aarch64-unknown-linux-gnu\release\magic目录下的所有so文件都打包拷贝到开发板上的cangjielib目录下。

然后使用下面的命令设置好所需要的库文件路径:

export LD_LIBRARY_PATH=./cangjielib可以看一下所有库文件的大小:
root@ubuntu:~# du -sh cangjielib/
47M     cangjielib/

所有库文件的大小是47M字节,还是比较小的,当然有进一步裁减的余地。

安装curl

Cangjie Magic默认是调用curl来执行大模型推理工作的,而开发板默认是没有curl程序的,需要安装程序。如果找不到该程序,我们的vlm程序会报告下面的错误:

2025-08-01T13:12:46.004227006Z ERROR VLMAssistant: ProcessException: Created process failed, errMessage: "No such file or directory".
An exception has occurred:
Exception: Fail to get chat model responseat magic.core.agent.AgentExecutionException::init(std.core::String)(/mnt/d/CangjieMagic/src/core/agent/agent_executor_exception.cj:8)at magic.agent_executor.react.ReactTask::handleStep(magic.agent_executor.react::ReactStep)(/mnt/d/CangjieMagic/src/agent_executor/react/react_task.cj:74)at magic.agent_executor.react.ReactTask::runOnce()(/mnt/d/CangjieMagic/src/agent_executor/react/react_task.cj:114)at magic.agent_executor.react.ReactExecutor::run(magic.core.agent::Agent, magic.core.agent::AgentRequest)(/mnt/d/CangjieMagic/src/agent_executor/react/react_executor.cj:25)at magic.agent.base.AbsAgent::chat(magic.core.agent::AgentRequest)(/mnt/d/CangjieMagic/src/agent/base/abs_agent.cj:37)at vlm.main()(/mnt/d/test/vlm/src/main.cj:18)

安装curl程序很简单,只需要执行下面命令:

apt update
apt install curl

如果不想安装curl,还有一个办法就是让Cangjie Magic使用仓颉语言的http库,需要在编译时加上curl=false选项。

运行程序

将vlm可执行文件拷贝到开发板上,并设置好可执行权限。

运行程序前还需要配置环境变量ZHIPU_API_KEY,设置其为质谱AI的API Key。

做好了所有准备工作就可以直接运行程序了,我们采用的测试图片是这样的。

d01ed6e71e53e1aa2ab3676770647ced764bf196.jpg

程序执行结果:

root@ubuntu:~# ./vlm
{"busInfo": {"routeNumber": "26", "busId": "26-03", "licensePlate": "鄂B·5C805"}}

效果相当不错!

结束语

从今天测试看,VLM 发展得非常快,可以部分替代 YOLO 和 OCR 的工作,我们可以在开发板上利用它进行拍摄的图片的分析,从而可以得到更丰富的环境信息。

使用Cangjie Magic编写大语言模型调用程序相当简单,确实是一个人工智能利器。当然如果仅仅想完成大语言模型调用,也可以直接调用质谱AI提供的API接口,我们只所以费很大力气完成Cangjie Magic的交叉编译,是为了实现智能代理(AI Agent)。这个问题留待下次介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92152.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最长连续序列(每天刷力扣hot100系列)

目录 题目介绍: 哈希表法: 复杂度分析: 思路分析: unordered_set 和 unordered_map的比较: 1. 核心区别 2. 使用场景 3. 在本题中的选择 4. 性能对比 5. 成员函数差异 unordered_table.begin()函数是返回的键…

国标渠道研究:专业为渠道策略提供数据支持(渠道调研)

北京国标市场调查有限公司是一家专业的市场调查公司,(线上问卷调查)(第三方市场咨询)(消费者调查研究)专注于为企业提供全方位的渠道研究服务。服务范围包括渠道策略研究、渠道销售数据分析和渠…

深入理解 C 语言中的拷贝函数

目录1. C 语言中的主要拷贝函数2. strcpy:字符串拷贝函数签名示例局限性3. strncpy:指定长度的字符串拷贝函数签名示例局限性4. memcpy:通用内存拷贝函数签名示例优势局限性5. memmove:支持重叠内存拷贝函数签名示例优势局限性6. …

主数据变更流程

主数据(如客户、供应商、产品等)的变更流程(新增、更新、停用等)是主数据管理(MDM)的核心环节,其设计需兼顾数据质量(准确性、一致性)、业务合规(审批权限、审…

VUE2 学习笔记 合集

​​​​​​​VUE2 学习笔记1 VUE特点、开发者工具、入门Demo-CSDN博客 VUE2 学习笔记2 数据绑定、数据代理、MVVM_vue2的数据绑定-CSDN博客 VUE2 学习笔记3 v-on、事件修饰符、键盘事件_vue2组件 点击事件-CSDN博客 VU2 学习笔记4 计算属性、监视属性-CSDN博客 VUE2 学习…

【motion】HumanML3D 的安装1:环境搭建

https://github.com/EricGuo5513/HumanML3D/issues/10 (base) root@k8s-master-pfsrv:/home/zhangbin/perfwork/01_ai/15_HumanML3D# conda env create -f environment.yaml Retrieving notices: ...working... done Channels:- defaults Platform: linux-64 Collecting

Pig Cloud遇到websocket不能实现同一个用户不同浏览器接受到广播的消息解决方案

自定义SecuritySessionKeyGenerator类,为每个客户端连接建立唯一的keypackage com.pig4cloud.plugin.websocket.custom;import com.pig4cloud.plugin.websocket.holder.SessionKeyGenerator; import org.springframework.web.socket.WebSocketSession;import java.util.UUID; p…

蓝讯hifi添加自定义算法

总结 自己定义算法要添加在hifi工程里 hifi工程在wiki上可以下载,名字叫做project 在main.c里添加了自己的算法,算法的执行涉及到通道与effect_id 编译hifi项目需要安装 XtensaTool 与hifi4 configuration file 编译成功后移植bin文件 通过hifi4_effect_audio_process调用hifi…

【软考中级网络工程师】知识点之 STP 协议,网络的 “交通协管员”

目录一、STP 协议初相识二、STP 协议登场,网络环路难题迎刃而解2.1 网络环路困境2.2 STP 协议闪亮登场三、STP 协议核心探秘:生成树算法3.1 选举根网桥3.2 确定根端口3.3 选定指定端口四、STP 协议端口状态解析4.1 阻塞状态4.2 监听状态4.3 学习状态4.4 …

分布式网关技术 + BGP EVPN,解锁真正的无缝漫游

无线漫游的核心挑战与标准化协议支持在构建高性能无线网络时,实现用户终端(STA)在不同接入点(AP)之间平滑、快速的漫游是核心目标之一。我们的无线AP产品原生支持业界标准的802.11k/v/r协议(常称为“快速漫…

广东省省考备考(第六十七天8.5)——资料分析、数量(强化训练)

资料分析 错题解析解析今日题目正确率:87% 数量:数学运算 错题解析解析解析解析标记题解析解析今日题目正确率:73%

FLAN-T5:大规模指令微调的统一语言模型框架

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 一、核心定义与原始论文 FLAN-T5是Google于2022年提出的指令微调&…

jenkins插件Active Choices的使用通过参数动态控制多选参数的选项

title: jenkins插件Active Choices的使用通过参数动态控制多选参数的选项 tags: - jenkins categories: - 学习语录Jenkins Active Choices 插件:通过参数动态控制多选参数选项一、插件介绍Active Choices 插件(以前称为 Uno Choice 插件)是…

Matplotlib(六)- 坐标轴定制

文章目录一、坐标轴概述1. 坐标轴介绍2. 坐标轴相关属性二、坐标轴1. axes() 方法介绍2. 示例:添加多个绘图区域三、坐标轴的刻度1. 坐标轴的刻度介绍2. 刻度定位器和格式器2.1 刻度定位器2.2 刻度格式器2.3 示例:刻度定位和格式3. 刻度样式3.1 tick_par…

【物联网】基于树莓派的物联网开发【22】——树莓派获取传感器数据实时存储实战

场景介绍 今天程序猫带领大家如何实时获取树莓派传感器温湿度数据,并自动存储到数据库中。确保数据的持续性。 实现过程 硬件连接 树莓派4b连接GPIO引脚与DHT11传感器; 硬件只涉及树莓派、DHT11传感器。 DHT11的信号引脚连接树莓派的GPIO17, DHT11的Vdd&…

Linux DNS缓存与Nginx DNS缓存运维文档

一、Linux DNS缓存机制与配置 1. Linux DNS缓存原理 Linux系统中的DNS缓存主要通过以下几种方式实现: ​** nscd(Name Service Caching Daemon)**​:系统级缓存服务,可缓存DNS解析、主机名解析等信息​dnsmasq​:轻量级DNS转发器和…

Java开发时出现的问题---并发与资源管理深层问题

Java 并发模型基于 JVM 内存模型(JMM),资源管理涉及 IO、线程、锁等关键组件。若对并发语义、资源生命周期理解不透彻,易引发死锁、内存泄漏、数据错乱等严重问题。1. 并发三大特性(可见性、原子性、有序性&#xff09…

从「同步」到「异步」:用 aiohttp 把 Python 网络 I/O 榨到极致

目录 一、写在前面:为什么 IO 是瓶颈 二、同步模型:requests 的忧伤 三、线程池:用并发掩盖阻塞 四、aiohttp:让「等待」非阻塞 4.1 安装与版本约定 4.2 异步客户端:asyncio aiohttp 4.3 错误处理与超时 4.4 …

MySQL 在麒麟系统上部署使用 + DBeaver 远程连接 + SQL 数据导入完整流程

🚀 MySQL 在麒麟系统上部署使用 DBeaver 远程连接 SQL 数据导入完整流程适用于国产操作系统(如:麒麟 / 统信 / Ubuntu)和 MySQL 8.0。包含远程配置、授权连接、SQL 导入、DBeaver连接配置等常见问题解决方案。📦 环境…

C语言-指针初级(指针定义、指针的作用、指针的计算、野指针、悬空指针、void类型指针)

本章概述思维导图:C语言指针指针是C语言中最强大但也最容易混淆的特性之一。它提供了直接操作内存地址的能力,使得C语言具有高效性和灵活性。下面我将详细介绍C语言指针的各个方面。指针定义指针的本质:指针是一个变量,其值为另一…