12 Convolutional Neural Networks
🆕 Գլխի բոլոր դասախոսություններն անցկացված են ([48]-[51]), ինչպես նաև Gesture Snake գործնականը ([52])։ Սլայդերը, նշումներով PDF-երը և տեսանյութերը ներքևում են։
🎲 Random
TBD
📚 Նյութը
Չորս դասախոսություն (սլայդերը ml/12_cnn/ պանակում)․
- [48] CNN Foundations: պատկերը որպես թվերի ցանց (գույնը՝ [33]-ի կարճ recap-ով), Hubel & Wiesel-ի բջիջները և CNN-ների ծագումը, կոնվոլյուցիա 1D→2D, kernel-ների գործիքատուփ, padding / stride / pooling, kernel-ի տարբերակները ձեռքով (dilation/erosion, dilated և transposed conv), ինչպես է սովորում shared kernel-ը (գրադիենտները գումարվում են), ինչ են տեսնում շերտերը խորանալիս, ինչու՞ dense ցանցը սխալ գործիք է պատկերների համար։ Fourier-ը՝ հավելվածում. PDF · PDF (նշումներով) · 📺 [48] CNN: Convolution & Computer Vision | Մեքենայական ուսուցում
- [49] CNN Architectures: ImageNet-ի պատմությունը, LeNet → AlexNet → ZFNet → VGG / GoogLeNet → ResNet, residual learning-ը որպես «boosting խորության մեջ», և 2026-ի տեսլականը (ViT, VLM, պատկերի և վիդեոյի գեներացիա, SAM 3). PDF · 📺 [49] CNN Architectures: AlexNet to ResNet | Մեքենայական ուսուցում
- [50] Transfer Learning: ինչու՞ եք հազվադեպ զրոյից սովորեցնում, freeze vs fine-tune (+ BatchNorm-ի թակարդը), 2026-ի pretrained backbone-երը (self-supervised DINOv3, CLIP), Grad-CAM քայլ առ քայլ և Clever Hans, պիտակավորման տնտեսագիտությունը. PDF · PDF (նշումներով) · 📺 [50] Transfer Learning & Grad-CAM | Մեքենայական ուսուցում
- [51] Vision Tasks: detection (IoU, NMS, YOLO, և mAP-ն ու YOLO-ի մեկ cell-ի decode-ը՝ ձեռքով), segmentation (semantic vs instance, U-Net), կոնվոլյուցիայի տարբերակները (dilated, transposed, separable). PDF · PDF (նշումներով) · 📺 [51] CNNs: Detection & Segmentation | Մեքենայական ուսուցում
Լրացուցիչ՝ The Convolution, Mathematically — ոչ պարտադիր հավելված (convolution theorem, Fourier, cross-correlation). PDF
📓 Ինքնուրույն ուսումնասիրություն - Լյարդի բիոպսիա, ձեռքով չափված ([48]-ից հետո)
Սա դասին չի անցնվում. notebook է ինքնուրույն աշխատելու համար (~1.5 ժամ, կոդը run է լինում ~1.5 րոպեում)։ Պաթոլոգը մանրադիտակով նայում է լյարդի բարակ կտրվածքին և զեկույցում գրում թվեր, օրինակ՝ որքան խիտ են կորիզները և որքան է ճարպը (steatosis)։ Այս երկու թիվը չափում եք առանց որևէ ուսուցման՝ [48]-ի գործիքներով և [33]-ի ու HW1b-ի HSV-ով։ Չափումը պատրվակ է. իրական նպատակը հինգ գաղափար է, ամեն մեկը՝ «նախ գուշակիր, հետո run արա» հարցով, նկարով, վերջում Remember տողով և Check yourself հարցերով (պատասխանները բացվում են սեղմելով)։ Երեք փոքր վարժություն ինքնաստուգումով են, լուծումը՝ ամեն մեկից անմիջապես հետո։
- Hue vs brightness - RGB կանոնը իրականում brightness threshold է (մեկ threshold-ի 0.15 փոփոխությունը պատասխանը փոխում է 9 անգամ)։ Pixel-ը մթնեցնելիս RGB-ի երեք թվերն էլ փոխվում են, hue-ն՝ ոչ (բանաձևում k-ն կրճատվում է)։ Մոխրագույն pixel-ների hue-ն աղմուկ է, դրա համար՝ saturation floor։
- Erosion և dilation - պատուհանի min և max. նախ 10x14 խաղալիք mask-ի վրա ձեռքով, հետո իրական mask-ի վրա (opening)։ «Կորիզները մուգ են» գայթակղիչ պայմանը գունատ կորիզները կտոր-կտոր է անում. brightness profile-ը ցույց է տալիս՝ ինչու։
- Connected components - pixel-ներից օբյեկտներ։ Ground truth-ը դուք եք. նույն patch-ը ձեռքով հաշվում եք երկու կանոնով և երկու տարբեր թիվ եք ստանում։
- Threshold-ը histogram-ի վրա գծված գիծ է - slider-ներով ինքներդ եք շարժում երկու threshold-ները։ Hue-ի cut-ը histogram-ի ցածր մասում է (5°-ով տեղաշարժը՝ 113 → 112 / 127 կորիզ), brightness cap-ը՝ գագաթին (0.04-ով տեղաշարժը՝ 82 → 24 / 134)։
- Slide B-ի ճարպը - սպիտակ = ցածր saturation. ամենամեծ «ճարպի» blob-ը իրականում արյունատար անոթ է (25.7% → 17.8%)։ Կարմիր գույնը hue-ի առանցքի երկու ծայրերում է, որովհետև hue-ն անկյուն է։
- Ազնվության թեստ - նույն slide-ը, այլ scanner։ Exposure-ի փոփոխությանը hue կանոնը դիմանում է (113 → 112), white balance-ի փոփոխությանը՝ ոչ. 4%-ը տալիս է 74 կամ 136 (իսկ mask-ը ողողում է crop-ի կեսը), և վարժությունում գտնում եք, որ «ավելի սառը» ուղղությամբ 1%-ն էլ բավական է։ Ահա թե ինչու է պետք ուսուցում և color augmentation։
- Bonus - կորիզի ձևով kernel (Mexican hat)՝ template matching [48]-ից. գտնում է մուգ կորիզները, բաց թողնում գունատները և «գտնում» կարմիր գնդիկները։
Notebook (output-ներով և լուծումներով. որ գուշակությունները չփչանան, սկզբում մաքրեք output-ները՝ Edit → Clear all outputs): extra_liver_biopsy_solution.ipynb (download) · view on GitHub · Open in Colab
🧪 Գործնական - Gesture Snake
Webcam-ով նկարում եք ձեր բութ մատը (վեր, վար, ձախ, աջ, կամ ոչինչ), սովորեցնում եք CNN, որը կարդում է, թե ուր է ցույց տալիս մատը, և հետո Snake եք խաղում ձեր մատով։ Ամեն ինչ աշխատում է laptop-ի CPU-ի վրա. նկարահանումը՝ ~3 րոպե, notebook-ը՝ ~13 րոպե (500 նկարի համար)։
Notebook-ը ցույց է տալիս [48]-[50]-ի պնդումները ձեր սեփական տվյալների վրա.
- Split by burst - ինչու՞ պատահական split-ը թաքցնում է ձախողումը (իրար նման կադրերը հայտնվում են և՛ train-ում, և՛ validation-ում)։
- Երեք ցանց զրոյից - սովորական ANN (առանց կոնվոլյուցիայի), փոքր CNN ([48]) և ավելի մեծ CNN՝ կողք կողքի, և որտեղ են դրանք ձախողվում։
- Error analysis - ինչո՞վ են տարբերվում ձեր train և validation կադրերը, և ինչ է մոդելը սովորել դրա փոխարեն։
- Grad-CAM ([50]) - իրո՞ք մատին է նայում, թե՞ ֆոնին ու թևքին։
- Augmentation-ը՝ որպես փորձ - այդ թվում մեկը, որը փոխում է label-ը. հայելային ձախ մատը աջ մատ է։
- Transfer learning ([50]) - frozen ResNet-18 features + logistic regression, հետո fine-tuning՝ միայն վերջին conv շերտը, probe-ից (LP-FT) և պատահական head-ից սկսած։
- CLIP - CLIP-ի features-ը և zero-shot դասակարգում՝ առանց մեկ training նկարի։
- Ուրիշ մարդիկ - աշխատու՞մ է անծանոթների լուսանկարների վրա (HaGRID dataset-ից 90 նկար)։
- Export և խաղ -
play_snake.py-ը webcam-ից կարդում է ձեր մոդելը։
Սկսեք STUDENT_GUIDE.md-ից (տեղադրում, նկարահանում, խաղ)։ Բոլոր ֆայլերը՝ 52_gesture_snake/ on GitHub։
Notebook (instructor-ի տվյալներով, output-ներով): 52_gesture_snake_solution.ipynb (view on GitHub) · 📺 [52] | Մեքենայական ուսուցում
🏡 Տնային
HW1b — Photoshop from scratch 🧀🧀
Կոնվոլյուցիան գրվում է ձեռքով, առանց scipy.signal-ի և cv2-ի։ Ամեն ֆիլտր Photoshop-ի իրական menu item է. Filter > Other > Custom երկխոսությունը բառացիորեն 5×5 kernel-ի ցանց է։ Ամեն ինչ աշխատում է laptop-ի CPU-ի վրա, առանց GPU-ի և առանց training-ի։
Սա դասին չի անցնվում. notebook է ինքնուրույն աշխատելու համար (~2 ժամ)։ Յոթ ֆունկցիա գրում եք ինքներդ՝ try-it cell-երում, որոնք ստուգում են ձեր տարբերակը, իսկ լուծումը հաջորդ cell-ում է։ Ամեն մասի վերջում՝ Remember տող և Check yourself հարցեր (պատասխանները բացվում են սեղմելով)։
Tasks:
- The engine 🧀 —
convolve2d_naive(loop over output pixels), ապաconvolve2d_fast(loop over thek×ktaps, vectorised). Երկուսը պետք է համընկնեն1e-12ճշտությամբ։ Ստուգումները՝ identity kernel, [48]-ի սլայդի օրինակը, ևo = ⌊(i − k + 2p)/s⌋ + 1բանաձևը։ - The kernel zoo 🧀 — ամեն ֆիլտր առանձին, իր knob-ով՝ box blur (
k= 3…41), Gaussian (σ= 1…8), motion blur (4 ուղղություն × 3 երկարություն), unsharp mask (4 amount × 3 scale), emboss (4 պտույտ), Sobel X/Y/magnitude, և ձեր սեփական երեք kernel-ը։ Կետի թեստը. մեկ սպիտակ պիքսելի blur-ը հենց kernel-ն է (box-ը՝ քառակուսի, Gaussian-ը՝ փափուկ շրջան, motion blur-ը՝ գիծ, emboss-ը՝ 180°-ով շրջված), իսկ sharpen-ի halo-ն բացատրվում է մեկ եզրի brightness profile-ով։ - The thumbnail generator 🧀🧀 — YouTube-ի lo-fi երաժշտության thumbnail-ը՝ շերտ առ շերտ. cover → text → background → blur → darken։
σ = 30նշանակում է 181×181 kernel = 32,761 tap մեկ պիքսելի համար, ուստի separability-ն այստեղ ընտրություն չէ։ - HSV 🧀🧀 —
rgb_to_hsvձեռքով, ապա Hue/Saturation panel-ը՝ hue rotation, desaturation, «կարմիր զգեստը սև-սպիտակ ֆիլմում»։
- Bonus 🎁 — ցույց տվեք, որ 2D Gaussian-ը երկու 1D-ի outer product-ն է (
k²tap →2k), և չափեք արագացումը։
Notebook (output-ներով և լուծումներով. որ գուշակությունները չփչանան, սկզբում մաքրեք output-ները՝ Edit → Clear all outputs): extra_photoshop_solution.ipynb (download) · view on GitHub · Open in Colab
Project — Barcode scanner, ձեռքով սարքած 🧀🧀🧀
Ամբողջական pipeline՝ լուսանկարից մինչև 13 թվանշան, առանց neural network-ի և առանց training-ի — բայց այս անգամ, ի տարբերություն HW1b-ի և բիոպսիայի գործնականի, cv2-ն թույլատրված է։ Սա reference walkthrough է (ոչ թե TODO-ներով տնային)․ ամեն քայլ բացատրված է, և ամեն պնդում չափված է հենց notebook-ի մեջ։
Barcode-ը բիոպսիայի գործնականի հակապատկերն է․ բիոպսիան ոչ ոք չի սարքել, որ camera-ին հեշտ լինի, իսկ barcode-ը հենց դրա համար է սարքված — quiet zone-ներ, guard bar-եր, parity, check digit։ Երբ աշխարհը սարքված է մեքենայի համար, classical CV-ն ճիշտ գործիքն է։
Ինչ կա մեջը.
- Check digit — որ սխալներն է բռնում (բոլոր single-digit-ները), որոնք՝ ոչ (5-ով տարբերվող հարևան զույգերի փոխատեղումները)՝ չափված։
- EAN-13 encoder — L/G/R այբուբենները, parity-ի մեջ թաքնված 13-րդ թվանշանը։
- Decoder — scanline → runs → widths → digits, և ուղղության հայտնաբերում («գլխիվայր էլ կկարդա»)։
- Դիմացկունություն — blur, noise, լուսավորության ramp․ ամեն fix մտնում է միայն before/after չափումով (adaptive threshold-ը ramp-ը սարքում է, բայց noise-ը ջարդում է — cascade + check digit)։
- Կողմնորոշում — gradient-ներ ու structure tensor, 0–170° բոլոր անկյուններով։
- Localization — դասական
|gx|-|gy|հնարքը (45°-ում մեռնում է) ընդդեմ rotation-proof coherence map-ի։ - Իրական լուսանկարներ — Wikimedia-ի 6 նկար․ 5/6, մեկ ազնիվ ձախողում (շշի ուսին փաթաթված barcode) և մեկ բռնված «checksum-valid սուտ»։
- Մրցում OpenCV-ի built-in detector-ի դեմ — նույն 6 նկարի վրա այն կարդում է 3/6։
Walkthrough: extra_barcode.ipynb (download) · view on GitHub