چیت‌شیت

بینایی ماشین

Computer Vision

پیش‌پردازش، کانولوشن، دسته‌بندی، فاین‌تیون، تشخیص اشیاء، بخش‌بندی و پچ‌بندی تصاویر. PyTorch و NumPy برگرفته از درس‌ها.

  • ۱۲ بخش
  • ۹ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. پایپ‌لاین Mask R-CNN
  2. پیش‌پردازش برای مدل از‌پیش‌آموزش‌دیده
  3. فرمول‌های کلیدی
  4. وظایف در قالب کد
  5. گذر رو به جلو در ViT
  6. شکل‌ها (Shapes)
  7. پیش‌فرض‌ها و اعداد
  8. بک‌بون‌ها
  9. عیب‌یابی
  10. اختصارات
  11. پرسش‌ها
  12. نکات کاربردی

پایپ‌لاین Mask R-CNN

معماری
ویژگی‌هاK تای برترتصویر ورودیلیستی از (3, H, W)بک‌بون ResNetاسترایدهای 4، 8، 16، 32FPNبالا به پایین + جانبیRPNحدود 1000 پروپوزالRoIAlignدوسطحی (bilinear)، بدون گرد کردنسر جعبهکلاس + تصحیح مختصاتسر ماسک28x28 به ازای هر کلاسNMSجعبه‌ها، برچسب‌ها، ماسک‌ها

پیش‌پردازش برای مدل از‌پیش‌آموزش‌دیده

گام‌به‌گام
  1. رمزگشاییفایل به uint8 با فرمت HWC در بازه [0, 255] تبدیل می‌شود.
  2. رنگتبدیل به RGB. ورودی BGR حدود ده امتیاز هزینه دارد.
  3. اعشاری و چیدمانتقسیم بر 255، سپس تبدیل HWC به NCHW.
  4. تغییر اندازهضلع کوتاه‌تر به 256، روش دوسطحی (bilinear).
  5. برشبرش از مرکز (center crop) به ابعاد 224x224.
  6. استانداردسازیکسر میانگین ImageNet، تقسیم بر انحراف معیار.
  7. مدلورودی اکنون با ورودی مرحله آموزش همخوانی دارد.

فرمول‌های کلیدی

مفهوم‌ها
اندازه خروجی
$H_{\text{out}} = \left\lfloor \frac{H - K + 2P}{S} \right\rfloor + 1$
پدینگ یکسان (Same)
$P = (K - 1) / 2$ برای $K$ فرد و $S = 1$
پارامترهای کانولوشن
$C_{\text{out}} \cdot C_{\text{in}} \cdot K \cdot K + C_{\text{out}}$
میدان دید
$1 + L \cdot (K - 1)$ برای $L$ لایه کانولوشن متوالی با استراید 1
باقیمانده (Residual)
$y = F(x) + x$
شاخص IoU
$\mathrm{IoU}(A, B) = \frac{\mathop{\mathrm{area}}(A \cap B)}{\mathop{\mathrm{area}}(A \cup B)}$
ضریب Dice
$\frac{2 \sum (p \cdot y)}{\sum p + \sum y + \epsilon}$، و $\text{Dice} = 2 \cdot \text{IoU} / (1 + \text{IoU})$
رمزگشایی YOLO
$x = (\sigma(t_x) + \text{cell}_x) \cdot \text{stride}$، $w = \text{anchor}_w \cdot \exp(t_w)$

وظایف در قالب کد

کار و کد
وظیفهکد
تبدیل HWC به CHWimg_hwc.permute(2, 0, 1)
کانولوشن 3x3 با اندازه یکسانnn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)
تابع زیان (loss) با هموارسازی برچسب‌هاnn.CrossEntropyLoss(label_smoothing=0.1)
جایگزینی هد ResNetmodel.fc = nn.Linear(model.fc.in_features, num_classes)
بک‌بون از‌پیش‌آموزش‌دیده، هر خانواده‌ایtimm.create_model("resnet50", pretrained=True, num_classes=10)
حذف جعبه‌های تکراریnms(boxes, scores, iou_threshold=0.45)
شبکه U-Net با انکودر از‌پیش‌آموزش‌دیدهsmp.Unet(encoder_name="resnet34", encoder_weights="imagenet", in_channels=3, classes=3)
مدل ViT از‌پیش‌آموزش‌دیدهtimm.create_model("vit_base_patch16_224", pretrained=True, num_classes=10)

گذر رو به جلو در ViT

کد
python
self.proj = nn.Conv2d(in_channels, dim, kernel_size=patch_size, stride=patch_size)
self.cls_token = nn.Parameter(torch.zeros(1, 1, dim))                # یک توکن یادگیری‌شده
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, dim))  # یادگیری‌شده
x = self.proj(x)                                                     # (N, dim, 14, 14) در 224 پیکسل
x = x.flatten(2).transpose(1, 2)                                     # توکن‌های (N, 196, dim)
cls = self.cls_token.expand(x.size(0), -1, -1)
x = torch.cat([cls, x], dim=1)                                       # (N, 197, dim)
x = x + self.pos_embed                                               # افزودن موقعیت
normed = self.ln1(x)                                                 # پیش‌نرمال‌سازی لایه‌ای (Pre-LN)
a, _ = self.attn(normed, normed, normed, need_weights=False)
x = x + a                                                            # اتصال باقیمانده (residual)
x = x + self.mlp(self.ln2(x))                                        # از D به 4D و به D، تابع GELU
return self.head(self.ln(x[:, 0]))                                   # دسته‌بندی بر اساس [CLS]

شکل‌ها (Shapes)

دستورها
Tensorشکل
Decoded image(H, W, 3)، uint8
Model input(N, 3, 224, 224)، float32
Conv weight(C_out, C_in, K, K)
YOLO head output(N, H, W, num_anchors, 5 + C)
Segmentation logits(N, C, H, W)، تارگت (N, H, W)
Mask R-CNN masks(N, 1, H, W) در بازه [0, 1]
ViT tokens at 224 px(197, 768) به همراه [CLS]

پیش‌فرض‌ها و اعداد

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
ImageNet mean0.485, 0.456, 0.406روی پیکسل‌های [0, 1]
ImageNet std0.229, 0.224, 0.225به ازای هر کانال
NMS iou_threshold0.45شبکه RPN از 0.7 استفاده می‌کند
conf_threshold0.25شیءبودگی ضرب در امتیاز کلاس
lambda_noobj0.5مقدار lambda_coord برابر 5.0 است، نسبت‌های YOLOv1
Mixup alpha0.2مقدار lam از توزیع Beta(alpha, alpha)
ViT patch size16196 توکن در 224 پیکسل
MAE mask ratio75%انکودر 25% را می‌بیند

بک‌بون‌ها

دستورها
Modelاندازه و ایده اصلی
LeNet-561,706 پارامتر. کانولوشن، پولینگ، متراکم (dense)
AlexNet60 میلیون. ReLU، دراپ‌اوت، عمق
VGG-16138 میلیون. صرفاً کانولوشن‌های 3x3
ResNet-1811.7 میلیون. اتصالات جهشی این‌همانی، دقت top-1 معادل 69.8%
ViT-B/1686 میلیون. 12 بلوک، 12 هد، بعد 768
Mask R-CNN R50 FPN46 میلیون. 91 کلاس COCO

عیب‌یابی

عیب‌یابی
  • خروجی بی‌معنی، بدون خطا

    علت
    ارسال uint8 خام به مدل
    راه‌حل
    تقسیم بر 255، سپس استانداردسازی
  • کانولوشن اول ارتفاع را به عنوان کانال می‌بیند

    علت
    ورودی HWC
    راه‌حل
    استفاده از permute(2, 0, 1) برای تبدیل به CHW
  • گرادیان نادرست، بدون خطا

    علت
    اعمال سافت‌مکس قبل از آنتروپی متقاطع
    راه‌حل
    ارسال لاجیت‌های خام
  • تابع زیان (loss) ناپایدار

    علت
    عدم اجرای zero_grad() در هر گام
    راه‌حل
    فراخوانی آن قبل از backward()
  • عملکرد ضعیف‌تر فاین‌تیون نسبت به ارزیابی خطی

    علت
    باگ در نرخ یادگیری (LR) یا Batch Normalization
    راه‌حل
    استفاده از نرخ یادگیری تفکیکی، freeze_bn_stats
  • دقت پیکسلی 99%، ماسک‌های بلااستفاده

    علت
    عدم‌توازن کلاس‌ها
    راه‌حل
    افزودن Dice به تابع زیان (loss)
  • آرتیفکت‌های شطرنجی

    علت
    کانولوشن ترانهاده (transposed conv)
    راه‌حل
    بزرگ‌نمایی دوسطحی (bilinear) + کانولوشن 3x3
  • هد یک کلاس کم دارد

    علت
    پس‌زمینه شمارش نشده است
    راه‌حل
    تنظیم num_classes = کلاس‌ها + 1

اختصارات

اصطلاح‌ها
IoU
اشتراک روی اجتماع. همپوشانی دو جعبه یا ماسک.
NMS
سرکوب غیرحداکثری. بهترین جعبه را نگه می‌دارد، موارد همپوشان را حذف می‌کند.
mAP@0.5:0.95
معیار AP در COCO. میانگین روی IoU از 0.5 تا 0.95 با گام 0.05.
mIoU
میانگین IoU روی تمام کلاس‌ها. متریک اصلی بخش‌بندی.
FPN
شبکه هرم ویژگی. ویژگی‌های معنایی در تمام استرایدها.
RPN
شبکه پیشنهاد منطقه. تعیین شیء یا غیرشیء برای هر انکر.
ViT
ترنسفورمر بینایی. استفاده از پچ‌ها به عنوان توکن.
MAE
خودرمزگذار پوشانده. پوشاندن 75% پچ‌ها و بازسازی آن‌ها.

پرسش‌ها

پرسش و پاسخ
چرا همه جا 3x3؟
دو کانولوشن 3x3 میدان دید 5x5 ایجاد می‌کنند با $18C^2$ پارامتر به جای $25C^2$.
چرا اتصالات باقیمانده؟
هر بلوک می‌تواند تابع همانی را یاد بگیرد، بنابراین عمق زیاد دیگر به عملکرد آسیب نمی‌زند.
چرا RoIAlign به جای RoIPool؟
بدون گرد کردن اعداد. دقت AP ماسک را در COCO بین 3 تا 4 واحد افزایش می‌دهد.
چرا انکرها؟
هد مدل تغییرات جزئی نسبت به یک جعبه پیشین را پیش‌بینی می‌کند.
چرا پیش‌نرمال‌سازی لایه‌ای (Pre-LN) در ViT؟
امکان آموزش مدل‌های بسیار عمیق را بدون فاز گرم‌کردن فراهم می‌کند.

نکات کاربردی

نکته‌ها
  • میانگین و انحراف معیار را روی مجموعه داده آموزشی خودتان محاسبه کنید.
  • برای تغییر اندازه ماسک‌ها و نقشه‌های برچسب از روش nearest استفاده کنید.
  • در هر اجرای انتقال یادگیری، دقت ارزیابی خطی و فاین‌تیون را چاپ کنید.
  • هنگامی که مجموعه‌ی پارامترهای آموزش‌پذیر تغییر می‌کند، اپتیمایزر را از نو بسازید.
  • معیار IoU را به تفکیک کلاس گزارش کنید، نه صرفاً mIoU.
  • معیارهای دقت، بازخوانی، AP@0.5 و mAP@0.5:0.95 را در کنار هم گزارش کنید.
ترجمه‌ی فارسی چیت‌شیت Computer Vision از دوره‌ی AI Engineering from Scratch، نوشته‌ی Rohit Ghumare، تحت مجوز MIT. کد و دستورها عیناً از متن اصلی‌اند. همه‌ی چیت‌شیت‌ها