如何霸榜口罩佩戴检测竞赛,看这篇就够了!

图片的Size size一般越大越好,因为越大的图片检测中的漏检应该越少,而且p40有24g显存,显存不是问题 但是图片太大又会导致训练速度太慢耗费太多积分 所以经过权衡,我选择把图片的min_size和max_size设置到了1000和1500 直接在fasterrcnn_resnet50_fpn这个函数中指定这两个值就可以 Anchor Size的选择模版中使用的是默认的anchor设置,即15种,比例分别为0.5、1、2大小分别为32、64、128、256、512由于之前把图片放得很大,anchor的size也需要重新调整来适应放大了的annotation,调整后的gt框变大,默认的anchorbox也需要同时进行放大,但是放大的倍数也不能靠感觉,在这里,我参考了YOLOv2、v3中使用K-means聚类方法,计算anchor的5个size和对应的3个ratio聚类是指把集合分组成多个类,每个类中的对象都是彼此相似的,K-means是聚类中最常用的方法之一它是基于点与点距离的相似度来计算最佳类别归宿最终聚类得到的size和ratio分别为134、256、386、519、770和1.03、1.29、1.90,使用聚类找出比较接近ground truth的先验anchor可以加速模型的收敛Focal LossFocal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡和难易样本的问题.这个损失函数降低了大量简单负样本在训练中所占的权重,可以理解为一种困难样本挖掘虽然对于fasterrcnn来说正负样本不存在严重失衡的问题,但是Fasterrcnn还是存在hard example 和easy example的问题,为了应对这个问题,我使用了focal loss替换了cross entropy loss,根据我的观察,使用focal loss大约可以带来两分的提升选择优质的模型主要通过大量上传同一个模型,求出得分的均值和标准差,再根据均值和标准差计算模型得高分的概率,通过这个概率来判断模型的好坏,最终选择最好的模型继续大量上传。

4

PyTorch

Faster-RCNN

Liyw·2020-04-01 21:55阅读 114

实测超轻量中文OCR开源项目,总模型仅17M

想要试试中文 OCR?这个项目可以考虑,轻量模型,不需要 GPU 也能跑得动。光学字符识别(OCR)现在已经有很广泛的应用了,很多开源项目都会嵌入已有的 OCR 项目来扩展能力,例如 12306 开源抢票软件,它就会调用其它开源 OCR 服务来识别验证码。很多流行的开源项目,其背后或多或少都会出现 OCR 的身影。如果要说到中文 OCR,像身份证识别、火车票识别都是常规操作,它也可以实现更炫酷的功能,例如翻译笔在书本上滑动一行,自动获取完整的图像,并识别与翻译中文。目前比较常用的中文 OCR 开源项目是 chineseocr,它基于 YOLO V3 与 CRNN 实现中文自然场景文字检测及识别,目前该项目已经有 2.5K 的 Star 量。而本文介绍的是另一个新 开源的中文 OCR 项目,它基于 chineseocr 做出改进,是一个超轻量级的中文字符识别项目。项目地址:https://github.com/ouyanghuiyu/chineseocr_lite该 chineseocr_lite 项目表示,相比 chineseocr,它采用了轻量级的主干网络 PSENet,轻量级的 CRNN 模型和行文本方向分类网络 AngleNet。尽管要实现多种能力,但 chineseocr_lite 总体模型只有 17M。目前 chineseocr_lite 支持任意方向文字检测,在识别时会自动判断行文本方向。我们可以先看看项目作者给出的效果示例:可以看到,chineseocr_lite 在横排文字和竖排文字的识别上都有不错的效果,而且它提供的交互式网页端能直接在页面插入图像与调用识别模型。为了进一步挖掘该轻量级模型的效果,机器之心也上手测试了一番。项目实测由于Docker能够提供一个不依赖主机操作系统的隔离空间,并且兼具良好的安全性与可移植性,我们决定在Docker下对该轻量级模型进行测试。至于测试过程中的环境配置与采坑过程,后文会一一道来。先看看使用作者项目里自带图片的测试效果。识别结果与项目里提供的类似,这里耗时较长主要是由于我们测试时没有使用 GPU 的缘故。下面我们找一些其它图片来测试一下它的效果。可以看到该模型对于常规印刷字体的识别效果还是很好的。接下来我们决定找一个书法图片为难一下它,竟然一个也没有识别对?不过对于这样一个主打超轻量,总模型大小不超过 20M 的 OCR 项目来说,还要啥自行车。Docker 环境搭建我们的运行环境Ubuntu 18.04 Python 3.6.9 Pytorch 1.5.0.dev20200227+cpu(作者推荐 1.2.0)首先下载 Docker 镜像。这里推荐使用咱们中国人自己做的镜像 deepo,一行代码傻瓜式安装 tensorflow、pytorch、darknet 等目前最新的深度学习框架。deepo 链接:https://hub.docker.com/r/ufoym/deepo当安装好 Docker 后,用以下代码获取包含所有深度学习框架的镜像:docker pull ufoym/deepo在这里我们使用猪厂提供的国内源来加速下载:docker pull hub-mirror.c.163.com/ufoym/deepo在高校的小伙伴推荐使用如下中科大的源,尽享丝般顺滑,10M/s 不是梦!docker pull docker.mirrors.ustc.edu.cn/ufoym/deepo拉取完镜像后我们新建一个容器开始配置环境,使用如下命令新建容器并进入交互模式:docker run -it -p 6666:8080 -v ~/Desktop/data/:/data --name ocr 18824ddf5d2d这里 docker run 表示创建容器,-it 表示创建容器后立刻进入交互模式,-p 表示进行端口映射,这里我们将主机 6666 的端口映射到容器的 8080 端口。-v 表示共享数据,我们将主机桌面上名为 data 的文件夹与容器共享,并将其在容器上挂载为/data,--name 表示将新建的容器命名为 ocr,18824ddf5d2d 为刚才下载镜像的 ID,可使用 docker images 命令进行查看。现在我们就进入到容器里了,输入 ls 就可看到我们与容器共享的文件夹/data 了。cd 到/data 文件夹下拉取 chineseocr_lite 项目:git clone https://github.com/ouyanghuiyu/chineseocr_lite作者很 nice 得提供了运行程序的依赖环境,cd 到 chineseocr_lite 下进行安装:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt这里我们使用了清华的源进行加速。依赖环境装好了,python3 app.py 8080 走起!出现以下输出表示网页服务已成功启动。需要注意的是,我们在创建容器时将主机的 6666 端口映射到了容器的 8080 端口,所以在浏览器里我们应该输入 http://127.0.0.1:6666/ocr (http://127.0.0.1:8080/ocr),出现如下界面:踩坑指南机器之心也将测试这个项目过程中踩过的坑记录了下来,避免各位对这个项目感兴趣的小伙伴中同样的招。当在容器里安装好 requirement 就万事大吉了吗?不存在的,电脑表示不出错是不可能的,这辈子都不可能不报错。直接运行后出现如下错误:原因是缺少共享文件库,使用如下方法解决:再运行出现这样的错误:遂使用 apt-get install libxrender1 与 apt install python-qt4 安装之。进行这样一番操作之后,就可以顺利运行了。完结撒花~文章转载至公众号:机器之心

1

视觉计算

AI小助手·2020-04-02 20:41阅读 21

浅谈“水下鱼类物种识别”比赛经验

首先声明,我是一个人工智能新手,不是大神,所以得分不会特别高,在此也只是想结识更多学习人工智能的朋友,一起探讨学习下.1. 首先对于数据观察,训练样本分类数量极度不平衡,尝试过很多平衡样本的方法,但是对于提升最终得分好像没有效果,(我猜测可能是最终的测试样本也是不平衡的的)2.最重要的是模型的选择,我使用的是pytorch官方实现的一个resnet50,使用了官方的预训练模型(flyai也提供了相关下载连接,下载模型更快)https://www.flyai.com/models然后把最后一个全连接修改成对应的分类数量fc_inputs = model.fc.in_features model.fc = nn.Sequential( nn.Linear(fc_inputs, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, 21))3.学习率,这个我认为是所有超参数中最重要的,我曾经做一个项目,模型一摸一样,就是学习率选错了,别人的得分就有八十多,我就只有零点几,我建议选择0.001,并用余弦退火衰减学习率,torch里面有相关函数,直接调用就好.# 采用SGDOptimizer为网络优化器,定义如下: optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9, weight_decay=2e-4) scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=40, eta_min=1e-7, last_epoch=-1)基本上我最主要做的就是以上步骤,得分最后到达了99分以上,但是最后零点几分,用了很多方法怎么也上不去了,在此也希望大家可以多探讨,多交流.

2

图像分类

乐百事·2020-04-03 16:12阅读 23

【经典网络模型】基于GUI实践AlexNet图像识别与分类

1、简介《ImageNet Classification with Deep Convolutional Neural Networks》是Hinton和他的学生Alex Krizhevsky在2012 年 ImageNet挑战赛中使用的模型结构,刷新Image Classification 的错误率,从此深度学习方法在Image这块开始一次次超过state-of-art,甚至于搭到打败人类的地步,看这边文章的过程中,发现了很多以前零零散散看到的一些优化技术,但是很多没有深入了解。2、AlexNet的基本结构Alexnet总共包括8层,其中前5层CNN卷积层,后面3层是FC全连接层,文章里面说的是减少任何一个卷积结果会变得很差,下面具体讲讲每一层的构成:第一层卷积层:输入图像为224*224*3的图像,使用了96个kernels(96,11,11,3),以4个Pixel为一个单位来右移或者下移,然后进行Response-Normalized(其实是Local Response Normalized,后面会继续介绍)和pooling,alexnet里面采样了两个GPU,所以从图上面看第一层卷积层厚度有两部分,池化pool_size=(3,3),滑动步长为2个pixels。第二层卷积层:使用256个(同样,分布在两个GPU上,每个128kernels(5*5*48)),做pad_size(2,2)的处理,以1个pixel为单位移动(感谢网友指出),能够产生27*27个卷积后的矩阵框,做LRN处理,然后pooled,池化以3*3矩形框,2个pixel为步长,得到256个13*13个features。第三层、第四层:都没有LRN和pool,第五层只有pool,其中第三层使用384个kernels(3*3*256,pad_size=(1,1),得到256*15*15,kernel_size为(3,3),以1个pixel为步长,得到256*13*13);第四层使用384个kernels(pad_size(1,1)得到256*15*15,核大小为(3,3)步长为1个pixel,得到384*13*13);第五层使用256个kernels(pad_size(1,1)得到384*15*15,kernel_size(3,3),得到256*13*13,pool_size(3,3)步长2个pixels,得到256*6*6)。全连接层:前两层分别有4096个神经元,最后输出Softmax为1000个(ImageNet)。3、创新型技术提出3.1、ReLU Nonlinearity一般来说,刚接触神经网络还没有深入了解深度学习的小伙伴们对这个都不会太熟,一般都会更了解另外两个激活函数(真正往神经网络中引入非线性关系,使神经网络能够有效拟合非线性函数)tanh(x)和(1+e^(-x))^(-1),而ReLU(Rectified Linear Units) f(x)=max(0,x)。基于ReLU的深度卷积网络比基于tanh的网络训练块数倍,下图是一个基于CIFAR-10的四层卷积网络在tanh和ReLU达到25%的training error的迭代次数:实线、间断线分别代表的是ReLU、tanh的training error,可见ReLU比tanh能够更快的收敛3.2、Training on Multiple GPUs这一部分和摘要说的差不多,就是那个图上部分用一个GPU算,下部分用另一个GPU算。3.3、Local Response Normalization这部分讲的是局部响应归一化 的这个正则化的方法。首先给出它的公式:(x,y)是神经元(kernel)所在的位置a_(x,y)^i是(x,y)这个位置下经过第i个神经元运算后的结果。k称为偏移量α为放缩的比列系数β同理也是一个影响归一化的超参数中间∑的部分可以理解成这样:保证取相邻的n个神经元(核)来做归一化。局部归一化的作用是分别减少了top-1 1.4%,top-5 1.2%的错误率。在CIFAR-10数据集上验证了这个方案的有效性:没有归一化的四层CNN取得了13%的错误率,而使用归一化取得了11%的错误率。3.4、Overlapping Pooling通俗地讲,重叠池化和普通池化不同的地方就是,重叠池化的步长比核的长和宽都要小,这样就会导致下一步的池化的像素点和上一步的池化的像素点有重叠,故称为重叠池化。CNN中的池化层使用相同的映射函数来总结出神经元相邻组的输出,总结的内容可以是均值,最大值等。一般而言,相邻池化单元的区域是不重叠的。更确切的说,池化层可看作由池化单元网格组成,网格间距为s个像素,这里的s就是step,每个网格归纳池化单元中心位置z×z大小的邻居。如果设置s = z,我们会得到通常在CNN中采用的传统局部池化。如果设置s < z,我们会得到重叠池化。这就是我们网络中使用的方法,设置s = 2,z = 3。这个方案与非重叠方案s = 2, z = 2相比,分别降低了top-1 0.4%,top-5 0.3%的错误率,两者的输出维度是相等的。我们在训练过程发现,采用重叠池化的模型更难以过拟合。4、Reducing Overfitting实践技术应用由于神经网络的结构存在6千万个参数 尽管ILSVRC的1000类使每个训练样本从图像到标签的映射上强加了10比特的约束,但这不足以学习这么多的参数而没有相当大的过拟合。它使用了两种方式来避免过拟合。4.1、Data Augmentation数据增强第一种数据增强方式包括产生图像平移和水平翻转。我们从256× 256图像上通过随机提取224 × 224的图像块(以及这些图像块的水平翻转)实现了这种方式,然后在这些提取的图像块上进行训练,最终的训练样本是高度相关的。没有这个方案,我们的网络会有大量的过拟合,这会迫使我们使用更小的网络。在测试时,网络会提取5个224 × 224的图像块(四个角上的图像块和中心的图像块)和它们的水平翻转(因此总共10个图像块)进行预测,然后对网络在10个图像块上的softmax层的预测结果进行平均。第二种数据增强方式包括改变训练图像的RGB通道的强度。具体地,我们在整个ImageNet训练集上对RGB像素值集合(一个pixel有三个值RGB也就是(224 * 224)* 3 这么大的矩阵,224 * 224是行数,3是列数),执行主成分分析(PCA)。对于每幅训练图像,我们这个大矩阵的主成分,大小成正比的对应特征值乘以一个随机变量,随机变量通过均值为0,标准差为0.1的高斯分布得到。4.2、DropoutDropout,它会以0.5的概率对每个隐层神经元的输出设为0。那些用这种方式“丢弃”的神经元不再进行前向传播并且不参与反向传播。因此每次输入时,神经网络会采样一个不同的架构,但所有架构共享权重。这个技术减少了复杂的神经元互适应,因为一个神经元不能依赖特定的其它神经元的存在。因此,神经元被强迫学习更鲁棒的特征,这让它在与许多不同层的神经元的连接时更为有效。在测试时,我们使用所有的神经元它们的输出乘以0.5,这是对指数级的dropout网络的预测分布的几何平均一种合理的估计。5、基于GUI界面的AlexNet图像分类实践该项目目的是为了验证AlexNet对于图像分类的效果,以及基于不同阈值设定的结果对比,同时为了方便大家看到好的呈现效果,使用了GUI可视化的功能。5.1、项目目录5.2、 网络结构搭建5.3、数据预处理5.4、训练结果展示5.5、基于GUI测试部分通过以上GUI显示结果可以看出,整个网络结构对于整体的预测算是正确的,但是还是不够全面,也会出现错误,这个能也是AlexNet选择大卷积核的局限。本文转载公众号:AI人工智能初学者

5

图像分类

AlexNet

AI小助手·2020-03-31 18:59阅读 59

参赛总结分享给大家,共同交流和进步!

首先申明一下自己是初学者,接触深度学习不到一年,希望通过比赛结识更多志同道合的同仁,共同交流和进步!作为经典的场景分类问题,该题具有较好的应用价值,相关的研究和比赛也很多,有兴趣的同仁可以进一步检索一下。  赛题难点分析赛题选取的数据量和尺寸较大,训练集达到80000多,测试集未知,图片分辨率不一,平均在512*512左右,且比赛平台并没有公开数据来源,无法构造完全等价的线下测试环境,同时,选择何种图片采样手段、分辨率没有先验标准,需要耐心的设计实验去选取。因此每一个版本的训练时间较长,平均在10-20小时左右才能看出显著的效果,需要耐心和一定的经验;类别45个,比赛评价指标为每类F1的平均值(macro avg),理论上类别越多难度越大,可能需要关注样本是否存在不平衡的现象,或者不同类别的分类难度是否存在较大的差异;另外,从示例图片观察,某些场景可能还存在二义性、混淆,甚至疑似错误标注,数据质量相比其他遥感数据有一定差别;场景分类可能是细粒度、粗粒度兼有的一种分类问题,轮廓、纹理、对象分布可能都跟分类有关,具体选取那种Backbone,从已有的文献和开源项目看,没有一个统一的标准,所以还得暴力去试。     总之,该题的挑战就是,每一次调参周期长,数据质量分布不一致容易过拟合,要在有限的时间、积分条件下尽可能找到一个较好的网络架构、学习率、优化器、批次和迭代次数大小的组合。     核心思路在实际的模型开发和实验迭代中:深度学习框架选取了keras,线下实验环境下载了NWPU-RESISC45数据集来模拟赛题(http://www.escience.cn/people/JunweiHan/NWPU-RESISC45.html),该数据集30000多样本,选20000做训练,10000做测试,自己的方法大概能做到96.6的准确率。预处理方面,因为没有均值和标准差的信息,同时该数据集与ImageNet有一定差别,所以直接用最大最小缩放中心化来处理,图片大小选取了224、256、320、384四种组合进行测试。模型选择方面,由于平台特性和限制,分别试验了DenseNet、ResNet、Inception v3、Inception ResNet v2进行比较。同时也发现,尽管样本多达80000,但从头训练还不足以提取和学习到足够的特征,因此一律采用预训练权重。数据增强,为了缓解过拟合,综合运用了Flip,Rotate,Zoom等手段,这个环节主要通过线下调参得到,不一定是最优的增强策略。损失函数,用到了标签平滑技术,比较成熟和常见的手段了。优化器和学习率的控制,Keras自带的Adam,学习率用到了Warmup Scheduler。没有用到后处理、测试增强和模型集成。应该还有提升空间。     比赛经验总结多试验,多看大牛代码找灵感。经验和技巧相比大牛还是有较大差距,希望能够得到大牛的指正。声明:该代码仅用于供大家学习所用,整体思想和原创代码请勿直接拿来参赛、开发商业产品、学术发表,本人保留所有原创代码的商业收益权、学术发表权。

11

PyTorch

SENet

YY·2020-03-31 18:53阅读 106

图像分类、识别炼丹心得(我不是骗键盘的小林子)

纯分享,有不足,还望指正首先声明本人自去年九月接触FlyAI,未拿过第一,只想单纯分享经验,一个梦想致力于开源路上的小男孩。但是平台可以帮人快速成长是一点没错的,当你看到诸多优秀的人,你会有一种为什么我不行的错觉,这篇文章就是希望帮你找到你在图像分类中可能忽视的细节。当第一次做图像分类的步骤应该是啥?观察数据:数据长什么样,标签几类啊,图像大小啊。数据增强:最开始最好什么也没有,或者肉眼感觉可以做的数据增强(仅限部分赛题,肉眼和CNN理解存在差距)模型选择:resnet,densenet,efficientnet个人最常用的三种,选择一个浅层的开始。观察性能:有了数据,模型,然后就提交看一下可以获得多少分啊!看了分数之后,发现怎么和第一差好多我该怎么办?我模型不对,我换个模型试试?我数据增强不好,我改一改?注意,我想说的是,以上这两条再单模的时候十分关键,模型和数据增强很大一部分决定了你的分数上限,所以在调参的时候可以跑一编常用的模型res34-50-101;wrn-50-101等等等,在换模型的时候注意不要改动数据增强了。然后你在修改数据增强,找到一个最好的数据增强。这个时候就有小伙伴问了,什么是最好的数据增强?如果你fai足够,你就尝试自己认为可能的数据增强,找到一个合适的。自己写好数据增强好,自己把增强后的数据画出来看看,如果差距同类中的太多,肯定不行啊!当你遇到瓶颈后,你可以分析bad case,看一下怎样的数据增强可以让其预测正确?(我在很多分类经验中都看到过这一点,虽然我从来没用过,因为我是个懒人)补充一点比较关键的optimizer和 lr_scheduler如果你不知道如何使用优化器:Adam,学习率3e-4。如果你不明白学习率递减策略: ReduceLROnPlateau(patience通常3、4)和余弦学习率选一个数据增强,模型都说完了,怎么上分才是关键啊,一下我就列举我在FlyAI,用到过的所有Trick(pytorch)。数据重新划分:官方给的是6:2,第一步我默认直接0.1或者0.2,这点我觉得也是大多数人默认的技术了。标签平滑:适用于有噪声的标签,我在标签种类多的比赛中常用,少的几乎不用,来自于经验。个人取舍!样本平衡:几乎不用,大部分评估指标acc(因此你可以揣测测试样本也是如此的,过大的权重不利于样本多的类更准确)。如果你非要用,搜索ImbalancedDatasetSampler即可使用。warmup:最开始我用小的学习率训练,防止一开始底层的权重被拉偏了。当数据量较少的时候我会使用。当数据量很大的时候,我通常为了剩fai这里就不做过多的设置。搜索GradualWarmupScheduler即可使用cutout以及随机擦除:这里有时候是涨分点,例如你画我猜的时候就很好用。这个trick在pytorch的transforms中自带了,可想而知,这个还是常用的。Mixup:我看到已经有大佬分享这个了,我只能说,用这个我从来没有上过分,不知道是不是自己太菜了!!所以,这个大家自己试试。在尝试的时候注意,如果你已经用到了cutout的话,再用是不是有点就不好了,个人理解。分层学习率:backbone和fc使用不同的学习率,这点我感觉和warmup有点相似之处,所以大家各取所好就好。具体实现可以自己写网络类,或者根据网络层的名字在optimizer里指定。Dropout和BN:抑制过拟合的好手段,将最后的fc前面加一层DP或者BN,或者自己重新写一下FC。这里分享以下,我以前Keras,后来Pytorch,所以在修改fc的时候有点不适应。后来发现只需要 nn.Sequential( nn.Dropout(0.2),nn.Linear(nfs, cfg.num_class) )即可。TTA:测试增强,这也是几乎必用的手段,没有副作用(在不要求复杂度的情况下)。模型预测的时候,使用数据增强的多张照片,取结果的平均值。这里的数据增强,我通常直接使用训练时候的数据增强。如果你分析了bad case在这里修改一下增强效果,涨分利器。模型融合:Flyai2.0更加开放,使得模型融合变得非常简单,所以不妨试一下,你会发现新大陆,就像我在X肺炎检测里说的,在过拟合的情况下,通常能带来稳定的涨点,也是各路比赛要求的。交叉验证:这里就和模型融合有点类似,区别在于数据上而已,使用不同的数据训练多个模型。有时候也是涨点利器。今天就分享这么多,以后可能会更新,怎么合理使用这些技巧呢?每次都试一遍不是 太扯淡了吗?这里要说的就是,当你看了很多心得,你发现为啥感觉大家说来说去就这么多,我好像都明白,但是为什么我的分数不如别人呢?哈哈,我也有同样的问题,这其中有运气的成分,但不可否认别人的经验和技术的差距,随便一个参数(例如学习率)别人设置的可能就比你设置的结果好一些。不乏大佬可以重新修改底层网络结构,所以在抱怨的时候,为何不去尝试一点新的东西,不分析一下bad case呢?例如最新的cbam,res2net,cutmix,别的数据增强包啊,优秀的预训练模型啊,kaggle就有你画我猜原题目啊,对吧?如果觉得我说的有用,就给我点个赞吧!PS:本人懒人,以上trick我在接触平台的时候就已经开始收集各种实现方式了,很多大佬也是如此。所以你看,同样一个题目,别人可能直接修改少量的参数就比较有好的效果了,所以把好用的就封装起来,下次直接用,祝大家可以取得高分。

14

PyTorch

ResNet

DenseNet

EfficientNet

小林子·2020-03-30 18:26阅读 276

基于PyTorch的X光片检测患者肺炎

基于对肺部感染检测的技术研究,可通过人工智能技术对医学影像-X光片进行患病情况检测,有效提升确诊准确率和效率;本赛题主要是对肺部X光片患病结果进行分类,共4个患病类别,数据集划分比例为6:2:2;问题分析首先查看原始图片的视觉特点,这里要注意人的直觉和CNN本质上还是有区别的,所以直觉上的对数据增强并不一定有效。图片不会出现垂直翻转严格上来说不会有水平翻转图片被缩放到224,224,可能已经损失了一些信息属于单通道灰度图片分析数据标签和数量:数据分为四类训练数据总量约18000左右数据存在不平衡现象数据增强通过观察数据,采用以下数据增强手段水平翻转,严格上不允许,但考虑到左右肺部的不完全对称性小幅度的旋转小幅度的平移小幅度的缩放模型设计最初模型采用深度较少的Resnet34,训练速度快,在后续的实验中也一直采用,为了抑制过拟合,在最后的分类前加了Dropout=0.2,性能略有提升。本问题模型准确度提升比较明显的技巧预测过程中使用TTA,也就是测试时间增强,对增强后的结果直接取平均加权模型融合,一开始不以为模型融合涨点明显,但是使用后发现涨点关键。经验分享去年九月开始,平台的模板可以帮助快速上手机器学习,参加比赛的目的主要是想提升自己,这个过程比较锻炼自己的代码能力和查文献能力。看到之前的分享,从寻找相关领域的论文开始,然后一步一步提升准确率..

4

PyTorch

EfficientNet

ResNet

DenseNet

小林子·2020-03-26 12:41阅读 320

基于PyTorch工程利器解析遥感影像分类任务,小白必看!

本赛题共有45个类别,涉及多分类问题。必定会存在样本不平衡问题。核心思路数据预处理:每个类别的样本个数不一样,故采用Imbalanced Dataset Sampler调整每个类别的权重最后使得整个样本群每个类别平衡。以下是 Label Smoothing 的代码:class ImbalancedDatasetSampler(torch.utils.data.sampler.Sampler): ㅤdef __init__(self, dataset, indices=None, num_samples=None): ㅤㅤㅤself.indices = list(range(len(dataset))) ㅤㅤㅤㅤㅤif indices is None else indices ㅤㅤㅤself.num_samples = len(self.indices) ㅤㅤㅤㅤㅤif num_samples is None else num_samples   # distribution of classes in the dataset ㅤㅤㅤlabel_to_count = {} ㅤㅤㅤfor idx in self.indices: ㅤㅤㅤㅤㅤtry: ㅤㅤㅤㅤㅤㅤㅤlabel = self._get_label(dataset, idx) ㅤㅤㅤㅤㅤㅤㅤif label in label_to_count: ㅤㅤㅤㅤㅤㅤㅤㅤlabel_to_count[label] += 1 ㅤㅤㅤㅤㅤㅤㅤelse: ㅤㅤㅤㅤㅤㅤㅤㅤlabel_to_count[label] = 1 ㅤㅤㅤㅤㅤexcept: ㅤㅤㅤㅤㅤㅤㅤpass ㅤ ㅤㅤㅤ# weight for each sample ㅤㅤㅤweights = [1.0 / label_to_count[self._get_label(dataset, idx)] ㅤㅤㅤㅤㅤㅤㅤㅤㅤfor idx in self.indices] ㅤㅤㅤself.weights = torch.DoubleTensor(weights) ㅤ ㅤdef _get_label(self, dataset, idx): ㅤㅤㅤdataset_type = type(dataset) ㅤㅤㅤif dataset_type is torchvision.datasets.MNIST: ㅤㅤㅤㅤㅤreturn dataset.train_labels[idx].item() ㅤㅤㅤelif dataset_type is torchvision.datasets.ImageFolder: ㅤㅤㅤㅤㅤreturn dataset.imgs[idx][1] ㅤㅤㅤelse: ㅤㅤㅤㅤㅤreturn np.argmax(dataset.labels[idx]) ㅤ ㅤdef __iter__(self): ㅤㅤㅤreturn (self.indices[i] for i in torch.multinomial( ㅤㅤㅤㅤㅤself.weights, self.num_samples, replacement=True)) ㅤ ㅤdef __len__(self): ㅤㅤㅤreturn self.num_samples数据增强:采用随机裁剪,随机旋转,随机翻转,随机擦除 模型选择:senet154,够强大的Baseline模型优化:Loss:基于CrossEntropy进行Label Smooth操作class CrossEntropyLabelSmooth(nn.Module): ㅤdef __init__(self, num_classes, epsilon=0.1, use_gpu=True): ㅤㅤㅤsuper(CrossEntropyLabelSmooth, self).__init__() ㅤㅤㅤself.num_classes = num_classes ㅤㅤㅤself.epsilon = epsilon ㅤㅤㅤself.use_gpu = use_gpu ㅤㅤㅤself.logsoftmax = nn.LogSoftmax(dim=1) ㅤ ㅤdef forward(self, inputs, targets): ㅤㅤㅤlog_probs = self.logsoftmax(inputs) ㅤㅤㅤtargets = torch.zeros(log_probs.size()).scatter_(1, targets.unsqueeze(1).data.cpu(), 1) ㅤㅤㅤif self.use_gpu: targets = targets.cuda() ㅤㅤㅤtargets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes ㅤㅤㅤloss = (- targets * log_probs).mean(0).sum() ㅤㅤㅤreturn lossLearning Rate:warm up模型集成;没采用此方法,单模型单尺度测试得到的结果比赛经验总结多看知乎上面的大佬分享,多动手多实践。多看论文,多关注一些最新的主流方法,其实通用的Trick就那么多,比如看到目标检测的Trick其实很多时候都可以用在分割或者识别上,很多任务都是共通的。 采用最强大Baseline进行网络训练才可以取得更高的分数。打比赛的时候先把Baseline设置好,再进行添砖加瓦,把一些骚操作用起来。 Warm Up 能涨一个点,Label Smooth 能涨一个点, Imbalanced Dataset Sampler能涨一个点,随机擦除能涨一个点。对这些Trick要铭记于心,不管在什么任务上都可以用的。 Triplet Loss在图像分类上也有不容忽视的作用,因为时间关系没有加上,之后大家也可以试试。

54

PyTorch

SENet

heshuting555·2020-03-25 23:02阅读 247

你画我猜赛题不可错过的"炼丹"技巧,迅速带你涨分!!

为了增强人工智能的趣味性,我们开展了你画我猜这一竞赛。你画我猜数据集中包括了40种生活中常见的类别如飞机、苹果、篮球等。图片信息以json格式存储,在每个json中记录了用户每一笔简笔画对应的横坐标集合和纵坐标集合。其中训练集、验证集和测试集划分比例为6:2:2.以下为给的json示例:{"drawing": [[[18, 21, 15, 17, 23], [255, 185, 106, 97, 89]], [[17, 7, 3, 0, 9, 19, 29, 40, 41, 30, 28], [70, 60, 50, 26, 4, 0, 12, 39, 49, 75, 88]], [[28, 25, 22, 13, 11, 14, 15, 7, 11], [63, 10, 67, 53, 30, 17, 28, 63, 58]]]}可以看到数据给的格式是用户绘画是的点的顺序。由于本人对nlp不是很熟悉,因此将此问题转化为图像分类问题。具体就是将这些点在(256, 256, 3)大小的图像上面显示。可视化结果如下:数据预处理将给的json数据格式转化为图片格式,然后以图片分类的思路进行分类。数据增强训练的时候使用随机翻转、随机尺度以及mixup来进行数据增强。 mixup是一种非常规的数据增强方法,一个和数据无关的简单数据增强原则,其以线性插值的方式来构建新的训练样本和标签。最终对标签的处理如下公式所示,这很简单但对于增强策略来说又很不一般。实现mixup数据增强很简单,其实我个人认为这就是一种抑制过拟合的策略,增加了一些扰动,从而提升了模型的泛化能力。def get_batch(x, y, step, batch_size, alpha=0.2):     candidates_data, candidates_label = x, y     offset = (step * batch_size) % (candidates_data.shape[0] - batch_size)     train_features_batch = candidates_data[offset:(offset + batch_size)]     train_labels_batch = candidates_label[offset:(offset + batch_size)]     if alpha == 0:         return train_features_batch, train_labels_batch     if alpha > 0:         weight = np.random.beta(alpha, alpha, batch_size)         x_weight = weight.reshape(batch_size, 1, 1, 1)         y_weight = weight.reshape(batch_size, 1)         index = np.random.permutation(batch_size)         x1, x2 = train_features_batch, train_features_batch[index]         x = x1 * x_weight + x2 * (1 - x_weight)         y1, y2 = train_labels_batch, train_labels_batch[index]         y = y1 * y_weight + y2 * (1 - y_weight)         return x, y而模型增前后的效果如下:模型选择模型选择上面采用先小模型验证代码流程,后用大模型涨分的策略。首先使用resnet18模型可以快速验证想法的正确性,将模型表达能力增强放在最后一步提升。使用resnet18可以达到84的准确率。最终使用的senet154则可以将准确率提升到91.5左右。模型优化模型优化使用SGD算法,采用动量优化,权重衰减0.0001.具体代码如下:optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=lr, momentum=0.9, weight_decay=0.0001, nesterov=True)学习率使用带有warmup的的余弦退火动态调整。其示意如下:参考链接:深度学习 | 训练网络trick——mixup最后的总结首先要使用一个简单的基础模型将流程跑通,得到一个baseline。之后在baseline的基础上添加测试训练技巧,这样可以快速涨分!!

5

PyTorch

ResNet

SENet

FastAI可解释性差·2020-03-25 22:34阅读 322

FasterRCNN在口罩佩戴检测任务中的上分技巧~

国家卫生健康委疾控局近日发布了《预防新型冠状病毒感染的肺炎口罩使用指南》,指南中明确指出口罩是预防呼吸道传染病的重要防线,可以降低新型冠状病毒感染风险。口罩不仅可以防止病人喷射飞沫,降低飞沫量和喷射速度,还可以阻挡含病毒的飞沫核,防止佩戴者吸入。因此在全民抗疫时期,在公共场所佩戴口罩等防护装备已成为防疫常识。数据集对应的标签数据说明:每行格式为 x_min, y_min, x_max, y_max, label。其中label为0表示没有佩戴口罩,label为1表示有佩戴口罩。整个过程使用的网络框架:FasterRCNN,使用ResNet-50-FPN提取分层特征,FPN适用于小物体检测。训练时,使用FasterRCNN_ResNet50_FPN预训练模型;   数据预处理方式:对数据进行归一化处理; 数据增广方式:调整(resize)图像和检测框的大小; 旋转(rotate)图像和对应的标签; 添加均值为0,方差为0.001的高斯噪声; 添加高斯模糊;调整图像的亮度,对比度,饱和度,使其分别上下浮动30%; 获取数据方式: a,b,c为0-1之间随机的浮点数; 当a<=0.2时,对图像添加高斯模糊核为9*9,sigmaX=0.5,sigmaY=0.3的高斯模糊; 当a>=0.8时,对图像添加均值为0,方差为0.001的高斯噪声; 当b<=0.2时,调整(resize)图像和检测框的大小; 当c<=0.2时,给定角度旋转范围(-35,35),对图像和标签在该范围内做相应的旋转;  超参数设置:学习率=0.0029 Batch_Size=1 Epoches=9;    优化器:采用SGD(随机梯度下降法)对网络中的参数进行迭代更新; 考虑到数据集特点为无约束场景下的人脸图片,且人脸角度多样,因此对图像进行旋转处理当旋转角度范围过小时,旋转操作对模型不起作用,当旋转角度过大时,旋转操作会对模型起负作用,通过大量实验选定最佳旋转角度范围为(-35,35);光照情况复杂,因此调整图像的亮度,对比度,饱和度,使其分别上下浮动30%; 图片清晰度和分辨率参差不齐,因此对图像添加噪声和模糊操作; 图片中人脸大小不一致,因此添加resize操作; 通过实验,我们还发现当数据增广方式较少时,学习率设置为0.001比较好,但此时模型精度不高;当增加数据增广方式时,学习率设置为0.003左右,模型精度会提升,且学习率为0.0029时,模型精度达到最佳。 

12

Faster-RCNN

PyTorch

cbj·2020-03-25 22:25阅读 416
没有更多了