cv图像翻转_涨点技巧!汇集13个Kaggle图像分类项目的性能提升指南

fe71e2a8b04effae05c0628a500bc0b2.png

从数据预处理、增强、模型优化、调参再到损失函数...

本文转载自:AI公园
作者:Prince Canuma 编译:ronghuaiyang

注:文末附CV学习交流群

导读

覆盖了模型相关的方方面面,从数据准备到模型的推理,每个阶段的方法和要点,非常多的参考资料,足够看一段时间了。

0e63f2f512e6a767fc3122921b650f17.png

任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果。

机器学习和图像分类也不例外,工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践。

在这篇文章中,我将给你很多资源来学习,聚焦于从13个Kaggle比赛中挑选出的最好的Kaggle kernel。这些比赛是:

  • Intel Image Classification:https://www.kaggle.com/puneet6060/intel-image-classification
  • Recursion Cellular Image Classification:https://www.kaggle.com/c/recursion-cellular-image-classification
  • SIIM-ISIC Melanoma Classification:https://www.kaggle.com/c/siim-isic-melanoma-classification
  • APTOS 2019 Blindness Detection:https://www.kaggle.com/c/aptos2019-blindness-detection/notebooks
  • Diabetic Retinopathy Detection:https://www.kaggle.com/c/diabetic-retinopathy-detection
  • ML Project — Image Classification:https://www.kaggle.com/c/image-classification-fashion-mnist/notebooks
  • Cdiscount’s Image Classification Challenge:https://www.kaggle.com/c/cdiscount-image-classification-challenge/notebooks
  • Plant seedlings classifications:https://www.kaggle.com/c/plant-seedlings-classification/notebooks
  • Aesthetic Visual Analysis:https://www.kaggle.com/c/aesthetic-visual-analysis/notebooks

我们会讨论调试深度学习解决方案的三个主要方面:

  • 数据
  • 模型
  • 损失函数

还有很多例子项目(和参考资料)供你参考。

数据

图像预处理 + EDA

ade7dc0bf38eae6251f46af876460980.png

每一个机器学习/深度学习解决方案都从原始数据开始。在数据处理管道中有两个基本步骤。

第一步是探索性数据分析 (EDA)。它帮助我们分析整个数据集并总结它的主要特征,比如类分布、大小分布等等。通常使用可视化方法来显示这种分析的结果。

第二步是图像预处理,目的是对原始图像提高图像数据(也称为图像特征)的质量,通过抑制不必要的扭曲,缩放,增强重要的特征,使数据更适合模型并提高性能。

你可以钻研这些Kaggle笔记本,看看一些图像预处理技术:

  • Visualisation:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline#Building-a-baseline-model-
  • Dealing with Class imbalance:https://www.kaggle.com/rohandeysarkar/ultimate-image-classification-guide-2020
  • Fill missing values (labels, features and, etc.):https://www.kaggle.com/datafan07/analysis-of-melanoma-metadata-and-effnet-ensemble
  • Normalisation :https://www.kaggle.com/vincee/intel-image-classification-cnn-keras
  • Pre-processing:https://www.kaggle.com/ratthachat/aptos-eye-preprocessing-in-diabetic-retinopathy#3.A-Important-Update-on-Color-Version-of-Cropping-&-Ben's-Preprocessing

数据增强

f5085c463267a313534cf1a1834581ac.gif

数据增强 可以通过从现有的训练样本中生成更多的训练数据来扩展我们的数据集。通过大量的随机转换生成新的样本,这些转换不仅可以生成可信的图像,而且还反映了真实的场景 —— 稍后将对此进行详细介绍。

这种技术得到了广泛的应用,不仅仅是在训练模型的数据样本太少的情况下。在这种情况下,模型开始记忆训练集,但无法泛化(在从未见过的数据上表现很差)。

通常,当一个模型在训练数据上表现很好,但在验证数据上表现很差时,我们称之为过拟合。为了解决这个问题,我们通常会尝试获取新数据,如果没有可用的新数据,则可以使用数据增强。

:一般的经验法则是始终使用数据增强技术,因为它有助于使我们的模型见识更多的变化并更好地泛化。即使我们有一个很大的数据集,也要使用数据增强,但这是以较慢的训练速度为代价的,因为增强是在线完成的(即在训练期间)。

此外,对于每个任务或数据集,我们必须使用反映可能的现实场景的增强技术(例如,如果我们有一个猫/狗探测器,我们可以使用水平翻转、剪裁、亮度和对比度,因为这些增强匹配不同的照片拍摄方式。

这里是一些Kaggle比赛notebooks,你可以查看流行的数据增强技术:

  • Horizontal Flip:https://www.kaggle.com/datafan07/analysis-of-melanoma-metadata-and-effnet-ensemble
  • Random Rotate and Random Dihedral:https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb
  • Hue, Saturation, Contrast, Brightness, Crop:https://www.kaggle.com/cdeotte/triple-stratified-kfold-with-tfrecords
  • Colour jitter:https://www.kaggle.com/nroman/melanoma-pytorch-starter-efficientnet

模型

be65d126181682b02a8a5559b4cbca9e.png

开发一个基线

在这里,我们使用一个非常简单的架构创建一个基本的模型,没有任何正则化或dropout层,看看我们是否能超过50%的准确率基线。尽管我们不可能总能达到这个目标,但如果我们在尝试了多种合理的架构后不能超过基线,那么输入数据可能不包含模型进行预测所需的信息。

用Jeremy Howard的名言:

“你应该能够在15分钟内使用50%或更少的数据集快速测试你是否正在朝着一个有希望的方向前进,如果没有,你必须重新考虑一切。”

开发一个足够大可以过拟合的模型

一旦我们的基线模型有足够的能力超过基线分数,我们就可以增加基线模型的能力,直到它在数据集上过拟合为止,然后我们就开始应用正则化。我们可以通过以下方式增加模块容量:

  • 添加更多层
  • 使用更好的结构
  • 更完善的训练流程

结构

根据文献,以下架构的改进提高了模型的容量,但几乎没有改变计算复杂度。

  • Residual Networks
  • Wide Residual Networks
  • Inception
  • EfficientNet
  • Swish activation
  • Residual Attention Network

大多数时候,模型容量和精度是正相关的 —— 随着容量的增加,精度也会增加,反之亦然。

训练过程

下面是一些你可以用来调整你的模型的训练过程,通过实例项目来看看它们是如何工作的:

  • Mixed-Precision Training
  • Large Batch-Size Training
  • Cross-Validation Set
  • Weight Initialization
  • Self-Supervised Training (Knowledge Distillation)
  • Learning Rate Scheduler
  • Learning Rate Warmup
  • Early Stopping
  • Differential Learning Rates
  • Ensemble
  • Transfer Learning
  • Fine-Tuning

超参数调试

0873045a4646378c61292b2f3891cc74.gif

与参数不同,hyperparameters是由你在配置模型时指定的(即学习率、epoch的数量、hidden units的数量、batch size大小等)。

你可以通过使用hyperparameter调优库,比如Scikit learn Grid Search,Keras Tuner来自动化这个过程,而不是去手动配置。这些库会在你指定的范围内尝试所有的hyperparameter组合,返回表现最好的模型。

需要调优的超参数越多,过程就越慢,因此最好选择模型超参数的最小子集进行调优。

并不是所有的模型超参数都同样重要。一些超参数会对机器学习算法的行为产生巨大的影响,进而影响其性能。你应该小心地选择那些对模型性能影响最大的参数,并对它们进行调优以获得最佳性能。

正则化

这种方法迫使模型学习有意义和具有泛化能力的数据表示,通过对记忆/过拟合欠拟合进行惩罚来实现,使模型对于它没见过的数据更鲁棒。

解决上述问题的一个简单方法是获得更多的训练数据,因为一个模型训练的数据越多,自然就会泛化得越好。

这里有一些技巧你可以试着减轻过拟合和欠拟合,项目如下:

  • Adding Dropout:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline
  • Adding or changing the position of Batch Norm:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline
  • Data augmentation:https://www.kaggle.com/cdeotte/triple-stratified-kfold-with-tfrecords
  • Mixup:https://arxiv.org/abs/1710.09412
  • Weight regularization:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline
  • Gradient clipping:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline

损失函数

92755ed040705d160578be73e16a6d1e.png

损失函数也被称为成本函数或目标函数,用于查找目标输出的模型之间的差异,并帮助模型最小化它们之间的距离。

这里是一些最流行的损失函数,与项目实例,你会发现一些技巧,以提高你的模型的能力:

  • Label smoothing
  • Focal loss
  • SparseMax loss and Weighted cross-entropy
  • BCE loss, BCE with logits loss and Categorical cross-entropy loss
  • Additive Angular Margin Loss for Deep Face Recognition

评估 + 错误分析

7b86dc270715646f6c80fc0d7d35f326.png

在这里,我们做消融研究,并分析我们的实验结果。我们确定了我们的模型的弱点和长处,并确定了未来需要改进的地方。在这个阶段,你可以使用以下技术,并在链接的示例中查看它们是如何实现的:

  • Tracking metrics and Confusion matrix:https://www.kaggle.com/vincee/intel-image-classification-cnn-keras
  • Grad CAM:https://arxiv.org/pdf/1610.02391v1.pdf
  • Test Time Augmentation (TTA):https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb

有许多实验跟踪和管理工具,采取最小设置为你自动保存所有数据,这使消融研究更容易。

最后

有许多方法来调整你的模型,并且新的想法总是会出现。深度学习是一个快速发展的领域,没有什么灵丹妙药。我们必须做很多实验,足够的试验和错误会带来突破。

英文原文:https://neptune.ai/blog/image-classification-tips-and-tricks-from-13-kaggle-competitions

CVer-学术交流群

建了CVer微信交流群!想要进计算机视觉学习交流群的同学,可以直接加微信号:CVer5555。加的时候备注一下:研究方向+学校+昵称,即可。然后就可以拉你进群了。

强烈推荐大家关注CVer知乎账号和CVer微信公众号,可以快速了解到最新优质的CV论文。

推荐阅读

利用知识蒸馏改进目标检测:面向准确高效的检测器

使用深度学习从视频中估计车辆的速度(已开源)

ECCV 2020 | 旷视开源LabelEnc:提升目标检测的新型中间监督方法

这9个技巧让你的PyTorch模型训练得飞快!

牛津博士论文 | 学习重建和分割3D目标(143页PDF)

谷歌刚刚发布Objectron新数据集,可完美检测3D目标,超过4百万幅图像和15K视频剪辑!

综述 | MIT提出视频理解/行为识别:全面调研(2004-2020)

综述 | 基于无人机的目标跟踪的相关滤波器:全面调研

从三个维度加速你的CNN:全面的剪枝框架

DeformCaps:第一个用于目标检测的可变形胶囊网络

Recall Loss:用于不平衡图像分类和语义分割的召回损失

即插即用!Rotate to Attend:卷积Triplet注意力模块

旷视提出MegDetV2:目标检测/实例分割系统

综述 | 基于深度学习的医学图像分割技术:全面调研

ResNet还是DenseNet?即插即用的DS涨点神器来了!

综述 | 基于深度学习的端到端人脸识别技术:全面调研

TBC:共享Thinner Filters,实现更强的CNN!

综述 | 行人检测技术(从手工特征到深度学习):全面调研

超越EfficientNets!无需注意力,也能让你的网络更快更强!

OpenCV 4.5来了!更强的SIFT,改进RANSAC算法,新增目标跟踪网络SiamRPN++

综述 | 基于深度学习的实时语义分割方法:全面调研

涨点神器!南航提出AFF:注意力特征融合

NeurIPS 2020 | 谷歌大脑提出:重新思考预训练和自训练

NeurIPS 2020 | 用于图像复原/恢复的神经稀疏表示

NeurIPS 2020 | aLRPLoss:统一目标检测中的分类和定位的平衡损失函数

CCE:具有互补交叉熵的不平衡图像分类

谷歌地标检索2020 Kaggle 第一名解决方案

ECCV AIM 2020 真实图像超分辨率挑战赛3项冠军解决方案

LVIS 实例分割挑战赛2020的第一名解决方案:好的Box不能保证好的Mask

ETH Zurich提出DPIR:具有Denoiser先验的即插即用图像恢复

综述 | 人脸图像质量评估:全面调研(2004-2020)

ECCV 2020 | NAS-DIP:通过NAS实现DIP(去噪/去雾/超分辨率/修复等)

TIP 2020 | PNEN:金字塔Non-Local增强型网络

综述 | 小样本学习:全面调研(Few-shot)

MiCo:用于半监督域自适应的Mixup联合训练

使用深度神经网络从Noisy Labels中学习:全面调研

剪枝filter?还是剪枝layer?这是个问题

ECCV 2020 | WeightNet:重新探索Weight网络的设计空间

Mask TextSpotter v3:用于场景文字检测和识别的分割Proposal网络

ECCV 2020 | 魔鬼在细节中:车辆重识别的自监督注意力(SAVER)

ECCV 2020 | 53.5 AP!PAA:用于目标检测的IoU预测的概率Anchor分配

ECCV 2020 | 南京理工提出FPT:特征金字塔Transformer

ECCV 2020 | 长尾数据集中多标签分类的分布平衡损失

ECCV 2020 | BMask R-CNN:边界保持的Mask R-CNN

ECCV 2020 | 即插即用!PSConv:将特征金字塔压缩到紧凑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

miniui datagrid 隐藏列默认赋值_Qt商业组件DataGrid:内置视图和布局详解(一)

QtitanDataGrid是Qt的商业DataGrid组件,它为将表格数据呈现给最终用户提供了真正的非凡可能性。该组件吸收了用于显示表格的用户界面构造领域中的所有现代成就。目前,这是Qt市场上唯一具有如此令人印象深刻的高级功能和出色性能的网格组件。QtitanDataGr…

zookeeper中展示所有节点_分布式协调服务之Zookeeper

??理论篇一、基础概念ZooKeeper是开源分布式协调服务,提供高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。二、ZooKeep…

idea怎么给项目改名_微软改名部惹祸了

IT服务圈儿有温度、有态度的IT自媒体平台作者:局长本文经公众号:开源中国(oschina2013)授权转载,如需转载请联系出处几年前,微软发布了一个名为"GVFS"的项目,这是一个 Git 虚拟文件系统,全称为 G…

@postconstruct注解方法没有执行_被标记为事务的方法互相调用的坑(下)

上一节,主要分析了 被标记为事务的方法互相调用,事务失效的原因,思考比较多,这一节主要说说解决方案,思考会少一些。解决方案的核心: 通过代理对象去调用方法1.把方法放到不同的类:如果想学习Ja…

python argparse_Python 命令行之旅:argparse、docopt、click 和 fire 总结篇

本文首发于HelloGitHub公众号,并发表于Prodesire 博客。一、前言在近半年的 Python 命令行旅程中,我们依次学习了 argparse、docopt、click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变。 本文作为本次旅程的终点&am…

阻塞式和非阻塞式udp传输_NIO非阻塞网络编程三大核心理念

本次开始NIO网络编程,之前已经说过BIO,对于阻塞IO里面的问题一定有了清晰的认识,在JDK1.4版本后,提供了新的JAVA IO操作非阻塞API,用意替换JAVA IO 和JAVA NetWorking相关的API。NIO其实有个名称叫new IO。(一)NIO① 介…

如何查看服务器文件进程,如何查看服务器上的所有进程

如何查看服务器上的所有进程 内容精选换一换华为云SSL证书管理服务帮助中心,为用户提供产品简介、用户指南、常见问题等技术文档,帮助您快速上手使用云证书管理服务。分析辅助软件是一款支持部署到多台服务器目标环境上,实现对整个业务集群的…

python minimize_Python数学规划案例一

Python数学规划案例一问题、模型、数据、算法、结果,统一地表述,是习惯也是效率。我的公众号数学规划模型表述习惯采用五个部分:Set, Data, Variable, Objective, Constraints;每个Notation,采用一个主字符&#xff0c…

java map转string_【库学科技】32道常见的Java基础面试题

内容来源于图灵 侵删。什么是 Java 虚拟机(JVM)?为什么 Java 被称作是“平台无关的编程语言”?Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。Java 被设计成允许应用程序可以运行在任意的平…

cout输出字符串_leetcode C++题解系列-042 字符串相乘

题目给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…

python序列类型举例说明_Python(第八课,序列类型)

引言: 我们之前学过整数,浮点数,字符串,今天带来的更具有包容性。 今天带来的是高级数据类型,包括列表,元组,集合和字典。根据他们特性不同,可以分为序列类型,集合类型&a…

上传附件_留学落户|上传附件预审时一定一定要注意的问题!

点击上方蓝色字体,关注启铭君。www.minqifudao.com启铭君相信大家都知道,从2019年留学落户“一网通办”新系统上线,可以在网上进行材料申报,“让数据多走路,让群众少跑腿”。在新系统中填报资料,怎样才能做…

python斐波那契数列30_python的30个骚操作

1、冒泡排序2、计算x的n次方的方法3、计算a*a b*b c*c ……4、计算阶乘 n!5、列出当前目录下的所有文件和目录名6、把一个list中所有的字符串变成小写:7、输出某个路径下的所有文件和文件夹的路径8、输出某个路径及其子目录下的所有文件路径9、输出某个路径及其子…

python中值滤波介绍_Python 实现中值滤波、均值滤波的方法

红包:Lena椒盐噪声图片:# -*- coding: utf-8 -*- """ Created on Sat Oct 14 22:16:47 2017 author: Don """ from tkinter import * from skimage import io import numpy as np imio.imread(lena_sp.jpg, as_greyTrue) …

竖向图片插入_Word小技巧:让你的图片文字排版更有创意

想在头条中发表文章或者写论文,插入的图片太单调?今天小编就简单跟大家分享几个小技巧,图片搭配文字让你的版面更有可读性。第一种:最简单的横向文字排版具体做法:在word中插入图片后,插入一个文本框后输入…

11有没有压力感应_特殊感应器赋予机械手多维触感

最新研发的机械触感装备,已经不仅具有可伸展的韧性,还具有感知压力、形变和拉力的功能,将为软体机器人、虚拟现实(VR)和现实增强(AR)等设备带来革命性的巨变。美国康乃尔大学(Cornell University)工程学院副教授谢泼德(Rob Shepherd)说&#…

如何用手机打开dcm格式图片_如何防止自己的图片被盗用?这 4 招教你优雅加水印...

出门旅游一趟,好不容易拍到一组相当满意的图片。想要把这些图片上传到社交平台,如何才能让大家一看就知道这是自己拍的作品,同时又防止盗图呢?答案是在图片上加上自己的水印,这次有用功将和大家分享下,如何…

python 堆_面试再问你什么是堆和栈,你就把这篇文章甩给他

栈:管程序如何运行的,程序如何执行,如何处理数据。(局部变量其实也是存在栈中的,引用数据类型在栈中存的是地址引用)(栈的空间就不需要那么大了)堆:管数据存储的。(引用数据类型的存放,所以堆的空间是比较大的)生活理解…

3d 仪表盘_新一代标致2008官图发布 配备3D全息仪表盘

【太平洋汽车网 新车频道】标致发布了新一代2008的官图,新车基于PSA集团的CMP平台打造,采用了标致最新一代的家族式设计语言,造型风格极具辨识度。据悉,新一代2008将提供汽油、柴油和纯电动三种动力版本供消费者选择,其…

python人脸识别程序如何嵌入到app_只用Python就能写安卓,简单几步实现人脸识别的App...

最近闲来无事,研究研究在安卓上跑Python。 想起以前玩过的kivy技术,kivy[1]是一个跨平台的UI框架。当然对我们最有用的是,kivy可以把python代码打包成安卓App。但是由于安卓打包的工具链很长,包括android sdk打包java代码、ndk编译…