详解这场图片分类赛baseline,赢取官方人才认证+奖金

2021 年 10 月 7 日 PaperWeekly



赛题背景

为进一步加快“6+5+6+1”西安现代产业以及养老服务等行业领域急需紧缺高技能人才培养,动员广大职工在迎十四运创文明城、建设国家中心城市、助力西安新时代追赶超越高质量发展中展现新作为,市委组织部、市人社局、市总工会决定举办西安市2021年“迎全运、强技能、促提升”高技能人才技能大赛(全市计算机程序设计员技能大赛)。

随着我国经济的发展和城市化进程的加速,生活垃圾对城市环境的威胁日益增加。因此,如何高效、环保地解决处理生活垃圾迫在眉睫。生活垃圾的分类和处理可以有效地增加垃圾处理的效率,也因此成为社会关注的热点。然而,对垃圾分类的知识普及以及工作落实一直以来都是一个难题。本次活动将以垃圾分类为主题,结合人工智能、大数据、计算机视觉技术,实现生活垃圾的智慧分拣。


数据说明


本次比赛将提供10,000张垃圾图片,其中8000张用于训练集,1,000张用于测试集。其中,每张图片中的垃圾都属于纸类、塑料、金属、玻璃、厨余、电池这六类垃圾中的一类。

数据文件:
  • train.zip,训练集,包括7831张垃圾图片。
  • validation.zip,测试集,包括2014张垃圾图片。
  • train.csv,训练集图片标签,标签为A-F,分别代表厨余、塑料、金属、纸类、织物、玻璃。



数据分析

首先我们可以对赛题数据进行可视化,这里使用opencv读取图片并进行操作:

  
  
    
def show_image(paths):
plt.figure(figsize=(10, 8)) for idx, path in enumerate(paths):
plt.subplot(1, len(paths), idx+1)
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.xticks([]); plt.yticks([])

从图中可以看出图片主体尺寸较少,但背景所包含的像素较多。接下来可以对类别数量进行统计,在数据集中厨余最多,玻璃垃圾最少。数据集类别整体还是比较均衡,样本比例没有相差很大。

参考上面的操作,可以对数据集每类图片进行可视化:

赛题建模


由于赛题任务是一个非常典型的图像分类任务,所以可以直接使用CNN模型训练的过程来完成。在本地比赛中如果使用得到的预训练模型越强,则最终的精度越好。

在构建模型并进行训练之前,非常建议将训练集图片提前进行缩放,这样加快图片的读取速度,也可以加快模型的训练速度。具体的缩放代码如下:

  
  
    
import cv2, glob, osimport numpy as np

os.mkdir('train_512')
os.mkdir('validation_512')for path in glob.glob('./train/*'): if os.path.exists('train_512/' + path.split('/')[-1]): continue
img = cv2.imread(path) try:
img = cv2.resize(img, (512, 512))
cv2.imwrite('train_512/' + path.split('/')[-1], img) except: passfor path in glob.glob('./validation/*'): if os.path.exists('validation_512/' + path.split('/')[-1]): continue
img = cv2.imread(path) try:
img = cv2.resize(img, (512, 512))
cv2.imwrite('validation_512/' + path.split('/')[-1], img) except:
img = np.zeros((512, 512, 3))
cv2.imwrite('validation_512/' + path.split('/')[-1], img)

Pytorch版本baseline


如果使用Pytorch,则需要按照如下步骤进行:
  • 定义数据集
  • 定义模型
  • 模型训练和预测

  
  
    
class BiendataDataset(Dataset): def __init__(self, img_path, img_label, transform=None):
self.img_path = img_path
self.img_label = img_label
self.transform = transform def __getitem__(self, index): try:
img = Image.open(self.img_path[index]).convert('RGB') except:
index = 0
img = Image.open(self.img_path[index]).convert('RGB') if self.transform is not None:
img = self.transform(img)

label = torch.from_numpy(np.array([self.img_label[index]])) return img, label def __len__(self): return len(self.img_path)


预训练模型推荐使用efficientnet,模型精度会更好。

  
  
    
import timm
model = timm.create_model('efficientnet_b4', num_classes=6,
pretrained=True, in_chans=3)

具体的数据扩增方法为:

  
  
    
transforms.Compose([
transforms.Resize((300, 300)),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.RandomAffine(5, scale=[0.95, 1.05]),
transforms.RandomCrop((256, 256)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

TF2.0版本baseline

如果使用TF2.0,则更加简单:

  • 定义ImageDataGenerator
  • 定义模型
  • 模型训练和预测
模型加载代码为:
  
  
    
from efficientnet.tfkeras import EfficientNetB4
models = EfficientNetB4(weights='imagenet', include_top=False)
具体的数据扩增方法为:
  
  
    
train_datagen = ImageDataGenerator(
rescale=1. / 255, # 归一化
rotation_range=45, # 旋转角度
width_shift_range=0.1, # 水平偏移
height_shift_range=0.1, # 垂直偏移
shear_range=0.1, # 随机错切变换的角度
zoom_range=0.25, # 随机缩放的范围
horizontal_flip=True, # 随机将一半图像水平翻转
fill_mode='nearest' # 填充像素的方法
)

赛题上分思路

如果使用baseline的思路,则可以取得线上0.85的成绩。如果还想取得更优的成绩,可以考虑如下操作:

1. 对数据集图片的主体物体进行定位&检测;

2. 通过五折交叉验证,训练得到5个模型然后对测试集进行投票;

3. 对测试集结果进行数据扩增,然后进行投票。


baseline地址:
https://www.biendata.xyz/media/download_file/21771129e38ed3f5b565af858fcd80b1.zip



 参赛办法 


扫描下方二维码或点击“阅读原文”




🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



·

登录查看更多
0

相关内容

图像分类,顾名思义,是一个输入图像,输出对该图像内容分类的描述的问题。它是计算机视觉的核心,实际应用广泛。
专知会员服务
12+阅读 · 2021年9月15日
【2020新书】Python金融大数据分析宝典,426页pdf与代码
专知会员服务
150+阅读 · 2020年7月11日
【高能所】如何做好⼀份学术报告& 简单介绍LaTeX 的使用
【资源】100+本免费数据科学书
专知会员服务
107+阅读 · 2020年3月17日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
MATLAB玩转深度学习?新书「MATLAB Deep Learning」162页pdf
专知会员服务
99+阅读 · 2020年1月13日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
TensorFlow实例: 手写汉字识别
数据挖掘入门与实战
11+阅读 · 2017年11月10日
国家自然科学基金
0+阅读 · 2016年12月31日
国家自然科学基金
1+阅读 · 2015年12月31日
国家自然科学基金
5+阅读 · 2015年7月12日
国家自然科学基金
4+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2014年12月31日
国家自然科学基金
4+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
1+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
One-Class Model for Fabric Defect Detection
Arxiv
0+阅读 · 2022年4月20日
Identity-aware Graph Neural Networks
Arxiv
14+阅读 · 2021年1月25日
VIP会员
相关基金
国家自然科学基金
0+阅读 · 2016年12月31日
国家自然科学基金
1+阅读 · 2015年12月31日
国家自然科学基金
5+阅读 · 2015年7月12日
国家自然科学基金
4+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2014年12月31日
国家自然科学基金
4+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
1+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Top
微信扫码咨询专知VIP会员