HyperAI

تم ترقية واجهة برمجة تطبيقات TorchVision Transforms بشكل كبير لدعم اكتشاف الكائنات وتجزئة المثيلات/الدلالات ومهام الفيديو

منذ 2 أعوام
معلومة
Jiaxin Sun
特色图像

مقدمة المحتوى: تم توسيع واجهة برمجة تطبيقات TorchVision Transforms وترقيتها لدعم اكتشاف الكائنات وتجزئة المثيلات والدلالات ومهام الفيديو. لا تزال واجهة برمجة التطبيقات الجديدة في مرحلة الاختبار ويمكن للمطورين تجربتها.

تم نشر هذه المقالة لأول مرة على WeChat: مجتمع مطوري PyTorch

أدخل وصف الصورة هنا

تم توسيع TorchVision باستخدام Transforms API. التفاصيل هي كما يلي:

  • بالإضافة إلى تصنيف الصور، يمكن الآن استخدامه لمهام مثل اكتشاف الكائنات، وتجزئة المثيلات والدلالات، وتصنيف الفيديو؛
  • دعم استيراد بيانات SoTA المتزايدة مباشرة من TorchVision، مثل MixUp، وCutMix، وLarge Scale Jitter، وSimpleCopyPaste.
  • يدعم استخدام التحويلات الوظيفية الجديدة لتحويل مقاطع الفيديو ومربعات التحديد وأقنعة التجزئة.

القيود الحالية للتحويلات

الإصدار المستقر من TorchVision Transforms API، المعروف أيضًا باسم Transforms V1،يدعم صورة واحدة فقط، وبالتالي فهو مناسب فقط لمهام التصنيف:

from torchvision import transforms
trans = transforms.Compose([
   transforms.ColorJitter(contrast=0.5),
   transforms.RandomRotation(30),
   transforms.CenterCrop(480),
])
imgs = trans(imgs)

لا تدعم الطرق المذكورة أعلاه اكتشاف الكائنات أو تقسيمها أو تصنيفها التحويلات التي تتطلب استخدام العلامات. مثل MixUp وcutMix. يجعل هذا من المستحيل تنفيذ الامتدادات اللازمة باستخدام واجهة برمجة التطبيقات Transforms لمهام الرؤية الحاسوبية الأخرى غير التصنيف. في نفس الوقت،وهذا يجعل أيضًا من الصعب تدريب النماذج عالية الدقة باستخدام العناصر البدائية TorchVision.

وللتغلب على هذا القيد،يوفر TorchVision تنفيذًا مخصصًا في البرنامج النصي المرجعي الخاص به. يتم استخدامه لإظهار كيفية إجراء التحسينات في جميع المهام.

على الرغم من أن هذا النهج يسمح للمطورين بتدريب نماذج التصنيف والكشف عن الكائنات والتجزئة عالية الدقة، إلا أنه نهج بدائي.لا تزال التحويلات غير قابلة للاستيراد في الملف الثنائي TorchVision.

واجهة برمجة تطبيقات التحويلات الجديدة

يدعم Transforms V2 API الفيديو، ومربع التحديد، والعلامة، وقناع التجزئة. وهذا يعني أنه يوفر دعمًا أصليًا للعديد من مهام الرؤية الحاسوبية. الحل الجديد هو بديل أكثر مباشرة:

from torchvision.prototype import transforms
# Exactly the same interface as V1:
trans = transforms.Compose([
    transforms.ColorJitter(contrast=0.5),
    transforms.RandomRotation(30),
    transforms.CenterCrop(480),
])
imgs, bboxes, labels = trans(imgs, bboxes, labels)

يمكن لفئة التحويل الجديدة قبول أي عدد من المدخلات دون فرض ترتيب أو هيكل محدد:

# Already supported:
trans(imgs)  # Image Classification
trans(videos)  # Video Tasks
trans(imgs_or_videos, labels)  # MixUp/CutMix-style Transforms
trans(imgs, bboxes, labels)  # Object Detection
trans(imgs, bboxes, masks, labels)  # Instance Segmentation
trans(imgs, masks)  # Semantic Segmentation
trans({"image": imgs, "box": bboxes, "tag": labels})  # Arbitrary Structure
# Future support:
trans(imgs, bboxes, labels, keypoints)  # Keypoint Detection
trans(stereo_images, disparities, masks)  # Depth Perception
trans(image1, image2, optical_flows, masks)  # Optical Flow

تم تحديث واجهة برمجة التطبيقات الوظيفية لدعم جميع مدخلات نواة معالجة الإشارة الضرورية، مثل تغيير الحجم، والقص، والتحويلات الأفينية، والحشو، وما إلى ذلك:

from torchvision.prototype.transforms import functional as F
# High-level dispatcher, accepts any supported input type, fully BC
F.resize(inpt, resize=[224, 224])
# Image tensor kernel
F.resize_image_tensor(img_tensor, resize=[224, 224], antialias=True)
# PIL image kernel
F.resize_image_pil(img_pil, resize=[224, 224], interpolation=BILINEAR)
# Video kernel
F.resize_video(video, resize=[224, 224], antialias=True)
# Mask kernel
F.resize_mask(mask, resize=[224, 224])
# Bounding box kernel
F.resize_bounding_box(bbox, resize=[224, 224], spatial_size=[256, 256])

تستخدم واجهة برمجة التطبيقات (API) فئة فرعية من Tensor لتغليف المدخلات، وإرفاق البيانات الوصفية المفيدة، وإرسالها إلى النواة الصحيحة. بمجرد الانتهاء من عملك مع Datasets V2 باستخدام TorchData Data Pipe، لن تحتاج بعد الآن إلى تغليف مدخلاتك يدويًا. حاليًا، يستطيع المستخدمون تغليف المدخلات يدويًا بالطرق التالية:

from torchvision.prototype import features
imgs = features.Image(images, color_space=ColorSpace.RGB)
vids = features.Video(videos, color_space=ColorSpace.RGB)
masks = features.Mask(target["masks"])
bboxes = features.BoundingBox(target["boxes"], format=BoundingBoxFormat.XYXY, spatial_size=imgs.spatial_size)
labels = features.Label(target["labels"], categories=["dog", "cat"])

بالإضافة إلى واجهة برمجة التطبيقات الجديدة، قدم مسؤولو PyTorch أيضًا تنفيذات مهمة لبعض تحسينات البيانات المستخدمة في أبحاث SoTA، مثل MixUp، وCutMix، وLarge Scale Jitter، وSimpleCopyPaste، وطرق AutoAugmentation، وبعض التحويلات الجديدة للتحويل الهندسي واللون والنوع.

تستمر واجهة برمجة التطبيقات في دعم واجهات PIL وTensor الخلفية للصورة الفردية أو صورة الإدخال المجمعة، وتحتفظ بإمكانية برمجة JIT على واجهة برمجة التطبيقات الوظيفية.يتيح هذا تأجيل تعيين الصورة من uint8 إلى float. أدى إلى مزيد من التحسن في الأداء.

إنه متاح حاليًا في منطقة النموذج الأولي لـ TorchVision ويمكن استيراده من الإصدارات الليلية.تم التحقق من أن واجهة برمجة التطبيقات الجديدة تتوافق مع دقة التنفيذ السابق.

القيود الحالية

تظل واجهة برمجة التطبيقات الوظيفية (النواة) قابلة للبرمجة بواسطة JIT وBC بالكامل، وتوفر فئة التحويل نفس الواجهة، ولكن لا يمكن برمجتها.

يرجع السبب في ذلك إلى أن Transform Class يستخدم Tensor Subclassing ويقبل عددًا عشوائيًا من المدخلات، وهو ما لا يدعمه JIT. سيتم تحسين هذا القيد بشكل مستمر في الإصدارات اللاحقة.

من النهاية إلى النهاية

فيما يلي مثال لواجهة برمجة التطبيقات الجديدة التي يمكنها العمل مع كل من صور PIL والموترات.

صورة الاختبار:

أدخل وصف الصورة هنا
مثال على الكود:

import PIL
from torchvision import io, utils
from torchvision.prototype import features, transforms as T
from torchvision.prototype.transforms import functional as F
# Defining and wrapping input to appropriate Tensor Subclasses
path = "COCO_val2014_000000418825.jpg"
img = features.Image(io.read_image(path), color_space=features.ColorSpace.RGB)
# img = PIL.Image.open(path)
bboxes = features.BoundingBox(
    [[2, 0, 206, 253], [396, 92, 479, 241], [328, 253, 417, 332],
     [148, 68, 256, 182], [93, 158, 170, 260], [432, 0, 438, 26],
     [422, 0, 480, 25], [419, 39, 424, 52], [448, 37, 456, 62],
     [435, 43, 437, 50], [461, 36, 469, 63], [461, 75, 469, 94],
     [469, 36, 480, 64], [440, 37, 446, 56], [398, 233, 480, 304],
     [452, 39, 463, 63], [424, 38, 429, 50]],
    format=features.BoundingBoxFormat.XYXY,
    spatial_size=F.get_spatial_size(img),
)
labels = features.Label([59, 58, 50, 64, 76, 74, 74, 74, 74, 74, 74, 74, 74, 74, 50, 74, 74])
# Defining and applying Transforms V2
trans = T.Compose(
    [
        T.ColorJitter(contrast=0.5),
        T.RandomRotation(30),
        T.CenterCrop(480),
    ]
)
img, bboxes, labels = trans(img, bboxes, labels)
# Visualizing results
viz = utils.draw_bounding_boxes(F.to_image_tensor(img), boxes=bboxes)
F.to_pil_image(viz).show()

-- زيادة--