
في 24 فبراير 2022 ، أعلنت روسيا الحرب وغزت أوكرانيا السلمية. بعد ضم شبه جزيرة القرم واحتلال منطقة دونباس ، قرر نظام بوتين تدمير الجنسية الأوكرانية. يظهر الأوكرانيون مقاومة شرسة ويظهرون للعالم بأسره ما يشبه الكفاح من أجل استقلال الأمة.
أطلقت حكومة أوكرانيا موقعًا على شبكة الإنترنت لمساعدة الأمهات والزوجات والأخوات الروسية في العثور على المحببين الذين قتلوا أو تم القبض عليهم في أوكرانيا - https://200rf.com & https://t.me/rf200_now (قناة Telegram). هدفنا هو إبلاغ أولئك الذين ما زالوا في روسيا و Belarus ، لذلك يرفضون الاعتداء على أوكرانيا.
ساعدنا في الحصول على أقصى قدر من التعرض لما يحدث في أوكرانيا والعنف وأعمال الإرهاب اللاإنسانية التي جلبها "العالم الروسي" إلى أوكرانيا. هذا ويكي شامل حول كيفية المساعدة في إنهاء هذه الحرب: https://how-to-help-ukraine-now.super.site/
القنوات الرسمية
المجد لأوكرانيا!
A pytorch-toolbelt هي مكتبة Python مع مجموعة من الأجراس وصفارات Pytorch للنماذج الأولية للبحث والتطوير السريع وزراعة Kaggle:
عرض: المحفز ، البيع ، Pytorch Toolbelt مثال: التقسيم الدلالي @ camvid
الإجابة الصادقة هي "لقد كنت بحاجة إلى طريقة مريحة لإعادة استخدام التعليمات البرمجية لمهنتي Kaggle". خلال عام 2018 ، حققت شارة Kaggle Master وكان هذا مسارًا طويلًا. في كثير من الأحيان وجدت نفسي أعيد استخدام معظم خطوط الأنابيب القديمة مرارًا وتكرارًا. في مرحلة ما تبلور في هذا المستودع.
لا يهدف هذا lib إلى استبدال المحفز / الإشعال / 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) وسيتم تغيير طبقة الإلتواء الأولى. كلما كان ذلك ممكنًا ، سيتم إعادة استخدام الأوزان الحالية للطبقة التلافيفية (في حالة أن عدد جديد من القنوات أكبر من الافتراضي ، سيتم وضع موتر للوزن الجديد مبطئًا مع 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 طريقة أكثر مرونة لتحقيق ذلك ، ولكن إليك تطبيق Pytorch بنسبة 100 ٪ من لي:
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 )في كثير من الأحيان ، هناك حاجة إلى تنفيذ تجزئة الصور للصورة الكبيرة الهائلة (5000 بكسل وأكثر). هناك بعض المشاكل مع مثل هذه المصفوفات الكبيرة بكسل:
أحد الحلول هو تقطيع صورة الإدخال إلى البلاط (متداخلة اختياريًا) وتغذية كل منها من خلال نموذج وتسلسل النتائج مرة أخرى. وبهذه الطريقة ، يمكنك ضمان الحد الأعلى لاستخدام RAM GPU ، مع الحفاظ على القدرة على معالجة الصور التعسفية على 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}
}