Keras_ocr调用recognize_from_boxes出现TypeError错误如何解决
错误原因
TypeError: object of type 'int' has no len() 报错的核心是你传入的box_groups(也就是你代码里的bb_list)参数不符合recognize_from_boxes的格式要求:
- 该方法要求
box_groups必须是和images(也就是你的img_list)长度完全一致的嵌套列表:img_list有N张图像,box_groups就有N个元素,每个元素是对应单张图像的所有边界框的集合,每个边界框是包含4个坐标点、shape为(4,2)的数组。 - 当代码尝试对某个不符合格式的参数取长度时,拿到了int类型的值,就会触发该报错,常见的错误场景有两个:
- 仅识别单张图像时,
bb_list直接传入了单张图的框列表,没有在外层额外套一层列表。比如img_list = [img]时,正确的bb_list结构应该是[[box1, box2...]],如果直接传[box1, box2...],方法会把第一个框的坐标值当成整组框遍历,遇到单个int值就会报错。 - 构造
bb_list时混入了单个int类型的坐标值,没有按照「每个框包含4个坐标点,每个坐标点是xy两个数值」的嵌套结构传入。
- 仅识别单张图像时,
另外你代码里的写法Recognizer_ = Recognizer_.recognize_from_boxes(...)存在逻辑问题:该方法的返回值是识别结果,直接赋值给识别器实例会覆盖原有实例,后续如果需要复用识别器会出错,建议用单独的变量接收识别结果。
解决办法
- 先校验参数长度匹配:打印
len(img_list)和len(bb_list),两者的数值必须完全相等。 - 调整
bb_list的嵌套结构,单张图识别的正确示例如下:
# 单张图像+两个识别框的传参示例 import cv2 import keras_ocr # 初始化识别器 recognizer = keras_ocr.recognition.Recognizer() # 构造图像列表 img = cv2.imread("test.jpg") img_list = [img] # 构造边界框列表,外层列表长度和img_list一致,内层放单张图的所有框 box1 = [[10, 10], [100, 10], [100, 30], [10, 30]] box2 = [[10, 40], [200, 40], [200, 60], [10, 60]] bb_list = [[box1, box2]] # 调用方法,用新变量接收结果 results = recognizer.recognize_from_boxes(images=img_list, box_groups=bb_list)
- 遍历所有边界框校验格式:确认每个边界框都是4个坐标点的嵌套数组,没有单个int值混入。
内容的提问来源于stack exchange,提问作者Gustavo Scholze
相关产品推荐
相关产品推荐

