TensorFlow自定义数据集训练失败:image_size维度错误求助
解决SSD MobileNet训练时
image_size must contain 3 elements[4]错误 你遇到的这个问题核心很明确:输入图片是4通道的RGBA格式,而SSD MobileNet模型预处理阶段只接受3通道的RGB图片,导致SampleDistortedBoundingBoxV2节点因为图片shape元素数不符合预期报错。下面是具体的解决步骤:
1. 批量转换所有图片为3通道RGB格式
你提到已经转成jpg格式,但部分原本带透明通道的PNG图片,即使改后缀也可能残留4通道数据。可以用代码批量处理:
用OpenCV实现:
import cv2 import os # 替换为你的数据集路径和输出路径 input_folder = "path/to/your/dataset/images" output_folder = "path/to/converted/images" os.makedirs(output_folder, exist_ok=True) for img_name in os.listdir(input_folder): if img_name.lower().endswith(('.png', '.jpg', '.jpeg')): img_path = os.path.join(input_folder, img_name) img = cv2.imread(img_path) # 检查通道数,若为4则转为RGB if len(img.shape) == 3 and img.shape[2] == 4: img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB) # 保存为标准JPG格式 output_path = os.path.join(output_folder, os.path.splitext(img_name)[0] + ".jpg") cv2.imwrite(output_path, img)
用PIL实现(更简洁处理通道):
from PIL import Image import os input_folder = "path/to/your/dataset/images" output_folder = "path/to/converted/images" os.makedirs(output_folder, exist_ok=True) for img_name in os.listdir(input_folder): if img_name.lower().endswith(('.png', '.jpg', '.jpeg')): with Image.open(os.path.join(input_folder, img_name)) as img: # 自动移除alpha通道,转换为RGB格式 rgb_img = img.convert("RGB") rgb_img.save(os.path.join(output_folder, os.path.splitext(img_name)[0] + ".jpg"), "JPEG")
2. 重新生成TFRecord文件
图片处理完成后,务必重新运行TFRecord生成脚本,确保写入的是3通道图片数据。如果生成脚本里没有通道处理逻辑,可以在读取图片时加上convert('RGB')(PIL)或COLOR_RGBA2RGB(OpenCV)的步骤。
3. 检查Pipeline配置文件
确认ssd_mobilenet_v1_pets.config中的图像尺寸配置正确,示例如下:
image_resizer { fixed_shape_resizer { height: 300 width: 300 } }
这里只需要设置高和宽,模型默认会处理3通道输入,无需额外配置通道数。
完成以上步骤后,重新运行训练命令应该就能解决这个错误了。
内容的提问来源于stack exchange,提问作者amat96
相关产品推荐
相关产品推荐

