chore(i18n): sync translations with latest source changes (chunk 2/4, 16 changes)
This commit is contained in:
parent
4c94e822b7
commit
e2c201135e
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,116 @@
|
|||
# ការណែនាំអំពី គំនិតវិចារណាអំពីរូបភាព
|
||||
|
||||
[គំនិតវិចារណាអំពីរូបភាព](https://wikipedia.org/wiki/Computer_vision) គឺជាវិជ្ជាមួយគោលបំណងអោយកុំព្យូទ័រអាចយល់ដឹងជាឡូយល្វីលពីរូបភាពឌីជីថល។ នេះជាការពិពណ៌នាធំទូលាយណាស់ ព្រោះ *ការយល់ដឹង* អាចមានន័យជាច្រើនប្រភេទ រួមមានការស្វែងរកវត្ថុក្នុងរូបភាព (**ការប្រើបញ្ជាក់វត្ថុ**), ការយល់ដឹងអំពីអ្វីកន្ល="{ល្ទ}"ន (\*\*ការសម្គាល់ព្រឹត្តិការណ៍\*\*), ការពិពណ៌នារូបភាពជាអត្ថបទ ឬការធ្វើឡើងវិញសีนារច្នៃជាបីវិមាត្រ។ មានការងារពិសេសខ្លះទាក់ទងនឹងរូបភាពមនុស្ស ដូចជា ការប៉ាន់ប្រមាណអាយុ និងអារម្មណ៍ ការសម្គាល់មុខ និងការបញ្ជាក់មុខ និងការប៉ាន់ប្រមាណទីតាំង3D ពីរបៀបមួយចំនួន។
|
||||
|
||||
## [សំណួរពិនិត្យមុនមេរៀន](https://ff-quizzes.netlify.app/en/ai/quiz/11)
|
||||
|
||||
មួយក្នុងចំណោមការងារងាយៗបំផុតនៃគំនិតវិចារណាអំពីរូបភាពគឺ **ចំណាត់ថ្នាក់រូបភាព**។
|
||||
|
||||
គំនិតវិចារណាអំពីរូបភាពត្រូវបានគេចាត់ទុកជាផ្នែកមួយនៃ AI។ ថ្ងៃនេះ ភាគច្រើននៃការងារជាមួយខ្នាតនេះត្រូវបានដោះស្រាយដោយបណ្តាញប្រសាទ។ យើងនឹងរៀនបន្ថែមអំពីប្រភេទពិសេសនៃបណ្តាញប្រសាទដែលប្រើសម្រាប់គំនិតវិចារណាអំពីរូបភាព, [បណ្តាញប្រសាទសំឡឹក](../07-ConvNets/README.md), តាមពេលផ្នែកនេះ។
|
||||
|
||||
ទោះយ៉ាងណា មុនពេលអ្នកផ្ញើរូបភាពទៅកាន់បណ្តាញប្រសាទ នៅក្នុងជាច្រើនករណី វាអាចមានអត្ថប្រយោជន៍ក្នុងការប្រើបច្ចេកវិទ្យាគណិតវិធីមួយចំនួនដើម្បីបង្កើនគុណភាពរូបភាព។
|
||||
|
||||
មានបណ្ណាល័យ Python ជាច្រើនសម្រាប់ដំណើរការរូបភាព៖
|
||||
|
||||
* **[imageio](https://imageio.readthedocs.io/en/stable/)** អាចប្រើសម្រាប់អាន/សរសេរទ្រង់ទ្រាយរូបភាពខុសៗគ្នា។ វាក៏គាំទ្រថ្មី ffmpeg ដែលជាកម្មវិធីមានប្រយោជន៍សម្រាប់បម្លែងចំណុចវីដេអូទៅជារូបភាពផងដែរ។
|
||||
* **[Pillow](https://pillow.readthedocs.io/en/stable/index.html)** (ដែលគេស្គាល់ថា PIL) មានខ្លះខ្លាំងជាង ហើយក៏គាំទ្រការផ្លាស់ប្តូររូបភាពមួយចំនួន ដូចជាការបំលែង ប្រែប្រួលពណ៌ និងផ្សេងៗទៀត។
|
||||
* **[OpenCV](https://opencv.org/)** ជាបណ្ណាល័យដំណើរការរូបភាពដែលមានកម្លាំងសរសេរឡើងក្នុងភាសា C++ ដែលបានក្លាយជាមាត្រដែលគេប្រើសម្រាប់ដំណើរការរូបភាព។ វាមានចំណុចប្រទាក់ Python ដែលងាយស្រួលប្រើ។
|
||||
* **[dlib](http://dlib.net/)** ជាបណ្ណាល័យ C++ ដែលអនុវត្តន៍លទ្ធវិធីរៀនម៉ាស៊ីនជាច្រើន រួមមានលទ្ធវិធីមួយចំនួននៃគំនិតវិចារណាអំពីរូបភាព។ វាក៏មានចំណុចប្រទាក់ Python ផងដែរ ហើយអាចប្រើសម្រាប់ការងារលំបាកដូចជាការសម្គាល់មុខ និងសម្គាល់សញ្ញាមុខ។
|
||||
|
||||
## OpenCV
|
||||
|
||||
[OpenCV](https://opencv.org/) ត្រូវបានគេចាត់ទុកជាមាត្រដដែលនៃការដំណើរការរូបភាព។ វាមានលទ្ធវិធីនានាដែលមានប្រយោជន៍ ជួយដោយភាសា C++។ អ្នកអាចហៅ OpenCV ពី Python បានផងដែរ។
|
||||
|
||||
កន្លែងល្អសម្រាប់រៀន OpenCV គឺ [មេកូសិក្សា Learn OpenCV នេះ](https://learnopencv.com/getting-started-with-opencv/។ នៅក្នុងកម្មវិធីសិក្សារបស់យើង គោលបំណងរបស់យើងមិនមែនទៀន OpenCV ទេ ប៉ុន្តែចង់បង្ហាញឲ្យអ្នកមើលឧទាហរណ៍ខ្លះពេលដែលវាអាចប្រើបាន និងរបៀបប្រើវា។
|
||||
|
||||
### ការផ្ទុករូបភាព
|
||||
|
||||
រូបភាពនៅក្នុង Python អាចតំណាងដោយអារេ NumPy បានយ៉ាងងាយស្រួល។ ឧទាហរណ៍ រូបភាពពណ៌ប្រផេះដែលមានទំហំ 320x200 ពិចសែល ត្រូវបានរក្សាទុកនៅក្នុងអារេ 200x320 ហើយរូបភាពពណ៌ដែលមានទំហំដូចគ្នា នឹងមានរាង 200x320x3 (សម្រាប់បោះពណ៌ចំនួន 3)។ ដើម្បីផ្ទុករូបភាព អ្នកអាចប្រើកូដដូចខាងក្រោម៖
|
||||
|
||||
```python
|
||||
import cv2
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
im = cv2.imread('image.jpeg')
|
||||
plt.imshow(im)
|
||||
```
|
||||
|
||||
តាមប្រពៃណី OpenCV ប្រើការអង្កត់ BGR (ខៀវ-បៃតង-ក្រហម) សម្រាប់រូបភាពពណ៌ ខណៈដែលឧបករណ៍ Python ផ្សេងៗប្រើការអង្កត់ RGB (ក្រហម-បៃតង-ខៀវ) ដែលជារបៀបផ្លូវការផ្សេងទៀត។ ដើម្បីឲ្យរូបភាពមើលបានត្រឹមត្រូវ អ្នកត្រូវបំលែងវាទៅជាអង្កត់ RGB ដោយប្រើការបត់ផ្លាស់ទីវិមាត្រ ក្នុងអារេ NumPy ឬហៅមុខងារ OpenCV ក៏បាន៖
|
||||
|
||||
```python
|
||||
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
|
||||
```
|
||||
|
||||
មុខងារ `cvtColor` ដូចគ្នានេះអាចប្រើសម្រាប់បម្លែងអង្កត់ពណ៌ផ្សេងៗដូចជាការបម្លែងរូបភាពទៅជាពណ៌ប្រផេះ ឬទៅ HSV (Hue-Saturation-Value)។
|
||||
|
||||
អ្នកក៏អាចប្រើ OpenCV ដើម្បីផ្ទុកចំណុចវីដេអូច្រើនជាកំណត់ត្រា តាមឧទាហរណ៍ដែលបានផ្តល់ក្នុងសមាហរណកម្ម [OpenCV Notebook](OpenCV.ipynb)។
|
||||
|
||||
### ដំណើរការរូបភាព
|
||||
|
||||
មុនពេលផ្តល់រូបភាពទៅបណ្តាញប្រសាទ អ្នកអាចចង់អនុវត្តជំហានក្រោយក្រោយមួយចំនួនសម្រាប់បង្កើនប្រសិទ្ធភាព។ OpenCV អាចធ្វើបានជាច្រើនរួមមាន៖
|
||||
|
||||
* **កំណត់ទំហំ** រូបភាពដោយប្រើ `im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS)`
|
||||
* **ធ្វើអោយរលោង** រូបភាពដោយប្រើ `im = cv2.medianBlur(im,3)` ឬ `im = cv2.GaussianBlur(im, (3,3), 0)`
|
||||
* ការផ្លាស់ប្តូរកំរិតភ្លឺ និងភាពខុសគ្នារបស់រូបភាពអាចធ្វើបានដោយការបំប្លែងអារេ NumPy ដូចបានពិពណ៌នានៅ [សេចក្ដីសម្គាល់ Stackoverflow នេះ](https://stackoverflow.com/questions/39308030/how-do-i-increase-the-contrast-of-an-image-in-python-opencv)។
|
||||
* ប្រើ [thresholding](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) ដោយហៅមុខងារ `cv2.threshold`/`cv2.adaptiveThreshold` ដែលជាជម្រើសល្អជាងការកែប្រែភ្លឺឬភាពខុសគ្នា។
|
||||
* អនុវត្តន៍ការបម្លែងផ្សេងៗ [transformations](https://docs.opencv.org/4.5.5/da/d6e/tutorial_py_geometric_transformations.html) ទៅលើរូបភាព៖
|
||||
- **[Affine transformations](https://docs.opencv.org/4.5.5/d4/d61/tutorial_warp_affine.html)** អាចមានប្រយោជន៍បើអ្នកចង់បញ្ចូលការបង្វិល ការកំណត់ទំហំ និងការបន្តួចឡើងទៅលើរូបភាព ហើយអ្នកដឹងទីតាំងដើមនិងទីតាំងចង់បានរបស់ចំណុចបីក្នុងរូបភាព។ Affine transformations រក្សាបន្ទាត់ផ្នែកដូចចាស់។
|
||||
- **[Perspective transformations](https://medium.com/analytics-vidhya/opencv-perspective-transformation-9edffefb2143)** មានប្រយោជន៍បើអ្នកដឹងទីតាំងដើមនិងទីតាំងចង់បានរបស់ចំណុច 4 ក្នុងរូបភាព។ ឧទាហរណ៍ ប្រសិនបើអ្នកថតរូបឯកសារមួយដែលមានរាងជាត្រីកោណត្រង់តាមមួយកាមេរ៉ាស្មាតហ្វូនពីមุมមួយ ហើយអ្នកចង់បង្កើតរូបភាពសម្រាប់ឯកសារនោះ។
|
||||
* យល់ដឹងអំពីចលនានៅក្នុងរូបភាពដោយប្រើ **[optical flow](https://docs.opencv.org/4.5.5/d4/dee/tutorial_optical_flow.html)**។
|
||||
|
||||
## ឧទាហរណ៍នៃការប្រើប្រាស់គំនិតវិចារណាអំពីរូបភាព
|
||||
|
||||
នៅក្នុង [OpenCV Notebook](OpenCV.ipynb), យើងផ្តល់ឧទាហរណ៍ខ្លះពេលដែលគំនិតវិចារណាអំពីរូបភាពអាចប្រើសម្រាប់ការងារពិសេស៖
|
||||
|
||||
* **ការប្រើប្រាស់ជាលំនាំមុនរូបថតនៃសៀវភៅ Braille**។ យើងផ្តោតលើរបៀបដែលអាចប្រើ thresholding, ការស្កេនលក្ខណៈពិសេស, ការបម្លែងពហុវិមាត្រ និងការបំប្លែង NumPy ដើម្បីបំបែកសញ្ញាប្រៃលីមួយៗសម្រាប់ចំណាត់ថ្នាក់បន្ថែមដោយបណ្តាញប្រសាទ។
|
||||
|
||||
 |  | 
|
||||
----|-----|-----
|
||||
|
||||
> រូបភាពពី [OpenCV.ipynb](OpenCV.ipynb)
|
||||
|
||||
* **ការសម្គាល់ចលនាក្នុងវីដេអូដោយការប្រៀបធៀបផ្សេងគ្នារវាងចំណុចវីដេអូ**។ ប្រសិនបើកាមេរ៉ាត្រូវបានកំណត់ឲ្យថេរ ផែនទីពីកាមេរ៉ាគួរតែស្រដៀងគ្នា។ ដោយសារចំណុចវីដេអូត្រូវបានតំណាងជា អារេ ដោយគ្រាន់តែដកអារេទាំងនោះដែលសម្រាប់ចំណុចវីដេអូពីរគ្នា ការផ្សេងគ្នាផ្គត់ផ្គង់នឹងមានតម្លៃទាបសម្រាប់រូបភាពថេរ ហើយកើនឡើងនៅពេលមានចលនាប្រហែល។
|
||||
|
||||

|
||||
|
||||
> រូបភាពពី [OpenCV.ipynb](OpenCV.ipynb)
|
||||
|
||||
* **ការសម្គាល់ចលនាដោយប្រើ Optical Flow**។ [Optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html) អនុញ្ញាតឲ្យយើងយល់ពីរបៀបដែលចំណុចវីដេអូចល័ត។ មានប្រភេទ Optical flow ពីរប្រភេទ៖
|
||||
|
||||
- **Dense Optical Flow** គណនារូបភាពវ៉ិចទ័រដែលបង្ហាញចំពោះចំណុចវីដេអូនីមួយៗកំពុងបានចល័តទៅណា
|
||||
- **Sparse Optical Flow** ស្ថិតនៅលើការយកលក្ខណៈមួយចំនួនដែលផ្ដាច់មុខក្នុងរូបភាព (ឧទាហរណ៍។ លក្ខណៈគន្លង) ហើយកំណត់ខ្សែកោងរបស់ពួកវាពីចំណុចមួយទៅទីតាំងបន្ទាប់។
|
||||
|
||||

|
||||
|
||||
> រូបភាពពី [OpenCV.ipynb](OpenCV.ipynb)
|
||||
|
||||
## ✍️ សៀវភៅណូតប៊ុកឧទាហរណ៍៖ OpenCV [សាកល្បង OpenCV ក្នុងសកម្មភាព](OpenCV.ipynb)
|
||||
|
||||
មកធ្វើតេស្តជាមួយ OpenCV ដោយស្វែងយល់ពី [OpenCV Notebook](OpenCV.ipynb)
|
||||
|
||||
## សេចក្ដីសន្និដ្ឋាន
|
||||
|
||||
ពេលខ្លះ ការងារលំបាកជាងមធ្យមដូចជាការសម្គាល់ចលនា ឬការសម្គាល់ចំណុចម្រាមដៃអាចដោះស្រាយដោយគំនិតវិចារណាអំពីរូបភាពទេ។ ដូចនេះ វាមានប្រយោជន៍ខ្លាំងក្នុងការដឹងបច្ចេកវិទ្យាមូលដ្ឋាននៃគំនិតវិចារណាអំពីរូបភាព និងបណ្ណាល័យដូចជា OpenCV អាចធ្វើអ្វីបាន។
|
||||
|
||||
## 🚀 챌ెនជ
|
||||
|
||||
មើល [វីដេអូនេះ](https://docs.microsoft.com/shows/ai-show/ai-show--2021-opencv-ai-competition--grand-prize-winners--cortic-tigers--episode-32?WT.mc_id=academic-77998-cacaste) ពីកម្មវិធី AI show ដើម្បីរៀនអំពីគម្រោង Cortic Tigers និងរបៀបដែលពួកគេបានបង្កើតដំណោះស្រាយជារបៀបប្លុក ដើម្បីអនុញ្ញាតឱ្យការងារគំនិតវិចារណាអំពីរូបភាពក្លាយទៅជាអ្នកគ្រប់គ្រងដោយរូបភាពរ៉ូបូត។ សូមធ្វើការស្រាវជ្រាវអំពីគម្រោងផ្សេងទៀតដែលជួយអ្នកចាប់ផ្តើមថ្មីចូលក្នុងវិស័យនេះ។
|
||||
|
||||
## [សំណួរពិនិត្យបន្ទាប់មេរៀន](https://ff-quizzes.netlify.app/en/ai/quiz/12)
|
||||
|
||||
## ការត្រួតពិនិត្យ និងសិក្សាឯកឡើយ
|
||||
|
||||
អានបន្ថែមអំពី optical flow [នៅក្នុងមេរៀនល្អនេះ](https://learnopencv.com/optical-flow-in-opencv/)។
|
||||
|
||||
## [ចាត់តាំង](lab/README.md)
|
||||
|
||||
ក្នុងពិធីសិក្សានេះ អ្នកនឹងថតវីដេអូជាមួយចលនាជាទម្រង់ ឆ្ពោះ លើក ក្រោម ឬច្រោះទៅខាងឆ្វេង/ស្តាំ ដោយប្រើ optical flow។
|
||||
|
||||
<img src="../../../../../translated_images/km/palm-movement.341495f0e9c47da3.webp" width="30%" alt="Palm Movement Frame"/>
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**:
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិក្នុងព័ត៌មាននេះអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅភាសាតំបន់ដើមគួរត្រូវបានគេស្គាល់ថាជាមូលដ្ឋានមានសុពលភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ ត្រូវបានណែនាំឲ្យប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែពុំត្រឹមត្រូវណាមួយដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ការរកឃើញចលនាដៃដោយប្រើ Optical Flow\n",
|
||||
"\n",
|
||||
"បล็បនេះជាផ្នែកមួយនៃ [មគ្គុទេសក៍សម្រាប់អ្នកចាប់ផ្តើម AI](http://aka.ms/ai-beginners)។\n",
|
||||
"\n",
|
||||
"ចូរពិចារណា [វីដេអូនេះ](../../../../../../lessons/4-ComputerVision/06-IntroCV/lab/palm-movement.mp4) ដែលដៃរបស់មនុស្សផ្លាស់ទីទៅឆ្វេង/ស្តាំ/លើ/ក្រោមលើផ្ទៃខាងក្រោយដែលមានស្ថេរភាព។\n",
|
||||
"\n",
|
||||
"<img src=\"../../../../../../translated_images/km/palm-movement.341495f0e9c47da3.webp\" width=\"30%\" alt=\"ស៊ុមចលនាដៃ\"/>\n",
|
||||
"\n",
|
||||
"**គោលបំណងរបស់អ្នក** គឺប្រើ Optical Flow ដើម្បីកំណត់ថា ផ្នែកណានៃវីដេអូដែលមានចលនាឡើង/ចុះ/ឆ្វេង/ស្តាំ។\n",
|
||||
"\n",
|
||||
"ចាប់ផ្តើមពីការទទួលបានស៊ុមវីដេអូចាប់តាមការពន្យល់ក្នុងមេរៀន៖\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ឥឡូវនេះ គណនាក្រឡាចរលោហៈសឺរមាំយ៉ាងក្រាស់ដូចបានពិពណ៌នាក្នុងវគ្គសិក្សា ហើយបំលែងក្រឡាចរលោហៈសឺរមាំក្រាស់ទៅជាគោលដៅโพឡារៈ:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"បង្កើតប្លង់សំរុងទិសដៅសម្រាប់មួយនីមួយៗនៃគ្រាប់ផ្លូរបញ្ចាំងពន្លឺ។ ប្លង់សំរុងបង្ហាញពីចំនួនវ៉ិចទ័រដែលចុះក្រោមប្រអប់មួយណាមួយ ហើយវាគួរតែចែកចេញទិសដៅចលនាផ្សេងៗនៅលើគ្រាប់ផ្លូរ។\n",
|
||||
"\n",
|
||||
"> អ្នកអាចចង់កំណត់តម្លៃវ៉ិចទ័រទាំងអស់ដែលមានចំនួនខ្ទង់តិចជាងស្ទង់កម្រិតជាក់លាក់ឲ្យទៅសូន្យផង។ វានឹងបំបាត់ចលនាខ្នាតតូចបន្ថែមនៅក្នុងវីដេអូ ដូចជាភ្នែក និង ក្បាល ។\n",
|
||||
"\n",
|
||||
"គូរប្លង់សំរុងសម្រាប់គ្រាប់ភាគខ្លះ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"មើលទៅក្រាស់តារាងបង្ហាញចំនួន (histograms) វាគួរតែជារឿងងាយស្រួលក្នុងការកំណត់ទិសដៅចលនា។ អ្នកត្រូវជ្រើសរើសប៊ីនដែលផ្គូផ្គងនឹងទិសដៅឡើង/ចុះ/ឆ្វេង/ស្តាំ ហើយដែលមានតម្លៃលើសកម្រិតកំណត់មួយ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Code here"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"សូមអបអរសាទរ! ប្រសិនបើអ្នកបានធ្វើតាមជំហានទាំងអស់ខាងលើ អ្នកបានបញ្ចប់មន្ទីរពិសោធន៍រួចរាល់ហើយ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងព្យាយាមរក្សាការត្រឹមត្រូវ ក៏សូមជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬការមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមជាគន្លងដើមនៅក្នុងភាសាមាតុភាគត្រូវត្រូវបានពិចារណាថាជា ប្រភពមានអធិភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
},
|
||||
"orig_nbformat": 4
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
# ការធ្វើឲ្យត្រូវចលនា ដោយប្រើ Optical Flow
|
||||
|
||||
ការប្រឡងមេរៀនពី [មេរៀន AI សម្រាប់អ្នកចាប់ផ្តើម](https://aka.ms/ai-beginners).
|
||||
|
||||
## ភារកិច្ច
|
||||
|
||||
ពិចារណា [វីដេអូនេះ](../../../../../../lessons/4-ComputerVision/06-IntroCV/lab/palm-movement.mp4) ដែលនៅក្នុងវីដេអូនោះ ដៃគេចល័តទៅឆ្វេង/ស្តាំ/លើ/ក្រោម លើផ្ទៃខាងក្រោយដែលមានស្ថេរភាព។
|
||||
|
||||
<img src="../../../../../../translated_images/km/palm-movement.341495f0e9c47da3.webp" width="30%" alt="Palm Movement Frame"/>
|
||||
|
||||
**គោលបំណងរបស់អ្នក** គឺអាចប្រើ Optical Flow ដើម្បីកំណត់ ថាតើផ្នែកណានៃវីដេអូមានចលនាឡើង/ចុះ/ឆ្វេង/ស្តាំ។
|
||||
|
||||
**គោលបំណងបន្ថែម** គឺតាមដានចលនាដៃ ហេតុតាមពណ៌ស្បែក ដូចដែលបានរៀបរាប់ [នៅក្នុងប្លកនេះ](https://dev.to/amarlearning/finger-detection-and-tracking-using-opencv-and-python-586m) ឬ [នៅទីនេះ](http://www.benmeline.com/finger-tracking-with-opencv-and-python/)។
|
||||
|
||||
## សៀវភៅកំណត់ត្រាចាប់ផ្តើម
|
||||
|
||||
ចាប់ផ្តើមមេរៀនដោយបើក [MovementDetection.ipynb](MovementDetection.ipynb)
|
||||
|
||||
## អ្វីដែលទទួលបាន
|
||||
|
||||
ពេលខ្លះ ការងារដែលស្មុគស្មាញដូចការស្វែងរកចលនាឬកំណត់ដងម្រាមដៃអាចដោះស្រាយបានតាមរយៈការមើលឃើញកុំព្យូធ័រតែប៉ុណ្ណោះ។ ដូចនេះ វាមានប្រយោជន៍ខ្លាំងក្នុងការដឹងថា បណ្ណាល័យដូចជា OpenCV អាចធ្វើអ្វីបានខ្លះ។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបម្លែងបំភ្លឺ**:
|
||||
ឯកសារនេះត្រូវបានបម្លែងដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ បើទោះបីយើងខិតខំរក្សាលំនាំត្រឹមត្រូវ ក៏សូមយល់ពីភាពអាចមានកំហុស ឬមិនត្រឹមត្រូវក្នុងបកប្រែដោយស្វ័យប្រវត្តិ។ ឯកសារដើមនៅក្នុងភាសាមូលដ្ឋាន គួรถูกគេចាត់ទុកជាប្រភពប្រកបដោយអធិបតេយ្យ។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែមនុស្សជំនាញគឺត្រូវបានផ្តល់អនុសាសន៍។ យើងមិនមានលទ្ធជាប់ខ្សែច្បាប់ចំពោះការយល់ច្រឡំហ ឬការបំភ្លឺខុសដែលកើតមានពីការប្រើបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
# វិ្ថិសាស្ត្រដែលល្បីល្បាញ CNN
|
||||
|
||||
### VGG-16
|
||||
|
||||
VGG-16 គឺជា បណ្ដាញមួយ ដែលបានទទួលបានភាពត្រឹមត្រូវ ៩២.៧% ក្នុងការបែងចែក ImageNet top-5 classification ក្នុងឆ្នាំ ២០១៤។ វាមានរចនាសម្ព័ន្ធស្រទាប់ដូចខាងក្រោម៖
|
||||
|
||||

|
||||
|
||||
ដូចដែលអ្នកអាចមើលឃើញ VGG សំរាប់បែបផែនរង្វាស់ពហុជ្រុងធម្មតា ដែលជាលំដាប់នៃស្រទាប់កុងវូលូសិន-បូលីង។
|
||||
|
||||

|
||||
|
||||
> រូបភាពពី [Researchgate](https://www.researchgate.net/figure/Vgg16-model-structure-To-get-the-VGG-NIN-model-we-replace-the-2-nd-4-th-6-th-7-th_fig2_335194493)
|
||||
|
||||
### ResNet
|
||||
|
||||
ResNet គឺជាគ្រួសារម៉ូដែលដែលបានណែនាំដោយ Microsoft Research ក្នុងឆ្នាំ ២០១៥។ គំនិតសំខាន់នៃ ResNet គឺការប្រើប្រាស់ **ប្លុកអចិន្រ្តៃយ៍ (residual blocks)**៖
|
||||
|
||||
<img src="../../../../../translated_images/km/resnet-block.aba4ccbcc0944434.webp" width="300"/>
|
||||
|
||||
> រូបភាពពី [កឋិននេះ](https://arxiv.org/pdf/1512.03385.pdf)
|
||||
|
||||
ហេតុផលក្នុងការប្រើ identity pass-through គឺដើម្បីឲ្យស្រទាប់របស់យើងអាចទាយទ្រង់ប្រាក់ **ភាពខុសគ្នា** រវាងលទ្ធផលនៃស្រទាប់មុន និងលទ្ធផលនៃប្លុកអចិន្រ្តៃយ៍ – ដូច្នេះហៅថា *residual*។ ប្លុកទាំងនេះងាយស្រួលបណ្តុះបណ្តាល, ហើយអាចសាងសង់បណ្តាញមានប្លុកចំនួនរយរាប់បាន (វែរីយ៉ង់ដែលពេញនិយមជាងគេគឺ ResNet-52, ResNet-101 និង ResNet-152)។
|
||||
|
||||
អ្នកក៏អាចគិតបណ្ដាញនេះថាជាអាចកែសម្រួលភាពស្មុគស្មាញរបស់វាតាមទិន្នន័យដូចជា។ នៅដើមពេលដែលអ្នកចាប់ផ្ដើមបណ្តុះបណ្តាលបណ្ដាញនេះ តម្លៃទម្ងន់តូច ហើយសញ្ញាពិសេសភាគច្រើនទៅតាមស្រទាប់អត្តសញ្ញាណផុតកាត់តែម្តង។ ពេលបណ្តុះបណ្តាលបន្តទៅ ប្រការ អាទិភាពនៃប៉ារ៉ាម៉ែត្របណ្ដាញកើនឡើង ហើយបណ្ដាញកែសម្រួលតាមតម្រូវការថាមពលបង្ហាញត្រឹមត្រូវដើម្បីចាត់ថ្នាក់រូបភាពបណ្តុះបណ្តាលត្រឹមត្រូវ។
|
||||
|
||||
### Google Inception
|
||||
|
||||
រចនាសម្ព័ន្ធ Google Inception បន្តដំណើរការរបស់គំនិតនេះមួយជំហានទៀត ហើយសាងសង់ស្រទាប់បណ្ដាញមួយជា ការប្រមួលផ្លូវផ្សេងៗគ្នាច្រើន៖
|
||||
|
||||
<img src="../../../../../translated_images/km/inception.a6605b85bcbc6f52.webp" width="400"/>
|
||||
|
||||
> រូបភាពពី [Researchgate](https://www.researchgate.net/figure/Inception-module-with-dimension-reductions-left-and-schema-for-Inception-ResNet-v1_fig2_355547454)
|
||||
|
||||
នៅទីនេះ យើងត្រូវតែរំលេចតួនាទីនៃ 1x1 convolutions ព្រោះដំបូងវាមិនមានអត្ថន័យទេ។ ហេតុអ្វីយើងត្រូវដំណើរការតាមរូបភាពជាមួយតម្រៀប 1x1? ទោះយ៉ាងណា អ្នកត្រូវចងចាំថា ឆានែលកុងវូលូសិនក៏ដំណើរការជាមួយឆានែលជម្រៅច្រើនផងដែរ (ដើម - ពណ៌ RGB, ក្នុងស្រទាប់បន្ទាប់មក - ឆានែលនៃតម្រៀបផ្សេងៗ), ហើយ 1x1 convolution ត្រូវបានប្រើដើម្បីច្របាច់ឆានែលបញ្ចូលទាំងនេះជាមួយទម្ងន់បណ្តុះបណ្តាល ផ្សេងៗគ្នា។ វាក៏អាចមើលឃើញថាជាការបន្ថយទំហំ (pooling) នៅលើវិមាត្រឆានែល។
|
||||
|
||||
នេះគឺជា [បទប្លុកល្អមួយ](https://medium.com/analytics-vidhya/talented-mr-1x1-comprehensive-look-at-1x1-convolution-in-deep-learning-f6b355825578) លើប្រធានបទនេះ និង [សារព័ត៌មានដើម](https://arxiv.org/pdf/1312.4400.pdf)។
|
||||
|
||||
### MobileNet
|
||||
|
||||
MobileNet គឺជាគ្រួសារម៉ូដែលដែលមានទំហំតូច ជម្រើសសមរម្យសម្រាប់ឧបករណ៍ចល័ត។ ប្រើវានៅពេលអ្នកមានធនធានកំណត់ ហើយអាចបង់បង់ភាពត្រឹមត្រូវបានបន្តិច។ គំនិតសំខាន់ពីក្រោយវាគឺ៖ **depthwise separable convolution** ដែលអនុញ្ញាតឲ្យតំណាងគ្រប់តម្រៀបកុងវូលូសិនដោយកោតគ្នារវាងកុងវូលូសិនលំហឈរ និង 1x1 convolution លើឆានែលជម្រៅ។ វាធ្វើអោយចំនួនប៉ារ៉ាម៉ែត្រក្នុងបណ្ដាញបានបន្ថយយ៉ាងខ្លាំង ធ្វើអោយបណ្តាញតូច ប្រាប្រសើរបណ្តុះបណ្តាលដោយដាតាបានងាយស្រួលជាងកាលពីមុន។
|
||||
|
||||
នេះគឺជា [បទប្លុកល្អមួយលើ MobileNet](https://medium.com/analytics-vidhya/image-classification-with-mobilenet-cc6fbb2cd470)។
|
||||
|
||||
## សេចក្តីសន្និដ្ឋាន
|
||||
|
||||
នៅក្នុងអយកល័យនេះ អ្នកបានរៀនពីគំនិតសំខាន់ជារបស់បណ្តាញខ្សែប្រវាត់ខួរក្បាលសម្រាប់ការមើលឃើញកុំព្យូទ័រ - បណ្ដាញកុងវូលូសិន។ វិាំងងការរាល់ជីវិតដែលជាគ្រឿងផ្សំសំខាន់នៃការបែងចែករូបភាព ការបង្ការរូបធាតុ និងបណ្តាញបង្កើតរូបភាព ពេញលេញគឺបង្កើតលើមូលដ្ឋាន CNN គឺតែមានបន្ថែមស្រទាប់ និងបច្ចុប្បន្នភាពបណ្តុះបណ្តាលបន្ថែម។
|
||||
|
||||
## 🚀 ជំនួញបញ្ហា
|
||||
|
||||
នៅក្នុងសៀវភៅកំណត់ចំណាំដាក់ជាមួយ មានកំណត់សំគាល់នៅខាងក្រោមអំពីវិធីទទួលបានភាពត្រឹមត្រូវខ្ពស់ជាងនេះ។ សូមធ្វើការប្រមាញ់ខ្លះៗដើម្បីមើលថាអ្នកអាចទទួលបានភាពត្រឹមត្រូវល្អជាងនេះបានទេ។
|
||||
|
||||
## [សំណួរប្រលងបន្ទាប់ម៉ាស្សាសិក្សា](https://ff-quizzes.netlify.app/en/ai/quiz/14)
|
||||
|
||||
## ការពិចារណារួម និងការសិក្សាដោយខ្លួនឯង
|
||||
|
||||
ខណៈយោងក្នុងការប្រើប្រាស់ CNNs ជាញឹកញាប់សម្រាប់ភារកិច្ចមើលឃើញកុំព្យូទ័រ ពួកវាជាទូទៅល្អសម្រាប់ការដកស្រង់ប៉ាទនឡាញដែលមានទំហំថេរ។ ឧទាហរណ៍ បើយើង ដំណើរការជាមួយសម្លេង យើងក៏អាចចង់ប្រើ CNN ដើម្បីស្វែងរកប៉ាទនឡាញជាក់លាក់នៅក្នុងសញ្ញាសម្លេង - ក្នុងករណីនេះ តម្រៀបនៃតម្រៀបគឺមានទំហំ ១ ( និង CNN នេះហៅថា 1D-CNN)។ ព្រមទាំងមានពេលខ្លះ 3D-CNN គឺប្រើសម្រាប់ដកស្រង់លក្ខណះនៅក្នុងលំហមួយច្រើនវិមាត្រ ដូចជាសកម្មភាពជាក់លាក់ដែលកើតឡើងនៅលើវីដេអូ - CNN អាចចាប់យកប៉ាទននៃលក្ខណស្សំខាន់ដែលប្រែប្រួលតាមពេលវេលា។ សូមធ្វើការពិនិត្យមើល និងសិក្សាដោយខ្លួនឯងអំពីភារកិច្ចផ្សេងទៀតដែលអាចធ្វើបានជាមួយ CNNs។
|
||||
|
||||
## [កិច្ចការផ្ទះ](lab/README.md)
|
||||
|
||||
នៅក្នុងមណ្ឌលខាងលើ អ្នកត្រូវបានចាត់ការរក្សា ប្រភេទឆ្កែ និងឆ្មាក្នុងរូបភាព។ រូបភាពទាំងនេះជាស្មុគស្មាញជាងសំណុំទិន្នន័យ MNIST និងមានវិមាត្រខ្ពស់ជាង មានច្រើនជាង ១០ ភេទ។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបម្លែងភាសារដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈដែលយើងខិតខំរកភាពត្រឹមត្រូវ សូមចាប់អារម្មណ៍ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាមូលដ្ឋានគួរត្រូវបានគេចាត់ទុកជាឈុតដែនធ្វើការយោងដ៏មានសុពលភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្ដល់អាទិភាពប្រើការបកប្រែដោយមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែចរចារផ្សេងៗដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,64 @@
|
|||
# បណ្តាញប្រសាទប្រើកំណត់ (Convolutional Neural Networks)
|
||||
|
||||
យើងបានឃើញមុននេះថាបណ្តាញប្រសាទគឺល្អក្នុងការដោះស្រាយរូបភាព ហើយបណ្តាញ Perceptron ទ្រង់ទ្រាយមួយស្រទាប់ក៏អាចស្គាល់លេខដុតដោយដៃពីឯកសារទិន្នន័យ MNIST ដោយភាពត្រឹមត្រូវដែលគួរឱ្យព្រាងព្រោះ។ ទោះយ៉ាងណា ឯកសារទិន្នន័យ MNIST គឺពិសេសណាស់ ហើយលេខទាំងអស់ត្រូវបានដាក់នៅកណ្តាលក្នុងរូបភាព ដែលធ្វើឱ្យការងារជាងសាមញ្ញ។
|
||||
|
||||
## [សំណួរជំនួញមុនបង្រៀន](https://ff-quizzes.netlify.app/en/ai/quiz/13)
|
||||
|
||||
នៅជីវិតពិត យើងចង់អាចស្គាល់វត្ថុក្នុងរូបភាពដោយមិនគិតពីទីតាំងត្រឹមត្រូវរបស់វាក្នុងរូបភាពនោះទេ។ ការមើលឃើញតាមកុំព្យូទ័រត្រូវខុសពីការបែងចែកទូទៅ ពីព្រោះពេលយើងកំពុងស្វែងរកវត្ថុណាមួយក្នុងរូបភាព យើងត្រូវស្កេនរូបភាព ដើម្បីស្វែងរក **លំនាំ** ហើយការបង្កប់របស់វា។ ឧទាហរណ៍ ពេលស្វែងរកឆ្មា យើងអាចមើលអប្បបរមាលេខបន្ទាត់ដេក ដែលអាចបង្កើតចង្កេះឆ្មា ហើយបន្ទាប់មកការបង្កប់កាចង្កេះណាមួយអាចប្រាប់ថាវាជារូបភាពឆ្មា។ ទីតាំងសាមញ្ញ និងការមានវត្ថុជាលំនាំមានសារៈសំខាន់ មិនមែនទីតាំងត្រឹមត្រូវនៃវា ក្នុងរូបភាពនោះទេ។
|
||||
|
||||
ដើម្បីដកយកលំនាំ យើងនឹងប្រើគំនិតនៃ **តម្រងកំណត់**។ ដូចដែលអ្នកបានដឹងរួចរូបភាពត្រូវបានតំណាងដោយម៉ាទ្រីក 2D ឬតង់ស័រ 3D ជាមួយជម្រៅពណ៌។ ការដាក់តម្រងមានន័យថាយើងយកម៉ាទ្រីកគឺមូលដ្ឋានតម្រងតូចៗ ហើយសំរាប់ពិក្សែលក្នុងរូបភាពដើម យើងគណនាមធ្យមភាគទល់នឹងវាជាមួយចំណុចជិតខាង។ យើងអាចមើលវា ដូចជាពីបង្អួចតូចឆ្លងតាមរូបភាពទាំងមូល ហើយបំបែកឲ្យស្តើងនូវពិក្សែលទាំងអស់តាមអន្ធរគ្រាប់ចំណុចក្នុងម៉ាទ្រីកតម្រង។
|
||||
|
||||
 | 
|
||||
----|----
|
||||
|
||||
> រូបភាពដោយ Dmitry Soshnikov
|
||||
|
||||
ឧទាហរណ៍ ប្រសិនបើយើងដាក់តម្រងគែម 3x3 គែមដេក និងគែមបញ្ឈរចូលក្នុងលេខ MNIST យើងអាចទទួលបានចំណុចសំរាប់រង្វាស់តម្លៃខ្ពស់នៅកន្លែងមានគែមដេក និងគែមបញ្ឈរនៅក្នុងរូបភាពដើម។ ដូច្នេះតម្រងទាំងពីរនេះអាចប្រើសម្រាប់ "ស្វែងរក" គែម។ ដូចគ្នាណាស់ យើងអាចបង្កើតតម្រងផ្សេងៗ ដើម្បីស្វែងរកលំនាំទាបផ្សេងទៀត៖
|
||||
|
||||
<img src="../../../../../translated_images/km/lmfilters.ea9e4868a82cf74c.webp" width="500" align="center"/>
|
||||
|
||||
> រូបភាពគម្រោង [ធនាគារតម្រង Leung-Malik](https://www.robots.ox.ac.uk/~vgg/research/texclass/filters.html)
|
||||
|
||||
ទោះយ៉ាងណា ចំពោះការរចនាតម្រងដើម្បីដកយកលំនាំដោយដៃ យើងអាចរចនាបណ្តាញជារបៀបដែលវាស្វែងរកលំនាំផ្ទាល់ខ្លួន។ នេះជាមូលដ្ឋានសំខាន់មួយនៅក្រោយ CNN។
|
||||
|
||||
## គំនិតសំខាន់ៗនៅពីក្រោយ CNN
|
||||
|
||||
របៀបការងាររបស់ CNN អាស្រ័យលើគំនិតសំខាន់ៗដូចខាងក្រោម៖
|
||||
|
||||
* តម្រងកំណត់អាចដកយកលំនាំ
|
||||
* យើងអាចរចនាបណ្តាញដែលតម្រងត្រូវបណ្ដុះបណ្ដាលដោយស្វ័យប្រវត្តិ
|
||||
* យើងអាចប្រើវិធីសាស្រ្តដូចគ្នានេះសម្រាប់រកលំនាំនៅលើមុខងារថ្នាក់ខ្ពស់ មិនត្រឹមតែផ្នែករូបភាពដើមទេ។ ដូច្នេះការដកលក្ខណៈ CNN អនុវត្តលើជួរមុខងារ ចាប់ពីលំនាំពិក្សែលកម្រិតទាប ដល់ការបង្កប់ផ្នែករូបភាពកម្រិតខ្ពស់។
|
||||
|
||||

|
||||
|
||||
> រូបភាពពី [អត្ថបទ Hislop-Lynch](https://www.semanticscholar.org/paper/Computer-vision-based-pedestrian-trajectory-Hislop-Lynch/26e6f74853fc9bbb7487b06dc2cf095d36c9021d), មូលដ្ឋានលើ [ការស្រាវជ្រាវរបស់ពួកគេ](https://dl.acm.org/doi/abs/10.1145/1553374.1553453)
|
||||
|
||||
## ✍️ ផ្នែកហាត់ប្រាណ៖ បណ្តាញប្រសាទប្រើកំណត់
|
||||
|
||||
សូមបន្តស្វែងយល់ពីរបៀបកំណត់បណ្តាញប្រសាទប្រើកំណត់ និងរបៀបយើងអាចសម្រេចបានតម្រងដែលអាចបណ្ដុះបណ្ដាល ដោយធ្វើតាមកំណត់តាបណ្ដាញខាងក្រោមនេះ៖
|
||||
|
||||
* [បណ្តាញប្រសាទប្រើកំណត់ - PyTorch](ConvNetsPyTorch.ipynb)
|
||||
* [បណ្តាញប្រសាទប្រើកំណត់ - TensorFlow](ConvNetsTF.ipynb)
|
||||
|
||||
## រចនាសម្ព័ន្ធមឿនរ៉ាយ (Pyramid Architecture)
|
||||
|
||||
ភាគច្រើននៃ CNN ដែលប្រើសម្រាប់កែច្នៃរូបភាព អនុវត្តរចនាសម្ព័ន្ធមឿនរ៉ាយ។ ស្រទាប់កំណត់ដំបូងដែលមានទៅលើរូបភាពដើមភាគច្រើនមានតម្រងតិច (8-16) ដែលសម្របសម្រួលការបង្កប់ពិក្សែលផ្សេងៗ ដូចជាជួរដេក/បញ្ឈរនៃខ្ទង់។ នៅជាន់បន្ទាប់ យើងកាត់បន្ថយវិមាត្រជាចំណុចចន្លោះ ហើយបន្ថែមចំនួនតម្រង ដែលបង្ហាញពីការបង្កប់លក្ខណៈសាមញ្ញភាគច្រើន។ ជាមួយនឹងស្រទាប់រាបរាបនៅក្នុងបណ្តាញនោះ ជាមួយនឹងបណ្តោយទៅជាម៉ាស៊ីនចំណាត់ថ្នាក់ចុងក្រោយ, វិមាត្រឆ្លើយតបរបស់រូបភាពក្រលឹក ត្រឹមត្រូវលឿនឡើង ហើយចំនួនតម្រងក៏បន្ថែមឡើង។
|
||||
|
||||
ជាឧទាហរណ៍ មកមើលរចនាសម្ព័ន្ធ VGG-16 ដែលបានទទួលបានភាពត្រឹមត្រូវ 92.7% ក្នុងពិន្ទុ Top-5 នៃការបែងចែក in ImageNet ឆ្នាំ 2014៖
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
> រូបភាពពី [Researchgate](https://www.researchgate.net/figure/Vgg16-model-structure-To-get-the-VGG-NIN-model-we-replace-the-2-nd-4-th-6-th-7-th_fig2_335194493)
|
||||
|
||||
## រចនាសម្ព័ន្ធ CNN ដែលមានឈ្មោះល្បី
|
||||
|
||||
[បន្តសិក្សាអំពីរចនាសម្ព័ន្ធ CNN ដ៏ល្បី](CNN_Architectures.md)
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបោះបង់ពីការទទួលខុសត្រូវ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំបំពានសុពលភាព សូមជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាដើមគួรถูกចាត់ទុកថាជាភស្តុតាងសម្របសម្រួល។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សវិជ្ជាជីវៈគឺត្រូវបានផ្តល់អនុសាសន៍។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬកិច្ចមិនយល់គ្នាណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,40 @@
|
|||
# ការធ្វើចំណាត់ថ្នាក់មុខសត្វចិញ្ចឹម
|
||||
|
||||
ការប្រលងមន្ទីរពី [កថិរូប AI សម្រាប់អ្នកដំបូង](https://github.com/microsoft/ai-for-beginners)។
|
||||
|
||||
## ភារកិច្ច
|
||||
|
||||
សូមសន្និដ្ឋានថា អ្នកត្រូវបង្កើតកម្មវិធីសម្រាប់ដ Nursery សត្វចិញ្ចឹម ដើម្បីធ្វើកំណត់ត្រាសត្វទាំងអស់។ មួយក្នុងនូវលក្ខណះល្អនៃកម្មវិធីដូចនេះគឺ អាចរកប្រភេទសត្វដោយស្វ័យប្រវត្តិពីរូបថត។ នេះអាចធ្វើបានដោយជោគជ័យដោយប្រើបណ្តាញប្រព័ន្ធប្រតិទិនសរសៃប្រសាទ។
|
||||
|
||||
អ្នកត្រូវបណ្តុះបណ្តាលបណ្តាញប្រព័ន្ធប្រតិទិនសរសៃប្រសាទប្រភេទកុងវុលូសិន ដើម្បីចំណាត់ថ្នាក់ប្រភេទខុសៗគ្នានៃឆ្មា និងឆ្កែ ដោយប្រើ **កំណត់ត្រាមុខសត្វ**។
|
||||
|
||||
## កំណត់ត្រា
|
||||
|
||||
យើងនឹងប្រើ [កំណត់ត្រាសត្វ Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/), ដែលមានរូបភាពនៃសត្វឆ្កែ និងឆ្មា ៣៧ ប្រភេទខុសៗគ្នា។
|
||||
|
||||

|
||||
|
||||
ដើម្បីទាញយកកំណត់ត្រា និយាយប្រើកូដខាងក្រោម៖
|
||||
|
||||
```python
|
||||
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
|
||||
!tar xfz images.tar.gz
|
||||
!rm images.tar.gz
|
||||
```
|
||||
|
||||
**ព័ត៌មាន៖** រូបភាពក្នុងកំណត់ត្រាសត្វ Oxford-IIIT ត្រូវបានរៀបចំតាមឈ្មោះឯកសារ (ដូចជា `Abyssinian_1.jpg`, `Bengal_2.jpg`)។ សៀវភៅសម្ថិទញនេះរួមបញ្ចូលកូដដើម្បីរៀបចំរូបភាពទាំងនេះទៅក្នុងថតរងតាមប្រភេទសត្វ សម្រាប់ការចំណាត់ថ្នាក់កាន់តែងាយស្រួល។
|
||||
|
||||
## សៀវភៅសម្ថិទញចាប់ផ្តើម
|
||||
|
||||
ចាប់ផ្តើមមន្ទីរពីការបើក [PetFaces.ipynb](PetFaces.ipynb)
|
||||
|
||||
## អត្ថប្រយោជន៍ទទួលបាន
|
||||
|
||||
អ្នកបានដោះស្រាយបញ្ហាចំណាត់ថ្នាក់រូបភាពដែលស្មុគស្មាញមួយពីគន្លងចាប់ផ្តើម! មានបណ្តាប្រភេទជាច្រើន ហើយអ្នកមិនថែមទាំងទទួលបានភាពត្រឹមត្រូវដែលសមរម្យទេ! វានៅតែមានន័យក្នុងការវាស់វែងភាពត្រឹមត្រូវ top-k ពីព្រោះងាយក្នុងការច្រឡំប្រភេទខ្លះៗដែលមិនខុសរវាងគ្នាក្បាលតែសំណាក់មនុស្សផងដែរ។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំប្រឹងប្រែងក្នុងការធ្វើឲ្យបានត្រឹមត្រូវ សូមចំណាំថាការបកប្រែដោយស្វ័យប្រវត្តអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាទូទៅគួរត្រូវបានគិតថាជាតំណוקចោលជាផ្លូវការជាមូលដ្ឋាន។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមប្រើការបកប្រែមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសផ្សេងៗ ដោយសារការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,85 @@
|
|||
# បណ្តាញដែលបានបណ្តុះបណ្តាលជាមុន និងការរៀនផ្ទេរ
|
||||
|
||||
ការបណ្តុះបណ្តាល CNNs អាចចំណាយពេលយូរជាច្រើន ហើយតម្រូវឱ្យមានទិន្នន័យច្រើនសម្រាប់ភារកិច្ចនោះ។ ទោះជាយ៉ាងណា ភាគច្រើននៃពេលវេលាត្រូវបានចំណាយក្នុងការរៀនរើសចម្រាញ់ត្រង់តិចទាបដែលបណ្តាញអាចប្រើសម្រាប់ទាញយកលំនាំពីរូបភាព។ សំណួរធម្មជាតិមួយកើតឡើង - តើយើងអាចប្រើបណ្តាញប្រព័ន្ធប្រសាទដែលបានបណ្តុះបណ្តាលលើទិន្នន័យមួយ និងប្តូរវាឱ្យសមរម្យក្នុងការបែងចែករូបភាពខុសគ្នារហើយដោយមិនចាំបាច់បណ្តុះបណ្តាលពេញលេញម្ដងទៀត?
|
||||
|
||||
## [សំណួរសាកល្បងមុនមេរៀន](https://ff-quizzes.netlify.app/en/ai/quiz/15)
|
||||
|
||||
វិធីសាស្រ្តនេះហៅថា **ការរៀនផ្ទេរ**, ព្រោះយើងផ្ទេរចំណេះដឹងពីម៉ូដែលបណ្តាញប្រព័ន្ធប្រសាទមួយទៅម៉ូដែលផ្សេងទៀត។ ក្នុងការរៀនផ្ទេរ យើងជាទូទៅចាប់ផ្ដើមជាមួយម៉ូដែលដែលបានបណ្តុះបណ្តាលជាមុនដែលបានត្រៀមលើឃ្លាំងរូបភាពធំមួយ ដូចជា **ImageNet**។ ម៉ូដែលទាំងនោះអាចធ្វើការបែងចែកលក្ខណៈផ្សេងៗពីរូបភាពទូទៅបានយ៉ាងល្អ ហើយនៅក្នុងករណីជាច្រើនគ្រាន់តែបង្កើតកម្មវិធីបែងចែកលើលក្ខណៈដែលទាញយកបានទើបអាចទទួលបានលទ្ធផលល្អ។
|
||||
|
||||
> ✅ ការរៀនផ្ទេរជាពាក្យដែលអ្នកប្រទះឃើញនៅក្នុងវិស័យសិក្សាផ្សេងទៀត ដូចជាការអប់រំ។ វាសំដៅលើដំណើរការនាំយកចំណេះដឹងពីដែនណាមួយ ហើយអនុវត្តទៅដែនផ្សេងទៀត។
|
||||
|
||||
## ម៉ូដែលដែលបានបណ្តុះបណ្តាលជាមុនជាឧបករណ៍ទាញយកលក្ខណៈ
|
||||
|
||||
បណ្តាញកុងវុលូសិនដែលយើងបានពិភាក្សានៅផ្នែកមុនមានជាន់ជាច្រើន ដែលនិទស្សន៍ថាចង់ទាញយកលក្ខណៈពីរូបភាព ដំបូងពីការបញ្ចូលបិទភីក្សែលទាប (ដូចជារបារ(horizontal)/បន្ទាត់ត្រង់(vertical) ឬគំនូស) រហូតដល់កម្រិតខ្ពស់ជាងនៃលក្ខណៈដែលបញ្ចូលគ្នា ដូចជាតួអាំងភ្លើង។ ប្រសិនបើយើងបណ្តុះបណ្តាល CNN លើឃ្លាំងរូបភាពធំនិងចម្រុះគ្រប់គ្រាន់ បណ្តាញគួរតែនាំយកលក្ខណៈទូទៅទាំងនោះបាន។
|
||||
|
||||
ទាំង Keras និង PyTorch មានមុខងារដែលងាយស្រួលក្នុងការទាញយកបញ្ចប់ទំងន់នៃបណ្តាញប្រព័ន្ធប្រសាទដែលបានបណ្តុះបណ្តាលជាមុនសម្រាប់រចនាសម្ព័ន្ធទូទៅមួយចំនួន ដែលភាគច្រើនត្រូវបានបណ្តុះលើរូបភាព ImageNet។ ការប្រើប្រាស់ធម្មតាជាញឹកញាប់ត្រូវបានពិពណ៌នានៅលើទំព័រ [CNN Architectures](../07-ConvNets/CNN_Architectures.md) ពីមេរៀនមុន។ ជាក់លាក់ អ្នកប្រហែលជាចង់ពិចារណាការប្រើប្រាស់មួយក្នុងចំណោមដូចខាងក្រោម៖
|
||||
|
||||
* **VGG-16/VGG-19** គឺជាម៉ូដែលតូចៗ ដែលនៅតែផ្តល់ភាពត្រឹមត្រូវល្អ។ ជាច្រើនជំហានការប្រើ VGG ជាការសាកល្បងដំបូងជាជម្រើសល្អដើម្បីមើលថាការរៀនផ្ទេរដំណើរការយ៉ាងដូចម្តេច។
|
||||
* **ResNet** គឺជាជតាំងម៉ូដែលដែលបានណែនាំដោយ Microsoft Research ក្នុងឆ្នាំ 2015។ វាមានជាន់ច្រើនជាង ហើយត្រូវការប្រាក់ចំណាយធនធានច្រើនជាង។
|
||||
* **MobileNet** គឺជាជតាំងម៉ូដែលដែលមានទំហំតូចសមរម្យសម្រាប់ឧបករណ៍ចល័ត។ ប្រើពួកវាប្រសិនបើធនធានរបស់អ្នកមានកម្រិតតិច ហើយអាចបោះបង់ភាពត្រឹមត្រូវបន្តិច។
|
||||
|
||||
នេះជាលក្ខណៈគំរូដែលត្រូវបានទាញយកពីរូបភាពឆ្មា ដោយបណ្តាញ VGG-16៖
|
||||
|
||||

|
||||
|
||||
## ឃ្លាំងទិន្នន័យឆ្មានិងសត្វឆ្កែ
|
||||
|
||||
ក្នុងឧទាហរណ៍នេះ យើងនឹងប្រើឃ្លាំងទិន្នន័យ [ឆ្មា និងសត្វឆ្កែ](https://www.microsoft.com/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) ដែលស្ថិតនៅជិតស្ថានភាពបែងចែករូបភាពជារឿងពិត។
|
||||
|
||||
## ✍️ លំហាត់: ការរៀនផ្ទេរ
|
||||
|
||||
ចង់មើលការរៀនផ្ទេរដំណើរការជាក់ស្តែងក្នុងកំណត់ត្រាសរសេរដូចខាងក្រោម៖
|
||||
|
||||
* [ការរៀនផ្ទេរ - PyTorch](TransferLearningPyTorch.ipynb)
|
||||
* [ការរៀនផ្ទេរ - TensorFlow](TransferLearningTF.ipynb)
|
||||
|
||||
## ការមើលឃើញឆ្មាសម្រួល
|
||||
|
||||
បណ្តាញប្រព័ន្ធប្រសាទដែលបានបណ្តុះបណ្តាលជាពិសេស មានលំនាំផ្សេងៗជាច្រើននៅក្នុង *ខួរក្បាល*, រួមបញ្ចូលទស្សនៈអំពី **ឆ្មាដែលល្អបំផុត** (រួមទាំងឆ្កែល្អបំផុត គោលនិយមសត្វដូងល្អបំផុត ហ وغيرها)។ វានឹងគួរឱ្យចាប់អារម្មណ៍ក្នុងការចង់ **បង្ហាញរូបភាពនេះ**។ ទោះជាយ៉ាងណា វាមិនសាមញ្ញឡើយ ព្រោះលំនាំត្រូវបានចែករំលែកនៅក្នុងទំងន់នៃបណ្តាញសុទ្ធៗ និងរៀបចំជាសំណុំបែបបទជាបណ្តាសម្ព័ន្ធ។
|
||||
|
||||
វិធីសាស្រ្តមួយដែលយើងអាចយកដំណើរការមកគឺចាប់ផ្ដើមជាមួយរូបភាពឯករាជ្យមួយ ហើយបន្ទាប់ពីនោះព្យាយាមប្រើបច្ចេកទេស **ផ្តោតអាំងតង់ស៊ីតេតំពួត(superior gradient descent)** ដើម្បីកែប្រែរូបភាពដូច្នេះ ដើម្បីឲ្យបណ្តាញចាប់ផ្តើមគិតថាវាជាឆ្មា។
|
||||
|
||||

|
||||
|
||||
ទោះជាយ៉ាងណា ប្រសិនបើយើងធ្វើបែបនេះ យើងនឹងទទួលបានអ្វីមួយស្រដៀងនឹងសម្លេងរំខានចៃដន្យ។ វាមកពី *មានវិធីជាច្រើនដែលធ្វើឲ្យបណ្តាញគិតថារូបភាពដែលបញ្ចូលជាឆ្មា* រួមទាំងមួយចំនួនដែលមិនមានអត្ថន័យផ្នែកមើលឃើញ។ នៅពេលរូបភាពទាំងនោះមានលំនាំជាច្រើនដែលធម្មតាសម្រាប់ឆ្មា ក៏គ្មានអ្វីដើម្បីដាក់កំណត់មិនឲ្យវាជាផ្សេងទៀតពីរូបភាពមើលឃើញ។
|
||||
|
||||
ដើម្បីធ្វើឲ្យលទ្ធផលប្រសើរជាងមុន អាចបន្ថែមពាក្យមួយទៀតនៅក្នុងអនុគមន៍ខាត ដែលហៅថា **variation loss**។ វាជាឧបមាធមណិតំណាស់បង្ហាញពីភាពស្រដៀងគ្នានៃភីក្សែលជិតៗរូបភាព។ ការបន្ថយvariation loss ធ្វើឲ្យរូបភាពរលោង និងកំចាត់សម្លេងរំខាន – ដូច្នេះបង្ហាញលំនាំដែលគួរឱ្យមើលឃើញ។ នេះជាឧទាហរណ៍រូបភាព "ល្អបំផុត" ដូចដែលត្រូវបានចាត់ថ្នាក់ជាឆ្មា និងជាសត្វដូងស្ត្រីជាមួយប្រហែលខ្ពស់៖
|
||||
|
||||
 | 
|
||||
-----|-----
|
||||
*ឆ្មាល្អបំផុត* | *សត្វដូងស្ត្រីល្អបំផុត*
|
||||
|
||||
វិធីសាស្រ្តស្រដៀងនេះអាចប្រើសម្រាប់ការធ្វើការវាយប្រហារជាផ្លូវការ (known as **adversarial attacks**) លើបណ្តាញប្រព័ន្ធប្រសាទ។ សន្និដ្ឋានថាយើងចង់ល្បួងបណ្តាញប្រព័ន្ធប្រសាទ ហើយធ្វើឲ្យសត្វឆ្កែកាន់តែជាឆ្មា។ ប្រសិនបើយើងយករូបភាពសត្វឆ្កែ ដែលបណ្តាញកំណត់ថាជាសត្វឆ្កែ យើងអាចកែប្រែវាបន្តិចដោយប្រើផ្តោតអាំងតង់ស៊ីតេតំពួត រាល់ពេលរហូតបណ្តាញចាប់ផ្តើមចាត់ថ្នាក់វាជាឆ្មា៖
|
||||
|
||||
 | 
|
||||
-----|-----
|
||||
*រូបដើមនៃសត្វឆ្កែ* | *រូបសត្វឆ្កែដែលចាត់ថ្នាក់ជាឆ្មា*
|
||||
|
||||
មើលកូដដើម្បីបង្កើតលទ្ធផលខាងលើនៅក្នុងកំណត់ត្រាដូចខាងក្រោម៖
|
||||
|
||||
* [ឆ្មាល្អបំផុត និងឆ្មាវាយប្រហារ - TensorFlow](AdversarialCat_TF.ipynb)
|
||||
|
||||
## សេចក្ដីសន្និដ្ឋាន
|
||||
|
||||
ដោយប្រើការរៀនផ្ទេរ អ្នកអាចបង្កើតកម្មវិធីបែងចែកសម្រាប់ភារកិច្ចបែងចែកវត្ថុផ្ទាល់ខ្លួនបានយ៉ាងឆាប់រហ័ស និងទទួលផលបានភាពត្រឹមត្រូវខ្ពស់។ អ្នកអាចមើលឃើញថា ភារកិច្ចស្មុគស្មាញជាងមុនដែលយើងកំពុងដោះស្រាយ តម្រូវឲ្យមានថាមពលគណនាធំជាង ហើយមិនអាចដោះស្រាយបានយ៉ាងងាយស្រួលលើ CPU ទេ។ នៅឯកជនបន្ទាប់ យើងនឹងព្យាយាមប្រើកូដបង្កើតដែលមានទម្ងន់ស្រាលជាងដើម្បីបណ្តុះម៉ូដែលដដែលដោយប្រើធនធានគណនាខ្ពស់តិចជាង ដែលបង្កើតភាពត្រឹមត្រូវបន្តបន្តិចប៉ុណ្ណោះ។
|
||||
|
||||
## 🚀 챌린지
|
||||
|
||||
នៅក្នុងកំណត់ត្រាដែលភ្ជាប់មកមានកំណត់ចំណាំនៅផ្នែកក្រោមអំពីរបៀបដែលចំណេះដឹងផ្ទេរបានល្អជាមួយទិន្នន័យបណ្តុះប្រកបដោយស្រដៀងគ្នា (ប្រហែលជាប្រភេទសត្វថ្មីមួយ)។ សូមធ្វើការប្រតិបត្តិការជាមួយរូបភាពប្រភេទថ្មីៗមួយចំនួន ដើម្បីមើលថា តើម៉ូដែលចំណេះដឹងផ្ទេររបស់អ្នកអាចដំណើរការបានល្អឬអត់។
|
||||
|
||||
## [សំណួរសាកល្បងបន្ទាប់មេរៀន](https://ff-quizzes.netlify.app/en/ai/quiz/16)
|
||||
|
||||
## ការសិក្សាខ្លួនឯងនិងការពិនិត្យឡើងវិញ
|
||||
|
||||
អានតាម [TrainingTricks.md](TrainingTricks.md) ដើម្បីបន្ថែមចំណេះដឹងរបស់អ្នកអំពីវិធីផ្សេងទៀតក្នុងការបណ្តុះបណ្តាលម៉ូដែលរបស់អ្នក។
|
||||
|
||||
## [ភារកិច្ច](lab/README.md)
|
||||
|
||||
នៅក្នុងមន្ទីរបណ្ដុះបណ្ដាលនេះ យើងនឹងប្រើឃ្លាំងទិន្នន័យជាក់លាក់ក្នុងជីវិតប្រចាំថ្ងៃ [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) ដែលមានប្ដូររាជ្យចំណាំលោកឆ្មានិងសត្វឆ្កែចំនួន ៣៥ ប្រភេទ ហើយយើងនឹងបង្កើតកម្មវិធីបែងចែកដោយការរៀនផ្ទេរ។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈដែលយើងខំប្រឹងប្រែងសម្រាប់ភាពត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិនោះអាចមានកំហុសឬមិនមានភាពត្រឹមត្រូវបាន។ ឯកសារដើមនៅភាសារដើមគួរត្រូវបានគេយកជាអត្ថប្រយោជន៍ដ៏មានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរតែប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនមានការទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសៗគ្នាដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
# យុទ្ធសាស្ត្របណ្តុះបណ្តាលរៀនជ្រៅ
|
||||
|
||||
នៅពេលដែលបណ្តាញអនុវត្តកាន់តែជ្រៅ ការបណ្តុះបណ្តាលរបស់ពួកវាក្លាយទៅជាការលំបាកបន្ថែមទៀត។ បញ្ហាមួយសំខាន់គឺហៅថា [ចំណុចបាត់បង់ទ្រង់ទ្រាយកាត់ត់](https://en.wikipedia.org/wiki/Vanishing_gradient_problem) ឬ [ចំណុចបែកបាក់ទ្រង់ទ្រាយកាត់ត់](https://deepai.org/machine-learning-glossary-and-terms/exploding-gradient-problem#:~:text=Exploding%20gradients%20are%20a%20problem,updates%20are%20small%20and%20controlled.)។ [អត្ថបទនេះ](https://towardsdatascience.com/the-vanishing-exploding-gradient-problem-in-deep-neural-networks-191358470c11) ផ្តល់នូវការណែនាំល្អស្តីពីបញ្ហាទាំងនេះ។
|
||||
|
||||
ដើម្បីធ្វើឱ្យការបណ្តុះបណ្តាលបណ្តាញជ្រៅមានប្រសិទ្ធភាពច្រើនขึ้น មានបច្ចេកទេសមួយចំនួនដែលអាចប្រើបាន។
|
||||
|
||||
## រក្សាតម្លៃក្នុងលំហសមរម្យ
|
||||
|
||||
ដើម្បីធ្វើឱ្យការគណនាតាត្បាលមានស្ថិរភាព យើងចង់ធ្វើឱ្យប្រាកដថាតម្លៃទាំងអស់ក្នុងបណ្តាញបណ្តាញអនុវត្តរបស់យើងស្ថិតនៅក្នុងលំហសមរម្យ ជាទូទៅ[-1..1] ឬ [0..1]។ វាមិនមែនជាការទាមទារយ៉ាងតឹងរឹងទេ ប៉ុន្តែធម្មជាតិនៃការគណនាចំនួនបន្តិចបន្តួចគឺថាតម្លៃដែលមានទំហំនានាផ្សេងគ្នាមិនអាចគ្រប់គ្រងបានយ៉ាងត្រឹមត្រូវរួមគ្នា។ ឧទាហរណ៍ ប្រសិនបើយើងបូក 10<sup>-10</sup> និង 10<sup>10</sup> យើងប្រហែលជាបាន 10<sup>10</sup> ព្រោះតម្លៃតូចនឹងត្រូវបាន "បំលែង" ទៅលំដាប់ដូចគ្នាដូចតម្លៃធំ ជាធម្មតាម៉ង់ទីស្សាតិត្រូវបាត់បង់។
|
||||
|
||||
មុខងារបញ្ចេញផ្សេងៗភាគច្រើនមានបម្រែបម្រួលមិនប៉ុនប៉ងនៅជុំវិញ [-1..1] ដូច្នេះវាមានន័យក្នុងការតំលើងទិន្នន័យចូលទាំងអស់ទៅលំហ [-1..1] ឬ [0..1] ។
|
||||
|
||||
## ការចាប់ផ្តើមផ្ដល់ទម្ងន់ដើម
|
||||
|
||||
អក្នុងលក្ខណៈល្អបំផុត យើងចង់ឲ្យតម្លៃស្ថិតនៅក្នុងជួរដូចគ្នាបន្ទាប់ពីការស្វែងកាត់តបណ្តាញ។ ដូច្នេះវាសំខាន់ក្នុងការចាប់ផ្តើមផ្ដល់ទម្ងន់ដោយវិធីដែលរក្សាតំបន់បែងចែកនៃតម្លៃ។
|
||||
|
||||
ការបែងចែកធម្មតា **N(0,1)** មិនមែនជាគំនិតល្អទេ ដោយសារបើយើងមាន *n* តម្លៃចូល កម្រិតបញ្ចេញផ្គត់ផ្គង់នៃលទ្ធផលនឹងជាប្រេកង់ *n* ហើយតម្លៃឆ្លងទៅអាចទៅកាន់លំហ [0..1]។
|
||||
|
||||
ការចាប់ផ្តើមផ្ដល់ទម្ងន់ខាងក្រោមគឺប្រើជារឿយៗ៖
|
||||
|
||||
* ការបែងចែកស្មើ -- `uniform`
|
||||
* **N(0,1/n)** -- `gaussian`
|
||||
* **N(0,1/√n_in)** ធានាថាសម្រាប់ទិន្នន័យចូលដែលមានមធ្យមសូន្យ និងកម្រិតបញ្ចេញផ្គត់ផ្គង់ 1 មធ្យម/គុណនៃកម្រិតបញ្ចេញផ្គត់ផ្គង់នឹងមាននៅ
|
||||
* **N(0,√2/(n_in+n_out))** -- ហៅថា **ចាប់ផ្តើម Xavier** (`glorot`), វាជួយរក្សាសញ្ញានៅក្នុងជួរទាំងក្នុងការស្ទង់តាមមុខនិងត្រឡប់ក្រោយ
|
||||
|
||||
## Batch Normalization
|
||||
|
||||
បើទោះបីបង្កើតផ្ដល់ទម្ងន់បានត្រឹមត្រូវ ក៏ទម្ងន់អាចកើនឡើង ឬតូចណាស់ក្នុងអំឡុងការបណ្តុះបណ្តាល ហើយវានឹងធ្វើឲ្យសញ្ញាចេញពីជួរត្រឹមត្រូវ។ យើងអាចយកសញ្ញាត្រឡប់វិញដោយប្រើនឹកស្មានវិធី **normalization** មួយ។ ខណៈដែលវាមានច្រើនយ៉ាង (Weight Normalization, Layer Normalization) វិធីដែលប្រើប្រាស់ច្រើនជាងគេគឺ Batch Normalization។
|
||||
|
||||
គំនិតនៃ **batch normalization** គឺយកតម្លៃទាំងអស់ក្នុង minibatch ហើយអនុវត្ត normalization (យបានដកមធ្យម និងបែងចែកដោយកម្រិតបញ្ចេញផ្គត់ផ្គង់) ដោយផ្អែកលើតម្លៃទាំងនោះ។ វាត្រូវបានអនុវត្តជាជាន់បណ្តាញមួយដែលអនុវត្ត normalization នេះបន្ទាប់ពីបូកទម្ងន់ ប៉ុន្តែមុនមុខងារបញ្ចេញ។ ផលវិបាក គឺយើងបានឃើញគុណភាពចុងក្រោយខ្ពស់ និងការបណ្តុះបណ្តាលរហ័ស។
|
||||
|
||||
នេះជាឯកសារដើម [original paper](https://arxiv.org/pdf/1502.03167.pdf) ស្តីពី batch normalization, [ការពន្យល់ក្នុងវិគីភីឌា](https://en.wikipedia.org/wiki/Batch_normalization), និង [អត្ថបទណែនាំល្អ](https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338) (និងមួយ [ជារុស្សី](https://habrahabr.ru/post/309302/))។
|
||||
|
||||
## Dropout
|
||||
|
||||
**Dropout** គឺជាបច្ចេកទេសគួរឱ្យចាប់អារម្មណ៍ដែលដកចេញភាគរយចៃដន្យនៃន្យូរ៉ូនក្នុងអំឡុងការបណ្តុះបណ្តាល។ វាត្រូវបានអនុវត្តជាជាន់មួយដែលមានប៉ារ៉ាម៉ែត្រជាមួយ (ភាគរយន្យូរ៉ូនដែលត្រូវដកចេញ ជាទូទៅ ១០%-៥០%) ហើយក្នុងអំឡុងការបណ្តុះបណ្តាល វាកំណត់តម្លៃឡុងទាំងចៃដន្យនៃវ៉ិចទ័រចូល ដើម្បីបញ្ចូនទៅជាន់បន្ទាប់។
|
||||
|
||||
បើទោះបីវាដូចជាគំនិតអស្ចារ្យ អ្នកអាចមើលឃើញផលប៉ះពាល់របស់ dropout លើការបណ្តុះបណ្តាលម៉ាស៊ីនបំបែកលេខ MNIST នៅក្នុងកំណត់កិច្ច [`Dropout.ipynb`](Dropout.ipynb)។ វាផ្តល់នូវល្បឿនបណ្តុះបណ្តាលរហ័ស និងអនុញ្ញាតឱ្យយើងទទួលបានភាពត្រឹមត្រូវខ្ពស់ជាងមុនក្នុងចំនួន epoch តិចជាង។
|
||||
|
||||
ផលប៉ះពាល់នេះអាចពន្យល់បានជា៖
|
||||
|
||||
* វាអាចត្រូវបានគេចាត់ទុកជាឧបករណ៍ចុកចាប់ចៃដន្យទៅលើម៉ូដែល ដែលយកការបង្រួមចំណុចពីខ្នាតតូច
|
||||
* វាអាចត្រូវបានគេដាក់ជារបៀប *ការเฉลี่ยម៉ូដែលដោយហេតុផល* ព្រោះយើងអាចនិយាយថា ក្នុងអំឡុង dropout យើងកំពុងបណ្តុះបណ្តាលម៉ូដែលខុសគ្នាខ្លះៗ
|
||||
|
||||
> *មនុស្សមួយចំនួនម្នាក់និយាយថា នៅពេលមនុស្សម្នាក់ផឹកស្រា ហើយព្យាយាមរៀនអ្វីមួយ គេនឹងចងចាំបានល្អជាងពេលឆៅពេលព្រឹក ព្រោះខួរក្បាលដែលមានន្យូរ៉ូនខូចខាតខ្លះព្យាយាមបត់បែនខ្លួនប្រសើរឡើងដើម្បីយល់ផ្លូវច្បាស់។ យើងមិនដែលសាកល្បងថាវាជាការពិតរឺអ្វីទេ។*
|
||||
|
||||
## ការទប់ស្កាត់ overfitting
|
||||
|
||||
មួយក្នុងចំណោមចំណុចសំខាន់នៃការរៀនជ្រៅគឺមានសមត្ថភាពទប់ស្កាត់ [overfitting](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)។ ខណៈដែលវាអាចជាចំណាប់អារម្មណ៍ក្នុងការប្រើម៉ូដែលបណ្តាញអនុវត្តមានថាមពលខ្លាំង យើងគួរតែនៅតែតុល្យភាពចំនួនប៉ារ៉ាម៉ែត្រម៉ូដែល ជាមួយចំនួនគំរូបណ្តុះបណ្តាល។
|
||||
|
||||
> ទុកចិត្តទាត់ខ្លួនឯងក្នុងគំនិត [overfitting](../../3-NeuralNetworks/05-Frameworks/Overfitting.md) ដែលយើងបានណែនាំជាមុន!
|
||||
|
||||
មានវិធីជាច្រើនដើម្បីទប់ស្កាត់ overfitting៖
|
||||
|
||||
* បញ្ឈប់បន្ទាន់ -- ត្រួតពិនិត្យកំហុសលើកំណត់ត្រាបញ្ជាក់ជាបន្តបន្ទាប់ ហើយបញ្ឈប់បណ្តុះបណ្តាលពេលកំហុសកំណត់ត្រាបញ្ជាក់ចាប់ផ្តើមកើនឡើង។
|
||||
* Weight Decay / Regularization ផ្ទាល់រំលេច -- បន្ថែមពិន័យបន្ថែមលើអនុគមន៍ខាតសម្រាប់តម្លៃទម្ងន់ខ្ពស់ ដែលទប់ស្កាត់មិនឲ្យម៉ូដែលមានលទ្ធផលមិនស្ថិតស្ថេរណ៍
|
||||
* ការជម្រះម៉ូដែល -- បណ្តុះបណ្តាលម៉ូដែលជាច្រើន ហើយបន្ទាប់មកជម្រះលទ្ធផល។ វាជួយថយចុះភាពខុសគ្នា។
|
||||
* Dropout (ការជម្រះម៉ូដែលដោយហេតុផល)
|
||||
|
||||
## Optimizers / Training Algorithms
|
||||
|
||||
ចំណុចសំខាន់មួយទៀតក្នុងការបណ្តុះបណ្តាលគឺជ្រើសរើសអាល់គ័រីធម៍បណ្តុះបណ្តាលល្អ។ ខណៈដែល **gradient descent** ចំណូលដល់ជាជម្រើសសមរម្យ ប៉ុន្តាមួយចំនួនពេលវាអាចយឺតពេក ឬមានបញ្ហាផ្សេងៗ។
|
||||
|
||||
ក្នុងការរៀនជ្រៅ យើងប្រើ **Stochastic Gradient Descent** (SGD) ដែលជាការធ្វើ gradient descent លើ minibatches ដែលជ្រើសរើសចៃដន្យពីសំណុំបណ្តុះបណ្តាល។ ទម្ងន់ត្រូវបានកែប្រែដោយរូបមន្តនេះ៖
|
||||
|
||||
w<sup>t+1</sup> = w<sup>t</sup> - η∇ℒ
|
||||
|
||||
### Momentum
|
||||
|
||||
នៅក្នុង **momentum SGD** យើងរក្សាផ្នែកមួយនៃ gradient ពីជំហានមុនៗ។ វាស្រដៀងពេលដែលយើងចត់ឲ្យទៅលើក្រោមល្បឿនមួយ ហើយទទួលបានគ្រោះថ្នាក់បាតុកម្មមួយទៅទិសដៅផ្សេង អ្នកមិនបម្លែងដងផ្លូវភ្លាមទេ ប៉ុន្តែរក្សាផ្នែកនៃចលនាដើម។ នៅទីនេះយើងបញ្ចូលវ៉ិចទ័រថ្មី v ដើម្បីតំណាងឱ្យ *ល្បឿន* ៖
|
||||
|
||||
* v<sup>t+1</sup> = γ v<sup>t</sup> - η∇ℒ
|
||||
* w<sup>t+1</sup> = w<sup>t</sup>+v<sup>t+1</sup>
|
||||
|
||||
នៅទីនេះប៉ារ៉ាម៉ែត្រ γ រាយការណ៍ពីកម្រិតដែលយើងយក inertia ទៅគិត៖ γ=0 តំណាងឱ្យ SGD ដើម; γ=1 ជាសមីការចលនាសុទ្ធ។
|
||||
|
||||
### Adam, Adagrad, និងផ្សេងៗទៀត
|
||||
|
||||
ដោយសារនៅក្នុងជាន់មួយៗ យើងគុណសញ្ញាជាមួយម៉ាទ្រីស W<sub>i</sub> មួយ ដែលអាស្រ័យទៅលើ ||W<sub>i</sub>||, gradient អាចត្រូវបន្ថយទៅជាមួយ 0 ឬកើនឡើងឥតដែនកំណត់។ នេះគឺជាមូលដ្ឋាននៃបញ្ហា Exploding/Vanishing Gradients។
|
||||
|
||||
ដំណោះស្រាយមួយសម្រាប់បញ្ហានេះគឺប្រើទិសដៅ gradient ទេ តម្លៃអប្បបរមាត្រូវបានរំលង គឺ
|
||||
|
||||
w<sup>t+1</sup> = w<sup>t</sup> - η(∇ℒ/||∇ℒ||), ដែល ||∇ℒ|| = √∑(∇ℒ)<sup>2</sup>
|
||||
|
||||
អាល់គ័រីធម៍នេះហៅថា **Adagrad**។ អាល់គ័រីធម៍ផ្សេងទៀត ដែលប្រើគំនិតដូចគ្នា៖ **RMSProp**, **Adam**
|
||||
|
||||
> **Adam** ត្រូវបានចាត់ទុកថាជាអាល់គ័រីធម៍មានប្រសិទ្ធភាពខ្ពស់សម្រាប់ករណីជាច្រើន ដូច្នេះបើអ្នកមិនប្រាកដថាត្រូវប្រើអ្វី គួរតែប្រើ Adam ។
|
||||
|
||||
### ការកាត់ gradient (Gradient clipping)
|
||||
|
||||
Gradient clipping ជាការបន្ថែមលើគំនិតខាងលើ។ នៅពេល ||∇ℒ|| ≤ θ យើងគិត gradient ដើមក្នុងការបង្កើតទម្ងន់ ហើយនៅពេល ||∇ℒ|| > θ - យើងបែងចែក gradient ដោយកម្រិតវា។ នៅទីនេះ θ ជាប៉ារ៉ាម៉ែត្រ ដែលនៅភាគច្រើននាយយក θ=1 ឬ θ=10។
|
||||
|
||||
### ការថយចុះអត្រាសិក្សា (Learning rate decay)
|
||||
|
||||
ភាពជោគជ័យនៃការបណ្តុះបណ្តាលជាញឹកញាប់អាស្រ័យលើប៉ារ៉ាម៉ែត្រ អត្រាសិក្សា η។ វាមានហេតុផលក្នុងការព្យាយាមពីថាតម្លៃ η ខ្ពស់នាំឲ្យមានការបណ្តុះបណ្តាលរហ័ស ខណៈដែលវាជារឿងដែលយើងចង់បាននៅដំបូងនៃការបណ្តុះបណ្តាល ហើយបន្ទាប់មកតម្លៃតូចនៃ η អនុញ្ញាតឲ្យយើងកែប្រែបណ្តាញបានល្អប្រសើរ។ ដូច្នេះ ក្នុងភាគច្រើនករណី យើងចង់ថយចុះ η ក្នុងដំណើរការបណ្តុះបណ្តាល។
|
||||
|
||||
នេះអាចធ្វើបាន ដោយគុណ η ជាមួយចំនួនមួយ (ឧ. 0.98) បន្ទាប់ពីមួយ epoch នៃការបណ្តុះបណ្តាល ឬដោយប្រើ **សៀវភៅរៀនអត្រា** ជាមួយវិធីសាស្ត្រលំបាកច្រើន។
|
||||
|
||||
## សំណង់បណ្តាញផ្សេងៗ
|
||||
|
||||
ការជ្រើសរើសសំណង់បណ្តាញត្រឹមត្រូវសម្រាប់បញ្ហារបស់អ្នកអាចពិបាក។ ជាធម្មតាយើងនឹងយកសំណង់ដែលបានបញ្ជាក់ថាដំណើរការល្អសម្រាប់ភារកិច្ចជាក់លាក់របស់យើង (ឬស្រដៀង)។ នេះជាវិចារណារូបមន្តល្អមួយ [good overview](https://www.topbots.com/a-brief-history-of-neural-network-architectures/) នៃសំណង់បណ្តាញសម្រាប់កុំព្យូទ័រមើលឃើញ។
|
||||
|
||||
> វាសំខាន់ក្នុងការជ្រើសរើសសំណង់ដែលមានថាមពលគ្រប់គ្រាន់សម្រាប់ចំនួនគំរូបណ្តុះបណ្តាលដែលយើងមាន។ ជ្រើសរើសម៉ូដែលមានថាមពលខ្លាំងរឹតតែខ្លាំង អាចនាំឲ្យមាន[overfitting](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)។
|
||||
|
||||
វិធីល្អមួយទៀតគឺប្រើសំណង់ដែលអាចប្លាស់ប្ដូរផ្អែកលើបរិមាណភាពចំរូងចំរាសត្រូវបានទាមទារ។ ក្នុងកម្រិតមួយ សំណង់ **ResNet** និង **Inception** មានលក្ខណៈស្វ័យប្រតិទិន។ [មើលបន្ថែមសំណង់រចនាគំរូកុំព្យូទ័រមើលឃើញ](../07-ConvNets/CNN_Architectures.md)។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការប្រុងប្រយត្ន័**៖
|
||||
ឯកសារនេះត្រូវបានបម្លែងភាសាដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ នៅពេលដែលយើងខិតខំផ្តល់នូវភាពត្រឹមត្រូវ សូមជ្រាបថាការបកប្រែមAutomated អាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅភាសាដើមគួរត្រូវបានណែនាំជាធាតុយោងផ្លូវការជាក់ស្តែង។ សម្រាប់ព័ត៌មានសំខាន់ៗ អំពីការបកប្រែដោយអ្នកជំនាញមនុស្សគួរត្រូវបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសដោយសារប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue