FlanChanXwO commited on
Commit
4f2bb82
·
verified ·
1 Parent(s): d36c40a

docs: define supported captcha version scope

Browse files

Document that the checkpoint is trained only for the four-digit captcha images from the target deployment footer label v0.7β, and mark other PHPWind releases, forks, themes, and generators as unverified.

Files changed (4) hide show
  1. README.md +72 -53
  2. README_zh.md +67 -45
  3. docs/en/EVALUATION.md +14 -3
  4. docs/zh/EVALUATION.md +12 -2
README.md CHANGED
@@ -2,6 +2,7 @@
2
  language:
3
  - en
4
  license: agpl-3.0
 
5
  tags:
6
  - captcha
7
  - ocr
@@ -11,91 +12,109 @@ tags:
11
  pipeline_tag: image-to-text
12
  model_type: phpwind-captcha-ocr
13
  metrics:
14
- - name: "validation accuracy"
15
  type: accuracy
16
- value: 0.886
17
- - name: "per-attempt login success"
18
- type: accuracy
19
- value: 0.876
20
- - name: "login success with retries"
21
- type: accuracy
22
- value: 0.999997
23
  ---
24
 
25
  # PHPWind Captcha OCR
26
 
27
- An OCR model for the built-in **PHPWind forum captcha** (4 digits). Fully local inference, no external API, 4 MB ONNX model.
 
 
 
28
 
29
- **中文版**: [README_zh.md](README_zh.md)
 
 
30
 
31
- ![example captcha](assets/example_captcha.png)
 
32
 
33
- ```
34
- Example input → Model output: 9125
35
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
- This captcha is PHPWind's built-in component (`PwVerifyCode` / `PwGDCode`). Colored digits, noise lines and distortion are its standard features.
38
 
39
- ## Quick Start
 
 
40
 
41
- ### Python (onnxruntime)
 
 
 
 
 
 
 
42
 
43
  ```bash
44
  pip install onnxruntime pillow numpy
45
  ```
46
 
 
 
47
  ```python
48
  import numpy as np
49
  import onnxruntime as ort
50
  from PIL import Image
51
 
52
- sess = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
53
 
54
- def solve(path):
55
- im = Image.open(path).convert("RGB").resize((160, 64), Image.BILINEAR)
56
- x = np.asarray(im, dtype=np.float32).transpose(2, 0, 1)[None] / 255.0
57
- logits = sess.run(None, {"input": x})[0]
58
- return "".join(str(int(logits[0, p].argmax())) for p in range(4))
59
 
60
- print(solve("captcha.png")) # e.g. "9125"
61
  ```
62
 
63
- ### Go (onnxruntime_go)
64
-
65
- See [docs/en/INFERENCE.md](docs/en/INFERENCE.md).
66
-
67
- ## I/O Specification
68
 
69
- | Item | Spec |
70
  |---|---|
71
- | Input `input` | `[batch, 3, 64, 160]` float32, RGB, values in `[0, 1]` |
72
- | Output `logits` | `[batch, 4, 10]`, argmax per position → digit |
73
- | ONNX opset | 18 |
74
- | Preprocessing | RGB → resize 160x64 (BILINEAR) → divide by 255 |
 
75
 
76
  ## Evaluation
77
 
78
- Evaluated against **real forum logins** (login success = correct recognition). Details in [docs/en/EVALUATION.md](docs/en/EVALUATION.md).
79
-
80
- | Metric | Value |
81
- |---|---|
82
- | Validation accuracy | 88.6% |
83
- | Per-attempt login success | **87.6%** (85/97) |
84
- | Login success with retries | ≈99.9997% |
85
-
86
- ## Training & Fine-tuning
87
-
88
- 997 manually-labeled captchas, CNN trained from scratch with a position-preserving architecture.
89
 
90
- - Dataset (997 labeled images): [FlanChanXwO/phpwind-captcha-dataset](https://huggingface.co/datasets/FlanChanXwO/phpwind-captcha-dataset)
91
- - Script: `scripts/train_fixed.py`
92
- - Guide: [docs/en/TRAINING.md](docs/en/TRAINING.md)
93
 
94
- ## Notes
 
 
 
95
 
96
- - The captcha is PHPWind's built-in component (not site-custom).
97
- - Different PHPWind versions may differ; compare samples before using on another site.
98
 
99
- ## License
 
 
100
 
101
- GNU AGPL-3.0 — free to use, modify and distribute (including commercial use), provided modified/derivative works stay AGPL-licensed; network-server use must offer source. See [LICENSE](LICENSE).
 
 
2
  language:
3
  - en
4
  license: agpl-3.0
5
+ library_name: onnxruntime
6
  tags:
7
  - captcha
8
  - ocr
 
12
  pipeline_tag: image-to-text
13
  model_type: phpwind-captcha-ocr
14
  metrics:
15
+ - name: validation accuracy
16
  type: accuracy
17
+ value: 0.8861
 
 
 
 
 
 
18
  ---
19
 
20
  # PHPWind Captcha OCR
21
 
22
+ [![Hugging Face Model](https://img.shields.io/badge/Hugging%20Face-Model-FFD21E?logo=huggingface&logoColor=000)](https://huggingface.co/FlanChanXwO/phpwind-captcha-ocr)
23
+ [![ONNX](https://img.shields.io/badge/Runtime-ONNX-005CED?logo=onnx&logoColor=fff)](https://onnx.ai/)
24
+ [![PHPWind](https://img.shields.io/badge/Target-PHPWind-3776AB)](https://github.com/alibaba/phpwind)
25
+ [![License: AGPL--3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE)
26
 
27
+ An ONNX OCR model trained on four-digit numeric captcha images from one legacy
28
+ PHPWind deployment. It runs entirely on the local machine: no external API or
29
+ GPU is required.
30
 
31
+ **PHPWind reference implementation**: [alibaba/phpwind](https://github.com/alibaba/phpwind)
32
+ contains the `PwVerifyCode` and `PwGDCode` classes targeted by this model.
33
 
34
+ **中文文档**: [README_zh.md](README_zh.md)
35
+
36
+ ![Example PHPWind captcha](assets/example_captcha.png)
37
+
38
+ > **Answer for the captcha shown above:** `9125`
39
+
40
+ ## Scope and responsible use
41
+
42
+ This model is intended for PHPWind site operators, developers, and researchers
43
+ working with PHPWind deployments they own or are explicitly authorized to test.
44
+ Use it for local integration tests, accessibility research, or evaluation of
45
+ your own captcha implementation. Do not use it to automate account logins or
46
+ bypass access controls.
47
+
48
+ Different PHPWind versions and custom themes can generate visually different
49
+ captchas. Validate on representative, authorized samples before deployment.
50
 
51
+ ## Version support
52
 
53
+ This checkpoint was trained only on four-digit captcha images from a target
54
+ deployment whose footer displayed `v0.7β`. This is an observed deployment
55
+ label, **not** a claim about an official PHPWind release version.
56
 
57
+ | Deployment or version label | Status | Evidence | Notes |
58
+ |---|---|---|---|
59
+ | Target deployment — footer label `v0.7β` | Training scope | 997 manually labelled images; 88.61% held-out validation accuracy | The only visual configuration represented in the training and reference evaluation data. |
60
+ | Other PHPWind releases, forks, themes, or captcha generators | Unverified | No version-specific evaluation | Validate with authorized representative samples; fine-tune if the visual distribution differs. |
61
+
62
+ ## Quick start
63
+
64
+ Install the runtime:
65
 
66
  ```bash
67
  pip install onnxruntime pillow numpy
68
  ```
69
 
70
+ Run local inference on a captcha image you are authorized to process:
71
+
72
  ```python
73
  import numpy as np
74
  import onnxruntime as ort
75
  from PIL import Image
76
 
77
+ session = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
78
 
79
+ def predict_captcha(path: str) -> str:
80
+ image = Image.open(path).convert("RGB").resize((160, 64), Image.BILINEAR)
81
+ inputs = np.asarray(image, dtype=np.float32).transpose(2, 0, 1)[None] / 255.0
82
+ logits = session.run(None, {"input": inputs})[0]
83
+ return "".join(str(int(logits[0, position].argmax())) for position in range(4))
84
 
85
+ print(predict_captcha("captcha.png"))
86
  ```
87
 
88
+ ## Model interface
 
 
 
 
89
 
90
+ | Item | Value |
91
  |---|---|
92
+ | Input | `input`: `[batch, 3, 64, 160]`, `float32`, RGB values in `[0, 1]` |
93
+ | Output | `logits`: `[batch, 4, 10]`; argmax per position gives one digit |
94
+ | Preprocessing | RGB → resize to `160 × 64` (bilinear) → divide by `255` |
95
+ | Format | ONNX, opset 18 |
96
+ | Runtime | CPU supported; no GPU requirement |
97
 
98
  ## Evaluation
99
 
100
+ The published checkpoint reached **88.61% validation accuracy** on a held-out
101
+ split of 997 manually labelled images from the target `v0.7β` footer-label
102
+ deployment. This is a model-card reference metric, not a guarantee for another
103
+ PHPWind version, theme, or deployment. See [the evaluation
104
+ protocol](docs/en/EVALUATION.md) for the scope and reproducibility requirements.
 
 
 
 
 
 
105
 
106
+ ## Documentation
 
 
107
 
108
+ - [Inference guide](docs/en/INFERENCE.md) — Python and Go integration details
109
+ - [Training and fine-tuning](docs/en/TRAINING.md) — data preparation and model training
110
+ - [Evaluation](docs/en/EVALUATION.md) — offline validation protocol
111
+ - [Documentation index](docs/en/README.md)
112
 
113
+ ## Training data and license
 
114
 
115
+ The checkpoint was trained from scratch with a position-preserving CNN on 997
116
+ manually labelled images. For adaptation, use only captcha images from PHPWind
117
+ deployments you operate or are authorized to evaluate.
118
 
119
+ This project is licensed under [GNU AGPL-3.0](LICENSE). Modified or networked
120
+ derivative works must meet the license's corresponding-source requirements.
README_zh.md CHANGED
@@ -2,6 +2,7 @@
2
  language:
3
  - zh
4
  license: agpl-3.0
 
5
  tags:
6
  - captcha
7
  - ocr
@@ -10,82 +11,103 @@ tags:
10
  - phpwind
11
  pipeline_tag: image-to-text
12
  model_type: phpwind-captcha-ocr
 
 
 
 
13
  ---
14
 
15
  # PHPWind 验证码识别
16
 
17
- 识别 **PHPWind 论坛内置验证码**(4 位数字)的 OCR 模型。完全本地推理、无外部 API 依赖、ONNX 模型仅 4 MB。
 
 
 
 
 
 
 
 
 
18
 
19
  **English version**: [README.md](README.md)
20
 
21
- ![验证码样例](assets/example_captcha.png)
22
 
23
- ```
24
- 示例输入 → 模型输出: 9125
25
- ```
 
 
 
 
 
 
 
 
 
26
 
27
- 这是 PHPWind 论坛软件的内置验证码组件(`PwVerifyCode` / `PwGDCode`),彩色数字、干扰线、扭曲都是它的标准特征。
 
28
 
29
- ## 快速使用
 
 
 
30
 
31
- ### Python (onnxruntime)
 
 
32
 
33
  ```bash
34
  pip install onnxruntime pillow numpy
35
  ```
36
 
 
 
37
  ```python
38
  import numpy as np
39
  import onnxruntime as ort
40
  from PIL import Image
41
 
42
- sess = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
43
 
44
- def solve(path):
45
- im = Image.open(path).convert("RGB").resize((160, 64), Image.BILINEAR)
46
- x = np.asarray(im, dtype=np.float32).transpose(2, 0, 1)[None] / 255.0
47
- logits = sess.run(None, {"input": x})[0]
48
- return "".join(str(int(logits[0, p].argmax())) for p in range(4))
49
 
50
- print(solve("captcha.png")) # 例如 "9125"
51
  ```
52
 
53
- ### Go (onnxruntime_go)
54
-
55
- 见 [docs/zh/INFERENCE.md](docs/zh/INFERENCE.md)。
56
-
57
- ## 输入 / 输出规格
58
-
59
- | 项 | 规格 |
60
- |---|---|
61
- | 输入 `input` | `[batch, 3, 64, 160]` float32,RGB,取值 `[0, 1]` |
62
- | 输出 `logits` | `[batch, 4, 10]`,每位置 argmax → 数字 |
63
- | ONNX opset | 18 |
64
- | 预处理 | RGB → 缩放到 160x64(双线性)→ 除以 255 |
65
-
66
- ## 评估结果
67
-
68
- 用**真实论坛登录**作为 ground truth(登录成功 = 识别正确)。详见 [docs/zh/EVALUATION.md](docs/zh/EVALUATION.md)。
69
 
70
- | 指标 | 数值 |
71
  |---|---|
72
- | 验证集精度 | 88.6% |
73
- | 真实登录单次命中 | **87.6%** (85/97) |
74
- | 带重试登录成功率 | ≈99.9997% |
 
 
75
 
76
- ## 训练 / 微调
77
 
78
- 997 张人工标注验证码,CNN 从零���练(位置保留架构)。
 
 
79
 
80
- - 数据集(997 张已标注图片):[FlanChanXwO/phpwind-captcha-dataset](https://huggingface.co/datasets/FlanChanXwO/phpwind-captcha-dataset)
81
- - 脚本:`scripts/train_fixed.py`
82
- - 指南:[docs/zh/TRAINING.md](docs/zh/TRAINING.md)
83
 
84
- ## 说明
 
 
 
85
 
86
- - 验证码为 PHPWind 内置组件(非站点定制)。
87
- - 不同 PHPWind 版本参数可能有差异,换站使用前建议对比样例确认风格。
88
 
89
- ## 许可证
 
90
 
91
- GNU AGPL-3.0 —— 可自由使用、修改、分发(含商用),但修改版/衍生作品必须同样以 AGPL 开源;网络服务使用也需提供源码。详见 [LICENSE](LICENSE)。
 
 
2
  language:
3
  - zh
4
  license: agpl-3.0
5
+ library_name: onnxruntime
6
  tags:
7
  - captcha
8
  - ocr
 
11
  - phpwind
12
  pipeline_tag: image-to-text
13
  model_type: phpwind-captcha-ocr
14
+ metrics:
15
+ - name: validation accuracy
16
+ type: accuracy
17
+ value: 0.8861
18
  ---
19
 
20
  # PHPWind 验证码识别
21
 
22
+ [![Hugging Face 模型](https://img.shields.io/badge/Hugging%20Face-Model-FFD21E?logo=huggingface&logoColor=000)](https://huggingface.co/FlanChanXwO/phpwind-captcha-ocr)
23
+ [![ONNX](https://img.shields.io/badge/Runtime-ONNX-005CED?logo=onnx&logoColor=fff)](https://onnx.ai/)
24
+ [![PHPWind](https://img.shields.io/badge/Target-PHPWind-3776AB)](https://github.com/alibaba/phpwind)
25
+ [![许可证:AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE)
26
+
27
+ 针对一个旧版 PHPWind 部署的四位数字验证码图片训练的 ONNX OCR 模型。模型完全在本地运行,
28
+ 不依赖外部 API,也不需要 GPU。
29
+
30
+ **PHPWind 参考实现源码**:[alibaba/phpwind](https://github.com/alibaba/phpwind),其中包含本模型
31
+ 对应的 `PwVerifyCode` 与 `PwGDCode` 类。
32
 
33
  **English version**: [README.md](README.md)
34
 
35
+ ![PHPWind 验证码样例](assets/example_captcha.png)
36
 
37
+ > **上图验证码的正确答案:** `9125`
38
+
39
+ ## 适用范围与负责任使用
40
+
41
+ 本模型面向 PHPWind 站点的运营者、开发者及研究者,用于其自有或已获明确授权的
42
+ PHPWind 部署。适合本地集成测试、无障碍研究,或评估自身验证码实现;不得用于
43
+ 自动化账户登录或绕过访问控制。
44
+
45
+ 不同 PHPWind 版本及自定义主题可能生成外观不同的验证码。部署前请以有授权的代表性
46
+ 样本验证实际效果。
47
+
48
+ ## 版本支持
49
 
50
+ 此 checkpoint 仅使用目标部署页脚显示为 `v0.7β` 的四位数字验证码图片训练。该页脚内容
51
+ 只是观测到的部署标识,**不能**视为 PHPWind 官方发布版本号。
52
 
53
+ | 部署或版本标识 | 状态 | 依据 | 说明 |
54
+ |---|---|---|---|
55
+ | 目标部署——页脚标识 `v0.7β` | 已训练范围 | 997 张人工标注图片;留出验证集准确率 88.61% | 训练数据和参考评估数据中唯一包含的验证码视觉配置。 |
56
+ | 其他 PHPWind 发行版、分支、主题或验证码生成器 | 未验证 | 无按版本划分的评估 | 请先使用有授权的代表性样本验证;视觉分布不同时需进行微调。 |
57
 
58
+ ## 快速开始
59
+
60
+ 安装运行时:
61
 
62
  ```bash
63
  pip install onnxruntime pillow numpy
64
  ```
65
 
66
+ 对已获授权处理的验证码图片执行本地推理:
67
+
68
  ```python
69
  import numpy as np
70
  import onnxruntime as ort
71
  from PIL import Image
72
 
73
+ session = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
74
 
75
+ def predict_captcha(path: str) -> str:
76
+ image = Image.open(path).convert("RGB").resize((160, 64), Image.BILINEAR)
77
+ inputs = np.asarray(image, dtype=np.float32).transpose(2, 0, 1)[None] / 255.0
78
+ logits = session.run(None, {"input": inputs})[0]
79
+ return "".join(str(int(logits[0, position].argmax())) for position in range(4))
80
 
81
+ print(predict_captcha("captcha.png"))
82
  ```
83
 
84
+ ## 模型接口
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
+ | 项目 | 规格 |
87
  |---|---|
88
+ | 输入 | `input`:`[batch, 3, 64, 160]`,`float32`,RGB 值域 `[0, 1]` |
89
+ | 输出 | `logits`:`[batch, 4, 10]`;逐位置 argmax 得到一位数字 |
90
+ | 预处理 | RGB → 缩放至 `160 × 64`(双线性)→ 除以 `255` |
91
+ | 格式 | ONNX,opset 18 |
92
+ | 运行环境 | 支持 CPU,无 GPU 依赖 |
93
 
94
+ ## 评估
95
 
96
+ 已发布 checkpoint 在来自目标页脚标识 `v0.7β` 部署的 997 张人工标注图片留出集上达到
97
+ **88.61% 验证集准确率**。该值仅是模型卡参考指标,不保证其他 PHPWind 版本、主题或
98
+ 部署环境中的表现。评估范围与复现要求见[评估说明](docs/zh/EVALUATION.md)。
99
 
100
+ ## 文档
 
 
101
 
102
+ - [推理指南](docs/zh/INFERENCE.md) —— Python 与 Go 集成细节
103
+ - [训练与微调](docs/zh/TRAINING.md) —— 数据准备及模型训练
104
+ - [评估说明](docs/zh/EVALUATION.md) —— 离线验证方法
105
+ - [文档索引](docs/zh/README.md)
106
 
107
+ ## 训练数据与许可证
 
108
 
109
+ 该 checkpoint 使用位置保留 CNN 从零训练,训练数据为 997 张人工标注图片。需要适配时,
110
+ 请只使用自有或已获授权的 PHPWind 部署所产生的验证码图片。
111
 
112
+ 本项目采用 [GNU AGPL-3.0](LICENSE) 许可。修改版或通过网络提供服务的衍生作品须满足
113
+ 许可证的对应源码提供义务。
docs/en/EVALUATION.md CHANGED
@@ -10,6 +10,17 @@ Evaluate only images from PHPWind deployments you own or are explicitly
10
  authorized to test. Keep the evaluation dataset separate from the training
11
  dataset, and do not publish captcha images or labels that contain private data.
12
 
 
 
 
 
 
 
 
 
 
 
 
13
  ## Reference metric
14
 
15
  The published checkpoint reports the following held-out validation result:
@@ -19,11 +30,11 @@ The published checkpoint reports the following held-out validation result:
19
  | Validation accuracy | 88.61% |
20
  | Labelled image count | 997 |
21
  | Validation split | 8% |
22
- | Task | Four-digit numeric PHPWind captcha recognition |
23
 
24
  This metric is a historical reference for this checkpoint. It is not a
25
- production guarantee: PHPWind versions, themes, fonts, and generator settings
26
- can change the image distribution.
27
 
28
  ## Reproducible protocol
29
 
 
10
  authorized to test. Keep the evaluation dataset separate from the training
11
  dataset, and do not publish captcha images or labels that contain private data.
12
 
13
+ ## Version boundary
14
+
15
+ The published checkpoint was trained on four-digit numeric captcha images from
16
+ one target deployment whose footer displayed `v0.7β`. This footer text is an
17
+ observed deployment label, not an official PHPWind release version claim.
18
+
19
+ | Deployment or version label | Status | Evidence | Notes |
20
+ |---|---|---|---|
21
+ | Target deployment — footer label `v0.7β` | Training and reference-evaluation scope | 997 manually labelled images; 88.61% held-out validation accuracy | The only visual configuration represented in the reported data. |
22
+ | Other PHPWind releases, forks, themes, or captcha generators | Unverified | No version-specific evaluation | Evaluate with authorized representative samples and fine-tune when the image distribution differs. |
23
+
24
  ## Reference metric
25
 
26
  The published checkpoint reports the following held-out validation result:
 
30
  | Validation accuracy | 88.61% |
31
  | Labelled image count | 997 |
32
  | Validation split | 8% |
33
+ | Task | Four-digit numeric captcha recognition for the target `v0.7β` footer-label deployment |
34
 
35
  This metric is a historical reference for this checkpoint. It is not a
36
+ production guarantee: other PHPWind versions, themes, fonts, and generator
37
+ settings can change the image distribution.
38
 
39
  ## Reproducible protocol
40
 
docs/zh/EVALUATION.md CHANGED
@@ -8,6 +8,16 @@
8
  仅评估来自自有或已获明确授权测试的 PHPWind 部署的图片。评估数据必须与训练数据分离,
9
  也不要公开可能包含私有信息的验证码图片或标签。
10
 
 
 
 
 
 
 
 
 
 
 
11
  ## 参考指标
12
 
13
  已发布 checkpoint 的留出验证结果如下:
@@ -17,9 +27,9 @@
17
  | 验证集准确率 | 88.61% |
18
  | 已标注图片数量 | 997 |
19
  | 验证集比例 | 8% |
20
- | 任务 | PHPWind 四位数字验证码识别 |
21
 
22
- 该指标仅是当前 checkpoint 的历史参考值,并非生产环境保证。PHPWind 版本、主题、字体及
23
  验证码生成设置都可能改变图片分布。
24
 
25
  ## 可复现流程
 
8
  仅评估来自自有或已获明确授权测试的 PHPWind 部署的图片。评估数据必须与训练数据分离,
9
  也不要公开可能包含私有信息的验证码图片或标签。
10
 
11
+ ## 版本边界
12
+
13
+ 已发布 checkpoint 使用一个目标部署的四位数字验证码图片训练;该部署页脚显示为 `v0.7β`。
14
+ 此页脚文字只是观测到的部署标识,不是对 PHPWind 官方发布版本的判断。
15
+
16
+ | 部署或版本标识 | 状态 | 依据 | 说明 |
17
+ |---|---|---|---|
18
+ | 目标部署——页脚标识 `v0.7β` | 训练和参考评估范围 | 997 张人工标注图片;留出验证集准确率 88.61% | 已报告数据中唯一包含的验证码视觉配置。 |
19
+ | 其他 PHPWind 发行版、分支、主题或验证码生成器 | 未验证 | 无按版本划分的评估 | 请用有授权的代表性样本评估;图片分布不同时进行微调。 |
20
+
21
  ## 参考指标
22
 
23
  已发布 checkpoint 的留出验证结果如下:
 
27
  | 验证集准确率 | 88.61% |
28
  | 已标注图片数量 | 997 |
29
  | 验证集比例 | 8% |
30
+ | 任务 | 目标页脚标识 `v0.7β` 部署的四位数字验证码识别 |
31
 
32
+ 该指标仅是当前 checkpoint 的历史参考值,并非生产环境保证。其他 PHPWind 版本、主题、字体及
33
  验证码生成设置都可能改变图片分布。
34
 
35
  ## 可复现流程