Align task API and add FunCaptcha support

This commit is contained in:
Hua
2026-03-12 19:32:59 +08:00
parent ef9518deeb
commit bc6776979e
33 changed files with 3446 additions and 672 deletions

View File

@@ -19,6 +19,7 @@ DATA_DIR = PROJECT_ROOT / "data"
SYNTHETIC_DIR = DATA_DIR / "synthetic"
REAL_DIR = DATA_DIR / "real"
CLASSIFIER_DIR = DATA_DIR / "classifier"
SERVER_TASKS_DIR = DATA_DIR / "server_tasks"
# 合成数据子目录
SYNTHETIC_NORMAL_DIR = SYNTHETIC_DIR / "normal"
@@ -33,6 +34,8 @@ REAL_MATH_DIR = REAL_DIR / "math"
REAL_3D_TEXT_DIR = REAL_DIR / "3d_text"
REAL_3D_ROTATE_DIR = REAL_DIR / "3d_rotate"
REAL_3D_SLIDER_DIR = REAL_DIR / "3d_slider"
REAL_FUN_CAPTCHA_DIR = REAL_DIR / "funcaptcha"
REAL_FUN_CAPTCHA_ROLLBALL_DIR = REAL_FUN_CAPTCHA_DIR / "4_3d_rollball_animals"
# Solver 数据目录
SOLVER_DATA_DIR = DATA_DIR / "solver"
@@ -51,8 +54,10 @@ for _dir in [
SYNTHETIC_3D_TEXT_DIR, SYNTHETIC_3D_ROTATE_DIR, SYNTHETIC_3D_SLIDER_DIR,
REAL_NORMAL_DIR, REAL_MATH_DIR,
REAL_3D_TEXT_DIR, REAL_3D_ROTATE_DIR, REAL_3D_SLIDER_DIR,
REAL_FUN_CAPTCHA_DIR, REAL_FUN_CAPTCHA_ROLLBALL_DIR,
CLASSIFIER_DIR, CHECKPOINTS_DIR, ONNX_DIR,
SLIDE_DATA_DIR, ROTATE_SOLVER_DATA_DIR,
SERVER_TASKS_DIR,
]:
_dir.mkdir(parents=True, exist_ok=True)
@@ -82,6 +87,7 @@ IMAGE_SIZE = {
"3d_text": (60, 160), # 3D 立体文字识别
"3d_rotate": (80, 80), # 3D 旋转角度回归 (正方形)
"3d_slider": (80, 240), # 3D 滑块偏移回归
"funcaptcha_rollball_animals": (48, 48), # FunCaptcha 专项 Siamese 输入
}
# ============================================================
@@ -99,7 +105,7 @@ GENERATE_CONFIG = {
},
"math": {
"operand_range": (1, 30), # 操作数范围
"operators": ["+", "-", "×"], # 支持的运算符 (除法只生成能整除的)
"operators": ["+", "-", "×", "÷"], # 支持的运算符 (除法只生成能整除的)
"image_size": (160, 40), # 生成图片尺寸 (W, H)
"bg_color_range": (230, 255),
"rotation_range": (-10, 10),
@@ -184,6 +190,14 @@ TRAIN_CONFIG = {
"loss": "SmoothL1",
"val_split": 0.1,
},
"funcaptcha_rollball_animals": {
"epochs": 30,
"batch_size": 64,
"lr": 1e-3,
"scheduler": "cosine",
"loss": "BCEWithLogits",
"val_split": 0.1,
},
}
# ============================================================
@@ -226,6 +240,23 @@ INFERENCE_CONFIG = {
"normalize_std": 0.5,
}
# ============================================================
# FunCaptcha 专项任务配置
# ============================================================
FUN_CAPTCHA_TASKS = {
"4_3d_rollball_animals": {
"artifact_name": "funcaptcha_rollball_animals",
"checkpoint_name": "funcaptcha_rollball_animals",
"data_dir": REAL_FUN_CAPTCHA_ROLLBALL_DIR,
"input_size": IMAGE_SIZE["funcaptcha_rollball_animals"], # (H, W)
"tile_size": (200, 200), # (W, H)
"reference_box": (0, 200, 200, 400), # (x1, y1, x2, y2)
"num_candidates": 4,
"answer_index_base": 0,
"channels": 3,
},
}
# ============================================================
# 随机种子 (保证数据生成可复现)
# ============================================================
@@ -246,6 +277,18 @@ def get_device():
SERVER_CONFIG = {
"host": "0.0.0.0",
"port": 8080,
"task_ttl_seconds": 600,
"task_workers": 2,
"tasks_dir": str(SERVER_TASKS_DIR),
"callback_timeout_seconds": 10,
"callback_max_retries": 2,
"callback_retry_delay_seconds": 1.0,
"callback_retry_backoff": 2.0,
"callback_signing_secret": os.getenv("CALLBACK_SIGNING_SECRET")
or os.getenv("CAPTCHA_CALLBACK_SIGNING_SECRET"),
"balance": 999999.0,
"task_cost": 0.0,
"client_key": os.getenv("CLIENT_KEY") or os.getenv("CAPTCHA_CLIENT_KEY"),
}
# ============================================================
@@ -281,6 +324,7 @@ SOLVER_TRAIN_CONFIG = {
}
SOLVER_REGRESSION_RANGE = {
"slide": (0, 1), # 归一化百分比
# 在 solver 输入宽度空间内预测缺口中心 x 坐标,再通过 sigmoid 归一化到 [0, 1]
"slide": (0, SOLVER_CONFIG["slide"]["cnn_input_size"][1]),
"rotate": (0, 360), # 角度
}