Skip to main content

12 Convolutional Neural Networks

Tip

🆕 Գլխի բոլոր դասախոսություններն անցկացված են ([48]-[51]), ինչպես նաև Gesture Snake գործնականը ([52])։ Սլայդերը, նշումներով PDF-երը և տեսանյութերը ներքևում են։

🎲 Random

TBD

📚 Նյութը

Չորս դասախոսություն (սլայդերը ml/12_cnn/ պանակում)․

Լրացուցիչ՝ 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:

  1. The engine 🧀 — convolve2d_naive (loop over output pixels), ապա convolve2d_fast (loop over the k×k taps, vectorised). Երկուսը պետք է համընկնեն 1e-12 ճշտությամբ։ Ստուգումները՝ identity kernel, [48]-ի սլայդի օրինակը, և o = ⌊(i − k + 2p)/s⌋ + 1 բանաձևը։
  2. 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-ով։
  3. The thumbnail generator 🧀🧀 — YouTube-ի lo-fi երաժշտության thumbnail-ը՝ շերտ առ շերտ. cover → text → background → blur → darken։ σ = 30 նշանակում է 181×181 kernel = 32,761 tap մեկ պիքսելի համար, ուստի separability-ն այստեղ ընտրություն չէ։
  4. 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-ն ճիշտ գործիքն է։

Ինչ կա մեջը.

  1. Check digit — որ սխալներն է բռնում (բոլոր single-digit-ները), որոնք՝ ոչ (5-ով տարբերվող հարևան զույգերի փոխատեղումները)՝ չափված։
  2. EAN-13 encoder — L/G/R այբուբենները, parity-ի մեջ թաքնված 13-րդ թվանշանը։
  3. Decoder — scanline → runs → widths → digits, և ուղղության հայտնաբերում («գլխիվայր էլ կկարդա»)։
  4. Դիմացկունություն — blur, noise, լուսավորության ramp․ ամեն fix մտնում է միայն before/after չափումով (adaptive threshold-ը ramp-ը սարքում է, բայց noise-ը ջարդում է — cascade + check digit)։
  5. Կողմնորոշում — gradient-ներ ու structure tensor, 0–170° բոլոր անկյուններով։
  6. Localization — դասական |gx|-|gy| հնարքը (45°-ում մեռնում է) ընդդեմ rotation-proof coherence map-ի։
  7. Իրական լուսանկարներ — Wikimedia-ի 6 նկար․ 5/6, մեկ ազնիվ ձախողում (շշի ուսին փաթաթված barcode) և մեկ բռնված «checksum-valid սուտ»։
  8. Մրցում OpenCV-ի built-in detector-ի դեմ — նույն 6 նկարի վրա այն կարդում է 3/6։

Walkthrough: extra_barcode.ipynb (download) · view on GitHub

Flag Counter