Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi

30 Samhain - Tionóladh 1 Nollaig i Nizhny Novgorod Cluiche OpenVINO Hackathon. Iarradh ar rannpháirtithe fréamhshamhail de réiteach táirge a chruthú ag baint úsáide as foireann uirlisí Intel OpenVINO. Mhol na heagraithe liosta topaicí a d’fhéadfaí a threorú agus tasc á roghnú acu, ach d’fhan an cinneadh deiridh ag na foirne. Ina theannta sin, spreagadh úsáid a bhaint as samhlacha nach bhfuil san áireamh sa táirge.

Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi

San Airteagal seo inseoimid duit faoi conas a chruthaigh muid ár fhréamhshamhail den táirge, a bhfuil muid ar deireadh thiar ghlac an chéad áit.

Ghlac níos mó ná 10 bhfoireann páirt sa hackathon. Is deas gur tháinig cuid acu ó réigiúin eile. Ba é an t-ionad don hackathon an coimpléasc “Kremlinsky on Pochain”, áit ar crochadh grianghraif ársa de Nizhny Novgorod taobh istigh, i gcomhluadar! (Cuirim i gcuimhne duit go bhfuil oifig lárnach Intel lonnaithe i Nizhny Novgorod faoi láthair). Tugadh 26 uair an chloig do rannpháirtithe cód a scríobh, agus ag an deireadh bhí orthu a réiteach a chur i láthair. Buntáiste ar leith a bhí ann ná seisiún taispeána a bheith ann chun a chinntiú go raibh gach rud a bhí beartaithe curtha i bhfeidhm i ndáiríre agus nár fhan na smaointe sa chur i láthair. Merch, sneaiceanna, bia, bhí gach rud ann freisin!

Ina theannta sin, chuir Intel ceamaraí, Raspberry PI, Neural Compute Stick 2 ar fáil go roghnach.

Roghnú tascanna

Ceann de na codanna is deacra maidir le hullmhú do haicathon saor in aisce ná dúshlán a roghnú. Shocraigh muid láithreach teacht ar rud éigin nach raibh fós sa táirge, ó dúirt an fógra go raibh fáilte mhór roimh seo.

Tar éis anailís a dhéanamh samhlacha, atá san áireamh sa táirge sa scaoileadh reatha, tháinig muid ar an tuairim go réitíonn an chuid is mó acu fadhbanna éagsúla fís ríomhaireachta. Ina theannta sin, tá sé an-deacair teacht suas le fadhb i réimse an fhís ríomhaire nach féidir a réiteach ag baint úsáide as OpenVINO, agus fiú amháin más féidir ceann a chumadh, tá sé deacair samhlacha réamh-oilte a aimsiú san fhearann ​​poiblí. Socraímid tochailt i dtreo eile - i dtreo próiseála cainte agus anailísíochta. Déanaimis tasc suimiúil a mheas maidir le mothúcháin ó chaint a aithint. Ní mór a rá go bhfuil múnla ag OpenVINO cheana féin a chinneann mothúcháin duine bunaithe ar a n-aghaidh, ach:

  • Go teoiriciúil, is féidir algartam comhcheangailte a chruthú a oibreoidh ar fhuaim agus ar íomhá araon, rud a d'fhéadfadh méadú ar chruinneas a thabhairt.
  • De ghnáth bíonn uillinn amhairc cúng ag ceamaraí; teastaíonn níos mó ná ceamara amháin chun limistéar mór a chlúdach; níl aon teorainn den sórt sin ag an bhfuaim.

Déanaimis an smaoineamh a fhorbairt: déanaimis an smaoineamh don earnáil mhiondíola mar bhonn. Is féidir leat sástacht na gcustaiméirí a thomhas ag seiceanna siopaí. Má tá duine de na custaiméirí míshásta leis an tseirbhís agus má thosaíonn sé ag ardú a dtola, is féidir leat glaoch láithreach ar an riarthóir chun cabhair a fháil.
Sa chás seo, ní mór dúinn aitheantas gutha daonna a chur leis, ligfidh sé seo dúinn fostaithe stórais a idirdhealú ó chustaiméirí agus anailísíocht a sholáthar do gach duine aonair. Bhuel, ina theannta sin, beifear in ann anailís a dhéanamh ar iompar na bhfostaithe sa siopa iad féin, an t-atmaisféar san fhoireann a mheas, fuaimeanna maith!

Déanaimid na ceanglais dár réiteach a fhoirmliú:

  • Méid beag an gléas sprioc
  • Oibriú fíor-ama
  • Praghas íseal
  • Inscalability éasca

Mar thoradh air sin, roghnaigh muid Raspberry Pi 3 c mar an gléas sprice Intel NCS 2.

Anseo tá sé tábhachtach gné thábhachtach amháin de NCS a thabhairt faoi deara - is fearr a oibríonn sé le hailtireachtaí caighdeánacha CNN, ach más gá duit samhail a reáchtáil le sraitheanna saincheaptha air, ansin bí ag súil le leas iomlán a bhaint as leibhéal íseal.

Níl ach rud beag amháin le déanamh: ní mór duit micreafón a fháil. Déanfaidh micreafón USB rialta, ach ní bheidh cuma mhaith air in éineacht leis an RPI. Ach fiú anseo tá an réiteach literally “in aice láimhe.” Chun an guth a thaifeadadh socraímid an clár Voice Bonnet ón trealamh a úsáid Google AIY Guth Kit, ar a bhfuil micreafón steirió sreangaithe.

Íosluchtaigh Raspbian ó Stór tionscadal AIY agus é a uaslódáil chuig tiomántán splanc, tástáil go n-oibríonn an micreafón ag baint úsáide as an ordú seo a leanas (taifeadfaidh sé fuaim 5 soicind ar fad agus sábhálfaidh sé i gcomhad í):

arecord -d 5 -r 16000 test.wav

Ba chóir dom a thabhairt faoi deara láithreach go bhfuil an micreafón an-íogair agus go n-ardaíonn sé torann go maith. Chun seo a shocrú, a ligean ar dul go dtí alsamixer, roghnaigh feistí Gabháil agus laghdú ar an leibhéal comhartha ionchur go 50-60%.

Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi
Déanaimid an comhlacht a mhodhnú le comhad agus luíonn gach rud, is féidir leat é a dhúnadh fiú le clúdach

Cnaipe táscaire á chur leis

Agus an Kit Guth AIY á thógáil óna chéile, cuimhnímid go bhfuil cnaipe RGB ann, ar féidir a backlight a rialú le bogearraí. Déanaimid cuardach ar “Google AIY Led” agus aimsímid doiciméid: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Cén fáth nach n-úsáidfeá an cnaipe seo chun an mhothúchán aitheanta a thaispeáint, níl ach 7 rang againn, agus tá 8 ndath ar an gcnaipe, díreach go leor!

Ceanglaíonn muid an cnaipe trí GPIO le Voice Bonnet, lódálann muid na leabharlanna riachtanacha (tá siad suiteáilte cheana féin sa trealamh dáileacháin ó thionscadail AIY)

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

Déanaimis dict a chruthú ina mbeidh dath comhfhreagrach ag gach mothúchán i bhfoirm Tuple RGB agus réad den rang aiy.leds.Leds, trína ndéanfaimid an dath a nuashonrú:

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()

Agus ar deireadh, tar éis gach tuar nua ar mhothúchán, déanfaimid dath an chnaipe a nuashonrú de réir é (de réir eochair).

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

Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi
Cnaipe, sruthán!

Ag obair le guth

Úsáidfimid pyaudio chun an sruth a ghabháil ón micreafón agus webrtcvad chun torann a scagadh agus chun guth a bhrath. Ina theannta sin, cruthóimid scuaine a gcuirfimid sleachta gutha leis agus a bhainfimid as.

Ós rud é go bhfuil teorainn ag webrtcvad ar mhéid na blúire a sholáthraítear - caithfidh sé a bheith comhionann le 10/20/30ms, agus rinneadh oiliúint an tsamhail chun mothúcháin a aithint (mar a fhoghlaimfimid níos déanaí) ar thacar sonraí 48kHz, déanfaimid smután gabhála de mhéid 48000×20ms/1000×1( mona)=960 beart. Tabharfaidh Webrtcvad Fíor/Bréagach ar ais do gach ceann de na smután seo, rud a fhreagraíonn do láithreacht nó d'éagmais vóta sa smután.

Cuirfimid an loighic seo a leanas i bhfeidhm:

  • Cuirfimid leis an liosta na smután sin ina bhfuil vóta; mura bhfuil vóta ann, méadóimid an cuntar de smután folmha.
  • Más é >=30 (600 ms) cuntar na smután folamh, féachaimid ar mhéid liosta na smután carntha; más >250 é, cuirimid leis an scuaine é; mura bhfuil, measaimid go bhfuil an fad den taifead nach leor é a bheathú don mhúnla chun an cainteoir a aithint.
  • Má tá cuntar na smután folmha fós <30, agus má sháraíonn an liosta smután carntha 300, ansin cuirfimid an blúire leis an scuaine le haghaidh tuar níos cruinne. (toisc go n-athraíonn mothúcháin le himeacht ama)

 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 = []

Tá sé in am samhlacha réamh-oilte a lorg san fhearann ​​poiblí, téigh go dtí github, Google, ach cuimhnigh go bhfuil teorainn againn leis an ailtireacht a úsáidtear. Is cuid sách deacair é seo, toisc go gcaithfidh tú na samhlacha a thástáil ar do shonraí ionchuir, agus ina theannta sin, iad a thiontú go formáid inmheánach OpenVINO - IR (Ionadaíocht Idirmheánach). Rinneamar iarracht thart ar 5-7 réitigh éagsúla ó github, agus má d'oibrigh an tsamhail chun mothúcháin a aithint láithreach, ansin le haitheantas gutha bhí orainn fanacht níos faide - úsáideann siad ailtireachtaí níos casta.

Dírímid ar na nithe seo a leanas:

Next beidh muid ag caint faoi samhlacha a thiontú, ag tosú le teoiric. Áiríonn OpenVINO roinnt modúl:

  • Oscail Samhail Zú, samhlacha óna bhféadfaí iad a úsáid agus a chur san áireamh i do tháirge
  • Samhail Optimzer, a bhuíochas sin is féidir leat samhail a thiontú ó chreat-fhormáidí éagsúla (Tensorflow, ONNX srl) go formáid Ionadaíochta Idirmheánach, lena n-oibreoimid tuilleadh
  • Ligeann Inference Engine duit samhlacha i bhformáid IR a rith ar phróiseálaithe Intel, sceallóga Myriad agus luasairí Neural Compute Stick
  • An leagan is éifeachtaí de OpenCV (le tacaíocht Inference Engine)
    Déanann dhá chomhad cur síos ar gach samhail i bhformáid IR: .xml agus .bin.
    Déantar samhlacha a thiontú go formáid IR trí Model Optimizer mar seo a leanas:

    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 ligeann duit an fhormáid sonraí a roghnú lena n-oibreoidh an tsamhail. Tacaítear le FP32, FP16, INT8. Má roghnaíonn tú an cineál sonraí is fearr is féidir treisiú maith feidhmíochta a thabhairt.
    --input_shape léiríonn sé toise na sonraí ionchuir. Dealraíonn sé go bhfuil an cumas é a athrú go dinimiciúil i láthair san C ++ API, ach níor thochaileamar chomh fada sin agus shocraigh muid é do cheann de na samhlacha.
    Ansin, déanaimis iarracht an tsamhail atá comhshóite cheana féin a luchtú i bhformáid IR tríd an modúl DNN go OpenCV agus é a chur ar aghaidh chuige.

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

    Ceadaíonn an líne dheireanach sa chás seo duit ríomhaireachtaí a atreorú chuig an Neural Compute Stick, déantar ríomhanna bunúsacha ar an bpróiseálaí, ach i gcás an Raspberry Pi ní oibreoidh sé seo, beidh bata uait.

    Ansin, is é seo a leanas an loighic: roinnimid ár gcuid fuaime i bhfuinneoga de mhéid áirithe (is é 0.4 s é dúinn), déanaimid gach ceann de na fuinneoga seo a thiontú go MFCC, agus ansin cuirimid beatha chuig an eangach:

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

    Ansin, déanaimis an rang is coitianta do gach fuinneog. Réiteach simplí, ach le haghaidh hackathon ní gá duit teacht suas le rud éigin ró-abstruse, ach amháin má tá am agat. Tá go leor oibre fós le déanamh againn, mar sin bogaimis ar aghaidh - déileálfaimid le haitheantas gutha. Is gá bunachar sonraí de chineál éigin a dhéanamh ina stórálfar speictreagraim de ghuthanna réamhthaifeadta. Ós rud é nach bhfuil mórán ama fágtha, réiteoimid an cheist seo chomh maith agus is féidir linn.

    Is é sin, cruthaímid script chun sliocht gutha a thaifeadadh (feidhmíonn sé ar an mbealach céanna a thuairiscítear thuas, ach amháin nuair a chuirtear isteach air ón méarchlár a shábhálann sé an guth chuig comhad).

    Déanaimis iarracht:

    python3 voice_db/record_voice.py test.wav

    Taifeadaimid guthanna roinnt daoine (triúr ball foirne inár gcás)
    Ansin, do gach guth taifeadta déanaimid claochlú gasta ceithre cinn, faigh speictream agus sábhálaimid é mar eagar numpy (.npy):

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

    Tuilleadh sonraí sa chomhad create_base.py
    Mar thoradh air sin, nuair a bheidh an phríomhscript á rith againn, gheobhaidh muid leabaithe ó na speictreagraim seo ag an tús:

    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)

    Tar éis dúinn an leabú a fháil ón deighleog fhuaimnithe, beimid in ann a chinneadh cé leis a mbaineann sé tríd an achar cósine a thógáil ón sliocht go dtí na guthanna go léir sa bhunachar sonraí (an lú, is dóichí) - le haghaidh taispeána shocraigh muid an tairseach. go 0.3):

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

    Sa deireadh, ba mhaith liom a thabhairt faoi deara go raibh an luas tátal tapa agus go raibh sé indéanta 1-2 mhúnla níos mó a chur leis (ar feadh sampla 7 soicind thóg sé 2.5 le haghaidh tátail). Ní raibh am againn a thuilleadh samhlacha nua a chur leis agus dhírigh muid ar fhréamhshamhail den fheidhmchlár gréasáin a scríobh.

    Feidhmchlár gréasáin

    Pointe tábhachtach: tógann muid ródaire linn ón mbaile agus socraímid ár líonra áitiúil, cabhraíonn sé leis an bhfeiste agus na ríomhairí glúine a nascadh thar an líonra.

    Is cainéal teachtaireachta deireadh le deireadh é an t-inneall idir an tosaigh agus Raspberry Pi, bunaithe ar theicneolaíocht websocket (http over tcp protocol).

    Is é an chéad chéim ná faisnéis phróiseáilte a fháil ó shú craobh, is é sin, réamhaisnéiseoirí pacáilte in json, a shábháiltear sa bhunachar sonraí leath bealaigh trína dturas ionas gur féidir staitisticí a ghiniúint faoi chúlra mhothúchánach an úsáideora don tréimhse. Seoltar an paicéad seo chuig an aghaidh ansin, a úsáideann síntiús agus a fhaigheann paicéid ó chríochphointe an tsoicéad gréasáin. Tá an mheicníocht inneall iomlán tógtha sa teanga golang; roghnaíodh é toisc go bhfuil sé oiriúnach go maith do thascanna asincrónacha, a láimhseálann goroutines go maith.
    Nuair a fhaigheann sé rochtain ar an gcríochphointe, tá an t-úsáideoir cláraithe agus curtha isteach sa struchtúr, ansin faightear a theachtaireacht. Cuirtear an t-úsáideoir agus an teachtaireacht araon isteach i mol coiteann, óna seoltar teachtaireachtaí níos faide cheana féin (go dtí an tosach suibscríofa), agus má dhúnann an t-úsáideoir an nasc (sú craobh nó tosach), ansin cuirtear a shíntiús ar ceal agus baintear as é. an mol.

    Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi
    Táimid ag fanacht le nasc ón gcúl

    Is feidhmchlár gréasáin é Front-end atá scríofa i JavaScript a úsáideann leabharlann React chun an próiseas forbartha a bhrostú agus a shimpliú. Is é cuspóir an fheidhmchláir seo sonraí a fhaightear a shamhlú trí úsáid a bhaint as halgartaim a ritheann ar an taobh cúil agus go díreach ar an Raspberry Pi. Tá ródú rannóige ar an leathanach, arna chur i bhfeidhm le ródaire imoibríoch, ach is é an príomhleathanach spéise an príomhleathanach, áit a bhfaightear sruth leanúnach sonraí i bhfíor-am ón bhfreastalaí ag baint úsáide as teicneolaíocht WebSocket. Aimsíonn Raspberry Pi guth, cinneann sé an mbaineann sé le duine ar leith ón mbunachar sonraí cláraithe, agus cuireann sé liosta dóchúlachta chuig an gcliant. Taispeánann an cliant na sonraí ábhartha is déanaí, taispeánann sé avatar an duine is dóichí a labhair isteach sa mhicreafón, chomh maith leis an mothúchán lena bhfuaimníonn sé na focail.

    Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi
    Leathanach baile le tuar nuashonraithe

    Conclúid

    Níorbh fhéidir gach rud a chríochnú mar a bhí beartaithe, ní raibh am againn, agus mar sin bhí an príomhdhóchas sa taispeántas, go n-oibreodh gach rud. Sa chur i láthair labhair siad faoi conas a oibríonn gach rud, cad iad na samhlacha a ghlac siad, cad iad na fadhbanna a bhí acu. Ansin bhí an chuid taispeána - shiúil na saineolaithe timpeall an tseomra in ord randamach agus chuaigh siad i dteagmháil le gach foireann féachaint ar an fhréamhshamhail oibre. Chuir siad ceisteanna orainn freisin, d'fhreagair gach duine a bpáirt, d'fhág siad an ngréasán ar an ríomhaire glúine, agus d'oibrigh gach rud i ndáiríre mar a bhíothas ag súil leis.

    Tabhair faoi deara gurbh é $150 costas iomlán ár réiteach:

    • Raspberry Pi 3 ~ $35
    • Google AIY Voice Bonnet (is féidir leat táille athchainte a ghlacadh) ~ 15$
    • Intel NCS 2 ~ 100$

    Conas a fheabhsú:

    • Bain úsáid as clárú ón gcliant - iarr ort an téacs a ghintear go randamach a léamh
    • Cuir cúpla samhlacha eile leis: is féidir leat inscne agus aois a chinneadh de réir guth
    • Scar guthanna á bhfuaimniú go comhuaineach (dialathas)

    Stór: https://github.com/vladimirwest/OpenEMO

    Hackathon OpenVINO: ag aithint gutha agus mothúcháin ar Raspberry Pi
    Tuirseach ach sásta go bhfuil muid

    Mar fhocal scoir, ba mhaith liom buíochas a ghabháil leis na heagraithe agus na rannpháirtithe. I measc na dtionscadal foirne eile, thaitin linn go pearsanta an réiteach chun monatóireacht a dhéanamh ar spásanna páirceála saor in aisce. Maidir linne, ba eispéireas an-fhionnuar é ar an tumoideachas sa táirge agus san fhorbairt. Tá súil agam go mbeidh níos mó imeachtaí suimiúla ar siúl sna réigiúin, lena n-áirítear ar ábhair AI.

Foinse: will.com

Add a comment