回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

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

头像 云天 2026.04.14 47 2

当视觉识别遇上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

       孩子们看到自己“组装”的玩偶被 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。

评论

user-avatar
  • 在北京吃烧烤的虫子

    在北京吃烧烤的虫子2026.04.15

    这是二哈的什么镜头啊?

    1
    • 云天

      云天2026.04.16

      DF活动的奖品