首页 > 解决方案 > 用于简单字母图像的 PyTorch 分类器:CNN 模型设计问题

问题描述

寻找为每个字母只有两种可能的字体的文本的 CAPTCHA 图像构建简单图像分类器的技巧。这是一个示例图像:

完整的示例图像

迄今为止的方法是尝试将图像分解为 6 ​​个相同大小的图像以尝试获取单个字符图像,并为这些图像构建分类器(示例如下)。

分区样本图像

有没有更简单的方法来解决这个问题?关于如何设计实际模型的任何提示?(也许一个相对简单的 CNN 就足够了?)

编辑:关于在下面构建合适模型的问题。

我试图在 resnet50 之上构建一个粗略的模型以达到低于标准的效果……这似乎是一种应该相对微不足道的图像分类任务。

非常感谢任何有关模型设计的提示。

下面的代码:

model = models.resnet50(pretrained=True)

for param in model.parameters():
    param.requires_grad = False
    
model.fc = nn.Sequential(nn.Linear(2048, 512),
                                 nn.ReLU(),
                                 nn.Dropout(0.2),
                                 nn.Linear(512, 26),
                                 nn.LogSoftmax(dim=1))
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.fc.parameters(), lr=0.003)
model.to(device)

epochs = 10
steps = 0
running_loss = 0
print_every = 10
train_losses, test_losses = [], []
for epoch in range(epochs):
    for inputs, labels in train_loader:
        steps += 1
        inputs, labels = inputs.to(device), labels.to(device)
        optimizer.zero_grad()
        logps = model.forward(inputs)
        loss = criterion(logps, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        
        if steps % print_every == 0:
            test_loss = 0
            accuracy = 0
            model.eval()
            with torch.no_grad():
                for inputs, labels in val_loader:
                    inputs, labels = inputs.to(device), labels.to(device)
                    logps = model.forward(inputs)
                    batch_loss = criterion(logps, labels)
                    test_loss += batch_loss.item()
                    
                    ps = torch.exp(logps)
                    top_p, top_class = ps.topk(1, dim=1)
                    equals = top_class == labels.view(*top_class.shape)
                    accuracy += torch.mean(equals.type(torch.FloatTensor)).item()
            train_losses.append(running_loss/len(train_loader))
            test_losses.append(test_loss/len(val_loader))                    
            print(f"Epoch {epoch+1}/{epochs}.. "
                  f"Train loss: {running_loss/print_every:.3f}.. "
                  f"Test loss: {test_loss/len(val_loader):.3f}.. "
                  f"Test accuracy: {accuracy/len(val_loader):.3f}")
            running_loss = 0
            model.train()

上述结果如下所示,准确率 <50%:

模型结果

标签: pythonpytorchconv-neural-networkclassificationocr

解决方案


推荐阅读