TorchVision Transforms API目標(biāo)檢測(cè)實(shí)例語(yǔ)義分割視頻類(lèi)
內(nèi)容導(dǎo)讀
TorchVision Transforms API 擴(kuò)展升級(jí),現(xiàn)已支持目標(biāo)檢測(cè)、實(shí)例及語(yǔ)義分割以及視頻類(lèi)任務(wù)。新 API 尚處于測(cè)試階段,開(kāi)發(fā)者可以試用體驗(yàn)。
本文首發(fā)自微信公眾號(hào):PyTorch 開(kāi)發(fā)者社區(qū)
TorchVision 現(xiàn)已針對(duì) Transforms API 進(jìn)行了擴(kuò)展, 具體如下:
- 除用于圖像分類(lèi)外,現(xiàn)在還可以用其進(jìn)行目標(biāo)檢測(cè)、實(shí)例及語(yǔ)義分割以及視頻分類(lèi)等任務(wù);
- 支持從 TorchVision 直接導(dǎo)入 SoTA 數(shù)據(jù)增強(qiáng),如 MixUp、 CutMix、Large Scale Jitter 以及 SimpleCopyPaste。
- 支持使用全新的 functional transforms 轉(zhuǎn)換視頻、Bounding box 以及分割掩碼 (Segmentation Mask)。
Transforms 當(dāng)前的局限性
穩(wěn)定版 TorchVision Transforms API,也也就是我們常說(shuō)的 Transforms V1,只支持單個(gè)圖像,因此,只適用于分類(lèi)任務(wù):
from torchvision import transforms trans = transforms.Compose([ transforms.ColorJitter(contrast=0.5), transforms.RandomRotation(30), transforms.CenterCrop(480), ]) imgs = trans(imgs)
上述方法不支持需要使用 Label 的目標(biāo)檢測(cè)、分割或分類(lèi) Transforms, 如 MixUp 及 cutMix。這使分類(lèi)以外的計(jì)算機(jī)視覺(jué)任務(wù)都不能用 Transforms API 執(zhí)行必要的擴(kuò)展。同時(shí),這也加大了用 TorchVision 原語(yǔ)訓(xùn)練高精度模型的難度。
為了克服這個(gè)局限性,TorchVision 在其 reference script 中提供了自定義實(shí)現(xiàn), 用于演示所有任務(wù)中的增強(qiáng)是如何執(zhí)行的。
盡管這種做法使得開(kāi)發(fā)者能夠訓(xùn)練出高精度的分類(lèi)、目標(biāo)檢測(cè)及分割模型,但做法比較粗糙,TorchVision 二進(jìn)制文件中還是不能導(dǎo)入 Transforms。
全新的 Transforms API
Transforms V2 API 支持視頻、bounding box、label 以及分割掩碼, 這意味著它為許多計(jì)算機(jī)視覺(jué)任務(wù)提供了本地支持。新的解決方案是一種更為直接的替代方案:
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)
全新的 Transform Class 無(wú)需強(qiáng)制執(zhí)行特定的順序或結(jié)構(gòu),就可以接收任意數(shù)量的輸入:
# 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
functional API 已經(jīng)更新,支持所有輸入必要的 signal processing kernel,如 resizing, cropping, affine transforms, padding 等:
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 subclassing 來(lái)包裝輸入,附加有用的元數(shù)據(jù),并 dispatch 到正確的內(nèi)核。 利用 TorchData Data Pipe 的 Datasets V2 相關(guān)工作完成后,就不再需要手動(dòng)包裝輸入了。目前,用戶(hù)可以通過(guò)以下方式手動(dòng)包裝輸入:
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"])
除新 API 之外,PyTorch 官方還為 SoTA 研究中用到的一些數(shù)據(jù)增強(qiáng)提供了重要實(shí)現(xiàn),如 MixUp、 CutMix、Large Scale Jitter、 SimpleCopyPaste、AutoAugmentation 方法以及一些新的 Geometric、Colour 和 Type Conversion transforms。
該 API 繼續(xù)支持 single image 或 batched input image 的 PIL 和 Tensor 后端,并在 functional API 上保留了 JIT-scriptability。這使得圖像映射得以從 uint8 延遲到 float, 帶來(lái)了性能的進(jìn)一步提升。
它目前可以在 TorchVision 的原型區(qū)域 (prototype area) 中使用,并且支持從 nightly build 版本中導(dǎo)入。經(jīng)驗(yàn)證,新 API 與先前實(shí)現(xiàn)的準(zhǔn)確性一致。
當(dāng)前的局限性
functional API (kernel) 仍然保持 JIT-scriptable 及 fully-BC,Transform Class 提供了相同的接口,卻無(wú)法使用腳本。
這是因?yàn)?Transform Class 使用的是張量子類(lèi) (Tensor Subclassing),且接收任意數(shù)量的輸入,這是 JIT 所不支持的。該局限將在后續(xù)版本中不斷優(yōu)化。
一個(gè)端到端示
以下是一個(gè)新 API 示例,它可以同時(shí)使用 PIL 圖像和張量。
測(cè)試圖片:
代碼示例:
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()
以上就是TorchVision Transforms API目標(biāo)檢測(cè)實(shí)例語(yǔ)義分割視頻類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于TorchVision Transforms API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)一個(gè)數(shù)組除以一個(gè)數(shù)的例子
今天小編就為大家分享一篇Python實(shí)現(xiàn)一個(gè)數(shù)組除以一個(gè)數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07如何利用Python提取pdf中的表格數(shù)據(jù)(附實(shí)戰(zhàn)案例)
從PDF表格中獲取數(shù)據(jù)是一項(xiàng)痛苦的工作,下面這篇文章主要給大家介紹了關(guān)于如何利用Python提取pdf中的表格數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Python中函數(shù)的參數(shù)類(lèi)型詳解
這篇文章主要介紹了Python中函數(shù)的參數(shù)類(lèi)型詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07Python基礎(chǔ)之高級(jí)變量類(lèi)型實(shí)例詳解
這篇文章主要介紹了Python基礎(chǔ)之高級(jí)變量類(lèi)型,結(jié)合實(shí)例形式詳細(xì)分析了Python元組、字典、字符串、公共方法以及遍歷、切片等常見(jiàn)操作技巧,需要的朋友可以參考下2020-01-01學(xué)會(huì)迭代器設(shè)計(jì)模式,幫你大幅提升python性能
這篇文章主要介紹了python 迭代器設(shè)計(jì)模式的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01