OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi

30 Novambra - 1 Desambra tany Nizhny Novgorod no natao OpenVINO hackathon. Nasaina namorona prototype ny vahaolana vokatra amin'ny alàlan'ny fitaovana Intel OpenVINO ny mpandray anjara. Ny mpikarakara dia nanolotra lisitr'ireo lohahevitra teo ho eo izay azo arahina amin'ny fisafidianana asa, fa ny fanapahan-kevitra farany dia nijanona tamin'ny ekipa. Ankoatra izany, dia namporisika ny fampiasana ny modely izay tsy tafiditra ao amin'ny vokatra.

OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi

Amin'ity lahatsoratra ity dia hilaza aminao ny fomba namoronanay ny prototype ny vokatra izahay, izay nahazoanay ny laharana voalohany.

Ekipa maherin'ny 10 no nandray anjara tamin'ny hackathon. Mahafinaritra fa avy any amin'ny faritra hafa ny sasany amin'izy ireo. Ny toerana hanaovana ny hackathon dia ny complexe “Kremlinsky on Pochain”, izay nahantona tao anatiny ny sarin'i Nizhny Novgorod fahiny, tao anatin'ny andiany iray! (Mampahatsiahy anao aho fa amin'izao fotoana izao dia ao Nizhny Novgorod ny birao foibe Intel). Nomena 26 ora ny mpandray anjara hanoratana kaody, ary amin'ny farany dia tsy maintsy manolotra ny vahaolana. Ny tombony manokana dia ny fisian'ny fivoriana demo mba hahazoana antoka fa ny zavatra rehetra nokasaina dia tena nampiharina ary tsy mijanona ho hevitra amin'ny famelabelarana. Varotra, tsakitsaky, sakafo, teo koa ny zava-drehetra!

Ho fanampin'izany, Intel dia nanome fakan-tsary, Raspberry PI, Neural Compute Stick 2.

Fantenana asa

Ny iray amin'ireo ampahany sarotra indrindra amin'ny fanomanana hackathon maimaim-poana dia ny fisafidianana fanamby. Nanapa-kevitra avy hatrany izahay ny hamorona zavatra izay tsy mbola ao anatin'ny vokatra, satria ny fanambarana dia nilaza fa tena noraisina izany.

Rehefa avy namakafaka modely, izay tafiditra ao amin'ny vokatra amin'ny famoahana amin'izao fotoana izao, dia tonga amin'ny fanatsoahan-kevitra izahay fa ny ankamaroan'izy ireo dia mamaha olana isan-karazany amin'ny fahitana solosaina. Ambonin'izany, sarotra dia sarotra ny mametraka olana eo amin'ny sehatry ny fahitana solosaina izay tsy azo vahana amin'ny fampiasana OpenVINO, ary na dia azo noforonina aza, dia sarotra ny mahita modely efa voaofana eny amin'ny sehatra ho an'ny daholobe. Manapa-kevitra ny hihady lalana hafa izahay - mankany amin'ny fanodinana kabary sy fanadihadiana. Andeha isika handinika asa mahaliana ny mamantatra ny fihetseham-po avy amin`ny kabary. Tsy maintsy lazaina fa ny OpenVINO dia efa manana modely izay mamaritra ny fihetseham-pon'ny olona iray amin'ny endriny, saingy:

  • Amin'ny teoria, azo atao ny mamorona algorithm mitambatra izay hiasa amin'ny feo sy ny sary, izay tokony hampitombo ny fahamendrehana.
  • Matetika ny fakan-tsary dia manana zoro fijery tery; fakan-tsary mihoatra ny iray no takiana mba handrakotra faritra midadasika; tsy manana fetra toy izany ny feo.

Andao hampivelatra ny hevitra: andao horaisina ho fototra ny hevitra ho an'ny sehatry ny varotra. Azonao atao ny mandrefy ny fahafaham-pon'ny mpanjifa amin'ny fivarotana fivarotana. Raha tsy afa-po amin'ny serivisy ny iray amin'ireo mpanjifa ary manomboka manandratra ny feony, dia afaka miantso avy hatrany ny mpitantana ianao mba hahazoana fanampiana.
Amin'ity tranga ity, mila manampy ny fankatoavana ny feon'olombelona isika, izany dia ahafahantsika manavaka ny mpiasan'ny fivarotana amin'ny mpanjifa ary manome fanadihadiana ho an'ny tsirairay. Eny ary, ho fanampin'izany, azo atao ny mandinika ny fihetsiky ny mpiasan'ny fivarotana ny tenany, manombana ny rivo-piainana ao amin'ny ekipa, toa tsara!

Mamolavola ny fepetra takiana amin'ny vahaolanay izahay:

  • Habe kely ny fitaovana kendrena
  • Fampandehanana ara-potoana
  • Vidiny ambany
  • Mora scalability

Vokatr'izany dia misafidy Raspberry Pi 3 c ho fitaovana kendrena izahay Intel NCS 2.

Eto dia zava-dehibe ny manamarika endri-javatra manan-danja iray amin'ny NCS - miasa tsara indrindra amin'ny maritrano CNN mahazatra izy io, fa raha mila manamboatra modely misy sosona manokana ianao dia manantena ny fanatsarana ambany.

Zavatra kely iray ihany no tokony hatao: mila maka mikrô ianao. Ny mikrô USB mahazatra dia mety, saingy tsy ho tsara miaraka amin'ny RPI. Saingy na dia eto aza ny vahaolana dia "mandry eo akaiky eo". Mba handrakitra feo dia manapa-kevitra ny hampiasa ny tabilao Voice Bonnet avy amin'ny kitapo izahay Google AIY Voice Kit, izay misy mikrô stereo misy tariby.

Download Raspbian avy amin'ny AIY projects repository ary ampidiro ao amin'ny kapila tselatra ilay izy, andramo fa miasa ny mikrô amin'ny alalan'ity baiko manaraka ity (hiraketana feo 5 segondra ny halavany ary tehiriziny ao anaty rakitra iray):

arecord -d 5 -r 16000 test.wav

Tokony ho marihiko avy hatrany fa tena saro-pady ny mikrô ary mandray feo tsara. Mba hamahana izany, andeha ho any amin'ny alsamixer, safidio ny fitaovana Capture ary hampihena ny haavon'ny famantarana fampidirana ho 50-60%.

OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi
Manova ny vatana miaraka amin'ny rakitra izahay ary mifanaraka amin'ny zava-drehetra, azonao atao ny manidy azy amin'ny sarony

Manampy bokotra famantarana

Rehefa manasaraka ny AIY Voice Kit dia tadidinay fa misy bokotra RGB, izay azo fehezin'ny rindrambaiko ny jiro aoriana. Mikaroka ny "Google AIY Led" izahay ary mahita antontan-taratasy: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Maninona raha mampiasa ity bokotra ity hanehoana ny fihetseham-po fantatra, kilasy 7 ihany no ananantsika, ary misy loko 8 ny bokotra, ampy fotsiny!

Mampifandray ny bokotra amin'ny alàlan'ny GPIO amin'ny Voice Bonnet izahay, ampidiro ny tranomboky ilaina (efa napetraka ao amin'ny kitapo fizarana avy amin'ny tetikasa AIY izy ireo)

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

Andao hamorona dict izay hanana loko mifanaraka amin'izany ny fihetseham-po tsirairay amin'ny endrika RGB Tuple sy zavatra iray ao amin'ny kilasy aiy.leds.Leds, izay hanavaozana ny loko:

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

Ary farany, aorian'ny faminaniana vaovao tsirairay momba ny fihetseham-po, dia havaozinay ny lokon'ny bokotra mifanaraka amin'izany (amin'ny lakile).

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

OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi
bokotra, may!

Miasa amin'ny feo

Hampiasa pyaudio izahay haka ny riaka avy amin'ny mikrô sy webrtcvad hanivana ny tabataba sy hamantarana feo. Ho fanampin'izay, hamorona filaharana izay hampidiranay sy hanesorana ireo sombin-peo izahay.

Koa satria ny webrtcvad dia manana fetra amin'ny haben'ny sombintsombiny omena - tsy maintsy mitovy amin'ny 10/20/30ms izy io, ary ny fanofanana ny maodely hamantarana ny fihetseham-po (araka ny hianarantsika any aoriana) dia natao tamin'ny angona 48kHz. alaivo ny habe 48000×20ms/1000×1(mono)=960 bytes. Webrtcvad dia hamerina True/False ho an'ny tsirairay amin'ireo tapany ireo, izay mifanandrify amin'ny fisiana na tsy fisian'ny vato ao amin'ny tapany.

Andao hampihatra izao lojika manaraka izao:

  • Hampianay ao anatin'ny lisitra ireo potika misy vato; raha tsy misy ny vato dia hampitombo ny kaontin'ny potika foana.
  • Raha > = 30 (600 ms) ny kaontin'ny sombin-javatra tsy misy na inona na inona, dia mijery ny haben'ny lisitry ny sombin-javatra voaangona isika; raha> 250 izany, dia ampidirintsika amin'ny filaharana izany; raha tsy izany dia heverintsika fa ny halavany. ny firaketana dia tsy ampy hanomezana azy ny modely mba hamantarana ny mpandahateny.
  • Raha mbola <30 ny kaontin'ny sombin-javatra tsy misy na inona na inona, ary mihoatra ny 300 ny haben'ny lisitr'ireo sombin-javatra voaangona, dia ampidirintsika ao amin'ny filaharana ilay sombiny mba hahazoana faminaniana marina kokoa. (satria miova ny fihetseham-po rehefa mandeha ny fotoana)

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

Fotoana izao hitadiavana modely efa voaofana ao amin'ny sehatra ho an'ny daholobe, mandehana any amin'ny github, Google, fa tadidio fa misy fetrany ny maritrano ampiasaina. Ampahany sarotra ity, satria tsy maintsy mitsapa ny maodely amin'ny angon-drakitrao ianao, ary ho fanampin'izany, avadika ho endrika anatiny OpenVINO - IR (Representation Intermediate). Nanandrana vahaolana 5-7 samihafa avy amin'ny github izahay, ary raha niasa avy hatrany ny maodely hamantarana ny fihetseham-po, dia tsy maintsy niandry ela kokoa noho ny faneken'ny feo izahay - mampiasa rafitra sarotra kokoa izy ireo.

Mifantoka amin'ireto manaraka ireto izahay:

  • Fihetseham-po avy amin'ny feo - https://github.com/alexmuhr/Voice_Emotion
    Miasa araka ity fitsipika manaraka ity izy io: tapaka ho andalan-tsoratra amin'ny habe iray ny feo, ho an'ny tsirairay amin'ireo andalana ireo no fidintsika. MFCC ary avy eo dia apetraho ho fidirana amin'ny CNN izy ireo
  • Famantarana feo - https://github.com/linhdvu14/vggvox-speaker-identification
    Eto, fa tsy MFCC, dia miara-miasa amin'ny spectrogram, aorian'ny FFT dia mamahana ny famantarana ho an'ny CNN izahay, izay amin'ny famoahana dia mahazo fanehoana vector ny feo.

Avy eo dia hiresaka momba ny fanovana modely isika, manomboka amin'ny teoria. Ny OpenVINO dia misy modules maromaro:

  • Open Model Zoo, modely azo ampiasaina sy ampidirina amin'ny vokatrao
  • Model Optimzer, izay ahafahanao mamadika modely avy amin'ny endrika rafitra isan-karazany (Tensorflow, ONNX sns) ho amin'ny endrika Intermediate Representation, izay hiarahanay bebe kokoa.
  • Inference Engine dia ahafahanao mampandeha modely amin'ny endrika IR amin'ny processeur Intel, chips Myriad ary accelerators Neural Compute Stick.
  • Ny dikan-teny mahomby indrindra amin'ny OpenCV (miaraka amin'ny fanohanan'ny Inference Engine)
    Ny modely tsirairay amin'ny endrika IR dia faritana amin'ny rakitra roa: .xml sy .bin.
    Ny modely dia avadika ho endrika IR amin'ny alàlan'ny Model Optimizer toy izao manaraka izao:

    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 mamela anao hisafidy ny angon-drakitra endrika izay ny modely no miasa. FP32, FP16, INT8 dia tohana. Ny fisafidianana ny karazana data tsara indrindra dia afaka manome tosika tsara.
    --input_shape manondro ny refin'ny angona fampidirana. Ny fahafahana manova azy io dia toa hita ao amin'ny C ++ API, saingy tsy nandavaka izany izahay ary nanamboatra azy io ho an'ny iray amin'ireo modely.
    Manaraka, andeha isika hiezaka hampiditra ny modely efa niova fo amin'ny endrika IR amin'ny alàlan'ny maody DNN ao amin'ny OpenCV ary afindra any aminy.

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

    Ny andalana farany amin'ity tranga ity dia ahafahanao mamindra ny kajy amin'ny Neural Compute Stick, ny kajy fototra dia atao amin'ny processeur, fa raha ny Raspberry Pi dia tsy mandeha izany, mila hazo ianao.

    Manaraka, ny lojika dia toy izao manaraka izao: mizara ny horonam-peo ho varavarankely amin'ny habe iray (ny anay dia 0.4 s), mamadika ny tsirairay amin'ireo varavarankely ireo ho MFCC, izay avy eo mamahana ny grid:

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

    Manaraka, andeha horaisintsika ny kilasy mahazatra indrindra amin'ny varavarankely rehetra. Vahaolana tsotra, fa ho an'ny hackathon dia tsy mila mamorona zavatra tsy misy dikany loatra ianao, raha tsy manam-potoana ianao. Mbola betsaka ny asa tokony hataontsika, ka ndeha hiroso amin’izany isika – hiatrika ny famantarana ny feo. Ilaina ny mamorona karazana angon-drakitra izay hitehirizana ny spectrograms amin'ny feo voarakitra mialoha. Koa satria kely ny fotoana tavela, dia hamaha ity olana ity araka izay tratra izahay.

    Izany hoe, mamorona script ho an'ny firaketana sombin-peo izahay (miara-miasa amin'ny fomba voalaza etsy ambony izy io, rehefa tapaka avy amin'ny klavier dia hamonjy ilay feo amin'ny rakitra iray).

    Andeha isika:

    python3 voice_db/record_voice.py test.wav

    Mandrakitra ny feon'olona maromaro izahay (raha misy anay, mpikambana telo ao amin'ny ekipa)
    Manaraka izany, isaky ny feo voarakitra dia manao fiovàna fourier haingana izahay, maka spectrograma ary tehirizo ho toy ny numpy array (.npy):

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

    Ny antsipiriany bebe kokoa ao amin'ny rakitra create_base.py
    Vokatr'izany, rehefa mihazakazaka ny script lehibe isika dia hahazo embeddings avy amin'ireto spectrograms ireto any am-piandohana:

    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)

    Rehefa avy nandray ny embedding avy amin'ny fizarana misy feo, dia ho afaka hamantatra hoe iza izy io amin'ny alalan'ny fakana ny cosine halaviran'ny andalan-teny amin'ny feo rehetra ao amin'ny tahiry (ny kely kokoa, ny azo inoana kokoa) - ho an'ny demo dia nametraka ny tokonam-baravarana. hatramin'ny 0.3):

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

    Amin'ny farany dia tiako ny manamarika fa ny hafainganam-pandehan'ny inference dia haingana ary nahafahana nanampy modely 1-2 fanampiny (ho an'ny santionany 7 segondra dia naka 2.5 ho an'ny inference). Tsy nanam-potoana hanampiana modely vaovao intsony izahay ary nifantoka tamin'ny fanoratana prototype an'ny rindranasa an-tranonkala.

    Fampiharana amin'ny Internet

    Hevi-dehibe iray: maka router miaraka aminay avy any an-trano izahay ary manangana tambajotra eo an-toerana, manampy amin'ny fampifandraisana ny fitaovana sy ny solosaina amin'ny tambajotra.

    Ny backend dia fantsona hafatra mifarana amin'ny farany eo anoloana sy Raspberry Pi, mifototra amin'ny teknolojia websocket (http over tcp protocol).

    Ny dingana voalohany dia ny fandraisana vaovao voavoatra avy amin'ny raspberry, izany hoe, ireo mpamantatra voarakitra ao amin'ny json, izay voatahiry ao amin'ny angon-drakitra antsasa-manila amin'ny dian'izy ireo mba hahafahan'ireo antontan'isa momba ny fihetseham-pon'ny mpampiasa mandritra ny vanim-potoana. Ity packet ity dia alefa any amin'ny frontend, izay mampiasa famandrihana ary mandray fonosana avy amin'ny teboka faran'ny websocket. Ny rafitra backend manontolo dia naorina amin'ny fiteny golang; nofidiana izy io satria mety tsara amin'ny asa asynchronous, izay karakarain'ny goroutine tsara.
    Rehefa miditra amin'ny teboka farany ny mpampiasa dia misoratra anarana ary miditra ao amin'ny rafitra, dia voaray ny hafany. Na ny mpampiasa sy ny hafatra dia miditra ao amin'ny habaka iraisana, izay efa nandefasana hafatra bebe kokoa (eo amin'ny faritra misoratra anarana), ary raha manakatona ny fifandraisana (raspberry na front) ny mpampiasa, dia foanana ny famandrihana ary esorina izy. ny hub.

    OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi
    Miandry fifandraisana avy any aoriana izahay

    Front-end dia fampiharana amin'ny tranonkala voasoratra amin'ny JavaScript mampiasa ny tranomboky React mba hanafainganana sy hanatsorana ny fizotran'ny fampandrosoana. Ny tanjon'ity fampiharana ity dia ny mijery ny angon-drakitra azo amin'ny alàlan'ny algorithm mandeha amin'ny lafiny aoriana ary mivantana amin'ny Raspberry Pi. Ny pejy dia manana fampandehanana fizarana ampiasaina amin'ny alàlan'ny react-router, fa ny pejy lehibe mahaliana dia ny pejy lehibe, izay misy ny angon-drakitra mitohy dia raisina amin'ny fotoana tena izy avy amin'ny mpizara mampiasa ny teknolojia WebSocket. Ny Raspberry Pi dia mahita feo iray, mamaritra raha an'ny olona iray manokana avy amin'ny angon-drakitra voasoratra anarana izy io, ary mandefa lisitry ny mety ho an'ny mpanjifa. Ny mpanjifa dia mampiseho ny angon-drakitra farany mifandraika amin'izany, mampiseho ny avatar an'ilay olona azo inoana fa niresaka tamin'ny mikrô, ary koa ny fihetseham-po nanononany ny teny.

    OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi
    Pejy fandraisana misy vinavina nohavaozina

    famaranana

    Tsy azo atao ny mamita ny zava-drehetra araka ny nokasaina, tsy nanam-potoana fotsiny izahay, noho izany ny fanantenana lehibe dia tao amin'ny demo, fa ny zava-drehetra dia handeha. Tao anatin'ny famelabelarana no niresahan'izy ireo ny fomba fiasan'ny zava-drehetra, ny modely nalainy, ny olana sedrain'izy ireo. Manaraka izany ny ampahany amin'ny demo - ny manam-pahaizana dia nandehandeha nanodidina ny efitrano tamin'ny filaharana kisendrasendra ary nanatona ny ekipa tsirairay mba hijery ny prototype miasa. Nametraka fanontaniana taminay koa izy ireo, samy namaly ny anjarany ny tsirairay, nandao ny tranonkala tamin'ny solosaina finday izy ireo, ary tena nandeha araka ny nampoizina ny zava-drehetra.

    Marihiko fa $150 ny totalin'ny vidin'ny vahaolana:

    • Raspberry Pi 3 ~ $35
    • Google AIY Voice Bonnet (afaka maka saram-pitenenana ianao) ~ 15$
    • Intel NCS 2 ~ 100$

    Ahoana no hanatsarana:

    • Ampiasao ny fisoratana anarana avy amin'ny mpanjifa - angataho ny hamaky ny lahatsoratra izay novokarina kisendrasendra
    • Manampia modely vitsivitsy: azonao atao ny mamaritra ny lahy sy ny vavy amin'ny feo
    • Avahana ny feo miray feo (diarisation)

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

    OpenVINO hackathon: mahafantatra ny feo sy ny fihetseham-po amin'ny Raspberry Pi
    Reraka nefa faly izahay

    Fehiny dia misaotra ny mpikarakara sy ny mpandray anjara aho. Amin'ireo tetikasan'ny ekipa hafa, dia tianay manokana ny vahaolana amin'ny fanaraha-maso ny toerana fiantsonan'ny fiara maimaim-poana. Ho anay, traikefa nahafinaritra tokoa tamin'ny fandrobohana amin'ny vokatra sy ny fampandrosoana izany. Manantena aho fa hisy hetsika mahaliana bebe kokoa hatao any amin'ny faritra, anisan'izany ny lohahevitra AI.

Source: www.habr.com

Add a comment