58回答

3收藏

旋转验证码:通过深度学习预测旋转角度

信息分享 信息分享 7395 人阅读 | 58 人回复 | 2021-03-08


声明:本文内容仅供学习交流,严禁用于商业用途,否则由此产生的一切后果均与作者无关,请于24小时内删除。





本文转自我的公众号,欢迎各位去关注一波~






1,前言:




对爬虫工程师而言,验证码是一个绕不过去的问题,而深度学习,则是应对各种验证码的利器。例如:定长英数或汉字验证码,我们可以通过卷积神经网络识别;不定长的英数或汉字验证码,我们可以再引入循环神经网络进行识别;滑块验证码或者点选验证码,我们可以通过目标检测的模型识别。VAPTCHA那种的手势验证码,我们可以通过语义分割的模型识别。

处理上述各种类型验证码的开源代码已经很多了,所以在此我不再赘述。本文讲一下目前很多人还在用最原始的积累图库的方式进行识别的验证码类型:旋转验证码。

如下:









2,常见的旋转验证码识别方式的缺点





目前常听说的处理方式都没有绕过一点:只有获取过原图,才能识别出角度。积累原始标注样本时,也需要一张一张的先手动校准角度。这就出现了一个问题:如果验证码厂商大规模的增加或更换验证码图库,那适配起来将极为困难。甚至厂商还会随机在图片上加一些水印,干扰识别程序的匹配。幸好使用旋转验证码的厂商,现在使用的图库一直比较少,才能让这个方法勉强能使用下去。





3,通过深度学习预测旋转角度的方案





3.1,方案简述:




本文,我们以某度验证码为例,介绍一下通过深度学习预测旋转角度的方法。本文介绍的方案源于github上的一个深度学习开源项目(RotNet),我对其关键代码进行了抽取及微调,尽量用最少的代码满足预测旋转角度这一目的。RotNet仓库地址及我修改后的代码放于文末供各位参考。




3.2模型介绍:




该项目用到的神经网络搭建只有短短几行,就是用了ResNet50模型加了一个展平层,如下:
# load base model  使用预训练模型提高训练效率
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)

# append classification layer  展平及分类
x = base_model.output
x = Flatten()(x)
final_output = Dense(nb_classes, activation='softmax', name='fc360')(x)

# create the new model 构造最终模型,设置输入与输出
model = Model(inputs=base_model.input, outputs=final_output)

# model compilation 配置损失函数,优化器, 评估标准
model.compile(loss='categorical_crossentropy',
              optimizer=SGD(lr=0.01, momentum=0.9),
              metrics=[angle_error])



上面的代码其实与识别不可变英数及汉字验证码的模型的原理极其相似,唯一的区别,也是能识别旋转角度的关键之处为其对损失的度量方式:



def angle_difference(self, x, y):
    return 180 - abs(abs(x - y) - 180)
       
def angle_error(y_true, y_pred):
    diff = angle_difference(K.argmax(y_true), K.argmax(y_pred))
    return K.mean(K.cast(K.abs(diff), K.floatx())





3.3识别效果




那么如此简单的模型,能获得怎样的成绩呢?我们看一下测试结果(左侧为随机抽取的验证码原图,右侧为预测旋转角度后进行校正的图):











  可以看到,准确率还是很高的,最为重要的是:厂商再怎么增加验证码图库的数量,对模型的识别都是影响不大的,不需要爬虫工程师不断适配。




3.4如何使用





3.4.1 需要python3.6环境,最好使用conda搭建。




3.4.2 通过pip install -r requirements.txt 安装所需的依赖




3.4.3 我提供的代码中包含了4个方法





3.4.3.1 getImgFromDisk:从磁盘中读取验证码(用于测试,可删除)





3.4.3.2 getImgFromUrl:通过url读取验证码(项目使用 )




3.4.3.3 predictAngle:预测图像旋转角度(项目使用)




3.4.3.4 rotate:通过预测出的旋转角度 校正原图。(用于测试,可删除)




3.4.4 可以通过flask等框架做一个提供预测角度的接口




3.5如何二次训练




3.5.1 如果你对模型或识别率不满意,那完全可以自己重新训练,具体有两个方向,由于文章篇幅有限,此处只提供思路。




3.5.2 针对模型:你可以将文中使用的ResNet50模型换为keras提供的其他预训练模型,或者自己搭建一个提取特征的网络,以达到提高识别效率及准确度的目的,可用的模型参考链接:https://keras.io/api/applications/




3.5.3 修改数据集提高准确率:当前的模型是用Google街景数据集训练出来的,如果想进一步提高准确率,那完全可以用验证码做数据集,或者选择与验证码风格更相似的数据集进行训练。




4github地址:




RotNet地址:
https://github.com/d4nst/RotNet


本文项目地址:
https://github.com/chencchen/RotateCaptchaBreak


模型百度网盘地址:

链接:https://pan.baidu.com/s/1vTS1OUKHc42mCmCUS9n3Fg  提取码:fs8f



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
回复

使用道具 举报

回答|共 58 个

会飞的猪

发表于 2021-3-8 16:22:49 | 显示全部楼层

太强了
回复

使用道具 举报

littlefine

发表于 2021-3-8 16:31:20 | 显示全部楼层

强的一批
回复

使用道具 举报

anxua

发表于 2021-3-13 09:42:39 | 显示全部楼层

666
回复

使用道具 举报

python键盘上的舞者

发表于 2021-3-15 17:55:50 | 显示全部楼层

666
回复

使用道具 举报

df_coding

发表于 2021-3-22 16:44:19 | 显示全部楼层

666999
回复

使用道具 举报

jjjjjjjj

发表于 2021-3-29 11:53:22 | 显示全部楼层

666666666666666
回复

使用道具 举报

jjjjjjjj

发表于 2021-3-29 11:55:18 | 显示全部楼层

公众号多少?
回复

使用道具 举报

henry

发表于 2021-3-30 17:51:39 | 显示全部楼层

来了来了
回复

使用道具 举报

命运

发表于 2021-3-31 15:03:55 | 显示全部楼层

66666
回复

使用道具 举报

121 积分
9 主题
热门推荐