ویژگی تصویر

معرفی کتابخانه torchvision در پایتون

  /  پایتون   /  کتابخانه torchvision در پایتون
بنر تبلیغاتی الف

کتابخانه torchvision بخشی از اکوسیستم PyTorch است که برای پردازش تصویر، دسترسی به دیتاست‌های رایج، مدل‌های از پیش‌آموزش‌دیده و ابزارهای کمکی طراحی شده است. این کتابخانه به پژوهشگران و مهندسین یادگیری عمیق کمک می‌کند تا سریع‌تر پروتوتایپ بسازند و از امکانات آماده برای مسائل طبقه‌بندی، تشخیص شی و تقسیم‌بندی استفاده کنند.

چرا torchvision مهم است؟

  • دسترسی آسان به دیتاست‌های استاندارد (CIFAR، ImageNet، COCO و غیره).
  • مدل‌های از پیش‌آموزش‌دیده برای راه‌اندازی سریع و فاین‌تیون.
  • ابزارهای تبدیل (transforms) برای افزایش داده و پیش‌پردازش ورودی‌ها.
  • ماژول‌های IO و عملکردهای بهینه برای پردازش تصاویر و ویدیو.

نصب

معمولاً torchvision را همراه با همان نسخه‌ی PyTorch نصب می‌کنیم تا با CUDA/CPU سازگار باشد:

pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu118

این فرمان برای سیستمی با CUDA 11.8 است. برای نسخه‌های دیگر CUDA یا نصب CPU باید آدرس شاخه مناسب را از صفحه رسمی PyTorch انتخاب کنید.

ماژول‌های اصلی و توضیحات

ماژولکاربرد
torchvision.datasetsلود دیتاست‌های استاندارد و رابط‌هایی مانند ImageFolder
torchvision.transformsتبدیلات ورودی: نرمال‌سازی، تغییر اندازه، افزایش داده
torchvision.modelsمدل‌های از پیش‌آموزش‌دیده (ResNet, MobileNet, EfficientNet و غیره)
torchvision.ioخواندن/نوشتن تصویر و ویدیو با عملکرد بالا
torchvision.opsعملیات اختصاصی مثل NMS، roi_align برای تشخیص شی

مثال عملی: pipeline ساده با CIFAR10

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465),
                         (0.2023, 0.1994, 0.2010))
])

train_ds = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_ds, batch_size=128, shuffle=True, num_workers=4, pin_memory=True)

توضیح: این کد دیتاست CIFAR10 را دانلود کرده و با استفاده از یک سلسله تبدیل شامل افقی‌برگردان، بریده تصادفی، تبدیل به تنسور و نرمال‌سازی آماده می‌کند. DataLoader با batch_size=128 و num_workers=4 برای بارگذاری موازی انتخاب شده است. گزینه pin_memory هنگام استفاده از GPU مفید است تا انتقال داده‌ها سریع‌تر باشد.

فاین‌تیون یک مدل از پیش‌آموزش‌دیده (ResNet18)

import torch
from torchvision import models, transforms
from torch import nn, optim

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = models.resnet18(pretrained=True)
model.fc = nn.Linear(model.fc.in_features, 10)  # برای 10 کلاس CIFAR10
model = model.to(device)

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

توضیح: ابتدا ResNet18 از پیش‌آموزش‌دیده بارگذاری می‌شود. لایه خروجی (fc) با یک لایه جدید متناسب با تعداد کلاس‌های مسئله جایگزین می‌گردد تا مدل را برای طبقه‌بندی CIFAR10 فاین‌تیون کنیم. سپس مدل و بهینه‌ساز آماده آموزش می‌شوند. معمولاً در فاین‌تیون لایه‌های پایین‌تر را با lr کمتر یا حتی فریز می‌کنند تا از تغییر شدید وزن‌های عمومی جلوگیری شود.

بهبود و نکات عملیاتی

  • برای دیتاست‌های بزرگ از num_workers بالا استفاده کنید (بسته به هسته‌های CPU).
  • در آموزش با GPU از pin_memory=True استفاده کنید تا نقل‌وانتقال حافظه سریع‌تر شود.
  • اگر از مدل‌های detection/segmentation استفاده می‌کنید، به قالب ورودی و اندازه تصویر توجه کنید (مثلاً Faster R-CNN ورودی متفاوت دارد).
  • برای افزایش دقت، از تکنیک‌هایی مانند MixUp، CutMix یا AutoAugment که در torchvision.transforms امکان‌شان هست (یا به‌صورت کتابخانه‌های اضافه)، بهره ببرید.

قابلیت‌های پیشرفته: detection، segmentation و ops

torchvision مدل‌های آماده مانند fasterrcnn_resnet50_fpn، maskrcnn_resnet50_fpn و deeplabv3_resnet50 را ارائه می‌دهد که برای تشخیص شی و تقسیم‌بندی مناسب‌اند. ماژول torchvision.ops شامل توابعی مثل nms، roi_align و deform_conv است که برای پیاده‌سازی مدل‌های سفارشی ضروری‌اند.

نمونه: بارگذاری مدل تشخیص شی و inference

from torchvision import models, transforms
from PIL import Image
import torch

model = models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval().to('cuda')

img = Image.open('image.jpg').convert('RGB')
tf = transforms.Compose([transforms.ToTensor()])
input_tensor = tf(img).unsqueeze(0).to('cuda')

with torch.no_grad():
    outputs = model(input_tensor)

توضیح: این قطعه مدل Faster R-CNN را بارگذاری کرده و یک تصویر را برای inference آماده می‌کند. خروجی شامل جعبه‌ها، برچسب‌ها و امتیازهای هر تشخیص است. توجه کنید ورودی مدل detection نیازی به نرمال‌سازی مطابق ImageNet ندارد چون مدل داخلی ممکن است نرمال‌سازی را خودش مدیریت کند—پیش از استفاده مستندات مدل را بررسی کنید.

سازگاری نسخه‌ها و تغییرات API

نسخه‌های torchvision ممکن است API‌هایی مانند transforms یا مدل‌ها را تغییر دهند. در ورژن‌های جدید، یک API جدید transforms.v2 معرفی شده است که امکان زنجیره‌ای و اجرای بهینه‌تر تبدیل‌ها را فراهم می‌کند. همیشه مستندات و یادداشت انتشار (release notes) را بررسی کنید تا از تغییرات مهم آگاه شوید.

نکات عیب‌یابی و بهترین تمرین‌ها

  • اگر با خطای cuda out of memory روبه‌رو شدید، اندازه batch را کاهش دهید یا از mixed precision (AMP) استفاده کنید.
  • برای آموزش توزیع‌شده از DistributedDataParallel همراه با sampler مناسب استفاده کنید.
  • هنگام استفاده از دیتاست‌های سفارشی، از ImageFolder یا نوشتن کلاس Dataset از torch.utils.data.Dataset استفاده کنید و متدهای __len__ و __getitem__ را به دقت پیاده‌سازی کنید.

خلاصه و پیشنهادات کاربردی

torchvision یک ابزار بسیار کاربردی برای هر کسی است که با داده‌های تصویری در PyTorch کار می‌کند. از دیتاست و تبدیل‌های آماده تا مدل‌های از پیش‌آموزش‌دیده و عملیات تخصصی، این کتابخانه مسیر توسعه و آزمایش را بسیار سریع‌تر می‌کند. برای پروژه‌های تولیدی توجه ویژه‌ای به نسخه‌های کتابخانه، بهینه‌سازی حافظه و روش‌های فاین‌تیون داشته باشید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: