第1章 项目描述
1.1 项目功能介绍
本项目实现了一种多模态大模型智能图片理解助理,可以基于硬件的摄像头获取图片和屏幕展示大模型的图像理解结果。
使用摄像头采集画面,并通过网络发给大语言模型,识别画面中拍摄的物体,并将画面内容的描述显示至屏幕上。
1.2 设计思路
本项目首先基于MaixPy m1w Dock的硬件功能,实现拍照和向屏幕展示文字两种基础功能。
基于官方手册和Github的开源项目,找到若干年前的串口控制单片机方案。基于该串口方案,使用图片与字节互转技术,利用串口发送字节流实现信息传递转换。使用智谱AI的免费多模态大模型API ,网络发送图片并接收信息,进行图像语义理解。编写简化的智能排版程序,展示到硬件屏幕。
选用串口方案,主要是因为该方案稳定且为USB 3.0速度,多个电子硬件社区对该型板卡的网络图传讨论停滞在 2019 年,且基于ESP的网络图传速度非常慢,在第二代Maix-II-Dock板卡对该网络图传功能进行了速度升级。
主要参考资源:
官网教程:
https://wiki.sipeed.com/hardware/zh/maix/maixpy_develop_kit_board/Maix_dock.html
[GitHub - 66my/mpfshell: 一个简单的基于 shell 的文件浏览器,适用于基于 ESP8266 Micropython 的设备](https://github.com/66my/mpfshell)
Mpfshell-lite
串口通信原理:
https://blog.csdn.net/z5859095/article/details/140623341
官方图传教程(仅适配 Maix-II-Dock 固件):
https://wiki.sipeed.com/hardware/zh/maixII/M2/maixhub_train.html?highlight=%E4%BC%A0%E5%9B%BE
网络传图方法(需要短接硬件刷ESP固件,官方出厂固件不直接支持该库,配置较为麻烦):
https://github.com/sipeed/MaixPy-v1_scripts/blob/master/network/demo_http_get_jpg.py
1.3 硬件框图
1.4 软件流程图
第2章 硬件介绍
MAIX Dock开发板是MAIX产品线的一员,是基于嘉楠堪智科技的边缘智能计算芯片K210设计的一款AIOT开发板。化繁为简的设计,整洁小巧,板载Type-C接口和USB-UART电路,用户可以直接通过USB Type-C线连接电脑进行开发,配置128Mbit Flash、LCD、DVP、Micro SD卡等接口并把所有IO引出,方便用户扩展。Sipeed M1w Dock Suit K210 开发板是由Seeed提供的一款开发套件,该套件配置了M1w dock模块、 2.4 英寸 LCD 以及OV2640 鱼眼相机。
Seeed Studio Sipeed M1w Dock Suit K210开发板设计适用于边缘计算。MAIX Dock是Sipeed专门构建的模块,用于在边缘运行AI,将其称为AIoT。该模块占位小、功耗低、性能高,可在边缘部署高精度AI。RV64 AI板采用28nm工艺、双核RISC-V 64位IMAFDC,以及片上大型8MB高速SRAM和400MHz频率处理器。
MAIX Dock开发板是SiPEED公司MAIX产品线的一员,基于嘉楠堪智科技的边缘智能计算芯片K210(RISC-V架构 64位双核)设计的一款AIOT开发板。化繁为简的设计,整洁小巧,板载Type-C接口和USB-UART电路,用户可以直接通过USB Type-C线连接电脑进行开发,配置128Mbit Flash、LCD、DVP、Micro SD卡等接口并把所有IO引出,方便用户扩展。
MaixDock 开发是以M1W AI模块作为核心单元,功能非常强大。模块内置64位双核处理器芯片,拥有8M的片上SRAM,在AI机器视觉、听觉性能方面表现突出,内置多种硬件加速单元(KPU、FPU、FFT等),总算力最高可达1TOPS,可以方便地实现各类应用场景的机器视觉/听觉算法,也可以进行语言方向扫描和语言数据输出的前置处理工作。
第3章 实现的功能及图片展示
闪光灯下识别效果:
上位机端反馈处理进度:
地板拍照识别效果:
游戏手柄识别效果:
橘子识别效果:
第4章 主要代码片段及说明
图像拍照、文字排版和展示功能:
img=sensor.snapshot()
img.draw_string(10,10, ("Dark object on table," ), color=(0,128,0), scale=2)
img.draw_string(10,50, ("..." ), color=(0,128,0), scale=2)
img.draw_string(10,100, ("..." ), color=(0,128,0), scale=2)
lcd.display(img)
图像压缩、转换为字节码。
img = img.compress(quality=80) # 压缩图片为jpg,质量为80%
img_bytes = img.to_bytes()
print(img_bytes)
上位机端,字节码转换为图像:
image = Image.open(io.BytesIO(byte_data))
image.save("output_image.png")
上位机端,控制开启命令行并持续输入:
process = subprocess.Popen("mpfs", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Mpfs命令行控制单片机的规则:
mpfs
python代码中实现控制
commands = [
"open COM6\n", # 打开 COM6
"lcd D:/24Python/Other/Hardware_code_py\n", # 切换到目标目录
"runfile maix_test.py\n", # 执行 maix_test.py
"quit\n" # 退出
]
图像通过网络上传给智谱AI(chatglm)处理。
img_base = base64.b64encode(img_file.read()).decode('utf-8')
client = ZhipuAI(api_key=" ")
response = client.chat.completions.create(
model="glm-4v-Flash", # 填写需要调用的模型名称,该模型免费调用
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": img_base
}
},
第5章 遇到的主要难题及解决方法
本项目主要困难在图传方案选择上,花了很长时间翻论坛评估网络图传方案的可行性,最后还是认为串口方案更加灵活易用。结合现有的开源库资源,设计了一套图传逻辑,传输速度基于USB3.0非常快。配合mpfshell-lite库进行设计开发也比较困难,因为mpfshell不支持这个板卡(无法连接板卡),所以需要进一步理解mpfshell-lite库。
另外调用多模态API,选定模型和调试也花了一定时间。
第6章 对本活动心得体会
多模态模型配合硬件这种需求出现不到一年半的时间,很难想象技术的发展和推广速度如此之快,随着技术进步,复杂需求对个人开发者来说越来越容易实现。得益于开源社区的进步和 Saas 服务模式的成熟,嵌入式软件开发可以更加灵活和高效。
感谢硬禾学堂和DigiKey发起的这次活动,如 Sipeed M1w Dock Suit 这类同时具备摄像、视频输出、网络、串口功能的高性能板卡,能够非常好地满足个人开发者的开发需求。