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

文本检测CNN调用keras.Sequential.fit报错及txt标注转y_train问题

错误原因

你遇到的报错首先是x_train_data维度不匹配导致的:你的卷积层要求输入是**(样本数, 64, 64, 3)**的四维张量,但你传入的x_train_data是一维数组,所以触发维度校验失败。你需要先确保输入图像的预处理逻辑正确,读取图像后统一resize到64*64、归一化后整理为四维数组再传入模型。

标注(y_train)格式要求

y_train的格式完全取决于你当前的任务设定,结合你给出的模型结构(输出层1个神经元+sigmoid激活+二分类交叉熵损失),你当前的模型是做单张图片级的二分类任务(比如判断图片是否包含文本),对应的y_train要求为:

  • 形状:(训练样本数, 1)
  • 取值:每个样本对应的值为0/1,0代表无文本,1代表有文本

如果你要做文本框坐标级的检测任务,现有模型结构不适用,需要调整输出层神经元数量、损失函数,对应的y_train需要存储每个样本对应的文本框坐标信息。

标注文件处理修正方案

你现有读取标注的代码存在两个致命错误:

  1. np.append()不会修改原数组,而是返回新数组,你没有接收返回值,导致y_train_data始终是初始的空数组
  2. 你直接将文件对象gtfile传入append,没有读取文件实际内容

修正后的二分类场景标注读取代码示例(注意要和图像读取的顺序完全对应,避免标注和样本不匹配):

import os
import numpy as np

source_train_gt = '/content/sample_data/y_train'
# 按文件名排序,保证和x_train的样本顺序一一对应
gt_files = sorted(os.listdir(source_train_gt))
y_train_list = []

for file_name in gt_files:
    file_path = os.path.join(source_train_gt, file_name)
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read().strip()
    # 规则可根据你的标注逻辑调整:这里假设txt非空代表有文本,标注为1,否则为0
    label = 1 if content else 0
    y_train_list.append(label)

# 转换为numpy数组并调整形状适配模型输入
y_train_data = np.array(y_train_list).reshape(-1, 1)
文本检测场景适配说明

如果你需要做坐标级文本检测(输出文本在图中的位置),需要做以下调整:

  • 修改输出层:将最后一层Dense的units改为4(对应文本框的xmin/ymin/xmax/ymax归一化值),激活函数改为linear,损失函数改为均方误差(MSE)
  • 标注处理逻辑改为从txt中读取坐标值,归一化到0-1区间后,y_train整理为形状(训练样本数, 4)的数组
  • 单张图有多个文本框的场景需要改用支持多框输出的检测架构(如EAST、YOLO等),或提前将原图切分为多个子图做单框检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:15:05