چیتشیت
بینایی ماشین
Computer Vision
پیشپردازش، کانولوشن، دستهبندی، فاینتیون، تشخیص اشیاء، بخشبندی و پچبندی تصاویر. PyTorch و NumPy برگرفته از درسها.
فهرست مطالب
پایپلاین Mask R-CNN
معماریپیشپردازش برای مدل ازپیشآموزشدیده
گامبهگام- رمزگشاییفایل به
uint8با فرمت HWC در بازه[0, 255]تبدیل میشود. - رنگتبدیل به RGB. ورودی BGR حدود ده امتیاز هزینه دارد.
- اعشاری و چیدمانتقسیم بر 255، سپس تبدیل HWC به NCHW.
- تغییر اندازهضلع کوتاهتر به 256، روش دوسطحی (bilinear).
- برشبرش از مرکز (center crop) به ابعاد 224x224.
- استانداردسازیکسر میانگین ImageNet، تقسیم بر انحراف معیار.
- مدلورودی اکنون با ورودی مرحله آموزش همخوانی دارد.
فرمولهای کلیدی
مفهومها- اندازه خروجی
- $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 به CHW | img_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) |
| جایگزینی هد ResNet | model.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 mean | 0.485, 0.456, 0.406 | روی پیکسلهای [0, 1] |
ImageNet std | 0.229, 0.224, 0.225 | به ازای هر کانال |
NMS iou_threshold | 0.45 | شبکه RPN از 0.7 استفاده میکند |
conf_threshold | 0.25 | شیءبودگی ضرب در امتیاز کلاس |
lambda_noobj | 0.5 | مقدار lambda_coord برابر 5.0 است، نسبتهای YOLOv1 |
Mixup alpha | 0.2 | مقدار lam از توزیع Beta(alpha, alpha) |
ViT patch size | 16 | 196 توکن در 224 پیکسل |
MAE mask ratio | 75% | انکودر 25% را میبیند |
بکبونها
دستورها| Model | اندازه و ایده اصلی |
|---|---|
LeNet-5 | 61,706 پارامتر. کانولوشن، پولینگ، متراکم (dense) |
AlexNet | 60 میلیون. ReLU، دراپاوت، عمق |
VGG-16 | 138 میلیون. صرفاً کانولوشنهای 3x3 |
ResNet-18 | 11.7 میلیون. اتصالات جهشی اینهمانی، دقت top-1 معادل 69.8% |
ViT-B/16 | 86 میلیون. 12 بلوک، 12 هد، بعد 768 |
Mask R-CNN R50 FPN | 46 میلیون. 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 را در کنار هم گزارش کنید.