Appearance
CAPTCHA Solving
- 来源:
noai-train/联合训练/Day3/T2 CAPTCHA 张子熙 - 类型:CV / multi-label grid classification
- 原始资料:
Problem Description.ipynb、baseline.ipynb、eval.py、Day3 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、弱监督定位、服饰属性识别和多标签场景理解。