You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Teachable Machine训练模型无法根据人物切换class index问题

问题分析与解决方案

从输出日志可见,无论镜头前是哪位人物,模型预测结果中第二个类别(class1)的概率始终接近100%,导致class index一直为1。这说明模型输入预处理不符合训练要求,或训练数据存在偏差,以下是具体解决步骤:

1. 补充图像归一化处理

Teachable Machine训练图像模型时,会将输入像素值归一化到[0,1]区间(即像素值除以255),但你的代码中缺少这一步,导致输入数据分布和训练时不一致。在图像reshape前添加归一化:

img = img / 255.0

2. 修正人脸裁剪错误

代码中裁剪人脸的区域写错了,应该使用x:x+w(宽度方向)而非x:x+h,否则会裁剪出包含非人脸区域的错误图像,干扰模型识别:

crop_img = imgOrignal[y:y+h, x:x+w]

3. 转换图像通道顺序

OpenCV读取的图像是BGR格式,而Teachable Machine训练时使用的是RGB格式,通道顺序不匹配会导致模型无法正确提取特征,需要转换通道:

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

4. 检查训练数据与标签对应关系

  • 确认Teachable Machine中两个类别的标签是否和代码中的get_className函数对应:比如是否训练时将numan设为class1、tony设为class0,导致标签反转。
  • 检查numan(class0)的训练样本是否充足、多样化(覆盖不同角度、光照、表情),如果样本数量远少于tony(class1),模型会自然偏向样本更多的类别。

修正后的关键代码片段

while True:
    sucess, imgOrignal=cap.read()
    faces = facedetect.detectMultiScale(imgOrignal,1.3,5)
    for x,y,w,h in faces:
        # 修正裁剪区域
        crop_img = imgOrignal[y:y+h, x:x+w]
        img = cv2.resize(crop_img, (224,224))
        # BGR转RGB
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        # 归一化处理
        img = img / 255.0
        img = img.reshape(1, 224, 224, 3)
        prediction=model.predict(img)
        classIndex = np.argmax(prediction,axis=1)
        probabilityValue=np.amax(prediction)
        # 后续绘制代码不变

内容的提问来源于stack exchange,提问作者numan kaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:30:48