dream的小站 Resource Source Research Search

使用yolo和孪生网络模型识别文字点选验证码

抖音的验证码一般是这样的:

解决方案通常可以选择:

  • 打码平台
  • 自己训练模型

在请求量不大的情况下可以用第一种,而对于公司这种每天几千万的请求,这里就需要第二种

一、我们识别的思路是什么?

实际上在请求里还会带有这么一张标签图片:

我们需要按照标签中给出的文字顺序点击图里的文本,因此,按照人类的思维,我们应当是如下操作:

  1. 先找到标签中的文字和文本顺序
  2. 再去图片中找哪几个位置有文字,这些文字是什么
  3. 按照标签和图片中文字的关系进行点选

而对于机器来说,我们需要转换一下第一第二步的顺序,并且我们不需要知道这个文字是什么

  1. 先找出图片中找哪几个位置有文字(每个字的坐标)
  2. 再去识别图中切出的文字和标签文字中的相似关系,不需要知道文字是什么
  3. 最后按照顺序进行点选

如果我们知道了验证部分的文字在图片中的什么位置,然后我们把每个字给剪切出来,然后再通过某种方式,识别出哪些字跟上面标签部分的字最相近不就知道了我们需要点击哪几个字了吗?

这里我们可以使用yolo来进行位置识别(判断每个字的位置),再用用pytorch来训练网络模型(判断相似关系)

我们需要按照他给的标签汉字顺序点击验证部分的汉字,最终要达到的效果是这样:

(这张图中的精度较低,实际上平均能够达到80%以上的识别精度)

二、数据标注

获取验证码图片(包含标签部分图片),可以抓包刷新验证码接口,来获取图片,越多越好,我这里是获取1100张,1000张图片用来训练,100张用来验证,标签部分跟验证部分可以分开存在不同的文件夹。

数据集标注要进行模型训练,就需要对数据集进行标注

使用labelimg对内容进行标注,这个用起来还是挺方便的

因为这里我们只需要在图中标注出来每个文字所在的位置,这里的标签,就统一给text;

这个名字可以随便起,没啥影响。

标注完之后,在保存标签的目录下,会生成很多跟原来图片名字一样的txt文件,内容就是标注出来的坐标

三、训练yolo目标检测模型

需要训练两个模型,一个用来识别目标,一个用来识别文字,模型不限,能用就行,这里我们先讲目标识别

目标检测模型有很多,这里使用的yolov5,最新的应该是yolov8,原理不讲,因为不懂,这里只说咋个用;

git clone https://github.com/ultralytics/yolov5

克隆下来之后,安装环境;一定要装在虚拟环境里隔离一下,不要将依赖安装在全局

在项目根目录,创建一个dataset文件夹,在下面创建几个子文件夹,像下面的目录结构:

dataset/images/train:放入刚刚标记好的1000张训练集样本图片(.jpg)
dataset/images/val:放入刚刚标记好的100张验证集样本图片(.jpg)
dataset/labels/train:放入刚刚标记时生成的1000个训练集标签文件(.txt)
dataset/labels/val:放入刚刚标记时生成的100个验证集标签文件(.txt)

接下来,在data目录下,创建(有就修改,没有就创建)一个叫做train.yaml的文件,如下:

path: /yolov5-master/dataset  # 你dataset的绝对路径
train: images/train           # 训练集的相对路径
val: images/val               # 验证集的相对路径
test:

# Classes(标签类型,我们打标签的时候,标注的text)
names:
  0: text

使用目标检测模型,获取验证部分的每个文字的坐标,并且剪切出来

使用神经网络模型,按标签部分的顺序,输入两张图片,一张标签部分的一张验证部分的,判定两张图片是否是一个字,如果是就返回坐标

下载权重文件

yolov5有很多个权重文件,我这里是使用的yolov5s这个:

下载链接是:https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt

下载之后,我们把yolov5s.pt文件放到根目录就行了。

开始训练

在train.py中,找到入口parse_opt函数

修改一下参数就可以开始训练了:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')  #权重文件
parser.add_argument('--data', type=str, default=ROOT / 'data/train.yaml', help='dataset.yaml path') # 训练的配置文件
parser.add_argument('--epochs', type=int, default=100, help='total training epochs') # 训练轮次,我们这里训练100次
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch') # 每次提取图片张树,电脑太垃圾了,这里设置16,好点的电脑可以搞32或者更高,根据自己配置来
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=352, help='train, val image size (pixels)') # 图片大小,可以默认,yolo有自适应缩放,如果要设置,这个值最好是32的倍数。
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') # 如有gpu就用gpu来训练,速度会快很多,我这个垃圾电脑,cpu
--project,项目输出,根据自己需求要不要改

其他参数默认就可以了,训练好后是这样子的,会在runs/train/exp/weights这个路径下会有训练生成的权重文件,这里默认是pt类型。

训练结果或者训练过程的数据,都可以在runs/train/exp路径下看到:

可以看到检测的成功率基本是挺高的

四、孪生网络训练

我们用yolo或者在labelimg进行标注的时候,已经有了坐标了,现在把他里面的每个文字裁剪下来

对上一步裁剪的内容,以及标签文本进行标注

这里标注的话,可以采用打码平台,如果人工的话,就是体力活了

百度orc也不错,不过现在现在已经没有每天5W的免费额度了

这里推荐可以用ddddoc,效果也还行,在70%左右;

pip install ddddocr

需要注意一下,ddddocr不支持python3.11,另外使用时需要手动降低一下pillow版本

我们这里呢主要是利用Pytorch搭建孪生神经网络(Siamese network)比较图片相似性

用到的bubbliiiing大佬的项目:https://github.com/bubbliiiing/Siamese-pytorch

也可以看他博客:https://blog.csdn.net/weixin_44791964/article/details/107406072

直接把项目克隆下来。然后安装环境,如果在运行的时候有报错,可以把requirements.txt里面的相关的库给更新一下版本,他这个有些是比较老的版本了。

需要将上面准备的数据集进行分类存放;我这里一共1100张验证图片,切割出来有5273张小图;

训练结果

通过这种多分类的网络训练出来的成功率呢,跟数据集关系比较大。刚训练出来的时候,成功率大概在80%左右

随着网站图片的更新,成功率也会随着降低;因为很多字不在分类里面,如果出现相似的字,就会影响成功率

2023/9/1

ps:后面在b站上看到有大佬用keras训练了极验的点选验证码

https://www.bilibili.com/video/BV14u411J7Fo/?spm_id_from=333.337.search-card.all.click

这个是基于二分类的,类似于正负样本对(我也没懂这啥)

我前几天实现了一下,大致跟上面的pytorch流程差不多,只不过这个是用keras来的而已

不过成功率还是大大提高了不少;我还是用的相同的样本来,成功率能有90%

五、按顺序点击验证部分坐标

这里就不写了,主要没什么难度,需要注意一下轨迹生成

本页的评论功能已关闭