You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/km/5-retail/lessons/2-check-stock-device/wio-terminal-object-detecto...

8.9 KiB

ដែល​ហៅ​ម៉ាស៊ីនកំណត់​អ្វីមួយ​ពីឧបករណ៍ IoT របស់​អ្នក - Wio Terminal

ពេលដែលម៉ាស៊ីនកំណត់​អ្វីមួយ​របស់​អ្នក​បានបោះពុម្ពផ្សាយរួច អ្នកអាចប្រើវាពីឧបករណ៍ IoT របស់អ្នក។

ចម្លងគំរោងម៉ាស៊ីនចាត់ថ្នាក់រូបភាព

ភាគច្រើននៃម៉ាស៊ីនកំណត់ស្តុករបស់អ្នកគឺដូចគ្នានឹងម៉ាស៊ីនចាត់ថ្នាក់រូបភាពដែលអ្នកបានបង្កើតនៅមេរៀនមុន។

ប៉ារម៉ង់ - ចម្លងគំរោងម៉ាស៊ីនចាត់ថ្នាក់រូបភាព

  1. ភ្ជាប់ ArduCam របស់អ្នកទៅ Wio Terminal តាមជំហានពី មេរៀនទី 2 នៃគម្រោងផលិតកម្ម

    អ្នកអាចចង់ដាក់កាមេរ៉ានៅទីតាំងតែមួយ ដូចជាការចងខ្សែឲ្យនៅលើប្រអប់ឬលើកញ្ចប់ ឬដាក់កាមេរ៉ាទៅលើប្រអប់ជាមួយក្លឹបស្ដើងទ្វេជាន់។

  2. បង្កើតគំរោងថ្មីមួយសម្រាប់ Wio Terminal ប្រើ PlatformIO ហើយដាក់ឈ្មោះគំរោងនេះជា stock-counter

  3. ស្ទួនជំហានពី មេរៀនទី 2 នៃគម្រោងផលិតកម្ម ដើម្បីថតរូបពីកាមេរ៉ា។

  4. ស្ទួនជំហានពី មេរៀនទី 2 នៃគម្រោងផលិតកម្ម ដើម្បីហៅម៉ាស៊ីនចាត់ថ្នាក់ទំរង់រូបភាព។ ភាគច្រើននៃកូដនេះនឹងត្រូវប្រើឡើងវិញដើម្បីកំណត់វត្ថុ។

បម្លែងកូដពីម៉ាស៊ីនចាត់ថ្នាក់ទៅកំណត់វត្ថុរូបភាព

កូដដែលអ្នកបានប្រើដើម្បីចាត់ថ្នាក់រូបភាពមានស្រដៀងគ្នាជាមួយកូដកំណត់វត្ថុ។ ការប្រែប្រួលសំខាន់គឺ URL ដែលបានហៅដែលអ្នកទទួលបានពី Custom Vision និងលទ្ធផលនៃការហៅ។

ប៉ារម៉ង់ - បម្លែងកូដពីម៉ាស៊ីនចាត់ថ្នាក់ទៅកំណត់វត្ថុ

  1. បន្ថែមផ្នែក include ខាងលើនៃឯកសារ main.cpp

    #include <vector>
    
  2. ដូរឈ្មោះមុខងារ classifyImage ទៅជា detectStock ទាំងឈ្មោះមុខងារ និងការហៅនៅក្នុងមុខងារ buttonPressed

  3. នៅលើមុខងារ detectStock ថ្លែងអថេរ threshold ដើម្បីកំណត់ចេញការវាយតម្លៃទាបៗ៖

    const float threshold = 0.3f;
    

    ខុសពីម៉ាស៊ីនចាត់ថ្នាក់ទំរង់រូបភាពដែលត្រឡប់លទ្ធផលតែមួយក្នុងមួយឆ្នាំង, ម៉ាស៊ីនកំណត់វត្ថុអាចបង្ហាញលទ្ធផលជាច្រើន ដូច្នេះលទ្ធផលដែលមានប្រហែលថាថយក្រោមចាំបាច់ត្រូវតែត្រូវបានច្រានចោល។

  4. នៅលើមុខងារ detectStock ថ្លែងមុខងារមួយដើម្បីដំណើរការវាយតម្លៃ៖

    void processPredictions(std::vector<JsonVariant> &predictions)
    {
        for(JsonVariant prediction : predictions)
        {
            String tag = prediction["tagName"].as<String>();
            float probability = prediction["probability"].as<float>();
    
            char buff[32];
            sprintf(buff, "%s:\t%.2f%%", tag.c_str(), probability * 100.0);
            Serial.println(buff);
        }
    }
    

    វាទទួលបញ្ជីនៃការវាយតម្លៃ ហើយបោះពុម្ពវាទៅម្ជុលឆ្លង។

  5. នៅក្នុងមុខងារ detectStock ជំនួសមាតិការបស់ for loop ដែលរុញតាមការវាយតម្លៃជាមួយខាងក្រោម៖

    std::vector<JsonVariant> passed_predictions;
    
    for(JsonVariant prediction : predictions) 
    {
        float probability = prediction["probability"].as<float>();
        if (probability > threshold)
        {
            passed_predictions.push_back(prediction);
        }
    }
    
    processPredictions(passed_predictions);
    

    វារុញតាមការវាយតម្លៃប្រៀបធៀបប្រហែលជាមួយ threshold។ ការវាយតម្លៃទាំងអស់ដែលមានប្រហែលខ្ពស់ជាង threshold ត្រូវបានបញ្ចូលទៅក្នុង list ហើយផ្ញើទៅមុខងារ processPredictions

  6. ផ្ទុកឡើងនិងដំណើរការកូដរបស់អ្នក។ បង្ហាញកាមេរ៉ាលើវត្ថុលើ​តុហើយចុចប៊ូតុង C។ អ្នកនឹងឃើញលទ្ធផលនៅក្នុងមន្ត្រីស៊េរីល៖

    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%

💁 អ្នកអាចស្វែងរកកូដនេះនៅក្នុងថត code-detect/wio-terminal

😀 កម្មវិធីរាប់ស្តុករបស់អ្នកជោគជ័យ!


ការបដិសេធ
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI Co-op Translator។ ក្នុងកំឡុងពេលយើងខិតខំដើម្បីទទួលបានភាពត្រឹមត្រូវ សូមយល់ព្រមថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬការបញ្ចូលខុសបាន។ ឯកសារដើមដែលមានភាសាបណ្ដើរជាភាសាមាតុភូមិគួរត្រូវបានចាត់ទុកថាជាការបញ្ជាក់ផ្លូវការជាដើម។ សម្រាប់ព័ត៌មានសំខាន់ណាស់ សូមផ្តល់អនុសាសន៍ឲ្យមានការបកប្រែដោយមនុស្សជាជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសប្រាជ្ញាដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។