Python身份证号自动识别源代码,基于opencv+torch深度学习

Python身份证号自动识别源代码,基于opencv+torch深度学习,测试的身份证照片data/1.jpg,运行IdentityCard.py即可,可将IFTRAIN设置为True,先对模型进行训练。

完整程序代码下载地址:Python身份证号自动识别源代码
Python身份证号自动识别源代码,基于opencv+torch深度学习_第1张图片
IdentityCard.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from sklearn.metrics import accuracy_score
from torch.autograd import Variable

from idcard import CutIdCard
import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision
import matplotlib.pyplot as plt

# 超参数
EPOCH = 4
BATCH_SIZE = 32
LR = 0.001
DOWNLOAD_MNIST = False
IFTRAIN = False
torch.manual_seed(1)


class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(         # input shape (1, 28, 28)
            nn.Conv2d(1, 32, 5, 1, 2),
            nn.ReLU(),                      # activation
            nn.MaxPool2d(2),    # choose max value in 2x2 area, output shape (16, 14, 14)
        )
        self.conv2 = nn.Sequential(         # input shape (16, 14, 14)
            nn.Conv2d(32, 128, 5, 1, 2),     # output shape (32, 14, 14)
            nn.ReLU(),                      # activation
            nn.MaxPool2d(2),                # output shape (32, 7, 7)
        )
        self.out = nn.Linear(128 * 7 * 7, 10)   # fully connected layer, output 10 classes

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.size(0), -1)           # flatten the output of conv2 to (batch_size, 32 * 7 * 7)
        output = self.out(x)
        return output

def get_model(iftrain):
    if iftrain:
        train_data = torchvision.datasets.MNIST(
            root='./data/mnist/',
            train=True,
            transform=torchvision.transforms.ToTensor(),
            download=DOWNLOAD_MNIST,
        )

        # 构建dataloader
        train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)

        cnn = CNN()
        optimizer = torch.optim.Adam(cnn.parameters(), lr=LR)  # optimize all cnn parameters
        loss_func = nn.CrossEntropyLoss()  # the target label is not one-hotted

        # 训练
        losses = []
        for epoch in range(EPOCH):
            for step, (b_x, b_y) in enumerate(train_loader):
                output = cnn(b_x)
                loss = loss_func(output, b_y)
                if step % 50 == 0:
                    losses.append(loss)
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()
        plt.plot(losses)
        plt.show()
        torch.save(cnn, 'tmp/cnn.pkl')
    else:
        cnn = torch.load('tmp/cnn.pkl')
    return cnn


def getIdcard(path):
    CutIdCard(path)
    print('图片处理完成!')
    cnn = get_model(IFTRAIN)
    print('模型加载完成!')

    x = []
    for i in range(18):
        img = cv.imread("tmp/pic/" + str(i) + ".png")
        img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
        img = np.array(img).astype(np.float32)
        img = np.expand_dims(img, 0)
        x.append(img)

    x = Variable(torch.from_numpy(np.array(x)))
    output = cnn(x)
    pred = torch.max(output, 1)[1].data.numpy()
    pred = [str(i) for i in pred]
    return ''.join(pred)


if __name__=="__main__":
   print("身份证号:"+getIdcard("data/1.jpg"))

完整程序代码下载地址:Python身份证号自动识别源代码

你可能感兴趣的:(Python代码大全,python,深度学习,opencv)