任务要求
使用摄像头采集画面,并通过网络发给大语言模型,识别画面中拍摄的物体,并将画面内容的描述显示至串口上(在想显示到屏幕上时,发现屏幕排线暂时被弄断所以这次只能实现串口显示到我们的图片信息)
任务思路
本次使用的板卡为K210,里面还搭载了ESP8265的WiFi芯片,使得K210拥有了访问网络的能力,接下来我们只需要AT连接上我们的WiFi,获取摄像头的图片,将图片转化为base64的二进制,连接上大模型处理我们的图片,从而将我们的图片结果生成出来显示到我们的串口上。
逻辑框图
实现准备
本次使用的大模型平台是智谱AI,通过套接字发送json数据来发送图片数据。
API平台:https://bigmodel.cn/usercenter/apikeys
使用板卡官网资料来实现套接字通讯如何使用 Socket 网络编程 - Sipeed Wiki
因为使用的是micro python固件可能没有一些库,板卡支持导入库文件使用。
实现代码
库文件代码
导入板卡的串口的,摄像头和base64编码,WiFi连接和套接字,json是发送我们给大模型的格式需要使用到的/
import time, network
from Maix import GPIO
from machine import UART
from fpioa_manager import fm
from board import board_info
import sensor, image, lcd
import ubinascii #base64
from network_espat import wifi
import json
驱动摄像头
配置摄像头基本参数
clock = time.clock()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
获取当前图片base64格式数据
先将当前图片转化为字节,再通过base64转化,我们就可以将图片发送给大模型
img = sensor.snapshot()
img = img.compress(quality=98)
img_bytes = img.to_bytes()
img_base = ubinascii.b2a_base64(img_bytes)
请求大模型的数据
这里需要修改一下API ,请自己区智谱AI去申请自己的API替换上去,这里的"text"用英文是因为再json格式中,如果使用中文是三个字节传输,假如没用对“text”询问内容进行换算时,我们的content_length计算的长度就会不对,这里我们不进行计算,直接英文提问,AI将发送中文结果返回。
data = {
"model":"glm-4v-plus-0111", # 填写需要调用的模型名称
"messages":[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": img_base
}
},
{
"type": "text",
"text": "What is this, please answer in Chinese and describe his role"
}
]
}
]
}
json_data = json.dumps(data)
content_length = str(len(json_data))
request = (
"POST /api/paas/v4/chat/completions HTTP/1.1\r\n" +
"Host: open.bigmodel.cn\r\n" +
"Authorization: Bearer 你自己的API\r\n" +
"Content-Type: application/json\r\n" +
"Content-Length: " + content_length + "\r\n" + # 修正:添加空格
"Connection: close\r\n" +
"\r\n" +
json_data
).encode("utf-8")
连接WIFI代码
定义我们连接的WiFi账号和密码,这里只支持2.4GWiFi信号,可以使用手机开一个2.4G的热点连接
def check_wifi_net(reply=5):
if wifi.isconnected() != True:
for i in range(reply):
try:
wifi.reset()
print('try AT connect wifi...', wifi._at_cmd())
wifi.connect(SSID, PASW)
if wifi.isconnected():
break
except Exception as e:
print(e)
return wifi.isconnected()
if wifi.isconnected() == False:
check_wifi_net()
print('network state:', wifi.isconnected(), wifi.ifconfig())
套接字访问连接大模型
连接上智谱AI的TCP网络端口,假如不知道可以使用电脑ping一下“open.bigmodel.cn”,就可以知道
将我们的套接字准备好的数据发送给AI图像识别,最后接收响应就可以知道我们的识别结果
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('119.23.85.51', 80)) # 连接服务器的 IP 和端口
client_socket.send(request) # 发送数据
data = client_socket.recv(2048) # 接收响应
print("收到服务器响应: {%s}",data.decode())
client_socket.close()
效果展示
可以看到已经成功识别到我们的屏幕,并详细解释了功能和介绍。想要其他的回答,可以修改自己的提问方式进行修改
{"choices":[{"finish_reason":"stop","index":0,"message":{"content":"这张图片显示的是一个液晶显示屏(LCD)模块,通常用于电子设备如手机、平板电脑或计算机显示器。LCD模块的作用是显示图像和文本,通过控制液晶分子的排列来调节光的透过率,从而呈现出不同的颜色和亮度。LCD模块通常包括液晶面板、背光源、驱动电路和连接器等组件。","role":"assistant"}}],"created":1743324402,"id":"20250330164634f02158c15ca44d03","model":"glm-4v-plus-0111","request_id":"20250330164634f02158c15ca44d03","usage":{"completion_tokens":70,"prompt_tokens":172,"total_tokens":242}}
总结
这次的K210识别画面通过大模型识别,让我体验到了大模型识别能力的效果,也感叹现在的大模型的与日俱增的潜力,这次有点可惜,再调试的过程中,将屏幕的排线弄断了,导致无法正常的显示到屏幕上,由于时间紧急,只能显示到串口上,基本能实现将图片上传大大模型读取其中的结果,也再次感谢funpack活动,让我体验到了图像识别大模型的魅力。