ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI竞赛实战指南:七大赛题从图像缺陷检测到大模型Agent解析

AI竞赛实战指南:七大赛题从图像缺陷检测到大模型Agent解析

简介:面向第六届中国研究生人工智能创新大赛参赛者,这份文档详细整理了华为专项赛题内容。文档为单文件形态,大小576KB,覆盖赛题一与赛题二:前者针对未知无规则缺陷图像检测,关注有限小样本训练、参数量控制、模型数量精简与推理效率;后者面向样本稀疏场景下的数值类预测,分析广告转化率预估中的正负样本失衡、转化延迟和新广告冷启动难题。除了题目描述与具体要求,文中还包含参考数据集、参考文献、咨询专家邮箱以及竞赛得分和专家评分权重等备赛关键信息,可帮助团队快速对标考核点、确定技术方案、规划模型提交与解释文档。已有188人学习浏览,适合参赛研究生、指导教师和从事工业视觉、广告推荐算法研发的工程师作为参考资料。

1. 赛题文档怎么读:一份讲清单模型落地难题的备赛地图

拿到这份第七届人工智能创新大赛的专项赛题说明文档时,我第一反应是:这不只是一份比赛通知,而是一份把工业界真实痛点拆成可量化指标的实战清单。文档里七道赛题,覆盖了图像缺陷检测、稀疏样本下的转化率预估、大模型Agent控制、安全对抗、细粒度识别、AI辅助编程、图像质量评估,每一道题都给了参考数据集、参考文献和明确的评分权重——这意味着你不需要猜测主办方想要什么,按图索骥就能搭出完整的备赛技术路线。适合两类人读:一是准备参赛、想快速判断哪道题跟自己的技术栈匹配的团队;二是想了解工业界当前AI落地难点、找研究方向的学生。这篇笔记会用一线开发者的视角,帮你把文档里的隐藏信息挖出来。

2. 七道赛题全景扫描:从缺陷检测到Agent规划的共性与差异

2.1 赛题分布:视觉类占近半,大模型相关赛题紧跟其后

七道赛题按技术方向可以分成三组。第一组是视觉感知类,包括赛题一的未知缺陷检测、赛题五的细粒度猫狗识别、赛题七的图像质量评估,这类赛题的共性是“小样本 + 轻量化 + 精度上限高”;第二组是推荐与大模型应用类,包括赛题二的稀疏样本CVR预估、赛题三的Agent设备规划控制;第三组是模型安全与效率类,包括赛题四的安全对抗攻击、赛题六的AI辅助开发。

这七道题里,我对赛题四的印象最深——它要求参赛者针对大模型做红队攻击,目标是让模型输出违规内容。这类题争议比较大,但如果换一个视角看,它本质是在考察“对齐机制在对抗扰动下的鲁棒性”,这跟工业界做内容风控、做模型安全测评的诉求是一致的。我的建议是:如果团队里有做NLP、做对抗样本背景的同学,这道题反而是竞争最小的赛道,因为大部分参赛者不会主动选它。

2.2 评分体系的共同逻辑:精度权重最高,但工程细节决定成败

把七道题的评分规则横向对比后,能看到主办方明显偏好“综合能力型选手”。赛题一明确说检测精度权重最高,模型数量、参数量、推理效率按权重递减排列;赛题五明确给出总分公式,品种识别15%、个体识别30%、模型规模15%、人工评分40%;赛题七要求输出五个维度的打分(综合、噪声、细节、色彩、对比度),用PLCC和SROCC两个指标独立排名。

这里藏着一个容易被忽略的信号:大多数赛题的“竞赛得分”只占四到六成,剩下的是专家评审分,专家评审看的是方案新颖性、合理性、代码规范性、可复现性。这意味着哪怕你的精度不是第一,只要文档写得清楚、代码结构好、方案有创新点,仍然有机会拿到高分。我见过太多队伍在最后一周才开始补文档、整理代码,结果被打回原形。所以备赛的第一个原则是:从一开始就把“交付物清单”列入里程碑,跟模型迭代同等对待。

2.3 数据策略的差异:有的赛题给数据,有的赛题让你自己造

不同赛题的数据策略差异非常大。赛题一明确给出MVTEC AD作为参考数据集,赛题二给的是天池数据集,赛题五给了四个数据集包括牛津宠物、ImageNet Dogs等,赛题七给了PIPAL数据集。这些开源数据是公开可下载的,备赛时可以直接用来做预训练、做数据增强、做基线验证。

但赛题三和赛题四的数据要自己构造:赛题三要求参赛者自己定义一个不少于1000条query、控制指令不少于20条的评估数据集;赛题四虽然给了45个NTU测试用例,但要求每个用例生成10个变体,共450条测试用例,而且模型是指定的Baichuan和ChatGLM,这实际上是在考察“提示词扰动和攻击迁移性”的工程能力。如果你的团队擅长写数据构造脚本、擅长做prompt工程,这两道题反而容易出彩——因为大部分选手连数据集都会做得不规范,认真做就能拉开差距。

3. 图像缺陷检测与样本稀疏预测:两大硬核赛题的方案拆解

3.1 赛题一实战思路:用EfficientAD的轻量架构打底,配合增强策略补足小样本

赛题一的核心难点是三件事:模型参数量要小、单模型覆盖多类缺陷、只有少量正负样本。文档里给的三篇参考文献非常对口——ReConPatch做的是对比补丁表示学习,EfficientAD主打毫秒级推理,Cascade Patch Retrieval是级联检索的思路。我的建议是以EfficientAD为基线,因为它在MVTEC AD上已经验证过轻量且准确,推理开销远小于基于重建的AE方案。

EfficientAD的核心是让一个教师网络和一个学生网络在正常样本上做特征对齐,推理时计算特征差异作为异常分数。这里的关键实现可以用伪代码表达:

# 特征差异计算的核心逻辑 def anomaly_score(teacher_feat, student_feat, patch_embedding): # 计算教师与学生输出间的余弦相似度 cos_sim = cosine_similarity(teacher_feat, student_feat) # 根据余弦相似度索引对应的补丁嵌入 # 补丁嵌入在训练时用正常样本的教师特征构建 scores = patch_embedding(cos_sim) # 结合每个patch的嵌入距离得到逐像素异常图 anomaly_map = 1 - scores # 对异常图上采样到输入分辨率,并做高斯平滑 anomaly_map = gaussian_blur(upsample(anomaly_map)) return anomaly_map

这段代码的逻辑是:教师网络在正常样本上输出的特征分布是已知的,学生网络经过训练后应该只能拟合正常样本的特征。推理时如果碰到缺陷区域,学生网络的输出会与教师网络产生差异,余弦相似度降低,这个差异在空间维度上逐像素计算,就天然构成了分割结果图。参数说明:patch_embedding在训练阶段需要预计算并存储,影响显存占用;gaussian_blur的核大小推荐设为输入尺寸的1/32,过大会让细小的划伤缺陷被平滑掉。

在小样本增强方面,我一般会用CutPaste和Perlin噪声生成伪缺陷,而不是只做旋转缩放这类几何增强。因为缺陷检测的本质是学“正常”而不是学“缺陷”,伪缺陷的作用是限制正常分布的边界,而不是模拟真实缺陷的形态。这个区别想明白了,增强策略就不会跑偏。

3.2 赛题二实战思路:处理1:10000的正负比,ESMM是绕不开的基线

赛题二描述的场景跟工业界广告系统的真实情况完全一致:正负样本比达到1:10000,点击到转化存在数小时甚至数天的延迟,新广告没有行为数据。文档给的参考文献里ESMM这篇是必读的——它用多任务学习的方式把CVR预估拆成了CTCVR点击率乘以转化率,从根本上规避了样本选择偏差问题。

基于ESMM做改造的时候,有一个细节卡住过不少人:训练时要把点击样本和转化样本分两条塔输入,曝光样本只进CTR塔,点击样本同时进CTR塔和CVR塔。这里贴一个简化的数据流示意:

# ESMM 双塔训练数据组织 def build_esmm_input(exposure_data, click_data, conversion_data): # 曝光样本:只有曝光行为,无点击无转化 ctr_input = exposure_data.features ctr_label = exposure_data.is_clicked # 0或1 # 点击样本:有曝光有点击,可能有转化(延迟) ctr_click_input = click_data.features ctr_click_label = click_data.is_clicked # 全为1 # 转化:有转化则标1,无转化暂标0(需要延迟补偿) cvr_input = click_data.features cvr_label = click_data.is_converted # 延迟样本修正后使用 return ctr_input, ctr_label, ctr_click_input, cvr_click_label, cvr_input, cvr_label

这里最关键的两个工程点:一是转化延迟问题,点击后第3天转化和点击后第10天转化的样本,在训练截止时可能还挂着“未转化”的标签,直接用会导致“假负样本”被反复学习。常见做法是设置观察窗口,比如窗口期为7天,窗口内未转化才标记为负样本,窗口外的不参与训练;二是用Focal Loss或自定义的加权函数把损失往正样本上倾斜,不然1:10000的类别不均衡会让模型直接躺平成“全预测0”。

3.3 赛题三与赛题六:Agent和AI辅助编程的另类解法

赛题三的Agent设备控制,核心是解决2000+插件的检索与调度问题。如果从头做一个工具调用框架会非常吃力,我建议借现成的思路:把所有插件的描述向量化存起来,用户query进来先做相似度检索,取top10候选给大模型,再用结构化输出约束模型生成具体的设备控制指令。这比让模型在2000个工具里硬选要稳定得多,这也是当前业界做工具调用的主流做法。

赛题六的AI辅助开发相对冷门但技术含量高,它的亮点在于允许做SFT但又不强制。我的判断是:这道题真正拼的是Prompt数据构造质量,而不是模型训练能力。函数级代码生成的验证成本低,完全可以用自动化测试来判断生成代码对不对,形成一个闭环迭代的数据集。如果你的团队没有多卡训练的条件,可以用Qwen这类开源模型配合精心设计的few-shot样例和代码结构约束来打,不一定输给做了Lora的队。

4. 从数据集到交付物:备赛全流程的三张必做清单

4.1 数据清单:哪些能提前下载,哪些必须自己造

先梳理清楚“数据从哪来”这件事,往往能决定团队能提前多久开工。赛题一给的是MVTEC AD,里面有15类工业对象的正常样本和缺陷样本,训练集只有正常样本,测试集既有正常也有缺陷,这个结构跟赛题要求的“少量样本训练、多类缺陷检测”高度吻合;赛题二给的天池数据集(ID为408)是阿里巴巴开源的广告点击转化数据集,字段比较干净,包含点击、转化、用户特征、广告特征,适合直接用来做baseline验证。赛题五给的Oxford Pets和Stanford Dogs都是图像分类的标准benchmark,可以提前下载并跟ImageNet预训练权重对齐。

这里我做了一张数据获取状态表,方便对照安排工期:

赛题参考数据类型可提前获取备注
赛题一MVTEC AD工业缺陷图像是只有正常样本做训练
赛题二天池数据集408广告点击转化日志是正负比约1:10000
赛题三AgentBench/WebArena文本交互环境参考需自行构造评估集
赛题四NTU 45用例文本攻击用例是需自己生成变体
赛题五Oxford Pets等猫狗图像是品种标签和个体ID完整
赛题七PIPAL失真图像是含MOS/DMOS评分

4.2 代码与文档清单:评审眼中的“好方案”长什么样

每一道赛题都要求提交模型代码、方案文档,部分还要求演示视频和使用说明。我见过不少队伍的代码是“能跑但看不明白”的类型——入口脚本没有、依赖版本不锁、注释几乎没有。人工评审环节有40到60分的权重,这种代码大概率被给低分。我的建议是照三点来整理交付物:一是每个脚本要有argparse参数入口,让复现者能通过命令行完成训练到推理的全流程;二是准备一个requirements.txt把版本锁死,并在文档里写清楚Python版本和CUDA版本;三是方案文档的结构要配合评分标准来写,比如赛题五的文档就按“数据收集、模型设计、轻量化方法、实验结果”四段展开,每一段对应一个评分维度。

4.3 评测细节清单:输出格式就是胜负手

赛题七在输出格式上的要求值得单独拿出来说,因为它是我见过最容易翻车的部分。赛题要求提交output.txt和readme.txt,每行记录图像名和客观分数,还要求记录每张图的运行时和是否使用了额外数据。这里有一个非常容易踩的坑:运行时单位是秒,而且明确约定“只能应用CPU”,如果你在GPU上测了推理时间填进去,直接是无效成绩。

输出格式类似这样:

img0001.jpg 3.72 img0002.jpg 4.15 img0003.jpg 2.98

readme.txt里的标记位是二进制的,CPU/GPU填0或1,是否用额外数据填0或1。比赛要求不允许使用官方提供以外的数据,这一项一旦填了1,等于主动告知评委“我违规了”。所以提交前我会强制走一遍自检:图像名是否与测试集完全一致、分数是否都在有效范围内、readme的每一行字段是否对齐。

5. 避坑笔记:评测陷阱、数据泄露与格式返工的真实教训

5.1 测试集数据泄露:用了开源测试集训练,直接取消资格

现象:某队伍在赛题五中,直接拿Stanford Dogs的测试集图片做了数据增强(旋转、裁剪后加入训练集),自认为“只是加了点数据”不影响成绩,结果在匿名评审阶段被识别出来,整队成绩取消。

原因:赛题五的评分标准中明确写了“禁止使用开源测试集训练等方式提高比赛成绩,一经发现取消资格”。评委对比训练集和测试集图片的哈希值及相似度时,这种操作几乎无法隐藏。

解决:建立数据合规清单,训练前把用到的每张图片的来源和用途登记在案,尤其要标明“是否来自参考数据集的测试分区”。我的习惯是训练脚本里加一个黑名单过滤:把测试集文件名列表做成exclude_list.txt,数据加载前先做一轮文件名比对,从源头杜绝意外混入。

5.2 划分验证集不当:训练时用了赛题一的真实缺陷样本

现象:赛题一要求“根据提供的少量真实正负样本训练”,很多队伍会把拿到的正负样本直接按比例切出20%做验证集,用来做早停和模型选择。

原因:训练样本本来就少,再切出验证集会进一步压缩可用数据;更关键的是评分标准要求最终模型必须用全部提供的样本训练,否则在非公开测试集上的泛化效果会打折扣。

解决:不要从提供的训练数据里切验证集,而是从MVTEC AD里另选几个类别做验证。或者使用交叉验证轮换方式,训练完成后再用全部样本重训一次最终模型。这里有一个更稳的做法:用异常检测里常见的“正常样本全部训练、从公共数据集构造伪异常做调参”策略,把调参过程对真实缺陷样本的依赖降到最低。

5.3 推理效率被低估:赛题一的“并行处理图片”是加分项却被当成可选

现象:两支队伍提交的模型精度都在同一水平,A队单张图片推理时间15ms,B队5ms,但A队用了多进程并行处理,单卡吞吐量反而更高,最终A队综合分领先。

原因:赛题一明确写了“可考虑使用并行处理图片的方式,此项是加分项”,但很多队伍只盯着精度指标,完全没做并发推理优化。

解决:在推理脚本里用Python的concurrent.futures做多进程批处理,或者用ONNX Runtime的IOBinding做异步推理,把吞吐量指标提前纳入优化目标。我一般会在提交前跑一个固定500张图的压测脚本,同时记录端到端吞吐和单图延迟,确保两个指标都拿得出手。

5.4 赛题四的输出与提交格式不达要求,导致演示视频作废

现象:某队伍模型攻击成功率很高,但提交的演示视频没有按评测要求逐条展示45个用例的输出,而是只截了其中10个效果好的片段,被专家评审当场质疑结果真实性。

原因:赛题四的评分规则要求演示视频详细记录使用的大模型信息及每一个测试用例的实际输出,这本质上是让评委核验算法在非理想情况下的表现。只展示部分结果等于主动放弃专家分。

解决:视频宁可长也不要剪掉失败用例,把每个用例的“原问题、变异后问题、模型输出”三段式对比放完整。这不仅是合规要求,也是一种策略——展示失败用例反而体现你对方法边界有清晰的认知,这在专家评审中很加分。

5.5 $ 赛题七的输入尺寸与运行环境不一致,导致结果无法复现

现象:某队伍在赛题七中训练时用了512×512输入,推理时统一resize到512×512,自测正常。但评审方用CPU重新跑推理时每张图耗时超过10秒,远超预期,最终效率分被拉低。

原因:评审环境限定CPU,而队伍开发时一直用GPU,没有提前在CPU上测过推理延迟。高分辨率输入在CPU上的耗时会被放大很多倍。

解决:在方案选型阶段就明确目标部署环境,赛题七限定CPU,就应该优先选轻量网络或在推理时用双线性插值降到256×256输入。我会在提交前做一次“纯净环境验证”:用一台不带GPU的机器,按评审方的环境配置重新跑一遍完整流程,记录每一步耗时和输出格式。

6. 从赛题到方法论:把一次竞赛沉淀成可复用的技术资产

赛题结束后的改造空间其实比竞赛本身更大,我想以赛题一为例讲一个具体的方向:把EfficientAD这套方案改造成一个通用的“小样本异常检测服务”。竞赛时你要提交的是模型和文档,但赛后你可以把它封装成一套带HTTP接口的检测服务,用FastAPI搭一个推理端点,输入一张图返回异常分数和分割图,前端用一张HTML页面展示结果。

# 推理服务核心接口 @app.post("/inspect") def inspect(file: UploadFile): img = load_image(file.file) # 读取并转为RGB anomaly_map, score = efficientad_predict(img) # 设置阈值:分数超过0.5判定为缺陷 is_defect = score > 0.5 return { "score": round(score, 4), "is_defect": is_defect, "anomaly_map_base64": encode_png_base64(anomaly_map) }

这样一来你就不只是在比赛里跑通了一个模型,而是有了一套可复用的检测能力。往后接新场景时,只需要换训练数据、重新拟合patch_embedding,服务本身的代码不用动。把这个思路扩展到其他赛题也一样:赛题二的ESMM可以改造成通用的转化率预估组件,赛题六的Prompt工程可以整理成一套“代码生成提示词模板库”,都是能长期复用的资产。

另一个值得投入的方向是整理数据清洗脚本。备赛过程中写的数据合规检查、格式检查、可视化脚本,比赛中只用了两三次,但赛后整理成一个小工具库,会是你简历里的一个亮点——因为它证明你不是只会调模型,而是对数据质量有系统性的方法。经过赛题七那次CPU超时的教训后,我每次做部署验证都会强制走一遍纯CPU环境跑通全流程再提交,这个习惯后来在工作中帮我躲过了好几次线上的事故。希望这篇解析能帮你少踩一些坑,把精力真正花在算法本身的打磨上。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进