Pythorch扩展用于快速研发原型和Kaggle农业
pytorch-toolbelt的Python项目详细描述
Pythorch工具带
apytorch-toolbelt
是一个python库,它为pytorch提供了一组铃声和口哨,用于快速研发原型和kaggle农场:
里面是什么
-
LI>采用灵活的编码器-解码器结构的简易模型构建。
- 模块:coordconv,scse,超柱,反方向可分离卷积等。
- gpu友好的测试时间扩展tta用于分割和分类
- 对大型(5000x5000)图像的GPU友好推断
- 每天常见的例程(修复/恢复随机种子、文件系统实用程序、度量)
- 损失:双星对焦,对焦,缩小对焦,洛瓦兹,提卡和骰子损失,机翼损失等。
- Catalyst库的附加功能(批预测的可视化,其他度量)
展示台:Catalyst, Albumentations, Pytorch Toolbelt example: Semantic Segmentation @ CamVid
为什么
诚实的回答是“我需要一个方便的方法来重用代码,为我的Kaggle职业生涯”。 2018年,我获得了Kaggle Master徽章,这是一条漫长的道路。 我经常发现自己一遍又一遍地重复使用大多数旧管道。 在某个时候,它结晶成了这个储存库。
这个lib不是用来替换catalyst/ignite/fast.ai。相反,它是为了补充它们而设计的。
安装
pip install pytorch_toolbelt
展示
编码器-解码器模型构造
frompytorch_toolbelt.modulesimportencodersasEfrompytorch_toolbelt.modulesimportdecodersasDclassFPNSegmentationModel(nn.Module):def__init__(self,encoder:E.EncoderModule,num_classes,fpn_features=128):self.encoder=encoderself.decoder=D.FPNDecoder(encoder.output_filters,fpn_features=fpn_features)self.fuse=D.FPNFuse()input_channels=sum(self.decoder.output_filters)self.logits=nn.Conv2d(input_channels,num_classes,kernel_size=1)defforward(self,input):features=self.encoder(input)features=self.decoder(features)features=self.fuse(features)logits=self.logits(features)returnlogitsdeffpn_resnext50(num_classes):encoder=E.SEResNeXt50Encoder()returnFPNSegmentationModel(encoder,num_classes)deffpn_mobilenet(num_classes):encoder=E.MobilenetV2Encoder()returnFPNSegmentationModel(encoder,num_classes)
构成多重损失
frompytorch_toolbeltimportlossesasLloss=L.JointLoss(L.FocalLoss(),1.0,L.LovaszLoss(),0.5)
测试时间增加
frompytorch_toolbelt.inferenceimporttta# Truly functional TTA for image classification using horizontal flips:logits=tta.fliplr_image2label(model,input)# Truly functional TTA for image segmentation using D4 augmentation:logits=tta.d4_image2mask(model,input)# TTA using wrapper module:tta_model=tta.TTAWrapper(model,tta.fivecrop_image2label,crop_size=512)logits=tta_model(input)
大图像推断:
importnumpyasnpimporttorchimportcv2frompytorch_toolbelt.inference.tilesimportImageSlicer,CudaTileMergerfrompytorch_toolbelt.utils.torch_utilsimporttensor_from_rgb_image,to_numpyimage=cv2.imread('really_huge_image.jpg')model=get_model(...)# Cut large image into overlapping tilestiler=ImageSlicer(image.shape,tile_size=(512,512),tile_step=(256,256),weight='pyramid')# HCW -> CHW. Optionally, do normalization heretiles=[tensor_from_rgb_image(tile)fortileintiler.split(image)]# Allocate a CUDA buffer for holding entire maskmerger=CudaTileMerger(tiler.target_shape,1,tiler.weight)# Run predictions for tiles and accumulate themfortiles_batch,coords_batchinDataLoader(list(zip(tiles,tiler.crops)),batch_size=8,pin_memory=True):tiles_batch=tiles_batch.float().cuda()pred_batch=model(tiles_batch)merger.integrate_batch(pred_batch,coords_batch)# Normalize accumulated mask and convert back to numpymerged_mask=np.moveaxis(to_numpy(merger.merge()),0,-1).astype(np.uint8)merged_mask=tiler.crop_to_orignal_size(merged_mask)