# ដែល​ហៅ​ម៉ាស៊ីនកំណត់​អ្វីមួយ​ពីឧបករណ៍ IoT របស់​អ្នក - Wio Terminal ពេលដែលម៉ាស៊ីនកំណត់​អ្វីមួយ​របស់​អ្នក​បានបោះពុម្ពផ្សាយរួច អ្នកអាចប្រើវាពីឧបករណ៍ IoT របស់អ្នក។ ## ចម្លងគំរោងម៉ាស៊ីនចាត់ថ្នាក់រូបភាព ភាគច្រើននៃម៉ាស៊ីនកំណត់ស្តុករបស់អ្នកគឺដូចគ្នានឹងម៉ាស៊ីនចាត់ថ្នាក់រូបភាពដែលអ្នកបានបង្កើតនៅមេរៀនមុន។ ### ប៉ារម៉ង់ - ចម្លងគំរោងម៉ាស៊ីនចាត់ថ្នាក់រូបភាព 1. ភ្ជាប់ ArduCam របស់អ្នកទៅ Wio Terminal តាមជំហានពី [មេរៀនទី 2 នៃគម្រោងផលិតកម្ម](../../../4-manufacturing/lessons/2-check-fruit-from-device/wio-terminal-camera.md#task---connect-the-camera)។ អ្នកអាចចង់ដាក់កាមេរ៉ានៅទីតាំងតែមួយ ដូចជាការចងខ្សែឲ្យនៅលើប្រអប់ឬលើកញ្ចប់ ឬដាក់កាមេរ៉ាទៅលើប្រអប់ជាមួយក្លឹបស្ដើងទ្វេជាន់។ 1. បង្កើតគំរោងថ្មីមួយសម្រាប់ Wio Terminal ប្រើ PlatformIO ហើយដាក់ឈ្មោះគំរោងនេះជា `stock-counter`។ 1. ស្ទួនជំហានពី [មេរៀនទី 2 នៃគម្រោងផលិតកម្ម](../../../4-manufacturing/lessons/2-check-fruit-from-device/README.md#task---capture-an-image-using-an-iot-device) ដើម្បីថតរូបពីកាមេរ៉ា។ 1. ស្ទួនជំហានពី [មេរៀនទី 2 នៃគម្រោងផលិតកម្ម](../../../4-manufacturing/lessons/2-check-fruit-from-device/README.md#task---classify-images-from-your-iot-device) ដើម្បីហៅម៉ាស៊ីនចាត់ថ្នាក់ទំរង់រូបភាព។ ភាគច្រើននៃកូដនេះនឹងត្រូវប្រើឡើងវិញដើម្បីកំណត់វត្ថុ។ ## បម្លែងកូដពីម៉ាស៊ីនចាត់ថ្នាក់ទៅកំណត់វត្ថុរូបភាព កូដដែលអ្នកបានប្រើដើម្បីចាត់ថ្នាក់រូបភាពមានស្រដៀងគ្នាជាមួយកូដកំណត់វត្ថុ។ ការប្រែប្រួលសំខាន់គឺ URL ដែលបានហៅដែលអ្នកទទួលបានពី Custom Vision និងលទ្ធផលនៃការហៅ។ ### ប៉ារម៉ង់ - បម្លែងកូដពីម៉ាស៊ីនចាត់ថ្នាក់ទៅកំណត់វត្ថុ 1. បន្ថែមផ្នែក include ខាងលើនៃឯកសារ `main.cpp`៖ ```cpp #include ``` 1. ដូរឈ្មោះមុខងារ `classifyImage` ទៅជា `detectStock` ទាំងឈ្មោះមុខងារ និងការហៅនៅក្នុងមុខងារ `buttonPressed`។ 1. នៅលើមុខងារ `detectStock` ថ្លែងអថេរ threshold ដើម្បីកំណត់ចេញការវាយតម្លៃទាបៗ៖ ```cpp const float threshold = 0.3f; ``` ខុសពីម៉ាស៊ីនចាត់ថ្នាក់ទំរង់រូបភាពដែលត្រឡប់លទ្ធផលតែមួយក្នុងមួយឆ្នាំង, ម៉ាស៊ីនកំណត់វត្ថុអាចបង្ហាញលទ្ធផលជាច្រើន ដូច្នេះលទ្ធផលដែលមានប្រហែលថាថយក្រោមចាំបាច់ត្រូវតែត្រូវបានច្រានចោល។ 1. នៅលើមុខងារ `detectStock` ថ្លែងមុខងារមួយដើម្បីដំណើរការវាយតម្លៃ៖ ```cpp void processPredictions(std::vector &predictions) { for(JsonVariant prediction : predictions) { String tag = prediction["tagName"].as(); float probability = prediction["probability"].as(); char buff[32]; sprintf(buff, "%s:\t%.2f%%", tag.c_str(), probability * 100.0); Serial.println(buff); } } ``` វាទទួលបញ្ជីនៃការវាយតម្លៃ ហើយបោះពុម្ពវាទៅម្ជុលឆ្លង។ 1. នៅក្នុងមុខងារ `detectStock` ជំនួសមាតិការបស់ `for` loop ដែលរុញតាមការវាយតម្លៃជាមួយខាងក្រោម៖ ```cpp std::vector passed_predictions; for(JsonVariant prediction : predictions) { float probability = prediction["probability"].as(); if (probability > threshold) { passed_predictions.push_back(prediction); } } processPredictions(passed_predictions); ``` វារុញតាមការវាយតម្លៃប្រៀបធៀបប្រហែលជាមួយ threshold។ ការវាយតម្លៃទាំងអស់ដែលមានប្រហែលខ្ពស់ជាង threshold ត្រូវបានបញ្ចូលទៅក្នុង `list` ហើយផ្ញើទៅមុខងារ `processPredictions`។ 1. ផ្ទុកឡើងនិងដំណើរការកូដរបស់អ្នក។ បង្ហាញកាមេរ៉ាលើវត្ថុលើ​តុហើយចុចប៊ូតុង C។ អ្នកនឹងឃើញលទ្ធផលនៅក្នុងមន្ត្រីស៊េរីល៖ ```output Connecting to WiFi.. Connected! Image captured Image read to buffer with length 17416 tomato paste: 35.84% tomato paste: 35.87% tomato paste: 34.11% tomato paste: 35.16% ``` > 💁 អ្នកប្រហែលជាត្រូវការ ប្តូរតម្លៃ `threshold` ទៅតម្លៃសមរម្យសម្រាប់រូបភាពរបស់អ្នក។ អ្នកនឹងអាចមើលឃើញរូបភាពដែលបានថត និងតម្លៃទាំងនេះនៅផ្ទាំង **Predictions** ក្នុង Custom Vision។ ![4 cans of tomato paste on a shelf with predictions for the 4 detections of 35.8%, 33.5%, 25.7% and 16.6%](../../../../../translated_images/km/custom-vision-stock-prediction.942266ab1bcca341.webp) > 💁 អ្នកអាចស្វែងរកកូដនេះនៅក្នុងថត [code-detect/wio-terminal](../../../../../5-retail/lessons/2-check-stock-device/code-detect/wio-terminal)។ 😀 កម្មវិធីរាប់ស្តុករបស់អ្នកជោគជ័យ! --- **ការបដិសេធ**៖ ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ក្នុងកំឡុងពេលយើងខិតខំដើម្បីទទួលបានភាពត្រឹមត្រូវ សូមយល់ព្រមថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬការបញ្ចូលខុសបាន។ ឯកសារដើមដែលមានភាសាបណ្ដើរជាភាសាមាតុភូមិគួរត្រូវបានចាត់ទុកថាជាការបញ្ជាក់ផ្លូវការជាដើម។ សម្រាប់ព័ត៌មានសំខាន់ណាស់ សូមផ្តល់អនុសាសន៍ឲ្យមានការបកប្រែដោយមនុស្សជាជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសប្រាជ្ញាដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។