ACCV2020细粒度比赛记录-数据处理和Baseline结果分享
比赛链接:
- accv官网:https://sites.google.com/view/webfg2020
- 比赛网站:https://www.cvmart.net/race/9917/base
数据下载:
- Baidu / 百度云盘:
链接: https://pan.baidu.com/s/1P0rpg0J34IUL5bvuA5f-pg
提取码: cg9z- Google / 谷歌云盘
https://drive.google.com/drive/folders/1ruvJow2Srp3wuqG1sYd_unG1EHBxYvI-?usp=sharing
Linux下合并解压:cat train.tar.gz.* | tar -zxv
1.数据清洗
训练集:5000类,557,169张图片
测试集:5000类,100,000张图片
由于数据来源于网络,可以视为直接从网站上爬虫下来且后缀全部改成了jpg
格式,而从实际情况来看图片原本包含的格式有jpg、png、gif、tiff
等,这就会导致使用代码读取的时候报错(Error)或者警告(Warning),因此需要先对数据进行清洗。Warning由于不会对程序运行造成影响,需要转换成可报错的Error,代码如下。
import warnings
warnings.filterwarnings('error')
根据实际情况清理出的报错主要有以下几种
corrupt EXIF
和Possibly corrupt EXIF
,这种是EXIF信息缺失导致的,筛选出来再去掉其EXIF头就可以了# Refer: https://blog.csdn.net/a19990412/article/details/105940446 # pip install piexif -i https://pypi.tuna.tsinghua.edu.cn/simple/ import piexif piexif.remove(img_path)
Palette images with Transparency
是在PIL调用convert('RGB')
的时候抛出的,大概是说alpha通道的转换问题,暂时没有解决,先把非RGB(通道数不为3)的图筛选出来,因为后来发现不止4通道图,还有单通道和双通道的图,再单独对这部分数据筛选报错的,发现数量较少,直接从数据集中剔除处理。image file could not be identified because WEBP
,这是由于有的数据原本是webp格式,PIL读取有问题,而且好像是conda环境下才存在,解决方案有几种:- 升级PIL库,6.x,7.x是没有问题但是会抛出新的问题,为了避免麻烦,就用的5.4.1版本
pip install Pillow==5.4.1
- 安装webp库,更新PIL解决了就没有实测
未知错误,在一开始排查没有查出来,所幸用了screen保存历史log,未知错误也只有几张,直接筛选出来了,错误信息如下:
Image size (117762898 pixels) exceeds limit of 89478485 pixels Metadata Warning, tag 296 had too many entries Image appears to be a malformed MPO file
完整代码:
step1: 遍历所有图片,筛选有问题的
import os
from PIL import Image
import cv2
import warnings
warnings.filterwarnings('error')root = './train'f1 = open('pExifError.txt', 'w')
f2 = open('rgbaError.txt', 'w')
f3 = open('ExifError.txt', 'w')
f4 = open('4chImg.txt', 'w')
f5 = open('WebpError.txt', 'w')
f6 = open('UnknownError.txt', 'w')idx = 0
for r, d, files in os.walk(root):if files != []:for i in files:fp = os.path.join(r, i)try:img = Image.open(fp)if(len(img.split()) != 3):# print('4CH:', fp)f4.write('{}\n'.format(fp))except Exception as e:print('Error:', str(e))print(fp)if 'Possibly corrupt EXIF data' in str(e):print('Exif error')f1.write('{}\n'.format(fp))elif 'Palette images with Transparency' in str(e):print('rgba error')f2.write('{}\n'.format(fp))elif 'Corrupt EXIF data' in str(e):print('pExif error')f3.write('{}\n'.format(fp))elif 'image file could not be identified because WEBP' in str(e):print('Webp error')f5.write('{}\n'.format(fp))else:print('Unknown error')f6.write('{}\n'.format(fp))if idx % 5000 == 0:print('='*20, idx)idx += 1f1.close()
f2.close()
f3.close()
f4.close()
f5.close()
f6.close()
step2: 筛选不可转换的图片
import warnings
from PIL import Image
warnings.filterwarnings('error')f1 = open('rgbaError.txt', 'w')
f2 = open('rgbaOK.txt', 'w')with open('4chImg.txt', 'r')as f:for i in f.readlines():i = i.strip()try:img = Image.open(i).convert('RGB')f2.write('{}\n'.format(i))except Exception as e:print('Error:', str(e))print(i)f1.write('{}\n'.format(i))f1.close()
f2.close()
step3: 修改和再测试
import os
import piexif
import warnings
from PIL import Image
warnings.filterwarnings('error')files = ['ExifError.txt', 'pExifError.txt']for file in files:with open(file, 'r')as f:for i in f.readlines():i = i.strip()print(i.strip())piexif.remove(i.strip())# try:# img = Image.open(i)# except Exception as e:# print('Error:', str(e))# print(i)
2.划分数据集
个人习惯把路径存到txt再在dataset加载。
from sklearn.model_selection import train_test_split
import osif __name__ == '__main__':root = './train'fpath = []labels = []for d in os.listdir(root):fd = os.path.join(root, d)label = int(d)for i in os.listdir(fd):fp = os.path.join(fd, i)fpath.append(fp)labels.append(label)print(len(fpath), len(labels))x_train, x_val, y_train, y_val = train_test_split(fpath, labels, random_state=999, test_size=0.2)print(len(x_train), len(x_val))with open('train.txt', 'w')as f:for fn, l in zip(x_train, y_train):f.write('{},{}\n'.format(fn, l))with open('val.txt', 'w')as f:for fn, l in zip(x_val, y_val):f.write('{},{}\n'.format(fn, l))
3.预处理
原数据由于尺寸不一,多数是高清图片,训练时resize会很耗时,因此先resize到一个小尺寸保存起来。Image.thumbnail()
可以起到过滤的作用,如果hw在范围内就不会resize,超过就会按比例放缩。图像质量和JPG压缩问题参考博客1,博客2。
import os
from PIL import Image
import cv2
import shutilroot = './train'
save_path = './thumbnail'
for r, d, files in os.walk(root):if files != []:for i in files:fp = os.path.join(r, i)label = i.split('_')[0]dst = os.path.join(save_path, label)if not os.path.exists(dst):os.makedirs(dst)img = Image.open(fp).convert('RGB')w, h = img.sizeif max(w, h) > 1080:img.thumbnail((1080, 1080), Image.ANTIALIAS)img.save(os.path.join(dst, i), quality=95, subsampling=0)else:shutil.copy(fp, os.path.join(dst, i))
处理前数据集大小为114G,处理后为86G。
在 Tesla V100 32GB*2
硬件环境下,训练Baseline,处理前训练时间一个epoch约为2400s(40min),处理后一个epoch约1400s(23min),极大缩小了训练时间,精度应该没有什么影响,调小判别尺寸应该还能更快,毕竟训练数据尺寸是224x224。
4.Baseline
# ls: labelsmooth
# cat: cat(gmp, gap)
{model: resnet50,pool: cat,init_lr: 0.01,schedule: cos(warm: 5),epochs: <60,loss: ls 0.2,result: 41.497
}
{model: resnext50,pool: cat,init_lr: 0.01,shcedule: step(step: 8, gamma: 0.5),epochs: 60,loss: ls 0.2,result: 42.748
}
关于数据增强,这里补充一下训练集的transform,图像size是224:
验证集只有resize和centercrop,测试时没有随机擦除,采用了5次TTA。
_(:з」∠)_佛系参赛,等大佬们分享高分solution。
ACCV2020细粒度比赛记录-数据处理和Baseline结果分享相关推荐
- Pandas时间序列数据处理和datetime模块详细教程
时间序列分析中,常常需要处理时间相关数据,故参考<Python for Data Analysis>总结了Python和Pandas常用的时间序列数据处理的相关操作,并在 Python3. ...
- 编程实现newton插值c++_数据体操:数据处理和IDW地理插值算法
问题背景 最近的研究课题遇到数据补全的需求,需要根据国际气象数据站的气象数据,对关注的缺值点进行补全.例如,假设我有位于A.B.C.D四市的四个气象观测站的某日的数据(包括观测站的经纬度数据.名称及气 ...
- vue webapp之music(十一) 歌手数据处理和singer类的封装
1.规范化处理数据(有时后端给到我们的数据并不是我们所需要的,所以需要自己对数据进行整理) _normalizeSinger(list) {let map = {hot: {//热门数据title: ...
- 千牛包表包下载_带有服务器端处理和VueJS组件的数据表包
千牛包表包下载 Vue数据表 (Vue Data Table) Data Table package with server-side processing and VueJS components. ...
- 【JProfiler帮助5】记录数据
分析器的主要目的是记录来自各种源的运行时数据,这对解决常见问题很有用.此任务的主要问题是正在运行的JVM以极高的速率生成此类数据.如果探查器始终记录所有类型的数据,则会产生不可接受的开销或快速耗尽所有 ...
- 爱可可推荐!关于竞赛思路,方法和代码实践,Datawhale数据竞赛Baseline开源分享!...
数据竞赛中baseline是最入门的分享, 它不仅有思路.方法还有内容: 或许你与Top选手的差距就是一个baseline! 01 项目介绍 如果你是数据竞赛的初学者.爱好者,比赛的baseline不 ...
- SAP RETAIL MM42维护商品采购信息记录数据的缺陷
SAP RETAIL MM42维护商品采购信息记录数据的缺陷 如下图商品主数据的采购试图里,维护了采购价格, 采购价格是12 CNY. 我试图使用MM42去将这个价格修改成10 CNY, 却发现无法在 ...
- 爱可可推荐!关于竞赛思路,方法和代码实践,数据竞赛Baseline开源分享!
数据竞赛中baseline是最入门的分享, 它不仅有思路.方法还有内容: 或许你与Top选手的差距就是一个baseline! 01 项目介绍 如果你是数据竞赛的初学者.爱好者,比赛的baseline不 ...
- [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
最新文章
- js自定义函数及参数问题
- [娱乐]一款浅陋的C++控制台贪吃蛇小游戏
- matlab 取43阶上部分,求教关于matlab四阶累积量函数里变量的意义。
- python可视化报表制作教程_如何使用Python快速制作可视化报表
- V1.8 - 2006.09.09
- 震惊!!!CSS垂直居中竟然有这么多方法~
- oracle中文转全拼音,Oracle数据库之oracle汉字转拼音
- 一亿融资在一家芯片初创公司可以烧多久?
- java.io.IOException: Failed to create local dir in /tmp/blockmgr-adb70127-0a28-4256-a205-c575acc74f9
- python微信接龙转Excel表格
- shadowplay要下载java,BBC 100件藏品中的世界史083:Shadow puppet of Bima皮影戏字符段
- 一文读懂间隙锁(Gap Locks)
- 根据用户的搜索需求,进行智能推送
- flex osgi实现-potomac 实现页面与页面间数据传递和页面间各部分的数据传递
- html获取页面点击事件吗,jquery 获取页面点击事件 $(body).click()
- HER608-ASEMI整流二极管R-6轴向插件封装
- html5 固定背景,css 背景固定样式background-attachment属性基础
- 例题5.5 圆桌骑士 LA3523
- 大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
- kubernetes1.8.5集群安装(带证书)
热门文章
- 网站的工作原理:网络开发新手(或任何人)入门
- ORAN专题系列-21:主要的玩家(设备商)以及他们各自的态度、擅长领域
- Fabric系列 - 锚节点
- android下载通知栏,Android开发中实现下载文件通知栏显示进度条
- WPF 可视化树和逻辑树
- cpua55和a53哪个好_OPPOA55和OPPOA53哪个好-参数对比-更值得入手
- [转载] 晓说——第29期:海上霸主航母(上)
- 电商订单系统设计简析(一)
- Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇
- Java UTC时间与本地时间互相转换