OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi

November 30 - December 1 ee Nizhny Novgorod ayaa la qabtay FurVINO hackathon. Ka qaybgalayaasha ayaa la waydiistay inay abuuraan nooc ka mid ah xalka badeecada iyagoo isticmaalaya qalabka Intel OpenVINO. Qabanqaabiyayaasha ayaa soo jeediyay liiska mawduucyo qiyaas ah oo lagu hagi karo marka la dooranayo hawsha, laakiin go'aanka kama dambaysta ah ayaa ku hadhay kooxaha. Intaa waxaa dheer, isticmaalka moodooyinka aan lagu darin alaabta ayaa la dhiirigeliyay.

OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi

Maqaalkani waxa aanu kuu sheegi doonaa oo ku saabsan sida aan u abuuray our prototype ee alaabta, kaas oo aan ugu dambeyntii qaadan kaalinta koowaad.

In ka badan 10 kooxood ayaa ka qaybgalay hackathon. Way fiicantahay in qaarkood ay ka yimaadeen gobollo kale. Goobta loogu talagalay hackathon waxay ahayd dhismaha "Kremlinsky on Pochain", halkaas oo sawiro qadiimi ah oo Nizhny Novgorod ah lagu dhejiyay gudaha, iyada oo la socota! (Waxaan ku xasuusinayaa in xilligan la joogo xafiiska dhexe ee Intel uu ku yaal Nizhny Novgorod). Ka qaybgalayaasha waxaa la siiyay 26 saacadood si ay u qoraan koodka, iyo dhamaadka waxay ahayd inay soo bandhigaan xalkooda. Faa'iidada goonida ah waxay ahayd joogitaanka fadhiga demo si loo hubiyo in wax walba oo la qorsheeyay la fuliyay oo aan ku sii jirin fikradaha bandhigga. Badeeco, cunto fudud, cunto, wax walbana waa ay jireen!

Intaa waxaa dheer, Intel waxay si ikhtiyaari ah u bixisay kamaradaha, Raspberry PI, Neural Compute Stick 2.

Doorashada hawsha

Mid ka mid ah qaybaha ugu adag ee u diyaargarowga hackathon-ka bilaashka ah ayaa dooranaya caqabad. Waxaan isla markiiba go'aansanay inaan la nimaadno wax aan weli ku jirin badeecada, tan iyo markii lagu dhawaaqay in tani si weyn loo soo dhaweynayo.

Isagoo falanqeeyay moodooyinka, kuwaas oo ku jira sheyga ku jira sii-deynta hadda, waxaanu ku nimid gabagabada in intooda badani ay xalliyaan dhibaatooyinka aragtida kombuyuutarka ee kala duwan. Waxaa intaa dheer, aad bay u adag tahay in lala yimaado dhibaato dhinaca aragtida kombuyuutarka ah oo aan lagu xallin karin iyada oo la adeegsanayo OpenVINO, xitaa haddii mid la ikhtiraaci karo, way adag tahay in la helo moodallo horay loo tababaray oo ku jira qaybta dadweynaha. Waxaan go'aansanay inaan u qodno jiho kale - dhanka habaynta hadalka iyo falanqaynta. Aynu tixgelinno hawl xiiso leh oo ah aqoonsiga dareenka hadalka. Waa in la sheegaa in OpenVINO ay horey u leedahay qaab go'aaminaya dareenka qofka oo ku saleysan wajigiisa, laakiin:

  • Aragti ahaan, waxaa suurtagal ah in la abuuro algorithm isku dhafan oo ka shaqeyn doona codka iyo sawirka labadaba, taas oo ah inay bixiso kordhinta saxda ah.
  • Kaamirooyinka badanaa waxay leeyihiin xagal daawasho oo cidhiidhi ah; in ka badan hal kamarad ayaa loo baahan yahay si ay u daboosho aag weyn; codku ma laha xaddidaad noocaas ah.

Aynu horumarino fikradda: aynu u qaadanno fikradda qaybta tafaariiqda oo saldhig u ah. Waxaad ku cabbiri kartaa qanacsanaanta macmiilka marka aad eegto dukaamada. Haddii mid ka mid ah macaamiisha uusan ku qanacsanayn adeegga oo uu bilaabo inuu kor u qaado codkooda, waxaad isla markiiba wici kartaa maamulaha caawimaad.
Xaaladdan oo kale, waxaan u baahannahay inaan ku darno aqoonsiga codka bini'aadamka, tani waxay noo ogolaaneysaa inaan kala saarno shaqaalaha dukaanka macaamiisha iyo bixinta falanqaynta shakhsi kasta. Waa hagaag, marka lagu daro, waxaa suurtagal ah in la falanqeeyo habdhaqanka shaqaalaha dukaanka laftooda, qiimee jawiga kooxda, waxay u egtahay mid wanaagsan!

Waxaan dejineynaa shuruudaha xalkeena:

  • Cabbir yar oo ah aaladda bartilmaameedka ah
  • Hawlgalka waqtiga dhabta ah
  • Qiimo hoose
  • Miisaanka fudud

Natiijo ahaan, waxaan dooranaa Raspberry Pi 3 c sida aaladda bartilmaameedka ah Intel NCS 2.

Halkan waxaa muhiim ah in la xuso hal sifo oo muhiim ah oo NCS ah - waxay si fiican ugu shaqeysaa naqshadaha CNN ee caadiga ah, laakiin haddii aad u baahan tahay inaad ku shaqeyso moodal leh lakabyo caado ah, ka dibna filo hagaajin heer hoose ah.

Waxaa jira hal shay oo yar oo la sameeyo: waxaad u baahan tahay inaad hesho makarafoon. Makarafoonka USB-ga ee caadiga ah ayaa sameyn doona, laakiin uma eka mid si wadajir ah RPI-da. Laakiin xitaa halkan xalku macno ahaan β€œu dhowaa”. Si aan codka u duubno, waxaan go'aansanay inaan ka isticmaalno boorsada Voice Bonnet ee xirmada Qalabka Codka Google AIY, kaas oo uu ku yaal makarafoon stereo xadhig leh.

Ka soo deji Raspbian Kaydka mashaariicda AIY oo ku dheji flash drive, tijaabi in makarafoonku uu shaqeeyo adiga oo isticmaalaya amarkan soo socda (waxa uu duubi doonaa codka 5 ilbiriqsi dhererkiisuna wuxuu ku kaydin doonaa fayl):

arecord -d 5 -r 16000 test.wav

Waa inaan isla markiiba ogaadaa in makarafoonku yahay mid xasaasi ah oo si fiican u qaada qaylada. Si taas loo hagaajiyo, aynu aadno alsamixer, dooro Aaladaha Qabashada oo yaree heerka signal-gelinta 50-60%.

OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi
Waxaan ku beddeleynaa jirka fayl iyo wax walba oo ku habboon, xitaa waxaad ku xiri kartaa dabool

Ku darida badhanka tilmaame

Marka aan kala saarno Qalabka Codka AIY, waxaan xasuusannahay in uu jiro badhan RGB, kaas oo iftiinka dambe lagu xakameyn karo software. Waxaan raadinaa "Google AIY Led" oo waxaan helnaa dukumeenti: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Waa maxay sababta aan u isticmaalin badhankan si aad u muujiso dareenka la aqoonsan yahay, waxaanu haynaa 7 fasal oo kaliya, badhankuna wuxuu leeyahay 8 midab, kaliya ku filan!

Waxaan ku xireynaa batoonka GPIO ilaa Voice Bonnet, ku dheji maktabadaha lagama maarmaanka ah (horrey ayaa loogu rakibay xirmada qaybinta mashaariicda AIY)

from aiy.leds import Leds, Color
from aiy.leds import RgbLeds

Aan abuurno dict ah kaas oo dareen kastaa uu yeelan doono midab u dhigma qaabka RGB Tuple iyo shay fasalka aiy.leds.Leds, kaas oo aan ku cusbooneysiin doono midabka:

led_dict = {'neutral': (255, 255, 255), 'happy': (0, 255, 0), 'sad': (0, 255, 255), 'angry': (255, 0, 0), 'fearful': (0, 0, 0), 'disgusted':  (255, 0, 255), 'surprised':  (255, 255, 0)} 
leds = Leds()

Ugu dambeyntiina, ka dib saadaal kasta oo cusub oo dareen ah, waxaan cusbooneysiin doonaa midabka badhanka si waafaqsan (furaha).

leds.update(Leds.rgb_on(led_dict.get(classes[prediction])))

OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi
Badhan, guba!

Ku shaqaynta cod

Waxaan u isticmaali doonaa pyaudio si aan uga qabanno qulqulka makarafoonka iyo webrtcvad si aan u shaandheyno buuqa oo aan u ogaano codka. Intaa waxa dheer, waxaanu samayn doonaa saf kaas oo aanu si isku mid ah ugu dari doono oo aanu ka saari doono qaybo cod ah.

Maadaama webrtcvad uu leeyahay xaddidaad cabbirka jajabka la keenay - waa inay la mid tahay 10/20/30ms, iyo tababarka qaabka aqoonsiga dareenka (sida aan gadaal ka baran doono) ayaa lagu fuliyay xogta 48kHz, waxaan qabso qaybo cabirkoodu yahay 48000Γ—20ms/1000Γ—1( mono)=960 bytes. Webrtcvad wuxuu u soo celin doonaa Run/Been mid kasta oo ka mid ah cutubyadan, taas oo u dhiganta joogitaanka ama maqnaanshaha cod bixinta qaybta.

Aynu hirgelinno caqliga soo socda:

  • Waxaan liiska ku dari doonaa jajabyada meesha codku ka jiro, haddii aysan jirin cod, markaa waxaan kordhin doonaa miiska jajabyada madhan.
  • Haddii miiska qashinka madhan yahay> = 30 (600 ms), ka dibna waxaan eegnaa xajmiga liiska qashinka la ururiyay; haddii ay tahay> 250, ka dibna waxaan ku darnaa safka; haddii kale, waxaan tixgelineynaa in dhererka diiwaanku kuma filna in lagu quudiyo qaabka si loo aqoonsado afhayeenka.
  • Haddii miiska jajabka madhan uu weli yahay <30, oo cabbirka liiska jajabyada la ururiyey uu ka badan yahay 300, ka dibna waxaan ku dari doonaa jajabka safka si loo saadaaliyo saxsanaanta. (maxaa yeelay dareenka ayaa u muuqda inuu isbedelo waqti ka dib)

 def to_queue(frames):
    d = np.frombuffer(b''.join(frames), dtype=np.int16)
    return d

framesQueue = queue.Queue()
def framesThreadBody():
    CHUNK = 960
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 48000

    p = pyaudio.PyAudio()
    vad = webrtcvad.Vad()
    vad.set_mode(2)
    stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
    false_counter = 0
    audio_frame = []
    while process:
        data = stream.read(CHUNK)
        if not vad.is_speech(data, RATE):
            false_counter += 1
            if false_counter >= 30:
                if len(audio_frame) > 250:              
                    framesQueue.put(to_queue(audio_frame,timestamp_start))
                    audio_frame = []
                    false_counter = 0

        if vad.is_speech(data, RATE):
            false_counter = 0
            audio_frame.append(data)
            if len(audio_frame) > 300:                
                    framesQueue.put(to_queue(audio_frame,timestamp_start))
                    audio_frame = []

Waa waqtigii la raadin lahaa moodooyinka horay loo tababbaray ee qaybta dadweynaha, aad github, Google, laakiin xusuusnow in aan xaddidno qaab-dhismeedka la isticmaalo. Tani waa qayb aad u adag, sababtoo ah waa inaad tijaabisaa moodooyinka xogtaada gelinta, oo intaa dheer, u beddelo qaabka gudaha ee OpenVINO - IR (Matalaad Dhexdhexaad ah). Waxaan isku daynay 5-7 xalal kala duwan oo ka yimid github, iyo haddii qaabka aqoonsiga dareenka uu isla markiiba shaqeeyay, ka dibna aqoonsiga codka waxaan ku qasbanahay inaan sugno waqti dheer - waxay isticmaalaan naqshado badan oo adag.

Waxaan diiradda saareynaa arrimaha soo socda:

Marka xigta waxaan ka hadli doonaa beddelka moodooyinka, laga bilaabo aragtida. OpenVINO waxaa ku jira dhowr qaybood:

  • Fur Model Zoo, moodooyinka laga yaabo in la isticmaalo oo lagu daro alaabtaada
  • Model Optimzer, taas oo ay ku mahadsan tahay inaad ka beddeli karto moodal qaabab qaabaysan oo kala duwan (Tensorflow, ONNX iwm) una beddelo qaabka Matalaadda Dhexdhexaadka ah, kaas oo aan si dheeraad ah ugu shaqayn doono
  • Inference Engine wuxuu kuu ogolaanayaa inaad ku socodsiiso moodooyinka qaabka IR-ga ah ee soo-saareyaasha Intel, Myriad chips iyo dardar-geliyayaasha Xisaabinta Neural Compute Stick.
  • Nooca ugu waxtarka badan ee OpenCV (oo leh taageerada Injinka Inference)
    Nooc kasta oo qaabka IR ah waxa lagu sifeeyaa laba fayl: .xml iyo .bin.
    Qaababka waxaa loo rogaa qaabka IR iyadoo loo marayo Model Optimizer sida soo socota:

    python /opt/intel/openvino/deployment_tools/model_optimizer/mo_tf.py --input_model speaker.hdf5.pb --data_type=FP16 --input_shape [1,512,1000,1]

    --data_type wuxuu kuu ogolaanayaa inaad doorato qaabka xogta kaas oo qaabku ku shaqeyn doono. FP32, FP16, INT8 waa la taageeray. Doorashada nooca xogta ugu fiican waxay ku siin kartaa kor u qaadida waxqabadka wanaagsan.
    --input_shape waxay tilmaamaysaa cabbirka xogta wax gelinta. Awoodda isbeddelka isbeddelka ah waxay u muuqataa inay ku jirto C ++ API, laakiin ma aanan qodin meel fog oo si fudud u hagaajin mid ka mid ah moodooyinka.
    Marka xigta, aan isku dayno in aan ku shubno moodelkii horeba loo beddelay ee qaabka IR annagoo adeegsanayna moduleka DNN gudaha OpenCV oo aan u sii gudbinno.

    import cv2 as cv
    emotionsNet = cv.dnn.readNet('emotions_model.bin',
                              'emotions_model.xml')
    emotionsNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

    Xariiqda ugu dambeysa ee kiiskan ayaa kuu ogolaaneysa inaad xisaabinta u jiheyso Stick Compute Neural, xisaabinta aasaasiga ah ayaa lagu sameeyaa processor-ka, laakiin kiiska Raspberry Pi tani ma shaqeyn doonto, waxaad u baahan doontaa ul.

    Marka xigta, caqligu waa sida soo socota: waxaanu u kala qaybinnaa maqalkeena daaqadaha cabbirka cayiman (annaga waxay tahay 0.4 s), mid kasta oo ka mid ah daaqadahaas waxaan u beddelnaa MMFC, ka dibna waxaan ku quudineynaa shabkada:

    emotionsNet.setInput(MFCC_from_window)
    result = emotionsNet.forward()

    Marka xigta, aynu soo qaadano fasalka ugu caansan dhammaan daaqadaha. Xalka fudud, laakiin hackathon uma baahnid inaad la timaado wax aad u xun, kaliya haddii aad waqti haysato. Waxaa noo harsan shaqo badan, markaa aan sii wadno - waxaan la tacaali doonaa aqoonsiga codka. Waa lagama maarmaan in la sameeyo nooc ka mid ah xog-ururin kaas oo lagu kaydin doono spectrograms ee codad hore loo duubay. Mar haddii ay wakhti yar ka hadhsan tahay, waxan u xallin doonaa arrintan sida ugu macquulsan.

    Magac ahaan, waxaan abuurnaa qoraal lagu duubo qayb cod ah (waxay u shaqeysaa si la mid ah sida kor lagu soo sheegay, kaliya marka kumbuyuutarka laga gooyo waxay badbaadin doontaa codka faylka).

    Aan isku dayno:

    python3 voice_db/record_voice.py test.wav

    Waxaan duubnaa codadka dhowr qof (xaaladkeenna, saddex xubnood oo kooxda ah)
    Marka xigta, cod kasta oo la duubo waxaanu samaynaa isbeddel afar ka dheereeya, waxaanu helnaa spectrogram oo aanu u kaydinay sida nambarada (.npy):

    for file in glob.glob("voice_db/*.wav"):
            spec = get_fft_spectrum(file)
            np.save(file[:-4] + '.npy', spec)

    Faahfaahin dheeraad ah oo ku jirta faylka create_base.py
    Natiijo ahaan, marka aan maamulno qoraalka ugu weyn, waxaan ka heli doonaa gundhigyada spectrogram-yadaan bilowga hore:

    for file in glob.glob("voice_db/*.npy"):
        spec = np.load(file)
        spec = spec.astype('float32')
        spec_reshaped = spec.reshape(1, 1, spec.shape[0], spec.shape[1])
        srNet.setInput(spec_reshaped)
        pred = srNet.forward()
        emb = np.squeeze(pred)

    Ka dib markii aan ka helno gundhigga qaybta dhawaaqa, waxaan awood u yeelan doonaa inaan go'aamino cidda ay tahay anagoo ka qaadanayna masaafada cosine ee marinka ilaa dhammaan codadka ku jira kaydka (ka yar, inta badan) - demo-ga waxaan dejineynaa marinka ilaa 0.3):

            dist_list = cdist(emb, enroll_embs, metric="cosine")
            distances = pd.DataFrame(dist_list, columns = df.speaker)

    Dhamaadka, waxaan jeclaan lahaa in aan ogaado in xawaaruhu uu ahaa mid degdeg ah oo suurtogaliyay in lagu daro 1-2 nooc oo dheeraad ah (muunad 7 ilbiriqsi dheer waxay qaadatay 2.5 fikradda). Mar dambe ma aan haysan waqti aan ku darno moodallo cusub oo aan diiradda saarno qorista tusaalaha codsiga shabakadda.

    Codsiga shabakada

    Qodob muhiim ah: waxaan ka soo qaadnaa router guriga waxaanan dejineynaa shabakadeena maxalliga ah, waxay kaa caawineysaa in lagu xiro qalabka iyo laptop-yada shabakadda.

    Dhabarka dambe waa kanaalka farriinta u dhexeeya dhammaadka-ilaa-dhamaadka ee u dhexeeya xagga hore iyo Raspberry Pi, oo ku salaysan tignoolajiyada websocket (http over tcp protocol).

    Marxaladda ugu horreysa waa in laga helo macluumaadka la farsameeyay ee raspberry, taas oo ah, saadaaliyayaal ku jira json, kuwaas oo lagu keydiyo kaydinta xogta kala bar safarkooda si loo soo saaro tirakoobyo ku saabsan asalka shucuurta isticmaalaha muddada. Xirmadan ayaa markaa loo diraa dhinaca hore, kaas oo adeegsada is-diiwaangelinta oo ka hela xidhmooyin barta dhamaadka websocket-ka. Dhammaan habka dhabarka dambe waxa lagu dhisay luqadda golang; waxaa la doortay sababtoo ah waxay si fiican ugu habboon tahay hawlaha asynchronous, kuwaas oo gorutines si fiican u qabtaan.
    Marka la galo barta dhamaadka, isticmaaluhu waa la diwaangeliyaa oo la galaa qaab dhismeedka, ka dibna fariintiisa waa la helay. Isticmaalaha iyo fariinta labadaba waxa la galaa xarun caadi ah, taas oo farriimaha horeba looga sii diray (laga soo diray hore), iyo haddii isticmaaluhu xidho xidhiidhka (raspberry ama hore), ka dibna rukunsigiisa waa la tirtiray oo laga saarayaa xuddunta.

    OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi
    Waxaan sugeynaa xiriirka xagga dambe

    Front-end waa codsi shabakadeed oo ku qoran JavaScript iyadoo la adeegsanayo maktabadda React si loo dedejiyo oo loo fududeeyo habka horumarinta. Ujeedada codsigan waa in la sawiro xogta la helay iyadoo la adeegsanayo algorithms ee ku socda dhinaca dambe iyo si toos ah Raspberry Pi. Boggu waxa uu leeyahay habayn qaybeed oo la fuliyay iyada oo la adeegsanayo react-router, laakiin bogga ugu muhiimsan ee xiisaha ayaa ah bogga ugu weyn, halkaas oo xogta joogtada ah ee xogta laga helo wakhtiga dhabta ah ee serverka iyada oo la adeegsanayo tignoolajiyada WebSocket. Raspberry Pi wuxuu ogaadaa cod, wuxuu go'aamiyaa inuu qof gaar ah leeyahay oo ka mid ah xogta diiwaangashan, wuxuuna u diraa liiska suurtogalka ah macmiilka. Macmiilku waxa uu soo bandhigayaa xogtii ugu dambaysay ee khusaysa, waxa uu soo bandhigayaa avatar-ka qofka ay u badan tahay in uu ku hadlay makarafoonka, iyo sidoo kale dareenka uu ku dhawaaqayo ereyada.

    OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi
    Bogga hoyga oo leh saadaasha la cusboonaysiiyay

    gunaanad

    Suurtagal ma ahayn in wax walba la dhamaystiro sidii loo qorsheeyay, si fudud ma haysan waqti, sidaas darteed rajada ugu weyn waxay ahayd demo, in wax walba ay shaqeyn doonaan. Soo bandhigida waxay ka hadleen sida wax walba u shaqeeyaan, moodooyinka ay qaateen, dhibaatooyinka ay la kulmeen. Xiga ayaa ahayd qaybta bandhiga - khubarada ayaa qolka ku wareegay si aan kala sooc lahayn waxayna u dhawaadeen koox kasta si ay u eegaan tusaalaha shaqada. Sidoo kale su'aalo ayay na waydiiyeen, qof walbana qaybtiisa ayuu ka jawaabay, waxa ay kaga tageen mareegaha Laptop-ka, wax walbana runtii sidii la filayay ayay u shaqeeyeen.

    Aan xuso in wadarta kharashka xalkeena uu ahaa $150:

    • Raspberry Pi 3 ~ $35
    • Google AIY Voice Bonnet (waxaad qaadan kartaa khidmad ku hadasho) ~ 15$
    • Intel NCS 2 ~ 100$

    Sida loo horumariyo:

    • Isticmaal diiwaangelinta macmiilka - weydii inaad akhrido qoraalka si aan kala sooc lahayn loo soo saaray
    • Ku dar dhowr nooc oo kale: waxaad ku ogaan kartaa jinsiga iyo da'da cod ahaan
    • Kala saar codadka isku mar dhawaqaya

    Kaydka: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: garashada codka iyo dareenka Raspberry Pi
    Waan daalanahay laakiin waan faraxsanahay

    Guntii iyo gunaanadkii waxaan leeyahay waad mahadsan tihiin qabanqaabiyaashii iyo ka qaybgalayaashiiba. Waxaa ka mid ah mashaariicda kooxaha kale, waxaan shakhsi ahaan jecleysanay xalka la socodka meelaha baabuurta la dhigto ee bilaashka ah. Annaga, waxay ahayd waayo-aragnimo aad u fiican oo ku-milan-qaadista badeecadda iyo horumarka. Waxaan rajeynayaa in dhacdooyin badan oo xiiso leh lagu qaban doono gobollada, oo ay ku jiraan mawduucyada AI.

Source: www.habr.com

Add a comment