验证码识别结果流程代码

2018-07-04 14:49:14

验证码识别过程是包含几个步骤的,要经过取模、二值化、特征计算、识别结果这几个流程,并且根据不同的验证码类型,复杂难易程度也是不同的。可以说每一个步骤都是很关键的,因为各个环节都是紧密相连的,任何一个出错都会影响识别的结果。而最后的识别结果输出来说,大致的代码如下:

code:

#-*- coding:utf-8 -*

import os
from captcha_test.captcha_soc import image_process, image_feature, image_model, image_training
from sklearn.externals import joblib
from captcha_test.captcha_soc.config import *



def clean():
 
    image_array, image_label = image_process.read_captcha(test_data_path) 
    print("待测试的验证码数量:", len(image_array))
    image_clean = image_process.image_transfer(image_array) 
    image_array = [] #[[im_1_1,im_1_2,im_1_3,im_1_4],[im_2_1,im_2_2,im_2_3,im_2_4],...]
    for each_image in image_clean:
        image_out = image_process.get_clear_bin_image(each_image) 
        split_result = image_process.image_split(image_out) 
        image_array.append(split_result)
    return image_array, image_label

def featrue_generate(image_array):
    feature = []
    for num, image in enumerate(image_array):
        feature_each_image = []
        for im_meta in image:
            fea_vector = image_feature.feature_transfer(im_meta)
            # print('label: ',image_label[num])
            # print(feature)
            feature_each_image.append(fea_vector)
            # print(fea_vector)
        # print(len(feature_each_image))
        if len(feature_each_image) == 0:
            feature_each_image = [[0]*(image_width+image_height)]*int(image_character_num)
        # print(feature_each_image)
        feature.append(feature_each_image)
    print("预测数据的长度:", len(feature))
    print("预测数据特征示例:", feature[0])
    return feature


def write_to_file(predict_list):
    file_list = os.listdir(test_data_path)
    with open(output_path, 'w') as f:
        for num, line in enumerate(predict_list):
            if num == 0:
                f.write("file_nametresultn")
            f.write(file_list[num] + 't' + line + 'n')
    print("结果输出到文件:", output_path)

def main():

    image_array, image_label = clean()
    #特征处理
    feature = featrue_generate(image_array)
    #预测
    predict_list = []
    acc = 0
    model = joblib.load(model_path)�0�2�0�2�0�2�0�2
    # print("预测错误的例子:")
    for num, line in enumerate(feature):
        # print(line)
        predict_array = model.predict(line)
        predict = ''.join(predict_array)
        predict_list.append(predict)
        if predict == image_label[num]:
            acc += 1
        else:
            pass
            print("-----------------------")
            print("actual:",image_label[num])
            print("predict:", predict)
    print("测试集预测acc:", acc/len(image_label))

    write_to_file(predict_list)

if __name__ == '__main__':
    main()

上面这段代码是识别结果的过程,这其中又包括读取、清理、字符切割、特征提取、识别、输出结果。根据字符的形态不同,输出识别的方法也分为通用识别和特殊识别。通用识别就是相对较好做字符分割的方法,只要字符分割不难的,就可以采用这种流程化的识别方法。程序代码是写好的,对这类字符码可以说没有难度。而特殊识别就是针对不容易做字符分割的来说的,这时候都需要用到一些特定的方法和技巧,包括降维和数据增强的技术,以此来达到高精度识别。

总之,在验证码识别的流程上来说是相同的,都是这个步骤和过程,而造成识别结果不同的原因就在识别的方法及算法上。识别结果的输出是最后的一个环节,也是最重要的一步。好的打码平台在识别的编码语言上一定是多样的,并且识别方法也是丰富多样的,这样才能保证识别的精度以及准确率。


推荐新闻