
24 февраля 2022 года Россия объявила войну и вторглась в мирную Украину. После аннексии Крыма и оккупации региона Донбаса режим Путина решил уничтожить украинскую гражданство. Украинцы демонстрируют жесткое сопротивление и демонстрируют всему миру, каково это бороться за независимость страны.
Правительство Украины запустило веб -сайт, чтобы помочь российским матерям, женам и сестрам найти своих любимых убитых или захваченных в Украине - https://200rf.com & https://t.me/rf200_now (канал телеграммы). Наша цель - информировать тех, кто все еще в России и Беларуси, поэтому они отказываются нападать на Украину.
Помогите нам получить максимальное воздействие на то, что происходит в Украине, насилие и бесчеловечных актах террора, которые «российский мир» принес в Украину. Это всеобъемлющее вики о том, как вы можете помочь положить конец этой войне: https://how-to-help-ukraine-now.super.site/
Официальные каналы
Слава Украине!
pytorch-toolbelt -это библиотека Python с набором наворотов и свистков для Pytorch для быстрого прототипа R & D и фермерского хозяйства Kaggle:
Витрина: катализатор, ликументирование, пример для инструментов Pytorch: семантическая сегментация @ camvid
Честный ответ: «Мне нужен был удобный способ повторного использования кода для моей карьеры Kaggle». В течение 2018 года я достиг значка Kaggle Master, и это был долгий путь. Очень часто я снова и снова обнаруживал, что снова и снова использую большинство старых трубопроводов. В какой -то момент он кристаллизовался в этот репозиторий.
Эта LIB не предназначена для замены каркасов Catalyst / Ignite / Fast.ai высокого уровня. Вместо этого он предназначен для их дополнения.
pip install pytorch_toolbelt
Ниже фрагмент кода, который создает ванильную модель U-Net для бинарной сегментации. По дизайну как Encoder, так и Decoder создают список тензоров, от Fine (индексированное 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 с Intatenation.
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) , и первый слой свертки будет изменен. Когда это возможно, существующие веса сверточного слоя будут повторно использованы (в случае, если новое количество каналов больше, чем дефолт, новый тензор веса будет сочетается с случайно инициализированными Weigths). Метод класса возвращает 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}Существует несколько способов объединить несколько потерь, а каркасы DL высокого уровня, такие как Catalyst, предлагают гораздо более гибкий способ достижения этого, но вот 100%-ная реализация Pytorch Mine:
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 )Время испытания Augmetnation (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 и больше). Есть несколько проблем с такими большими массивами пикселей:
Одним из решений является нарезка входного изображения на плитки (опционально перекрытие) и подавать каждый через модель и объединить результаты назад. Таким образом, вы можете гарантировать верхний предел использования графических оперативных памяти, сохраняя при этом способность обрабатывать изображения произвольного размера на графическом процессоре.
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}
}