【问题标题】:How to reshape numpy image array for color channel如何为颜色通道重塑 numpy 图像数组
【发布时间】:2017-10-10 13:10:11
【问题描述】:

我正在使用 Keras 库进行验证码识别项目。对于训练集,我使用以下函数生成最多 5 位数的验证码。

def genData(n=1000, max_digs=5, width=60):
    capgen = ImageCaptcha()
    data = []
    target = []
    for i in range(n):
        x = np.random.randint(0, 10 ** max_digs)
        img = misc.imread(capgen.generate(str(x)))
        img = np.mean(img, axis=2)[:, :width]
        data.append(img.flatten())
        target.append(x)
    return np.array(data), np.array(target)

然后,我正在尝试重塑训练数据数组,如下所示;

train_data = train_data.reshape(train_data.shape[0], 60, 60, 3)

我猜我的验证码有 3 个颜色通道。但是,当我尝试重塑训练数据时,我遇到了以下错误;

ValueError: 无法将大小为 3600000 的数组重新整形为形状 (1000,60,60,3)

注意:如果我尝试使用 1 而不是 3。错误不会发生,但我的准确度甚至不接近 %1

【问题讨论】:

    标签: python numpy tensorflow keras neural-network


    【解决方案1】:

    您正在通过取平均值创建单通道图像。该错误表示您正在尝试重塑一个数组,其中数组中的 3600000 个元素是原来的三倍(1000*60*60*3 = 10800000)。在下面的示例中调整您的函数以使其正常工作。

    此外,由于您将图像的宽度减小到 60 像素,因此目标不再正确。这解释了低准确性。尝试使用更大的宽度,您的准确度很可能会提高(例如 150-155)。

    def genData(n=1000, max_digs=5, width=60):
        capgen = ImageCaptcha()
        data = []
        target = []
        for i in range(n):
            x = np.random.randint(0, 10 ** max_digs)
            img = misc.imread(capgen.generate(str(x)))
            img = img[:,:width,:]
            data.append(img.flatten())
            target.append(x)
        return np.array(data), np.array(target)
    

    【讨论】:

    • 非常感谢您的建议。我没有意识到取平均值会将深度减少到 1。我将继续使用相同的结构,但我还有一个问题。我正在创建具有不同长度的验证码,因此每个图像的大小都不同。我需要为每个长度分别训练我的模型吗? @威尔玛
    • 不,这会花费很多时间和精力。最好调整 captha 的大小,使它们的大小都相同。但是,你正在做的是减少宽度。最好通过添加零或任何值来增加太小的验证码的宽度。比你不会丢失信息
    猜你喜欢
    • 2018-03-21
    • 2020-12-21
    • 1970-01-01
    • 2021-11-05
    • 2021-04-18
    • 2015-08-01
    • 1970-01-01
    • 2015-02-20
    • 2019-03-03
    相关资源
    最近更新 更多