ویژگی تصویر

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

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

imgaug یک کتابخانه محبوب و قدرتمند برای تقویت داده‌های تصویری (image augmentation) در پایتون است. این کتابخانه امکانات گسترده‌ای برای اعمال تبدیلات هندسی، تغییر رنگ، اضافه کردن نویز، تغییر روشنایی و شبیه‌سازی شرایط واقعی مانند مه و باران فراهم می‌کند. imgaug با طراحی ماژولار و انطباق‌پذیر برای پروژه‌های یادگیری عمیق که نیاز به افزایش تنوع داده‌ها دارند، بسیار مناسب است.

چرا از imgaug استفاده کنیم؟

  • پشتیبانی از انواع داده‌ها: تصاویر، جعبه‌های محدود (bounding boxes)، نقشه‌های سگمنتیشن و کلیدواژه‌ها (keypoints).
  • گستره وسیع Augmenterها: چرخش، مقیاس، برش، تغییر رنگ، افکت‌های اشیاء، نویز و موارد فیزیکی مثل باران یا برف.
  • قابلیت تعیین احتمال هر تبدیل و ترکیب گوناگون از تبدیلات با نحوه‌های متفاوت (Sequential, Sometimes, OneOf).
  • قابلیت استفاده Deterministic برای بازتولید دقیق عملیات در آموزش و ارزیابی.

نصب و شروع سریع

نصب ساده است و معمولاً با pip انجام می‌شود:

pip install imgaug

بعد از نصب می‌توانید با استفاده از numpy و OpenCV تصاویر را بارگذاری و تقویت کنید.

مثال پایه: یک Pipeline ساده

import imgaug.augmenters as iaa
import imageio
import numpy as np

image = imageio.imread('cat.jpg')  # numpy array HxWxC

seq = iaa.Sequential([
    iaa.Resize({"shorter-side": 256}),
    iaa.Fliplr(0.5),
    iaa.Affine(rotate=(-20, 20)),
    iaa.AdditiveGaussianNoise(scale=0.05*255)
])

aug_image = seq(image=image)

در این مثال یک پائپ‌لاین متوالی تعریف کردیم که تصویر را ابتدا تغییر اندازه می‌دهد، سپس با احتمال ۰.۵ آن را افقی برمی‌گرداند، چرخش تصادفی بین -۲۰ تا ۲۰ درجه اعمال می‌کند و در نهایت نویز گاوسی اضافه می‌کند. خروجی یک آرایه numpy است که قابل استفاده در مدل‌های یادگیری عمیق می‌باشد.

کار با Bounding Boxes و Keypoints

برای مسائل تشخیص شیء و تشخیص نقاط کلیدی (مثل دست‌ها یا صورت)، باید موقعیت‌ها را همزمان با تصویر تغییر دهیم تا تراز بمانند. imgaug این امکانات را دارد:

from imgaug import BoundingBox, BoundingBoxesOnImage

bbs = BoundingBoxesOnImage([
    BoundingBox(x1=30, y1=20, x2=200, y2=150)
], shape=image.shape)

seq_det = seq.to_deterministic()  # همگام کردن تغییرات روی تصویر و bboxes
image_aug = seq_det.augment_image(image)
bbs_aug = seq_det.augment_bounding_boxes([bbs])[0]

در کد بالا، ابتدا یک BoundingBox تعریف می‌کنیم. با استفاده از to_deterministic() از همگامی بین تغییرات تصویر و بردارهای موقعیت اطمینان حاصل می‌کنیم، سپس هر دو را تقویت می‌کنیم تا جعبه‌ها با تصویر تطابق داشته باشند.

مثال: ترکیب شرایط جوی و افکت‌ها

seq_weather = iaa.Sequential([
    iaa.OneOf([
        iaa.Clouds(),
        iaa.Rain(drop_size=(0.1, 0.3)),
        iaa.Snowflakes(flake_size=(0.1, 0.5))
    ]),
    iaa.Multiply((0.8, 1.2)),  # تغییر روشنایی
    iaa.GaussianBlur(sigma=(0.0, 1.5))
])
aug = seq_weather(image=image)

این پائپ‌لاین به طور تصادفی یکی از افکت‌های آب‌وهوا را انتخاب کرده، روشنایی را کمی تغییر می‌دهد و در نهایت بلور گاوسی اعمال می‌کند. این نوع augment برای داده‌های خودروی خودران یا تشخیص در فضای باز بسیار مفید است.

نکات پیشرفته و بهینه‌سازی

  • Deterministic vs Stochastic: برای آموزش مدل همراه با برچسب‌ها یا جعبه‌ها از to_deterministic استفاده کنید تا تغییرات روی همه اجزا یکسان باشند.
  • سرعت و پردازش دسته‌ای: اعمال augment روی GPU انجام نمی‌شود؛ برای افزایش سرعت از چند پردازش همزمان (multiprocessing) یا اعمال augment روی CPU قبل از ارائه به GPU استفاده کنید.
  • توازن بین تنوع و واقع‌گرایی: augment بیش از حد می‌تواند نمونه‌های نامعقول تولید کند؛ بهتر است توزیعات پارامترها را محدود و بر اساس داده‌های واقعی تنظیم کنید.
  • ادغام با فریم‌ورک‌ها: می‌توانید imgaug را با Keras, PyTorch (توسط تبدیل آرایه‌ها به تنسورها) و TF data pipeline ترکیب کنید.

نمونه: استفاده در PyTorch DataLoader

class ImgAugDataset(torch.utils.data.Dataset):
    def __init__(self, image_paths, transform):
        self.image_paths = image_paths
        self.transform = transform

    def __len__(self):
        return len(self.image_paths)

    def __getitem__(self, idx):
        img = imageio.imread(self.image_paths[idx])
        img = self.transform(image=img)
        img = img.astype('float32') / 255.0
        img = np.transpose(img, (2,0,1))
        return torch.tensor(img)

در این کد، یک Dataset برای PyTorch تعریف کرده‌ایم که imgaug را به عنوان transform می‌پذیرد. توجه کنید که imgaug با آرایه‌های numpy کار می‌کند؛ بنابراین لازم است تبدیل به تنسور و نرمال‌سازی را بعد از augment انجام دهیم.

مقایسه کوتاه با سایر کتابخانه‌ها

ویژگیimgaugAlbumentationstorchvision.transforms
پشتیبانی از Bounding Boxesخوبعالیمحدود
تنوع Augmentersبسیار زیادزیادکلاسیک
کاراییخوب (CPU)بسیار خوببهینه برای PyTorch

هر کتابخانه مزایا و معایب خاص خود را دارد؛ imgaug برای انعطاف‌پذیری و طیف گسترده augmenters شناخته می‌شود، اما Albumentations معمولاً سریع‌تر و سازگارتر با PyTorch است.

چند نکته عملی و خطاهای رایج

  • فرمت کانال رنگ: imgaug از آرایه‌های HxWxC استفاده می‌کند؛ برای تصاویر سیاه‌قلم (grayscale) ممکن است نیاز به reshape داشته باشید.
  • حذف مقادیر خارج از محدوده: بعد از برخی عملیات (مثلاً Add) مقادیر را به بازه 0-255 کلپ کنید.
  • همگام‌سازی RNG: برای باز تولید تجربیات، مقداردهی seed با np.random.seed و iaa.seed مفید است.

نتیجه‌گیری و پیشنهادات

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

اگر نیاز دارید، می‌توانم نمونه‌های بیشتر مرتبط با segmentation maps، keypoints پیشرفته یا ادغام با tf.data و Keras را نیز آماده کنم.

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

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