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
相关产品推荐
相关产品推荐

