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

基于Keras与OpenCV的CNN实时瓶身标签检测异常问题咨询

问题根因

不需要找Keras原生的实时流接口替代cv2.read(),识别效果异常的核心原因是OpenCV输出的帧格式和Keras load_img()生成的模型输入格式不匹配,两个关键差异直接导致推理结果错误:

  • 通道顺序不一致:cv2.read()读取的图像默认是BGR通道排列,load_img()加载的图像是RGB通道排列,通道顺序颠倒会完全打乱模型学到的特征分布
  • 预处理逻辑不对齐:直接对cv2帧做resize、数组转换时,若没对齐训练时的归一化、尺寸对齐规则,输入张量和训练数据分布不一致,推理精度会大幅下降

另外你原代码里还有两个隐形bug:一是cv2.resize()的入参顺序是(宽度, 高度),和你定义的altura(高度)、longitud(宽度)顺序很容易写反,尺寸输入错误也会导致推理失效;二是模型predict默认会打印日志,拖慢实时帧率。

修正后的无落盘实时推理代码

直接在内存里把OpenCV帧处理成和load_img()输出完全一致的张量即可,不需要存图再读,延迟可以满足实时要求:

import cv2
import numpy as np
from tensorflow.keras.preprocessing.image import img_to_array

# 注意:cv2.resize参数顺序为(目标宽度, 目标高度),和训练时输入尺寸严格对齐
TARGET_INPUT_SIZE = (longitud, altura)
# 初始化框默认颜色
draw_color = (255,0,0)

while True:
    read_success, frame = cap.read()
    if not read_success:
        break
    # 绘制检测框
    frame_with_rect = cv2.rectangle(frame, start_point, end_point, draw_color, thickness)
    # 裁剪瓶身标签区域
    label_crop = frame[yMin:yMax, xMin:xMax]

    # ========== 核心格式对齐逻辑 ==========
    # 1. 缩放到模型要求的输入尺寸
    model_input = cv2.resize(label_crop, TARGET_INPUT_SIZE)
    # 2. BGR转RGB,对齐load_img的通道顺序
    model_input = cv2.cvtColor(model_input, cv2.COLOR_BGR2RGB)
    # 3. 转数组、增加batch维度
    model_input = img_to_array(model_input)
    model_input = np.expand_dims(model_input, axis=0)
    # 4. 对齐训练时的归一化逻辑,训练时怎么处理输入这里就怎么处理
    # 例:如果训练时将像素值除以255缩放到0~1区间,就打开下面这行
    # model_input = model_input / 255.0
    # 如果用了keras预训练模型的预处理函数,这里直接调用对应preprocess_input即可
    # ======================================

    # 推理,verbose=0关闭冗余日志提升帧率
    pred_result = cnn.predict(model_input, verbose=0)
    pred_cls = np.argmax(pred_result[0])
    
    # 根据结果更新框颜色
    if pred_cls == 0:
        draw_color = (46, 242, 79)
    else:
        draw_color = (255, 0, 0)
    print(f"预测类别:{pred_cls},置信度:{pred_result[0]}")

    cv2.imshow("Original", frame_with_rect)
    cv2.imshow("Cropped Label", label_crop)

    # 按q退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
注意事项
  • 尺寸参数顺序一定核对:OpenCV的数组维度是(y, x)即(高度, 宽度),但cv2.resize()的入参是(x, y)即(宽度, 高度),顺序写反会导致输入图像变形,推理完全失效
  • 预处理逻辑必须和训练阶段完全一致:如果训练时做了归一化、减均值、除标准差等操作,推理时必须用完全相同的参数处理输入,否则精度会出现明显下跌
  • OpenCV的视频采集效率足够支撑实时检测,格式转换全在内存完成,开销远低于存图再读取的方案,不需要额外引入其他流采集库

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:06:23