Skip to content

CAPTCHA Solving

  • 来源:noai-train/联合训练/Day3/T2 CAPTCHA 张子熙
  • 类型:CV / multi-label grid classification
  • 原始资料:Problem Description.ipynbbaseline.ipynbeval.pyDay3 ref/T2 Capcha ref/T2 response.md
  • 题面完整性:完整
  • 解法资料完整性:完整,有多种参考解法

题面大意

每个 CAPTCHA 给一张街拍穿搭人物图,被切成 4 x 4 共 16 个格子,并给出一个查询,例如“点击所有包含 blouse 的格子”。任务是预测 16 个格子是否包含目标服饰类别。训练集有 4652 个 image-question-label 三元组,测试集 1454 个。提交 CSV 每行允许两次尝试,即 32 个布尔预测。最终分数结合 strict accuracy 与 loose accuracy,评测会自动取两次尝试中更好的。

数据特点

图像包含人像和服饰,目标类别是服装/配饰。每个查询只关注一个类别,但同一图像可对应多个问题。格子标签是多标签布尔向量,一个服饰可能跨多个格子。目录中存在 label mask/预计算包含关系等辅助文件,参考题解指出可直接利用掩码构造监督。

考点

核心考点是将“图像 + 查询类别 -> 16 格布尔向量”建模为条件多标签分类。若有分割 mask,最强解法是利用 mask 中的物品 id 统计每格是否包含目标物;若不能直接用测试 label mask,则需要训练模型预测每格每类概率。

涉及知识点

  • 图像网格划分与 patch 级多标签分类。
  • 预训练 ResNet18 离线加载。
  • 多头输出:16 个格子各自预测类别分布。
  • Query-conditioned inference:用查询类别索引输出。
  • Strict vs loose accuracy:完整行匹配与逐元素正确率。

解法思路

参考解法一是利用训练 label mask 监督学习。先把 mask 切成 16 格,统计每格内每个物品 id 的像素数,得到 (16, num_classes) 的存在标签。模型用 ResNet18 提取整图特征,接 16 个独立 head,每个 head 输出所有物品类别概率。训练时根据 query 类别选择对应列,与 16 格 ground truth 做 BCE loss。推理时对测试 query 选择目标类别列,输出 16 个布尔值。

参考解法三进一步使用多个预训练 backbone 冻结特征,分别训练 head,再平均预测概率做集成。若比赛环境允许且测试 label mask 可读,参考文档还描述了直接读取测试 mask 的作弊式满分方法;正式解法应避免依赖隐藏标签文件。

可选/多种解法

整图多头模型:输入整图,输出 16 格 x 类别概率,查询只是索引。

patch 模型:把 16 格分别 crop,输入 patch 和 query 类别,预测是否包含;实现直观但可能丢失上下文。

分割/检测模型:若能训练语义分割或目标检测,再把预测 mask 投影到格子,解释性最好。

特殊技巧

两次尝试机制可以用于阈值多样化:第一套用较保守阈值,第二套用较激进阈值,提高 strict 命中概率。对于跨格服饰,判断标准通常是“是否有像素落入格子”,所以阈值不宜过高。缓存 backbone 特征可以大幅加速多 head 训练。

调参优化

这题调参重点在多标签阈值和两次尝试策略。建议为不同 head 或不同网格单独扫描阈值,并设计第一套保守、第二套激进的组合,而不是两次提交同一结果。模型侧可调 backbone 冻结层数、输入分辨率、多 head loss 权重、类别不平衡权重和增强强度;后处理侧调跨格判定阈值、最小面积和连通域过滤。由于 strict 命中率对单个错误很敏感,应按整题正确率验证,而不是只看单 head accuracy。

注意事项

题面说有 16 possible garment categories,但参考文件提到 label id 可能更多;整理实现时应以 label_list.csv 和数据实际列为准。提交列数和布尔格式必须匹配 eval。不要把可见的测试答案或 label mask 当成正式可用资源。

推广意义

这题是视觉问答/开放词检测的简化版:查询文本限定目标类别,视觉模型输出空间位置。它可推广到网格 CAPTCHA、弱监督定位、服饰属性识别和多标签场景理解。