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/sw/4-manufacturing/lessons/2-check-fruit-from-device/wio-terminal-classify-image.md

11 KiB

Tambua picha - Wio Terminal

Katika sehemu hii ya somo, utatuma picha iliyokamatwa na kamera kwa huduma ya Custom Vision ili kuitambua.

Tambua picha

Huduma ya Custom Vision ina API ya REST unayoweza kuitumia kutoka kwa Wio Terminal kutambua picha. API hii ya REST inapatikana kupitia muunganisho wa HTTPS - muunganisho salama wa HTTP.

Unaposhirikiana na sehemu za mwisho za HTTPS, msimbo wa mteja unahitaji kuomba cheti cha ufunguo wa umma kutoka kwa seva inayofikiwa, na kutumia cheti hicho kusimba trafiki inayotumwa. Kivinjari chako cha wavuti hufanya hili kiotomatiki, lakini microcontrollers hazifanyi hivyo. Utahitaji kuomba cheti hiki mwenyewe na kukitumia kuunda muunganisho salama kwa API ya REST. Vyeti hivi havibadiliki, kwa hivyo mara unapokuwa na cheti, kinaweza kuwekwa moja kwa moja kwenye programu yako.

Vyeti hivi vina funguo za umma, na havihitaji kuhifadhiwa kwa usalama. Unaweza kuvitumia katika msimbo wako wa chanzo na kuvishiriki hadharani kwenye maeneo kama GitHub.

Kazi - weka mteja wa SSL

  1. Fungua mradi wa programu ya fruit-quality-detector ikiwa haujafunguliwa tayari.

  2. Fungua faili ya kichwa config.h, na ongeza yafuatayo:

    const char *CERTIFICATE =
        "-----BEGIN CERTIFICATE-----\r\n"
        "MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n"
        "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
        "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n"
        "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n"
        "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n"
        "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n"
        "ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n"
        "wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n"
        "iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n"
        "ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n"
        "aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n"
        "0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n"
        "gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n"
        "sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n"
        "lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n"
        "N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n"
        "Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n"
        "AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n"
        "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n"
        "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n"
        "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n"
        "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n"
        "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n"
        "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n"
        "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n"
        "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n"
        "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n"
        "+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n"
        "cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n"
        "kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n"
        "trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n"
        "8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n"
        "-----END CERTIFICATE-----\r\n";
    

    Hii ni Microsoft Azure DigiCert Global Root G2 certificate - ni moja ya vyeti vinavyotumiwa na huduma nyingi za Azure duniani.

    💁 Ili kuona kwamba hiki ndicho cheti cha kutumia, endesha amri ifuatayo kwenye macOS au Linux. Ikiwa unatumia Windows, unaweza kuendesha amri hii ukitumia Windows Subsystem for Linux (WSL):

    openssl s_client -showcerts -verify 5 -connect api.cognitive.microsoft.com:443
    

    Matokeo yatataja cheti cha DigiCert Global Root G2.

  3. Fungua main.cpp na ongeza agizo la kujumuisha:

    #include <WiFiClientSecure.h>
    
  4. Chini ya maagizo ya kujumuisha, tangaza mfano wa WifiClientSecure:

    WiFiClientSecure client;
    

    Darasa hili lina msimbo wa kuwasiliana na sehemu za mwisho za wavuti kupitia HTTPS.

  5. Katika njia ya connectWiFi, weka WiFiClientSecure kutumia cheti cha DigiCert Global Root G2:

    client.setCACert(CERTIFICATE);
    

Kazi - tambua picha

  1. Ongeza mstari ufuatao kama mstari wa ziada kwenye orodha ya lib_deps katika faili ya platformio.ini:

    bblanchon/ArduinoJson @ 6.17.3
    

    Hii inaingiza ArduinoJson, maktaba ya JSON ya Arduino, na itatumika kufafanua majibu ya JSON kutoka kwa API ya REST.

  2. Katika config.h, ongeza vigezo vya URL ya utabiri na Key kutoka kwa huduma ya Custom Vision:

    const char *PREDICTION_URL = "<PREDICTION_URL>";
    const char *PREDICTION_KEY = "<PREDICTION_KEY>";
    

    Badilisha <PREDICTION_URL> na URL ya utabiri kutoka Custom Vision. Badilisha <PREDICTION_KEY> na ufunguo wa utabiri.

  3. Katika main.cpp, ongeza agizo la kujumuisha maktaba ya ArduinoJson:

    #include <ArduinoJSON.h>
    
  4. Ongeza kazi ifuatayo kwa main.cpp, juu ya kazi ya buttonPressed.

    void classifyImage(byte *buffer, uint32_t length)
    {
        HTTPClient httpClient;
        httpClient.begin(client, PREDICTION_URL);
        httpClient.addHeader("Content-Type", "application/octet-stream");
        httpClient.addHeader("Prediction-Key", PREDICTION_KEY);
    
        int httpResponseCode = httpClient.POST(buffer, length);
    
        if (httpResponseCode == 200)
        {
            String result = httpClient.getString();
    
            DynamicJsonDocument doc(1024);
            deserializeJson(doc, result.c_str());
    
            JsonObject obj = doc.as<JsonObject>();
            JsonArray predictions = obj["predictions"].as<JsonArray>();
    
            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);
            }
        }
    
        httpClient.end();
    }
    

    Msimbo huu huanza kwa kutangaza HTTPClient - darasa linalo na mbinu za kushirikiana na API za REST. Kisha linaunganisha mteja na URL ya utabiri ukitumia mfano wa WiFiClientSecure uliowekwa na ufunguo wa umma wa Azure.

    Mara baada ya kuunganishwa, hutuma vichwa - taarifa kuhusu ombi linalokuja ambalo litatolewa dhidi ya API ya REST. Kichwa cha Content-Type kinaonyesha kwamba ombi la API litatuma data ya binary ghafi, kichwa cha Prediction-Key kinapitisha ufunguo wa utabiri wa Custom Vision.

    Kisha ombi la POST linatolewa kwa mteja wa HTTP, likipakia safu ya byte. Hii itakuwa na picha ya JPEG iliyokamatwa kutoka kwa kamera wakati kazi hii inaitwa.

    💁 Ombi la POST linakusudiwa kutuma data, na kupata majibu. Kuna aina nyingine za maombi kama maombi ya GET ambayo hupata data. Maombi ya GET hutumiwa na kivinjari chako cha wavuti kupakia kurasa za wavuti.

    Ombi la POST linarejesha msimbo wa hali ya majibu. Hizi ni thamani zilizoainishwa vizuri, na 200 ikimaanisha OK - ombi la POST lilifanikiwa.

    💁 Unaweza kuona misimbo yote ya hali ya majibu katika Ukurasa wa Orodha ya Msimbo wa Hali ya HTTP kwenye Wikipedia

    Ikiwa 200 inarejeshwa, matokeo yanasomwa kutoka kwa mteja wa HTTP. Hii ni majibu ya maandishi kutoka kwa API ya REST na matokeo ya utabiri kama hati ya JSON. JSON iko katika muundo ufuatao:

    {
        "id":"45d614d3-7d6f-47e9-8fa2-04f237366a16",
        "project":"135607e5-efac-4855-8afb-c93af3380531",
        "iteration":"04f1c1fa-11ec-4e59-bb23-4c7aca353665",
        "created":"2021-06-10T17:58:58.959Z",
        "predictions":[
            {
                "probability":0.5582016,
                "tagId":"05a432ea-9718-4098-b14f-5f0688149d64",
                "tagName":"ripe"
            },
            {
                "probability":0.44179836,
                "tagId":"bb091037-16e5-418e-a9ea-31c6a2920f17",
                "tagName":"unripe"
            }
        ]
    }
    

    Sehemu muhimu hapa ni safu ya predictions. Hii ina utabiri, na ingizo moja kwa kila tagi likiwa na jina la tagi na uwezekano. Uwezekano uliorejeshwa ni nambari za pointi za kuelea kutoka 0-1, na 0 ikiwa na nafasi ya 0% ya kulingana na tagi, na 1 ikiwa na nafasi ya 100%.

    💁 Watabiri wa picha watarudisha asilimia kwa tagi zote ambazo zimetumika. Kila tagi itakuwa na uwezekano kwamba picha inalingana na tagi hiyo.

    JSON hii inafafanuliwa, na uwezekano kwa kila tagi unatumwa kwa monitor ya serial.

  5. Katika kazi ya buttonPressed, badilisha msimbo unaohifadhi kwenye kadi ya SD na wito kwa classifyImage, au ongeza baada ya picha kuandikwa, lakini kabla ya buffer kufutwa:

    classifyImage(buffer, length);
    

    💁 Ikiwa unabadilisha msimbo unaohifadhi kwenye kadi ya SD unaweza kusafisha msimbo wako kwa kuondoa kazi za setupSDCard na saveToSDCard.

  6. Pakia na endesha msimbo wako. Elekeza kamera kwenye matunda na bonyeza kitufe cha C. Utaona matokeo kwenye monitor ya serial:

    Connecting to WiFi..
    Connected!
    Image captured
    Image read to buffer with length 8200
    ripe:   56.84%
    unripe: 43.16%
    

    Utaweza kuona picha iliyochukuliwa, na maadili haya katika kichupo cha Predictions kwenye Custom Vision.

    Ndizi katika Custom Vision iliyotabiriwa kuwa imeiva kwa 56.8% na haijaiva kwa 43.1%

💁 Unaweza kupata msimbo huu katika folda ya code-classify/wio-terminal.

😀 Programu yako ya kutambua ubora wa matunda imefanikiwa!


Kanusho:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI Co-op Translator. Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.