从0梳理1场CV大赛(Top 3%)!
↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
Datawhale干货
作者:阿水,北京航空航天大学 ,Datawhale成员
摘要:数据竞赛对于大家理论实践和增加履历帮助比较大,但许多读者反馈不知道如何入门,本文以全国数字生态大赛为背景,梳理了cv数据竞赛的整个流程和改进思路。
继上一篇从0梳理1场数据挖掘赛事后。今天以天池正在进行的数字生态大赛为背景,对CV赛事的解题思路和上分技巧做了详细讲解。
这份Baseline不算复杂,用了1个小时,提交结果后比赛排名100/3171(Top 3%)
0.赛事背景
大赛名称:全国数字生态创新大赛-智能算法赛
大赛地址:
https://tianchi.aliyun.com/s/92ccdd364891b9e559a10e1df10079de(或文末阅读原文)
大赛类型:计算机视觉、语义分割
1. 赛题分析
赛题基于不同地形地貌的高分辨率遥感影像资料,要求参赛队伍利用遥感影像智能解译技术识别提取土地覆盖和利用类型,实现生态资产盘点、土地利用动态监测、水环境监测与评估、耕地数量与监测等应用。
地表类型(初赛)包括:
{1: "耕地",2: "林地",3: "草地",4: "道路",5: "城镇建设用地",6: "农村建设用地",7: "工业用地",8: "构筑物"9: "水域"10: "裸地"}
2. 赛题数据
赛题设置
初赛
:利用算法对遥感影像进行10大类地物要素分类,主要考察算法地物分类的准确性;复赛
:利用AI算法对遥感影像进行10大类地物要素地物分类。同时考察算法地物分类的准确性及模型推理效率。
数据介绍
数据简介:数据为覆盖0.8m-2m分辨率的高分系列遥感多光谱影像,成像波段包括R、G、B、Nir波段,数据覆盖地貌包括:山地、丘陵地区、河湖(水库)、平原、城镇等等。感谢浙江大学环境与资源学院为本赛题提供数据支持。
数据规格:4万+张遥感影像及对应地物分类标记样本,影像大小为256*256像素。
初赛
:16017张高分遥感影像和标注文件训练集,A榜测试集3000张测试数据,B榜测试集4366张测试数据。复赛
:15904张高分遥感影像和标注文件,6000张测试数据。
训练测试数据说明:影像保存格式为tif文件,包括R、G、B、Nir四个波段
,训练测试集影像尺寸均为256 * 256像素。标签数据格式为单通道的png。
评价标准
初赛指标
使用通用指标平均交并比mIoU,计算每个类别的交并比的平均值,仅对算法效果进行评价,具体计算公式为:
其中,是目标类别数,是真值类别为i的像素被分为第j类的个数。
复赛指标
在初赛指标基础上,综合考虑算法效果、模型推理效率。具体如下:在mIoU的技术上引入模型效率评价指标,模型效率得分Fe
,衡量模型推理时间得分,Fe的计算方式待复赛阶段公布。
最终成绩计算公式为:
3. 建模方法
首先可以对赛题的数据进行分析,下图所示左边为对应的标注,右边为原图。
从中大致看出,原始图片是比较模糊的,也表明赛题难度比较大。
根据对赛题任务的理解,可以将赛题任务视为语义分割任务,则可以使用语义分割的流程来完成。
输入四通道图片,完成10通道输出。
具体的流程可以分为:
构建赛题数据集,数据&标签读取;
构建分割模型;
完成模型训练并提交;
赛题数据读取
首先完成赛题读取,这里我们先只用到TIF默认三通道,然后对应的标注映射到0-9范围内。
class TianChiDataset(D.Dataset):def __init__(self, paths, transform, test_mode=False):self.paths = pathsself.transform = transformself.test_mode = test_modeself.len = len(paths)self.as_tensor = T.Compose([T.ToPILImage(),T.Resize(IMAGE_SIZE),T.ToTensor(),T.Normalize([0.625, 0.448, 0.688], [0.131, 0.177, 0.101]),])# get data operationdef __getitem__(self, index):img = cv2.imread(self.paths[index])img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)if not self.test_mode:mask = cv2.imread(self.paths[index].replace('.tif', '.png')) - 1mask = cv2.resize(mask, (IMAGE_SIZE, IMAGE_SIZE))augments = self.transform(image=img, mask=mask)return self.as_tensor(augments['image']), augments['mask'][:, :, 0].astype(np.int64)else:return self.as_tensor(img), '' def __len__(self):return self.len
模型构建
使用FCN或者Unet都是可以的:
# Unet
import segmentation_models_pytorch as smp
model = smp.Unet(encoder_name="resnet50", # choose encoder, e.g. mobilenet_v2 or efficientnet-b7encoder_weights="imagenet", # use `imagenet` pretreined weights for encoder initializationin_channels=3, # model input channels (1 for grayscale images, 3 for RGB, etc.)classes=10, # model output channels (number of classes in your dataset)
)# FCN
model = torchvision.models.segmentation.fcn_resnet50(True)
model.classifier[4] = nn.Conv2d(512, 10, kernel_size=(1, 1), stride=(1, 1))
损失函数&训练
这里由于图片像素有可能属于多个类别,因此我们直接选用CrossEntropy对像素类别进行分类即可。
需注意,这里我们本质是对256*256
尺寸每个像素进行类别划分,所以此时的类别10体现在具体的通道上。
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-3)
loss_fn = nn.CrossEntropyLoss().to(DEVICE);best_iou = 0
for epoch in range(1, EPOCHES+1):losses = []start_time = time.time()model.train()model.to(DEVICE);for image, target in tqdm_notebook(loader):optimizer.zero_grad()output = model(image)loss = loss_fn(output, target)loss.backward()optimizer.step()
预测提交
model.eval()
for idx, name in enumerate(tqdm_notebook(glob.glob('./suichang_round1_test_partA_210120/*.tif')[:])):image = cv2.imread(name)image = trfm(image)with torch.no_grad():image = image.to(DEVICE)[None]score1 = model(image).cpu().numpy().argmax(0) + 1cv2.imwrite('results/' + name.split('/')[-1].replace('.tif', '.png'), score_sigmoid)
使用单折模型完成训练,可以到线上34.5的分数,在排行榜100名以内。
4. 改进思路
类别不均衡的情况
由于赛题使用mIOU进行评价,而赛题中不同类别存在不均衡的情况。
可以从损失函数进行尝试,如Lovasz-Softmax Loss、 Focal Loss等;
可以在数据采样角度考虑,对像素占比少的类别进行上采样;
多折模型
可以对赛题数据进行多折划分,然后训练多个模型,然后集成多个模型的结果。
数据通道
将R、G、B、Nir
四个波段加入训练,带来的精度肯定会比三通道高。这部分操作可能需要修改分割模型输入层的通道个数。
分类损失&分类模型
赛题类别存在不均衡的情况,因此也可以考虑在分割的同时加加入类别损失。
完整代码的notebook可在后台回复阿水下载
希望能帮助你完整实践一场cv赛事。
“整理不易,点赞三连↓
从0梳理1场CV大赛(Top 3%)!相关推荐
- 从0梳理1场CV缺陷检测赛事!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:江保祥,厦门大学 一.布匹缺陷检测比赛分析 1. 赛题背景 去年的 ...
- 【数据竞赛】从0梳理1场CV缺陷检测赛事!
作者:江保祥,厦门大学 一.布匹缺陷检测比赛分析 1. 赛题背景 去年的广东工业大赛已入选到全球人工智能技术大赛热身赛,大赛聚焦布匹疵点智能检测,要求选手研究开发高效可靠的计算机视觉算法,提升布匹疵点 ...
- 从0梳理1场NLP赛事!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:徐美兰-lan,华南理工大学 摘要:这是从0实践竞赛第3篇,数据竞 ...
- 【NLP】从0梳理1场NLP赛事!
作者:徐美兰-lan,华南理工大学 摘要:这是从0实践竞赛第3篇,数据竞赛对理论实践和增加履历有益,为了让初学者也能入门,本文以全球人工智能技术大赛预热赛-中文预训练模型赛事为背景,梳理了nlp赛事的 ...
- 从0梳理1场时间序列赛事!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:杰少,南京大学硕士 本文基于 2021 "AI Eart ...
- 从0梳理1场数据挖掘赛事!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:王茂霖,华中科技大学,Datawhale成员 摘要:数据竞赛对于大 ...
- 【数据竞赛】从0梳理1场时间序列赛事!
作者:杰少,南京大学硕士 本文基于 2021 "AI Earth"人工智能创新挑战赛-AI助力精准气象和海洋预测,梳理了时间序列赛事的实践和分析过程,提供了完整baseline方案 ...
- 【数据竞赛】从0梳理1场数据挖掘赛事!
作者:王茂霖,华中科技大学,Datawhale成员 摘要:数据竞赛对于大家理论实践和增加履历帮助比较大,但许多读者反馈不知道如何入门,本文以河北高校数据挖掘邀请赛为背景,完整梳理了从环境准备.数据读取 ...
- 78万奖金!天池最新CV大赛来了
主办单位 丽水市人民政府,阿里巴巴集团 赛事简介 首届全国绿色生态创新大赛是由丽水市人民政府联合阿里巴巴集团共同启动的,以「数字化下沉」为主题的全国性创新大赛.赛事汇聚全国科技创新人才,发掘数字化技术 ...
最新文章
- Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
- nhibernate入门系列: 使用Criteria载入对象
- C#字符串与unicode互相转换
- 深度探索C++ 对象模型(7)-Data member的布局(虚继承)
- java backlog满_java socket参数详解:BackLog
- 生产者消费者--TestPC.java
- opengl加载显示3D模型ZAE类型文件
- 大话重构7:重构是一系列的等量变换
- cesium label 显示隐藏到地底下
- UE4--多线程的实现方式
- 李航《统计学习方法》-----朴素贝叶斯
- 使用node的pm2管理相关进程
- 淘宝Hadoop现有测试框架探幽
- 数据中心操作人员:艰难地在针对VM构建的基础设施上运行容器
- 简单的识别猫狗的模型
- 解决WINDOWS 7中显示摄像头的简易方法
- asp.net数据绑定之Eval和Bind 和等区别
- 计算机教室管理员应知应会,教室管理
- html背景图片纵向拉伸,html网页背景图片拉伸 关于html背景图片往下拉伸问题
- 计算机的应届毕业生简历上可以写什么,计算机应届生简历范文计算机专业应届毕业生简历写.doc...
热门文章
- [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...
- hdu - 1087 - Super Jumping! Jumping! Jumping!
- sql isnull函数的使用(转载)
- 如何使用pyecharts中的主题样式?
- 【Codeforces】908B New Year and Buggy Bot(暴力+全排列)
- 【MATLAB】三维图形的绘制mesh
- ef关联多实体查询_Mybatis基本知识十二:关联关系查询之延迟加载:侵入式延迟加载...
- 推荐 6 个好用到爆的 Pycharm 插件
- 《评人工智能如何走向新阶段》后记(再续10)
- 就因为一个笔记本,运营和产品吵得不可开交......