文本检测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需要存储每个样本对应的文本框坐标信息。
标注文件处理修正方案
你现有读取标注的代码存在两个致命错误:
np.append()不会修改原数组,而是返回新数组,你没有接收返回值,导致y_train_data始终是初始的空数组- 你直接将文件对象
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
相关产品推荐
相关产品推荐

