Funpack4-1: 基于M1w dock suit开发板的图像物体识别功能
该项目使用了M1w dock suit开发板,实现了图像物体识别的设计,它的主要功能为:采集摄像头图像,保存图像到本地,发送图像到远程大语言模型,将解析内容显示在屏幕上。
标签
Funpack活动
摄像头
sipeed
clr
更新2025-04-03
5

一、 项目介绍

Sipeed M1w Dock Suit 是一款基于 Kendryte K210 AI 处理器的开发板,内置 8MB SRAM,具备硬件加速的神经网络(KPU)和 FFT 处理单元,适用于人工智能、计算机视觉和物联网(IoT)应用。它具备强大的计算能力,并集成了无线功能,适用于低功耗边缘计算场景。

项目目标:

1.       实现使用摄像头采集画面并保存为JPEG格式。

2.       配置WiFi功能,使用http协议进行数据传输

3.       使用flask作为后端转发数据包。

4.       将采集的画面发送给模型识别画面中的物体。

5.       在开发板LCD屏幕上显示识别结果。


. 设计思路

  官方WiFi驱动不支持https功能,如果需要通过https远程连接远端的图像识别模型,通过一个服务器来转发请求比较容易实现。

模型选用Azure 计算机视觉API,它能够识别图像中的物体,并返回适度的文本长度,但只能输出英文文本。

系统采用客户端-服务器架构设计:

  1. 客户端(M1W Dock)
    • 初始化摄像头和LCD屏幕
    • 采集图像并压缩为JPEG格式
    • 建立Wi-Fi连接
    • 通过HTTP POST发送图像数据到服务器
    • 接收并解析服务器响应
    • 在LCD上显示识别结果
  2. 服务器端(Flask应用)
    • 接收客户端发送的图像数据
    • 调用Azure计算机视觉API进行图像分析
    • 将API响应转发回客户端


软件流程图:

savephoto.pngsendRequest.pngresponseHandler.png

实现过程

1.开发环境搭建

使用官方的maixpy ide进行开发。可以同时监视摄像头传感器输出。

image.png

2. 具体代码实现

网络连接功能

  • 使用network_espat模块进行Wi-Fi连接
  • 提供5次重试机制确保连接可靠性
  • 打印网络连接状态和IP配置
def enable_espat():
from network_espat import wifi
if wifi.isconnected() == False:
for i in range(5):
try:
wifi.reset()
print('try AT connect wifi...')
wifi.connect(SSID, PASW)
if wifi.isconnected():
break
except Exception as e:
print(e)
print('network state:', wifi.isconnected(), wifi.ifconfig())


图像采集与处理

  • 初始化LCD和摄像头传感器
  • 设置图像格式为RGB565,分辨率为QVGA(320x240)
  • 跳过前2000帧以确保图像稳定
  • 实现5秒倒计时功能
  • 采集最终图像并保存为JPEG格式
  • 压缩图像并转换为二进制数据
lcd.init()
sensor.reset(freq=24000000, set_regs=True, dual_buff=True)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
sensor.set_vflip(1)

# 5秒倒计时显示
start_time = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), start_time) < 5000:
remaining_time = 5 - time.ticks_diff(time.ticks_ms(), start_time) // 1000
fimg = sensor.snapshot()
fimg.draw_string(140, 110, str(remaining_time), color=(255, 0, 0), scale=5)
lcd.display(fimg)

# 拍摄最终图片并保存
final_img = sensor.snapshot()
final_img.save("/flash/test2.jpg", quality=95)
jpg = jpg.compress(quality=95)
jpg_data = bytearray(jpg)

数据传输与服务器通信

  • 创建TCP socket连接服务器
  • 构建符合HTTP协议的POST请求
  • 发送请求头和图像二进制数据
addr = (FLASK_SERVER_IP, FLASK_SERVER_PORT)
s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
s.connect(addr)

content_length = len(jpg_data)
http_request = (
"POST {} HTTP/1.1\r\n"
"Host: {}:{}\r\n"
"Content-Type: application/octet-stream\r\n"
"Content-Length: {}\r\n"
"Connection: close\r\n"
"\r\n"
).format(FLASK_SERVER_URL, FLASK_SERVER_IP, FLASK_SERVER_PORT, content_length).encode()

s.send(http_request)
s.send(jpg_data)

响应处理与结果显示

  • 接收服务器响应
  • 解析JSON格式的识别结果
  • 格式化文本以适应屏幕显示
  • 在原始图像上叠加识别结果并显示


response = s.recv(1024)
header, json_data = response.split("\r\n\r\n", 1)
result = json.loads(json_data.strip())
caption = result["captionResult"]["text"]
confidence = result["captionResult"]["confidence"]

formatted_caption = form_text(caption)
img = image.Image("/flash/test2.jpg")
img.draw_string(0, 0, formatted_caption, color=(0, 0, 0), scale=2)
lcd.display(img)

文本格式化功能

  • 将长文本按单词分割为多行
  • 每行最多28个字符
  • 保持单词完整性不截断
def form_text(text, max_chars_per_line=28):
words = text.split()
lines = []
current_line = ""
for word in words:
if len(current_line) + len(word) + 1 <= max_chars_per_line:
current_line += (" " + word) if current_line else word
else:
lines.append(current_line)
current_line = word
if current_line:
lines.append(current_line)
return "\n".join(lines)

flask服务端图像上传接口

  • 接收客户端POST请求中的二进制图像数据
  • 将图像数据转发到Azure计算机视觉API
  • 处理API响应并返回给客户端
  • 包含完善的错误处理机制
@app.route("/upload", methods=["POST"])
def upload_image():
try:
image_data = request.data
if not image_data:
return jsonify({"error": "No image data received"}), 400

azure_response = requests.post(AZURE_URL, params=AZURE_PARAMS,
headers=AZURE_HEADERS, data=image_data)

if azure_response.status_code == 200:
return jsonify(azure_response.json()), 200
else:
return jsonify({"error": "Azure API request failed",
"details": azure_response.text}), azure_response.status_code

except Exception as e:
return jsonify({"error": "Server error", "details": str(e)}), 500


实现效果

image.png

image.png


总结

本项目成功实现了从图像采集到文字识别的完整流程,展示了嵌入式设备与云服务的结合应用利用云端强大的AI能力进行图像分析,但是存在图片上传速度慢的缺点,未来可扩展方向包括支持本地缓存识别结果、多图像连续识别等功能。




附件下载
UL.py
客户端运行程序
flask.py
服务端运行文件
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号