作者丨Derrick Mwiti
来源丨AI公园
极市平台编辑
作者参加了39个Kaggle比赛,按照整个比赛的顺序,总结了赛前数据处理、模型训练、后处理等。tips和tricks,现在和大家分享很多技巧和经验。
想象一下,如果你能得到一切tips和tricks,你需要参加一个Kaggle比赛。我已经超过39个了。Kaggle包括:
Data Science Bowl 2017 – $1,000,000
Intel & MobileODT Cervical Cancer Screening – $100,000
2018 Data Science Bowl – $100,000
Airbus Ship Detection Challenge – $60,000
Planet: Understanding the Amazon from Space – $60,000
APTOS 2019 Blindness Detection – $50,000
Human Protein Atlas Image Classification – $37,000
SIIM-ACR Pneumothorax Segmentation – $30,000
Inclusive Images Challenge – $25,000
现在把这些知识挖出来给你!
外部数据
使用 LUng Node Analysis Grand Challenge 因为这个数据集包含放射学标记的细节。
使用 LIDC-IDRI 数据,因为它描述了肿瘤的所有放射学。
使用Flickr CC,维基百科通用数据集
使用Human Protein Atlas Dataset
使用IDRiD数据集
数据探索和直觉
使用0.5的阈值对3D聚类分割
确认训练集和测试集的标签分布是否不同
预处理
使用DoG(Difference of Gaussian)方法进行blob检测,使用skimage中的方法。
使用基于patch为了减少训练时间,训练输入。
使用cudf不要使用加载数据Pandas,因为读数据更快。
确保所有图像都有相同的方向。
对比度限制用于平衡直方图。
使用OpenCV通用图像预处理。
采用自动主动学习,添加手工标记。
将所有图像缩放成相同的分辨率,使用相同的模型扫描不同的厚度。
将扫描图像归一化为3D的numpy数组。
采用暗通道先验法对单个图像进行图像除雾。
将所有图像转化成单位(放射学概念)。
使用RGBY找到冗余图像的匹配系数。
开发采样器,使标签更加均衡。
伪标签测试图像以提高分数。
将图像/Mask降采样到320x480。
平衡直方图(CLAHE)的时候使用kernel size为32×32
将DCM转化为PNG。
当有冗余图像时,计算每个图像md5 hash值。
数据增强
使用 albumentations 进行数据增强。
随机旋转90度。
水平翻转,上下翻转。
可尝试较大的几何变换:弹性变换、仿射变换、样条仿射变换、枕形变换。
使用随机HSV。
使用loss-less增强泛化,防止有用的图像信息大loss。
应用channel shuffling。
数据增强是基于类别频率的。
使用高斯噪声。
对3D图像使用lossless重排数据增强。
0到45度随机旋转。
从0.8到1.2随机缩放。
亮度变换。
随机变化hue和饱和度。
使用D4:https://en.wikipedia.org/wiki/Dihedral_group增强。
对比度限制用于平衡直方图。
使用AutoAugment:https://arxiv.org/pdf/1805.09501.pdf增强策略。
模型
结构
使用U-net适应3作为基础结构的调整D的输入。
使自动化主动学习并添加人工标注。
使用inception-ResNet v2 architecture结构使用不同的感受野训练特征。
使用Siamese networks进行对抗训练。
使用_ResNet50_, Xception, Inception ResNet v2 x 5,最后一层用全连接。
使用global max-pooling layer,无论什么输入尺寸,返回固定长度的输出。
使用stacked dilated convolutions。
VoxelNet。
在LinkNet的跳跃连接中将相加替换为拼接和conv1x1。
Generalized mean pooling。
使用224x224x3的输入,用Keras NASNetLarge从头训练模型。
使用3D卷积网络。
使用ResNet152作为预训练的特征提取器。
将ResNet的最后的全连接层替换为3个使用dropout的全连接层。
在decoder中使用转置卷积。
使用VGG作为基础结构。
使用C3D网络,使用adjusted receptive fields,在网络的最后使用64 unit bottleneck layer 。
使用带预训练权重的UNet类型的结构在8bit RGB输入图像上提升收敛性和二元分割的性能。
使用LinkNet,因为又快又省内存。
MASKRCNN
BN-Inception
Fast Point R-CNN
Seresnext
UNet and Deeplabv3
Faster RCNN
SENet154
ResNet152
NASNet-A-Large
EfficientNetB4
ResNet101
GAPNet
PNASNet-5-Large
Densenet121
AC-GAN
XceptionNet (96), XceptionNet (299), Inception v3 (139), InceptionResNet v2 (299), DenseNet121 (224)
AlbuNet (resnet34) from ternausnets
SpaceNet
Resnet50 from selim_sef SpaceNet 4
SCSEUnet (seresnext50) from selim_sef SpaceNet 4
A custom Unet and Linknet architecture
FPNetResNet50 (5 folds)
FPNetResNet101 (5 folds)
FPNetResNet101 (7 folds with different seeds)
PANetDilatedResNet34 (4 folds)
PANetResNet50 (4 folds)
EMANetResNet101 (2 folds)
RetinaNet
Deformable R-FCN
Deformable Relation Networks
硬件设置
Use of the AWS GPU instance p2.xlarge with a NVIDIA K80 GPU
Pascal Titan-X GPU
Use of 8 TITAN X GPUs
6 GPUs: 2_1080Ti + 4_1080
Server with 8×NVIDIA Tesla P40, 256 GB RAM and 28 CPU cores
Intel Core i7 5930k, 2×1080, 64 GB of RAM, 2x512GB SSD, 3TB HDD
GCP 1x P100, 8x CPU, 15 GB RAM, SSD or 2x P100, 16x CPU, 30 GB RAM
NVIDIA Tesla P100 GPU with 16GB of RAM
Intel Core i7 5930k, 2×1080, 64 GB of RAM, 2x512GB SSD, 3TB HDD
980Ti GPU, 2600k CPU, and 14GB RAM
损失函数
Dice Coefficient ,因为在不均衡数据上工作很好。
Weighted boundary loss 目的是减少预测的分割和ground truth之间的距离。
MultiLabelSoftMarginLoss 使用one-versus-all损失优化多标签。
Balanced cross entropy (BCE) with logit loss 通过系数来分配正负样本的权重。
Lovasz 基于sub-modular损失的convex Lovasz扩展来直接优化平均IoU损失。
FocalLoss + Lovasz 将Focal loss和Lovasz losses相加得到。
Arc margin loss 通过添加margin来最大化人脸类别的可分性。
Npairs loss 计算y_true 和 y_pred之间的npairs损失。
将BCE和Dice loss组合起来。
LSEP – 一种成对的排序损失,处处平滑因此容易优化。
Center loss 同时学习每个类别的特征中心,并对距离特征中心距离太远的样本进行惩罚。
Ring Loss 对标准的损失函数进行了增强,如Softmax。
Hard triplet loss 训练网络进行特征嵌入,最大化不同类别之间的特征的距离。
1 + BCE – Dice 包含了BCE和DICE损失再加1。
Binary cross-entropy – log(dice) 二元交叉熵减去dice loss的log。
BCE, dice和focal 损失的组合。
BCE + DICE - Dice损失通过计算平滑的dice系数得到。
Focal loss with Gamma 2 标准交叉熵损失的升级。
BCE + DICE + Focal – 3种损失相加。
Active Contour Loss 加入了面积和尺寸信息,并集成到深度学习模型中。
1024 * BCE(results, masks) + BCE(cls, cls_target)
Focal + kappa – Kappa是一种用于多类别分类的损失,这里和Focal loss相加。
ArcFaceLoss — 用于人脸识别的Additive Angular Margin Loss。
soft Dice trained on positives only – 使用预测概率的Soft Dice。
2.7 * BCE(pred_mask, gt_mask) + 0.9 * DICE(pred_mask, gt_mask) + 0.1 * BCE(pred_empty, gt_empty) 一种自定义损失。
nn.SmoothL1Loss()。
使用Mean Squared Error objective function,在某些场景下比二元交叉熵损失好。
训练技巧
尝试不同的学习率。
尝试不同的batch size。
使用SGD + 动量 并手工设计学习率策略。
太多的增强会降低准确率。
在图像上进行裁剪做训练,全尺寸图像做预测。
使用Keras的ReduceLROnPlateau()作为学习率策略。
不使用数据增强训练到平台期,然后对一些epochs使用软硬增强。
冻结除了最后一层外的所有层,使用1000张图像进行微调,作为第一步。
使用分类别采样
在调试最后一层的时候使用dropout和增强
使用伪标签来提高分数
使用Adam在plateau的时候衰减学习率
用SGD使用Cyclic学习率策略
如果验证损失持续2个epochs没有降低,将学习率进行衰减
将10个batches里的最差的batch进行重复训练
使用默认的UNET进行训练
对patch进行重叠,这样边缘像素被覆盖两次
超参数调试:训练时候的学习率,非极大值抑制以及推理时候的分数阈值
将低置信度得分的包围框去掉。
训练不同的卷积网络进行模型集成。
在F1score开始下降的时候就停止训练。
使用不同的学习率。
使用层叠的方法用5 folds的方法训练ANN,重复30次。
评估和验证
按类别非均匀的划分训练和测试集
当调试最后一层的时候,使用交叉验证来避免过拟合。
使用10折交叉验证集成来进行分类。
检测的时候使用5-10折交叉验证来集成。
集成方法
使用简单的投票方法进行集成
对于类别很多的模型使用LightGBM,使用原始特征。
对2层模型使用CatBoost。
使用 ‘curriculum learning’ 来加速模型训练,这种训练模式下,模型先在简单样本上训练,再在困难样本上训练。
使用ResNet50, InceptionV3, and InceptionResNetV2进行集成。
对物体检测使用集成。
对Mask RCNN, YOLOv3, 和Faster RCNN 进行集成。
后处理
使用test time augmentation ,对一张图像进行随机变换多次测试后对结果进行平均。
对测试的预测概率进行均衡化,而不是使用预测的类别。
对预测结果进行几何平均。
在推理的时候分块重叠,因为UNet对边缘区域的预测不是很好。
进行非极大值抑制和包围框的收缩。
在实例分割中使用分水岭算法后处理来分离物体。
本文仅做学术分享,如有侵权,请联系删文。
1.面向自动驾驶领域的多传感器数据融合技术
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进4.国内首个面向工业级实战的点云处理课程5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)
9.从零搭建一套结构光3D重建系统[理论+源码+实践]
10.单目深度估计方法:算法梳理与代码实现
11.自动驾驶中的深度学习模型部署实战
12.相机模型与标定(单目+双目+鱼眼)
13.重磅!四旋翼飞行器:算法与实战
14.ROS2从入门到精通:理论与实战
15.国内首个3D缺陷检测教程:理论、源码与实战
16.基于Open3D的点云处理入门与实战教程
扫码添加小助手微信,可
一定要备注:
▲长按加微信群或投稿
▲长按关注公众号
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、答疑解惑、助你高效解决问题