Kuinka suunnitella Language-Agnostic Platform-Cross Computer Vision SDK: Hands-On-opastus

(Cyrus Behroozi) (21. lokakuuta 2020)

Minulla oli äskettäin tilaisuus esiintyä Venice Computer Vision -kokouksessa. Jos et ole perehtynyt, se on tapahtuma, jota sponsoroi Trueface , jossa sekä tietokonenäön kehittäjät että harrastajat voivat esitellä uusinta tietokonenäkötutkimusta, sovelluksia ja käytännön asioita opetusohjelmat.

Tässä artikkelissa käyn läpi opetusohjelman esityksen siitä, miten suunnitellaan kieli-agnostisen tietokonenäköohjelmiston kehityspaketti (SDK) alustojen väliseen käyttöönottoon ja maksimaaliseen laajennettavuuteen. Jos haluat tarkastella esityksen livetallennusta , voit tehdä sen täällä . Olen myös tehnyt koko projektin avoimen lähdekoodin , joten voit käyttää sitä mallina seuraavaan tietokonenäköprojektiisi.

cyrusbehr / sdk_design

Kuinka suunnitella kieli-agnostinen SDK alustan väliseen käyttöönottoon ja maksimaaliseen laajennettavuuteen. Venetsian tietokonenäkö…

github.com

Miksi tämä opetusohjelma on tärkeä

Kokemukseni mukaan en koskaan löytänyt kaikkea kattavaa opasta, joka esittää yhteenvedon kaikista asiaankuuluvista vaiheista, joita tarvitaan kieli-agnostisen, alustojen välisen SDK: n luomiseen. Minun täytyi kampata läpi erilaiset asiakirjat oikean tietopalan saamiseksi, oppia kukin komponentti erikseen ja sitten palata se itse itse. Se oli turhauttavaa. Se kesti paljon aikaa. Ja nyt sinä, rakas lukija, saat hyötyä kaikesta työstäni. Ennen opit rakentamaan kieli-agnostisen, alustojen välisen SDK: n. Kaikki olennaiset ovat siellä. Ei kukaan fluffista, paitsi muutama meemi. Nauti.

Tässä opetusohjelmassa voit odottaa oppivasi:

  • Rakenna tietokonenäkökirjasto C ++ -sovellukseen.
  • Kääntää ja ristiin käännä kirjasto AMD64: lle, ARM64: lle ja ARM32: lle
  • Pakkaa kirjasto ja kaikki riippuvuudet yhtenä staattisena kirjastona
  • Automatisoi yksikön testaus
  • Määritä jatkuva integraatio (CI) -putki
  • Kirjoita python-sidokset kirjastoomme
  • Luo dokumentaatio suoraan sovellusliittymästä

Tämän esittelyn vuoksi rakentaa kasvojen ja maamerkkien tunnistuksen SDK: n käyttämällä avoimen lähdekoodin kasvotunnistinta MTCNN.

Esimerkki kasvojen rajoituslaatikoista ja kasvomaamerkkeistä

API-funktiomme ottaa kuvan polun ja palauttaa sitten kasvojen rajoituslaatikon ja kasvomaamerkkien koordinaatit. Kyky tunnistaa kasvot on erittäin hyödyllinen tietokonenäkössä, koska se on ensimmäinen vaihe monissa putkilinjoissa, mukaan lukien kasvojentunnistus, ikäennuste ja automaattinen kasvojen hämärtyminen.

Huomaa: Tätä varten opetusohjelma, työskentelen Ubuntu 18.04 -käyttöjärjestelmässä.

Miksi käyttää C ++: ta kirjastossamme?

Tehokkaan C ++ -koodin käyttäminen voi tuntua tältä

Suurin osa kirjastostamme kirjoitetaan käännetyllä ja staattisesti kirjoitetulla kielellä C ++. Ei ole mikään salaisuus, että C ++ on erittäin nopea ohjelmointikieli; se on tarpeeksi matala antamaan meille haluamasi nopeuden ja sillä on vähän lisättyä ajonaikaisia ​​lisäkustannuksia.

Tietokonenäkösovelluksissa me yleensä manipuloimme paljon kuvia, suoritamme matriisitoimintoja, suoritamme koneoppimisen päätelmiä, joihin kaikkiin liittyy valtava määrä tietojenkäsittelyä. Suoritusnopeus on siksi kriittinen. Tämä on erityisen tärkeää reaaliaikaisissa sovelluksissa, joissa sinun on pienennettävä viivettä halutun kehysnopeuden saavuttamiseksi – usein meillä on vain millisekunteja koko koodin suorittamiseen.

Toinen C ++: n etu on, että jos käännä tietylle arkkitehtuurille ja linkitä kaikki riippuvuudet staattisesti, niin voimme suorittaa sen kyseisellä laitteistolla tarvitsematta ylimääräisiä tulkkeja tai kirjastoja. Uskokaa tai älkää, voimme jopa käyttää paljaalla metallilla upotettua laitetta, jossa ei ole käyttöjärjestelmää!

Hakemistorakenne

Käytämme projektissamme seuraavaa hakemistorakennetta.

3rdparty sisältää projektimme edellyttämät kolmannen osapuolen riippuvuuskirjastot.

dist sisältää tiedostot, jotka jaetaan SDK: n loppukäyttäjille. Meidän tapauksessamme se on itse kirjasto ja siihen liittyvä otsikkotiedosto.

docker sisältää telakointitiedoston, jota käytetään telakointikuvan luomiseen CI: n rakennuksia varten.

docs sisältää koontikomentosarjat, joita tarvitaan dokumentaation luomiseen suoraan otsikkotiedostostamme.

include sisältää kaikki julkisen sovellusliittymän sisältämät tiedostot.

models sisältää kasvojentunnistuksen syväoppimismallitiedostot.

python sisältää python-sidosten luomiseen tarvittavan koodin.

src sisältää kaikki käännettävät cpp-tiedostot, ja myös kaikki otsikkotiedostot, joita ei jaeta SDK: n kanssa (sisäiset otsikkotiedostot).

test sisältävät yksikötestimme.

tools sisältää ristikääntämiseen tarvittavat CMake-työkaluketjutiedostomme.

Riippuvuuskirjastojen asentaminen

Tässä projektissa kolmas osapuoli tarvittavat riippuvuuskirjastot ovat ncnn , kevyt koneoppimisen päättelykirjasto, OpenCV , kuvan lisäyskirjasto, Catch2 , yksikön testauskirjasto ja lopuksi kirjasto pybind11 käytetään python-sidosten luomiseen. Kaksi ensimmäistä kirjastoa on koottava erillisinä kirjastoina, kun taas kaksi viimeksi mainittua ovat vain otsakkeita, joten tarvitsemme vain lähteen.

Yksi tapa lisätä nämä kirjastot projektiimme on git-alimoduulien kautta . Vaikka tämä lähestymistapa toimii, olen henkilökohtaisesti fani käyttää komentotulkkikomentosarjoja, jotka hakevat lähdekoodin ja rakentavat sitten halutut käyttöympäristöt: meidän tapauksessamme AMD64, ARM32 ja ARM64.

Tässä on esimerkki siitä, mikä näistä koontikomentosarjoista näyttää tältä:

Skripti on melko yksinkertainen. Se alkaa vetämällä haluttu julkaisun lähdekoodi git-arkistosta. Seuraavaksi CMakea käytetään koontiversion valmistelemiseen, ja sitten make kutsutaan kääntäjän ajamiseksi lähdekoodin rakentamiseksi.

Huomaa, että tärkein ero AMD64-rakennelman ja ARM-koontiversioiden välillä on se, että ARM-koontiversio välittää ylimääräisen CMake-parametrin nimeltä CMAKE_TOOLCHAIN_FILE. Tätä argumenttia käytetään määrittämään CMakelle, että koontikohdearkkitehtuuri (ARM32 taiARM64) eroaa isäntäarkkitehtuurista (AMD64 / x86_64). Siksi CMakea kehotetaan käyttämään kirjaston rakentamisessa valitun työkaluketiedostossa määritettyä ristikääntäjää (lisätietoja työkaluketjutiedostoista myöhemmin tässä opetusohjelmassa). Jotta tämä komentosarjaskripti toimisi, sinulla on oltava asianmukaiset ristikääntäjät asennettuna Ubuntu-koneellesi. Nämä voidaan asentaa helposti käyttämällä apt-get ja ohjeet siitä esitetään täällä .

Kirjastomme sovellusliittymä

Kirjastomme sovellusliittymä näyttää tältä:

Koska olen erittäin luova, päätin nimetä SDK: n MySDK. Sovellusliittymässämme on luettelo nimeltä ErrorCode, meillä on rakenne nimeltä Point ja lopuksi meillä on yksi julkisen jäsenen toiminto nimeltä getFaceBoxAndLandmarks. Tämän opetusohjelman laajuudessa en aio tarkastella SDK: n käyttöönoton yksityiskohtia. Ydin on, että luemme kuvan muistiin OpenCV: n avulla ja suoritamme sitten koneoppimisen päätelmät ncnn: n kanssa avoimen lähdekoodin malleilla kasvojen rajoituslaatikon ja maamerkkien havaitsemiseksi. Jos haluat sukeltaa toteutukseen, voit tehdä sen täällä .

Haluan sinun kuitenkin kiinnittävän huomiota käyttämämme suunnittelumalli. Käytämme tekniikkaa nimeltä Pointer to implement, tai lyhyesti pImpl , joka periaatteessa poistaa luokan toteutuksen yksityiskohdat sijoittamalla ne erilliseen luokkaan. Yllä olevassa koodissa tämä saavutetaan ilmoittamalla eteenpäin Impl -luokka ja sitten unique_ptr tähän luokkaan yksityisen jäsenen muuttujana. Tällöin piilotamme toteutuksen paitsi loppukäyttäjän uteliailta silmiltä (mikä voi olla melko tärkeää kaupallisessa SDK: ssa), mutta myös pienennämme niiden otsikoiden määrää, joista API-otsikkomme riippuu (ja estämme siten API-otsikko #include riippuvuuskirjaston otsikoista).

Huomautus mallitiedostoista

Sanoin, ettemme aio mennä täytäntöönpanon yksityiskohdat, mutta mielestäni on syytä mainita. Oletuksena käytössä oleva avoimen lähdekoodin kasvontunnistin, nimeltään MTCNN, lataa koneoppimismallitiedostot ajon aikana. Tämä ei ole ihanteellinen, koska se tarkoittaa, että meidän on jaettava mallit loppukäyttäjälle. Tämä ongelma on vieläkin merkittävämpi kaupallisissa malleissa, joissa et halua, että käyttäjillä on vapaa pääsy näihin mallitiedostoihin (ajatellaan lukemattomia tunteja, joita näiden mallien kouluttamiseen käytettiin). Yksi ratkaisu on näiden mallien tiedostojen salaus, jota suosittelen ehdottomasti tekemään.Tämä tarkoittaa kuitenkin sitä, että mallitiedostot on toimitettava SDK: n mukana. Viime kädessä haluamme vähentää käyttäjälle lähettämiemme tiedostojen määrää, jotta heillä olisi helpompaa käyttää ohjelmistojamme (vähemmän tiedostoja tarkoittaa vähemmän paikkoja mennä pieleen). Siksi voimme käyttää alla esitettyä tapaa muuntaa mallitiedostot otsikkotiedostoiksi ja upottaa ne itse SDK: hon.

xdd bash -komentoa käytetään heksadesimaalikaatojen luomiseen, ja sitä voidaan käyttää otsikkotiedoston luomiseen binaaritiedostosta. Siksi voimme sisällyttää mallitiedostot koodiin kuten tavalliset otsikkotiedostot ja ladata ne suoraan muistista. Tämän lähestymistavan rajoitus on, että se ei ole käytännöllinen hyvin suurten mallitiedostojen kanssa, koska se kuluttaa liikaa muistia käännösaikana. Sen sijaan voit muuntaa nämä suuret mallitiedostot suoraan objektitiedostoiksi työkalulla, kuten ld.

CM Tee kirjaston kokoaminen ja kääntäminen

Voimme nyt käyttää CMakea luomaan projektin koontitiedostot. Jos et ole perehtynyt, CMake on rakennusjärjestelmän generaattori, jota käytetään rakennusprosessin hallintaan. Alla näet, mikä juuren CMakeLists.txt (CMake-tiedosto) osa näyttää.

Periaatteessa luomme staattisen kirjaston nimeltä my_sdk_static kahdella lähdetiedostolla, jotka sisältävät toteutuksemme, my_sdk.cpp ja mtcnn.cpp. Syy staattisen kirjaston luomiseen on, että kokemukseni mukaan staattisen kirjaston jakaminen käyttäjille on helpompaa ja se on ystävällisempi upotettuja laitteita kohtaan. Kuten edellä mainitsin, jos suoritettava tiedosto on linkitetty staattiseen kirjastoon, se voidaan suorittaa sulautetulla laitteella, jolla ei edes ole käyttöjärjestelmää. Tämä ei yksinkertaisesti ole mahdollista dynaamisen kirjaston kanssa. Dynaamisten kirjastojen kanssa meidän on lisäksi huolehdittava riippuvuusversioista. Saatamme tarvita jopa kirjastoon liittyvää luettelotiedostoa. Staattisesti linkitetyillä kirjastoilla on myös hieman parempi suorituskykyprofiili kuin niiden dynaamisilla vastineilla.

Seuraava asia, jonka teemme CMake-komentosarjassa, on kertoa CMakelle, mistä löydät tarvittavat sisällysluettelotiedostot, joita lähdetiedostomme edellyttävät. Jotain huomionarvoista: vaikka kirjastomme kokoaa tässä vaiheessa, kun yritämme linkittää kirjastoa vastaan ​​(esimerkiksi suoritettavan tiedoston kanssa), saamme absoluuttisen määrän määrittelemätöntä viittausta symbolivirheisiin. Tämä johtuu siitä, että emme ole linkittäneet yhtään riippuvuuskirjastoa. Joten jos halusimme linkittää suoritettavan tiedoston onnistuneesti libmy_sdk_static.a: iin, meidän olisi myös löydettävä ja linkitettävä kaikki riippuvuuskirjastot (OpenCV-moduulit, ncnn jne.). Toisin kuin dynaamisissa kirjastoissa, staattiset kirjastot eivät pysty ratkaisemaan omia riippuvuuksiaan. Ne ovat pohjimmiltaan vain kokoelma objektitiedostoja, jotka on pakattu arkistoon.

Myöhemmin tässä opetusohjelmassa esittelen, kuinka voimme niputtaa kaikki riippuvuuskirjastot staattiseen kirjastoon, jotta käyttäjän ei tarvitse huolehdi linkittämisestä mihin tahansa riippuvuuskirjastoon.

Kirjasto- ja työkaluketjutiedostojen ristikoostaminen

Edge-laskenta on niin… edgy

Monet tietokonenäön sovellukset on otettu käyttöön reunalla. Tämä yleensä sisältää koodin suorittamisen pienitehoisissa sulautetuissa laitteissa, joissa on yleensä ARM-suorittimet. Koska C ++ on käännetty kieli, meidän on koottava koodimme CPU-arkkitehtuurille, jolla sovellus suoritetaan (kukin arkkitehtuuri käyttää erilaisia ​​asennusohjeita).

Ennen kuin sukellamme siihen, koskettakaamme myös ARM32: n ja ARM64: n, joita kutsutaan myös AArch32: ksi ja AArch64: ksi, ero. AArch64 viittaa ARM-arkkitehtuurin 64-bittiseen laajennukseen ja on sekä prosessorista että käyttöjärjestelmästä riippuvainen. Joten esimerkiksi vaikka Raspberry Pi 4: llä on 64-bittinen ARM-suoritin, Raspbian-oletuskäyttöjärjestelmä on 32-bittinen. Siksi tällainen laite vaatii AArch32-käännetyn binaarin. Jos meidän pitäisi käyttää 64-bittistä käyttöjärjestelmää, kuten Gentoo tällä Pi-laitteella, tarvitsemme AArch64-käännetyn binaarin. Toinen esimerkki suositusta upotetusta laitteesta on NVIDIA Jetson, jolla on sisäänrakennettu GPU ja joka käyttää AArch64: ää.

Ristikääntämiseksi meidän on määritettävä CMakelle, että emme käännä kone, johon parhaillaan rakennamme. Siksi meidän on määritettävä ristikääntäjä, jota CMake käyttää. AArch64: ssä käytämme aarch64-linux-gnu-g++ kääntäjää ja AArch32: n kääntäjää arm-linux-gnuebhif-g++ (hf tarkoittaa hard float ).

Seuraava on esimerkki työkaluketjutiedostosta. Kuten näette, määrittelemme AArch64-ristikääntäjän käyttämistä.

Takaisin juurellemme CMakeLists.txt, voimme lisää seuraava koodi tiedoston yläosaan.

Lisäämme periaatteessa CMake-asetuksia, jotka voidaan ottaa käyttöön komentoriviltä ristikääntämistä varten. Joko vaihtoehtojen BUILD_ARM32 tai BUILD_ARM64 ottaminen käyttöön, sopiva työkaluketiedosto valitaan ja kokoonpano määritetään ristikokoelmaa varten.

SDK: n pakkaaminen riippuvuuskirjastoihin

Kuten aiemmin mainittiin, jos kehittäjä haluaa linkittää kirjastoa vastaan ​​tässä vaiheessa, heidän on linkitettävä myös kaikkiin riippuvuuskirjastoihin voidakseen ratkaista kaikki symbolit riippuvuuskirjastot. Vaikka sovelluksemme on melko yksinkertainen, meillä on jo kahdeksan riippuvuuskirjastoa! Ensimmäinen on ncnn, sitten meillä on kolme OpenCV-moduulikirjastoa, sitten meillä on neljä apuohjelmakirjastoa, jotka on rakennettu OpenCV: llä (libjpeg, libpng, zlib, libtiff). Voisimme vaatia käyttäjää rakentamaan riippuvuuskirjastot itse tai jopa lähettämään ne kirjastomme viereen, mutta viime kädessä se vie enemmän työtä käyttäjälle ja pyrimme alentamaan käytön esteitä. Ihanteellinen tilanne on, jos voimme lähettää käyttäjälle yhden kirjaston, joka sisältää kirjastomme, sekä kaikki kolmannen osapuolen riippuvuuskirjastot, lukuun ottamatta tavallisia järjestelmäkirjastoja. On käynyt ilmi, että voimme saavuttaa tämän käyttämällä joitain CMake-taikuuksia.

Lisäämme ensin mukautetun kohteen CMakeLists.txt, suorita sitten MRI-komentosarja. Tämä MRI-komentosarja siirretään ar -M bash -komentoon, joka yhdistää kaikki staattiset kirjastot yhdeksi arkistoksi. Hienoa tässä menetelmässä on, että se käsittelee sulavasti alkuperäisten arkistojen päällekkäisiä jäsenten nimiä, joten meidän ei tarvitse huolehtia siellä olevista konflikteista. Tämän mukautetun kohteen rakentaminen tuottaa libmy_sdk.a, joka sisältää SDK: n ja kaikki riippuvuusarkistot.

Pitäkää hetki: Tarkastellaan mitä me Olen tehnyt tähän mennessä.

Ota henkeä. Tartu välipala. Soita äidillesi.

Tässä vaiheessa meillä on staattinen kirjasto nimeltä libmy_sdk.a, joka sisältää SDK: n ja kaikki riippuvuuskirjastot, jotka olemme pakanneet yhdeksi arkistoksi. Meillä on myös mahdollisuus kääntää ja ristikäännellä (käyttämällä komentoriviargumentteja) kaikille kohdealustoille.

Yksikkötestit

Kun suoritat yksikötestit ensimmäistä kertaa

En todennäköisesti tarvitse selitä, miksi yksikötestit ovat tärkeitä, mutta pohjimmiltaan ne ovat tärkeä osa SDK-suunnittelua, jonka avulla kehittäjä voi varmistaa, että SDK toimii sisennyttä. Lisäksi, jos rikkovia muutoksia tehdään rivillä, se auttaa niiden jäljittämisessä ja korjausten työntämisessä ulos nopeammin.

Tässä erityistapauksessa yksikkötestin suoritustiedoston luominen antaa meille myös mahdollisuuden linkittää yhdistetty kirjasto, jonka olemme juuri luoneet varmistaaksemme, että voimme linkittää oikein tarkoituksella (ja emme saa yhtäkään näistä ikävistä määrittelemättömistä viitteistä symboleihin -virheistä).

Käytämme Catch2: ta yksikön testauskehyksenä . Syntaksi on esitetty alla:

Kuinka Catch2 toimii, meillä on tämä makro nimeltä TEST_CASE ja toinen makro nimeltä SECTION. Jokaiselle SECTION suoritetaan TEST_CASE alusta alkaen. Joten esimerkissämme mySdk alustetaan ensin ja sitten ensimmäinen osa nimeltä ”Muu kuin kasvokuva” suoritetaan. Seuraavaksi mySdk puretaan ennen rekonstruointia, sitten toinen osio nimeltä ”Kasvot kuvassa” suoritetaan. Tämä on hienoa, koska se varmistaa, että meillä on uusi MySDK objekti, jota voidaan käyttää kullekin osalle. Voimme sitten käyttää väitteidemme makroja, kuten REQUIRE.

Voimme käyttää CMakea rakentamaan yksikön testaustiedoston nimeltä run_tests. Kuten voimme nähdä kutsusta target_link_libraries alla olevalla rivillä 3, ainoa kirjasto, johon meidän on linkitettävä, on libmy_sdk.a eikä mikään muu riippuvuuskirjastot.

Dokumentaatio

Jos vain käyttäjät lukisivat pirun asiakirjat.

Käytämme doxygen dokumenttien luomiseksi suoraan otsikkotiedostostamme. Voimme mennä eteenpäin ja dokumentoida kaikki tapamme ja tietotyypit julkisessa otsikossa käyttämällä alla olevaa koodinpätkää osoittavaa syntaksia.Muista määrittää kaikki tulo- ja lähtöparametrit toiminnoille.

Asiakirjojen luomiseksi , tarvitsemme jotain, jota kutsutaan doxyfile-tiedostoksi, joka on pohjimmiltaan suunnitelma doxygenin ohjeistamiselle dokumentaation luomisesta. Voimme luoda yleisen doxyfile-tiedoston suorittamalla doxygen -g päätelaitteessamme, olettaen, että järjestelmään on asennettu doxygen. Seuraavaksi voimme muokata doxyfile-tiedostoa. Ainakin meidän on määritettävä lähtöhakemisto ja myös syötetiedostot.

Tällöin haluamme luoda dokumentaation vain API-otsikkotiedostostamme, minkä vuoksi olemme määrittäneet sisällytyshakemiston. Lopuksi käytät CMakea tosiasiallisesti rakentamaan dokumentaatio, joka voidaan tehdä kuten .

Python-sidokset

Oletko kyllästynyt näkemään puoliksi osuvia gifejä? Joo, en kumpikaan.

Olkaamme rehellisiä. C ++ ei ole helpoin tai ystävällisin kieli, jota kehittää. Siksi haluamme laajentaa kirjastojamme tukemaan kielisidoksia, jotta kehittäjien käyttö olisi helpompaa. Esittelen tämän pythonilla, koska se on suosittu tietokonenäön prototyyppikieli, mutta muita kielisitoja on yhtä helppo kirjoittaa. Käytämme tätä pybind11: n avulla:

Aloitetaan käyttämällä PYBIND11_MODULE makro, joka luo toiminnon, jota kutsutaan, kun tuontilauseke lähetetään pythonista. Joten yllä olevassa esimerkissä python-moduulin nimi on mysdk. Seuraavaksi voimme määritellä luokkamme ja heidän jäsenensä käyttämällä pybind11-syntaksia.

Tässä on jotain huomioitavaa: C ++: ssa on melko yleistä siirtää muuttujia muuttuvalla viitteellä, joka sallii sekä luku- että kirjoitusoikeuden. Juuri näin olemme tehneet API-jäsenfunktiollamme parametreilla faceDetected ja fbAndLandmarks. Pythonissa kaikki argumentit välitetään viitteenä. Tietyt python-perustyypit ovat kuitenkin muuttumattomia, mukaan lukien bool. Sattumalta faceDetected -parametrimme on booli, joka välitetään muuttuvalla viitteellä. Siksi meidän on käytettävä yllä olevassa koodissa esitettyä kiertotapaa riveillä 31-34, jossa määritämme boolin python-käärefunktiossa, ja siirrämme sen sitten C ++ -funktiollemme ennen muuttujan palauttamista osana duplettia.

Kun olemme rakentaneet python-sidontakirjaston, voimme käyttää sitä helposti alla olevan koodin avulla:

Jatkuva integrointi

Jatkuvan integraation putkistoissamme käytämme työkalua nimeltä CircleCI, josta pidän todella, koska se integroituu suoraan Githubiin. Uusi koontiversio käynnistyy automaattisesti aina, kun painat sitoutumista. Aloita siirtymällä CircleCI -sivustolle ja yhdistämällä se Github-tiliisi ja valitsemalla sitten projekti, jonka haluat lisätä. Kun se on lisätty, sinun on luotava .circleci -hakemisto projektisi juurelle ja luotava tiedosto nimeltä config.yml hakemistoon.

Kaikille, jotka eivät ole perehtyneitä, YAML on sarjallisuuskieli, jota käytetään yleisesti määritystiedostoissa. Voimme käyttää sitä opastamaan mitä toimintoja haluamme CircleCI: n suorittavan. Alla olevasta YAML-katkelmasta näet, kuinka rakennamme ensin yhden riippuvuuskirjastoista, seuraavaksi itse SDK: n ja lopuksi rakennamme ja suoritamme yksikötestit.

Jos olemme älykkäitä (ja oletan, että oletkin, jos olet päässyt tähän mennessä), voimme käyttää välimuistia lyhentääksemme rakennusaikoja huomattavasti. Esimerkiksi yllä olevassa YAML: ssä välimuisti OpenCV-koontiversio käyttämällä koontikoodin tiivistettä välimuistiavaimena. Tällä tavalla OpenCV-kirjasto rakennetaan uudelleen vain, jos koontikomentosarjaa on muokattu – muuten välimuistissa olevaa rakennetta käytetään. Toinen huomionarvoinen asia on se, että suoritamme valitsemamme telakointikuvan rakentamisen. Olen valinnut mukautetun telakointikuvan ( tässä on Docker-tiedosto), johon olen asentanut kaikki järjestelmäriippuvuudet.

Fin.

Ja sinulla on se. Kuten kaikki hyvin suunnitellut tuotteet, haluamme tukea kaikkein kysyttyjä alustoja ja tehdä siitä helppokäyttöisen useimmille kehittäjille. Yllä olevan opetusohjelman avulla olemme rakentaneet SDK: n, joka on käytettävissä useilla kielillä ja joka voidaan ottaa käyttöön useilla alustoilla. Ja sinun ei tarvinnut edes lukea pybind11: n dokumentaatiota itse. Toivottavasti pidit tästä oppaasta hyödyllistä ja viihdyttävää. Hyvää rakennusta.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *