
2022年2月24日、ロシアは戦争を宣言し、平和的なウクライナに侵入しました。クリミアの併合とドンバス地域の占領後、プーチン政権はウクライナ国籍を破壊することを決めました。ウクライナ人は激しい抵抗を示し、全世界に国の独立のために戦うことがどのようなものかを示しています。
ウクライナ政府は、ロシアの母親、妻、姉妹がウクライナで殺されたり捕獲されたりするのを支援するためにウェブサイトを立ち上げました-https://200rf.com&https://t.me/rf200_now(テレグラムチャンネル)。私たちの目標は、まだロシアとベラルーシにいる人々に知らせることです。そうすれば、彼らはウクライナを暴行することを拒否します。
「ロシアの世界」がウクライナにもたらしたウクライナ、暴力、および非人道的な恐怖の行為で起こっていることに最大限の暴露を得るのを手伝ってください。これは、この戦争の終了を支援する方法に関する包括的なWikiです:https://how-to-help-ukraine-now.super.site/
公式チャンネル
ウクライナへの栄光!
pytorch-toolbeltは、速いR&DプロトタイプとKaggle農業のためのPytorch用のベルとホイッスルのセットを備えたPythonライブラリです。
ショーケース:Catalyst、Albumentations、Pytorch Toolbeltの例:セマンティックセグメンテーション @ camvid
正直な答えは、「Kaggleのキャリアのためにコードを再利用するための便利な方法が必要でした」です。 2018年にKaggleマスターバッジを達成しましたが、これは長い道のりでした。非常に頻繁に、私は自分が古いパイプラインのほとんどを何度も再利用していることに気づきました。ある時点で、このリポジトリに結晶化しました。
このLIBは、Catalyst / Ignite / Fast.AIハイレベルフレームワークを置き換えることを意図したものではありません。代わりに、それらを補完するように設計されています。
pip install pytorch_toolbelt
バイナリセグメンテーションのためにバニラU-Netモデルを作成するコードスニペットの下。設計上、エンコーダーとデコーダーの両方で、細かい(高解像度、インデックス0 )から粗い(低解像度)機能マップまで、テンソルのリストを作成します。すべての中間機能マップへのアクセスは、中間機能マップへのアクセスが必要なオブジェクト検出タスクのエンコーダデコーダーに深い監督損失を適用する場合に有益です。
from torch import nn
from pytorch_toolbelt . modules import encoders as E
from pytorch_toolbelt . modules import decoders as D
class UNet ( nn . Module ):
def __init__ ( self , input_channels , num_classes ):
super (). __init__ ()
self . encoder = E . UnetEncoder ( in_channels = input_channels , out_channels = 32 , growth_factor = 2 )
self . decoder = D . UNetDecoder ( self . encoder . channels , decoder_features = 32 )
self . logits = nn . Conv2d ( self . decoder . channels [ 0 ], num_classes , kernel_size = 1 )
def forward ( self , x ):
x = self . encoder ( x )
x = self . decoder ( x )
return self . logits ( x [ 0 ])前の例と同様に、接続されてデコーダーをFPNに変更できます。
from torch import nn
from pytorch_toolbelt . modules import encoders as E
from pytorch_toolbelt . modules import decoders as D
class SEResNeXt50FPN ( nn . Module ):
def __init__ ( self , num_classes , fpn_channels ):
super (). __init__ ()
self . encoder = E . SEResNeXt50Encoder ()
self . decoder = D . FPNCatDecoder ( self . encoder . channels , fpn_channels )
self . logits = nn . Conv2d ( self . decoder . channels [ 0 ], num_classes , kernel_size = 1 )
def forward ( self , x ):
x = self . encoder ( x )
x = self . decoder ( x )
return self . logits ( x [ 0 ])pytorch_toolbeltのすべてのエンコーダーは、入力チャネルの数の変化をサポートしています。 encoder.change_input_channels(num_channels)を呼び出すだけで、最初の畳み込み層が変更されます。可能な場合はいつでも、畳み込み層の既存の重みが再利用されます(新しい数のチャネル数がデフォルトよりも大きい場合、新しい重量テンソルはランダムに開始されたWeigthでパディングされます)。クラスメソッドはselfを返すため、この呼び出しはチェーンされる可能性があります。
from pytorch_toolbelt . modules import encoders as E
encoder = E . SEResnet101Encoder ()
encoder = encoder . change_input_channels ( 6 )ニューラルネットワークでモデルを設計し、機能を最適化するとき、高レベルのブロック( encoderやdecoderなど)にパラメーターの数を印刷することは非常に便利であることがわかりました。 pytorch_toolbeltでそれを行う方法は次のとおりです。
from torch import nn
from pytorch_toolbelt . modules import encoders as E
from pytorch_toolbelt . modules import decoders as D
from pytorch_toolbelt . utils import count_parameters
class SEResNeXt50FPN ( nn . Module ):
def __init__ ( self , num_classes , fpn_channels ):
super (). __init__ ()
self . encoder = E . SEResNeXt50Encoder ()
self . decoder = D . FPNCatDecoder ( self . encoder . channels , fpn_channels )
self . logits = nn . Conv2d ( self . decoder . channels [ 0 ], num_classes , kernel_size = 1 )
def forward ( self , x ):
x = self . encoder ( x )
x = self . decoder ( x )
return self . logits ( x [ 0 ])
net = SEResNeXt50FPN ( 1 , 128 )
print ( count_parameters ( net ))
# Prints {'total': 34232561, 'trainable': 34232561, 'encoder': 25510896, 'decoder': 8721536, 'logits': 129}複数の損失を組み合わせる方法は複数あり、Catalystのような高レベルのDLフレームワークはこれを達成するためのより柔軟な方法を提供しますが、ここでは私の100%純粋なPytorchの実装があります。
from pytorch_toolbelt import losses as L
# Creates a loss function that is a weighted sum of focal loss
# and lovasz loss with weigths 1.0 and 0.5 accordingly.
loss = L . JointLoss ( L . FocalLoss (), L . LovaszLoss (), 1.0 , 0.5 )テスト時間の8月(TTA)は、トレーニング段階とテスト段階の両方で使用できます。
from pytorch_toolbelt . inference import tta
model = UNet ()
# 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 )多くの場合、非常に大きな画像(5000px以上)のために画像セグメンテーションを実行する必要があります。このような大きなピクセル配列にはいくつかの問題があります。
ソリューションの1つは、入力画像をタイルにスライスし(オプションでオーバーラップ)、各モデルを介してそれぞれにフィードし、結果を連結することです。このようにして、GPU RAMの使用量の上限を保証し、GPUで任意のサイズの画像を処理する能力を維持できます。
import numpy as np
from torch . utils . data import DataLoader
import cv2
from pytorch_toolbelt . inference . tiles import ImageSlicer , CudaTileMerger
from pytorch_toolbelt . utils . torch_utils import tensor_from_rgb_image , to_numpy
image = cv2 . imread ( 'really_huge_image.jpg' )
model = get_model (...)
# Cut large image into overlapping tiles
tiler = ImageSlicer ( image . shape , tile_size = ( 512 , 512 ), tile_step = ( 256 , 256 ))
# HCW -> CHW. Optionally, do normalization here
tiles = [ tensor_from_rgb_image ( tile ) for tile in tiler . split ( image )]
# Allocate a CUDA buffer for holding entire mask
merger = CudaTileMerger ( tiler . target_shape , 1 , tiler . weight )
# Run predictions for tiles and accumulate them
for tiles_batch , coords_batch in DataLoader ( 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 numpy
merged_mask = np . moveaxis ( to_numpy ( merger . merge ()), 0 , - 1 ). astype ( np . uint8 )
merged_mask = tiler . crop_to_orignal_size ( merged_mask ) @misc{Khvedchenya_Eugene_2019_PyTorch_Toolbelt,
author = {Khvedchenya, Eugene},
title = {PyTorch Toolbelt},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/BloodAxe/pytorch-toolbelt}},
commit = {cc5e9973cdb0dcbf1c6b6e1401bf44b9c69e13f3}
}