【创意智造组】用二哈识图“看见”元器件,再让AI画出创意玩偶——一个让低年级学生爱上创客的小项目

2026-04-14713
精华项目
AI 快速预览详细 收起
这个项目名为“创意玩偶”,旨在通过行空板M10、二哈视觉传感器(Huskylens)和SiliconFlow API,帮助低年级学生认识电子元器件。孩子们可以亲手选择元器件作为玩偶的眼睛、躯干和四肢,系统会自动识别并调用AI生成一张独一无二的玩偶图像。硬件清单包括行空板M10、二哈视觉传感器、USB麦克风以及各类元器件。软件方面,使用了Mind+ 2.0进行目标检测模型训练,SiliconFlow API用于图像生成。整个过程分为三个阶段:数据采集与模型训练、编写主控程序、效果展示。孩子们通过这个项目不仅记住了元器件的名字,还理解了不同元器件的形态特征。

当视觉识别遇上AIGC,电子元器件也能变成生动的卡通玩偶

【缘起:如何让元器件“活”起来?】

       在创客教育中,低年级学生常常需要认识各种电子元器件:LED、电阻、电容、超声波传感器、车轮……这些名词对他们来说抽象又枯燥。传统的教学方式是老师指着实物、念出名字,学生被动记忆,效果有限。

       我们一直在想:能不能让孩子亲手“搭建”一个玩偶——眼睛用什么元器件?身体用什么?四肢用什么?然后让AI根据他们的选择,实时生成一张独一无二的玩偶图像?这样,元器件不再是冷冰冰的零件,而是变成玩偶的一部分,学习过程像做游戏一样有趣。

       于是,我们用行空板M10二哈视觉传感器(Huskylens)Mind+ 2.0 的目标检测训练功能,以及 SiliconFlow 平台的 AI 图像生成 API,做出了一个完整的互动系统。孩子们只需在语音提示下,依次把元器件放到二哈面前,系统就会自动识别、组合提示词,调用 AI 画出一只“电子元器件玩偶”。

c47b5591f39e42473ec5b7e647667b1e_webwxgetmsgimg_&MsgID=8032441778872515527&skey=%40crypt_b90cd10e_db3385f12f11fffb85de6772278eb728.jpg
9979572c06eded47d6294f376c99ac92_webwxgetmsgimg_&MsgID=6264913258245866919&skey=%40crypt_b90cd10e_db3385f12f11fffb85de6772278eb728.jpg
8db66752087273aeaeb8a5cdffc817bd_webwxgetmsgimg_&MsgID=4823936197149644271&skey=%40crypt_b90cd10e_db3385f12f11fffb85de6772278eb728.jpg

【硬件与工具清单】

硬件作用
行空板M10主控、运行Python程序、显示生成图像
二哈视觉传感器(Huskylens)识别元器件(目标检测)
USB 麦克风(或行空板自带)播放语音提示(二哈自带喇叭)
各类元器件LED、电容、电阻、超声波传感器、车轮等

软件/平台作用
Mind+ 2.0训练目标检测模型(二哈专用)
SiliconFlow API图像生成(Kwai-Kolors/Kolors模型)
Mind+Python主控逻辑、API调用、图像处理
unihiker 库,行空板屏幕GUI显示,图片下载与处理
PIL / requests,图片下载与处理

步骤1 训练一个能“认出”元器件的二哈

       二哈视觉传感器内置的算法支持物体分类目标检测。我们选择目标检测模式(算法编号128),因为需要识别元器件的具体位置和名称。

       数据采集

       行空板M10连接二哈,拍摄各类元器件的照片。

屏幕截图 2026-04-12 132827.png

       使用 Mind+ 2.0 的“模型训练”工具,每个元器件采集 多 张不同角度、不同光照下的图片。

image.png

       在工具中框出元器件位置,并标注标签:LED、dr(电容)、csb(超声波传感器)、chelun(车轮)、res(电阻)等。

屏幕截图 2026-04-12 130356.png

       模型训练

       在 Mind+ 云端训练约 10 分钟,得到针对我们数据集的专属模型。

       下载模型文件(.kmodel),通过 USB 烧录到二哈的 TF 卡中。

屏幕截图 2026-04-12 130852.png

       效果验证

       烧录完成后,将二哈对准任意一个元器件,屏幕上会显示绿色的识别框和标签名称,识别率在 90% 以上。

 

c467a397a5bd8365fcf68bd82331f7e3_webwxgetmsgimg_&MsgID=2145185165263912776&skey=%40crypt_b90cd10e_db3385f12f11fffb85de6772278eb728.jpg
707d2477d4518a1d89c4a05a2850d479_webwxgetmsgimg_&MsgID=5972279510446731557&skey=%40crypt_b90cd10e_db3385f12f11fffb85de6772278eb728.jpg

步骤2 编写主控程序——三部曲式互动

       程序运行在行空板 M10 上(基于 Linux + Python)。主要逻辑分为三个阶段,对应玩偶的眼睛躯干四肢

       语音提示顺序

       1.系统播放 yanjing.mp3:“请放入眼睛元器件”

       2.学生将某个元器件(如 LED)放到二哈前 → 识别为 LED → 记录到变量 YanJing = "LED灯"

       3.播放 qugang.mp3:“请放入身体躯干元器件”

       4.学生放入另一个元器件(如电容)→ 识别为 dr → QuGan = "电容"

       5.播放 sizhi.mp3:“请放入四肢手脚元器件”

       6.学生放入车轮 → ShouJiao = "车轮"

       拼接提示词并调用 API

       当三个部位都识别完成后,程序自动构造如下提示词:

       “使用电子元器件绘制一个玩偶,眼睛由LED灯组成,身体躯干由电容组成,四肢手脚由车轮组成“

       然后通过 SiliconFlow 的 OpenAI 兼容接口请求图像生成:

代码
response = client.images.generate(
    model="Kwai-Kolors/Kolors",
    prompt=f"使用电子元器件绘制一个玩偶,眼睛由{YanJing}组成,身体躯干由{QuGan}组成,四肢手脚由{ShouJiao}组成",
    size="1024x1024",
    n=1,
    extra_body={"step": 20}
)
image_url = response.data[0].url

       下载、旋转、缩放并显示

       生成的原图是 1024×1024 的正方形,而行空板屏幕是 320×240 横屏,因此需要:

       1.向右旋转 90 度(使图像适应横屏)

       2.缩放到 320×240

       3.保存为临时文件,再用 unihiker 的 draw_image 显示

代码
resp = requests.get(image_url, stream=True)
img = Image.open(resp.raw)
img = img.transpose(Image.ROTATE_270)   # 向右转90°
img = img.resize((320, 240), Image.LANCZOS)
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
    img.save(tmp.name, 'PNG')
    tmp_path = tmp.name
gui.draw_image(image=tmp_path, x=0, y=0)
os.remove(tmp_path)

ce46cff599df7c1cb2aa8baaefb6c288_webwxgetmsgimg_&MsgID=6937793301403499499&skey=%40crypt_b90cd10e_db3385f12f11fffb85de6772278eb728.jpg

       防误触与等待逻辑

       每次识别后,系统会等待 10 秒,防止短时间内重复识别同一个元器件。

       使用 BiaoShi 变量(0,1,2)切换三个阶段。

       如果学生放错元器件,程序只会记录最后一次识别结果,并重新播放提示语音。

步骤3 效果展示

将二哈固定在行空板M10上方,运行程序:

语音提示:“请放入眼睛元器件”

学生拿起一个 LED 放到摄像头前 → 二哈喇叭播放“LED灯”

重复第二步和第三步,分别放入电容车轮

行空板屏幕开始转圈等待(API调用约 3~5 秒)

一幅色彩鲜艳、充满电子风格的玩偶图像出现在屏幕上:

眼睛是发光的 LED 形状

身体是电容的圆柱造型

四肢是齿轮状的车轮

学生可以反复更换元器件,每次都会生成全新的玩偶图像。

image.png
STEM教育 · 用二哈识图和AI画出创意玩偶_image_1.webp

       孩子们看到自己“组装”的玩偶被 AI 画出来,兴奋不已。他们不仅记住了元器件的名字,还理解了不同元器件的形态特征。

步骤4 完整代码

代码
import time
import requests
import tempfile
import os
from unihiker import GUI
from openai import OpenAI
from pinpong.board import Board
from dfrobot_huskylensv2 import *
from PIL import Image

# 初始化
u_gui = GUI()
Board().begin()
huskylens = HuskylensV2_I2C()
huskylens.knock()
huskylens.switchAlgorithm(128)   # 目标检测模式

client = OpenAI(api_key="sk-xxx", base_url="https://api.siliconflow.cn/v1")

# 元器件名称映射(需与训练标签一致)
name_map = {"LED":"LED灯","chelun":"车轮","dr":"电容","csb":"超声波传感器"}

# 状态变量
YanJing = ""; QuGan = ""; ShouJiao = ""
BiaoShi = 0          # 0:眼睛 1:躯干 2:四肢
DengDai = False
last_time = 0
image_generated = False

# 播放提示音(二哈自带)
huskylens.playMusic("cshwc.mp3", 20)
time.sleep(10)

while True:
    huskylens.getResult(128)
    result = huskylens.getCachedCenterResult(128)
    JieGuo = result.name if result else -1
    print("识别到:", JieGuo)

    # 10秒冷却
    if DengDai and (time.time() - last_time > 10):
        DengDai = False
        BiaoShi = (BiaoShi + 1) % 3

    # 阶段0:识别眼睛
    if BiaoShi == 0 and not DengDai:
        if JieGuo != -1:
            DengDai = True
            YanJing = name_map.get(JieGuo, JieGuo)
            print("眼睛:", YanJing)
            huskylens.playMusic(f"{JieGuo}.mp3", 20)
            last_time = time.time()
        else:
            huskylens.playMusic("yanjing.mp3", 20)
            time.sleep(2)

    # 阶段1:识别躯干
    elif BiaoShi == 1 and not DengDai:
        if JieGuo != -1:
            DengDai = True
            QuGan = name_map.get(JieGuo, JieGuo)
            print("躯干:", QuGan)
            huskylens.playMusic(f"{JieGuo}.mp3", 20)
            last_time = time.time()
        else:
            huskylens.playMusic("qugang.mp3", 20)
            time.sleep(2)

    # 阶段2:识别四肢 + 生成图像
    elif BiaoShi == 2 and not DengDai and not image_generated:
        if JieGuo != -1:
            DengDai = True
            ShouJiao = name_map.get(JieGuo, JieGuo)
            print("四肢:", ShouJiao)
            huskylens.playMusic(f"{JieGuo}.mp3", 20)
            last_time = time.time()

            # 生成图像
            prompt = f"使用电子元器件绘制一个玩偶,眼睛由{YanJing}组成,身体躯干由{QuGan}组成,四肢手脚由{ShouJiao}组成"
            print("提示词:", prompt)
            response = client.images.generate(
                model="Kwai-Kolors/Kolors",
                prompt=prompt,
                size="1024x1024",
                n=1,
                extra_body={"step": 20}
            )
            image_url = response.data[0].url
            resp = requests.get(image_url, stream=True)
            if resp.status_code == 200:
                img = Image.open(resp.raw)
                img = img.transpose(Image.ROTATE_270)   # 向右转90°
                img = img.resize((320, 240), Image.LANCZOS)
                with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
                    img.save(tmp.name, 'PNG')
                    tmp_path = tmp.name
                u_gui.draw_image(image=tmp_path, x=0, y=0)
                os.remove(tmp_path)
                image_generated = True
            else:
                print("图片下载失败")
        else:
            huskylens.playMusic("sizhi.mp3", 20)
            time.sleep(2)

    time.sleep(0.1)

注意:请替换 api_key 为你自己的 SiliconFlow API Key。

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
认真学开心玩
认真学开心玩
大佬,硅基流动没有写成mind+的库吗??
在北京吃烧烤的虫子
在北京吃烧烤的虫子
这是二哈的什么镜头啊?
- 没有更多了 -