OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних

30-р сарын 1 - XNUMX-р сарын XNUMX-нд Нижний Новгород хотод болсон OpenVINO хакатон. Оролцогчдоос Intel OpenVINO хэрэглүүрийг ашиглан бүтээгдэхүүний шийдлийн прототипийг бүтээхийг хүссэн. Зохион байгуулагчид даалгавраа сонгохдоо удирдан чиглүүлж болох ойролцоо сэдвүүдийн жагсаалтыг санал болгосон боловч эцсийн шийдвэр нь багуудад үлдсэн. Үүнээс гадна бүтээгдэхүүнд ороогүй загваруудыг ашиглахыг дэмжсэн.

OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних

Энэ нийтлэлд бид бүтээгдэхүүнийхээ прототипийг хэрхэн бүтээж, улмаар эхний байрыг эзэлсэн тухай танд хэлэх болно.

Хакатон тэмцээнд 10 гаруй баг оролцлоо. Зарим нь өөр бүс нутгаас ирсэн нь сайхан байна. Хакатон болох газар нь Нижний Новгородын эртний гэрэл зургуудыг дотор нь өлгөж байсан "Почайн дахь Кремль" цогцолбор байв! (Одоогийн байдлаар Intel-ийн төв оффис Нижний Новгород хотод байрладаг гэдгийг би танд сануулж байна). Оролцогчдод код бичих 26 цаг өгсөн бөгөөд эцэст нь тэд шийдлээ танилцуулах ёстой байв. Төлөвлөсөн бүх зүйл бодитоор хэрэгжиж, танилцуулгад санаа үлдэхгүй байхын тулд демо сесс байсан нь тусдаа давуу тал байв. Бараа, зууш, хоол, бүх зүйл тэнд байсан!

Нэмж дурдахад Intel нь Raspberry PI, Neural Compute Stick 2 гэх камеруудыг нэмэлтээр хангасан.

Даалгаврын сонголт

Чөлөөт хэлбэрийн хакатон тэмцээнд бэлтгэх хамгийн хэцүү хэсгүүдийн нэг бол сорилтыг сонгох явдал юм. Зарлалд энэ нь маш таатай байна гэж хэлсэн тул бид тэр даруй бүтээгдэхүүнд хараахан ороогүй зүйлийг гаргахаар шийдсэн.

Шинжилгээ хийсний дараа загварууд, одоогийн хувилбарт бүтээгдэхүүнд багтсан бөгөөд тэдгээрийн ихэнх нь компьютерийн харааны янз бүрийн асуудлыг шийддэг гэсэн дүгнэлтэд хүрсэн. Түүгээр ч барахгүй компьютерийн харааны талбарт OpenVINO-г ашиглан шийдэх боломжгүй асуудлыг гаргаж ирэх нь маш хэцүү бөгөөд зохион бүтээсэн ч гэсэн олон нийтийн эзэмшилд урьдчилан бэлтгэгдсэн загваруудыг олоход хэцүү байдаг. Бид өөр чиглэлд - яриа боловсруулах, аналитик руу чиглүүлэхээр шийдсэн. Ярианаас сэтгэл хөдлөлийг таних сонирхолтой даалгаврыг авч үзье. OpenVINO аль хэдийн хүний ​​царайнд тулгуурлан сэтгэл хөдлөлийг тодорхойлдог загвартай гэж хэлэх ёстой, гэхдээ:

  • Онолын хувьд дуу, дүрс дээр ажиллах хосолсон алгоритмыг бий болгох боломжтой бөгөөд энэ нь нарийвчлалыг нэмэгдүүлэх ёстой.
  • Камерууд нь ихэвчлэн нарийн харах өнцөгтэй байдаг; том талбайг хамрахын тулд нэгээс олон камер шаардлагатай, дуу чимээнд ийм хязгаарлалт байдаггүй.

Санаагаа хөгжүүлцгээе: жижиглэн худалдааны сегментийн санааг үндэс болгон авч үзье. Та дэлгүүрийн кассаар үйлчлүүлэгчийн сэтгэл ханамжийг хэмжих боломжтой. Хэрэв үйлчлүүлэгчдийн аль нэг нь үйлчилгээнд сэтгэл дундуур байгаа бөгөөд дуугаа дээшлүүлж эхэлбэл та тэр даруй админ руу залгаж тусламж авах боломжтой.
Энэ тохиолдолд бид хүний ​​дуу хоолой таних системийг нэмэх шаардлагатай бөгөөд энэ нь дэлгүүрийн ажилчдыг үйлчлүүлэгчдээс ялгах, хувь хүн бүрт дүн шинжилгээ хийх боломжийг олгоно. Нэмж дурдахад дэлгүүрийн ажилчдын зан төлөвт дүн шинжилгээ хийх, багийн уур амьсгалыг үнэлэх боломжтой, сайхан сонсогдож байна!

Бид шийдэлд тавигдах шаардлагыг томъёолдог:

  • Зорилтот төхөөрөмжийн жижиг хэмжээ
  • Бодит цагийн ажиллагаа
  • Бага үнэтэй
  • Хялбар өргөтгөх боломжтой

Үүний үр дүнд бид Raspberry Pi 3 c-г зорилтот төхөөрөмж болгон сонгосон Intel NCS 2.

Энд NCS-ийн нэг чухал онцлогийг тэмдэглэх нь зүйтэй - энэ нь стандарт CNN архитектуртай хамгийн сайн ажилладаг, гэхдээ хэрэв та тусгай давхарга бүхий загвар ажиллуулах шаардлагатай бол доод түвшний оновчлолыг хүлээх хэрэгтэй.

Зөвхөн нэг жижиг зүйл хийх хэрэгтэй: та микрофон авах хэрэгтэй. Ердийн USB микрофон ажиллах болно, гэхдээ RPI-тэй хамт сайн харагдахгүй. Гэхдээ энд ч гэсэн шийдэл нь шууд утгаараа "ойролцоох" юм. Дуу бичлэг хийхийн тулд бид иж бүрдэлээс Voice Bonnet хавтанг ашиглахаар шийдсэн Google AIY дуу хоолойны хэрэгсэл, дээр нь утастай стерео микрофон байдаг.

Raspbian-г татаж аваарай AIY төслүүдийн агуулах флаш диск рүүгээ байршуулж, микрофон ажиллаж байгаа эсэхийг дараах командыг ашиглан шалгана уу (энэ нь 5 секундын турш аудио бичиж, файлд хадгална):

arecord -d 5 -r 16000 test.wav

Микрофон нь маш мэдрэмтгий бөгөөд дуу чимээг сайн авдаг гэдгийг би нэн даруй тэмдэглэх хэрэгтэй. Үүнийг засахын тулд alsamixer руу орж Capture devices сонгоод оролтын дохионы түвшинг 50-60% хүртэл бууруулъя.

OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних
Бид биеийг файлаар өөрчилдөг бөгөөд бүх зүйл тохирсон, та үүнийг таглаад ч хааж болно

Заагч товчлуур нэмж байна

AIY Voice Kit-ийг салгахдаа RGB товчлуур байгаа бөгөөд арын гэрлийг програм хангамжаар удирдаж болно гэдгийг бид санаж байна. Бид "Google AIY Led"-ийг хайж, баримт бичгийг олно: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Хүлээн зөвшөөрөгдсөн сэтгэл хөдлөлийг харуулахын тулд яагаад энэ товчлуурыг ашиглаж болохгүй гэж, бид ердөө 7 ангитай, товчлуур нь 8 өнгөтэй, хангалттай!

Бид товчлуурыг GPIO-ээр дамжуулан Voice Bonnet-тэй холбож, шаардлагатай сангуудыг ачаална (тэдгээрийг AIY төслүүдийн түгээлтийн хэрэгсэлд аль хэдийн суулгасан)

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

Сэтгэл хөдлөл бүр нь RGB Tuple болон aiy.leds.Leds ангиллын объект хэлбэрээр харгалзах өнгөтэй байх дикт бүтээцгээе.

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

Эцэст нь хэлэхэд, сэтгэл хөдлөлийн шинэ таамаглал бүрийн дараа бид товчлуурын өнгийг түүнд нийцүүлэн (түлхүүрээр) шинэчлэх болно.

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

OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних
Товчлуур, шатаа!

Дуу хоолойгоор ажиллах

Бид микрофоноос урсгалыг авахын тулд pyaudio, дуу чимээг шүүж, дууг илрүүлэхийн тулд webrtcvad ашиглах болно. Нэмж дурдахад бид дуут хэсгүүдийг асинхроноор нэмж, хасах дараалал үүсгэх болно.

Webrtcvad нь нийлүүлсэн фрагментийн хэмжээнд хязгаарлалттай байдаг тул энэ нь 10/20/30 мс-тэй тэнцүү байх ёстой бөгөөд сэтгэл хөдлөлийг таних загварыг (бид дараа нь сурах болно) 48 кГц өгөгдлийн багц дээр хийсэн. 48000×20ms/1000×1(моно)=960 байт хэмжээтэй хэсгүүдийг авах. Webrtcvad нь эдгээр хэсгүүдийн хувьд Үнэн/Худал гэж буцаана, энэ нь тухайн хэсэг дэх санал байгаа эсэхтэй тохирч байна.

Дараах логикийг хэрэгжүүлье.

  • Бид санал өгсөн хэсгүүдийг жагсаалтад нэмж, хэрэв санал өгөхгүй бол хоосон хэсгүүдийн тоологчийг нэмнэ.
  • Хэрэв хоосон хэсгүүдийн тоолуур >=30 (600 мс) байвал бид хуримтлагдсан хэсгүүдийн жагсаалтын хэмжээг харна, хэрэв >250 бол дараалалд нэмнэ, үгүй ​​бол бид уртыг тооцно. Бичлэгийн хэмжээ нь чанга яригчийг тодорхойлохын тулд загварт оруулахад хангалтгүй юм.
  • Хэрэв хоосон хэсгүүдийн тоологч <30 хэвээр байгаа бөгөөд хуримтлагдсан хэсгүүдийн жагсаалтын хэмжээ 300-аас хэтэрсэн бол бид илүү нарийвчлалтай таамаглахын тулд фрагментийг дараалалд нэмнэ. (сэтгэл хөдлөл цаг хугацааны явцад өөрчлөгддөг учраас)

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

Олон нийтийн домэйнд урьдчилан бэлтгэгдсэн загваруудыг хайж олох, Google-ийн github руу орох цаг нь болсон, гэхдээ бид ашигласан архитектурт хязгаарлалттай гэдгийг санаарай. Энэ нь нэлээд хэцүү хэсэг юм, учир нь та загваруудаа оруулсан өгөгдөл дээрээ туршиж үзэх хэрэгтэй бөгөөд үүнээс гадна тэдгээрийг OpenVINO-ийн дотоод формат - IR (завсрын төлөөлөл) болгон хөрвүүлэх хэрэгтэй. Бид github-аас 5-7 өөр шийдлүүдийг туршиж үзсэн бөгөөд хэрэв сэтгэл хөдлөлийг таних загвар нь тэр даруй ажилласан бол дуу хоолойг танихын тулд бид илүү удаан хүлээх хэрэгтэй болсон - тэд илүү төвөгтэй архитектурыг ашигладаг.

Бид дараахь зүйлд анхаарлаа хандуулж байна.

  • Дуу хоолойны сэтгэл хөдлөл - https://github.com/alexmuhr/Voice_Emotion
    Энэ нь дараахь зарчмын дагуу ажилладаг: аудио нь тодорхой хэмжээтэй хэсгүүдэд хуваагддаг бөгөөд эдгээр хэсгүүдийн хувьд бид сонгосон MFCC дараа нь CNN-д оруулга болгон илгээнэ үү
  • Дуу таних - https://github.com/linhdvu14/vggvox-speaker-identification
    Энд MFCC-ийн оронд бид спектрограммтай ажилладаг бөгөөд FFT-ийн дараа бид CNN-д дохио өгдөг бөгөөд гаралт дээр бид дуу хоолойны вектор дүрслэлийг авдаг.

Дараа нь бид онолоос эхлээд загваруудыг хөрвүүлэх талаар ярих болно. OpenVINO нь хэд хэдэн модулийг агуулдаг:

  • Загвар амьтны хүрээлэнг нээгээрэй, тэдгээрийн загваруудыг ашиглаж, бүтээгдэхүүндээ оруулж болно
  • Model Optimzer, үүний ачаар та загварыг янз бүрийн хүрээний форматаас (Tensorflow, ONNX гэх мэт) завсрын төлөөллийн формат руу хөрвүүлэх боломжтой бөгөөд бид цаашид ажиллах болно.
  • Inference Engine нь Intel процессор, Myriad чип, Neural Compute Stick хурдасгуур дээр загваруудыг IR форматаар ажиллуулах боломжийг танд олгоно.
  • OpenCV-ийн хамгийн үр дүнтэй хувилбар (Inference Engine дэмжлэгтэй)
    IR форматтай загвар бүрийг .xml болон .bin гэсэн хоёр файлаар дүрсэлсэн.
    Загваруудыг Model Optimizer ашиглан дараах байдлаар IR формат руу хөрвүүлдэг.

    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 загвар нь ажиллах өгөгдлийн форматыг сонгох боломжийг танд олгоно. FP32, FP16, INT8 дэмждэг. Хамгийн оновчтой өгөгдлийн төрлийг сонгох нь гүйцэтгэлийн сайн өсөлтийг өгч чадна.
    --input_shape оролтын өгөгдлийн хэмжээсийг заана. Үүнийг динамикаар өөрчлөх чадвар нь C++ API-д байгаа мэт боловч бид тийм ч хол ухаагүй бөгөөд зүгээр л нэг загварт зориулж зассан.
    Дараа нь аль хэдийн хөрвүүлсэн загварыг DNN модулиар дамжуулан IR форматаар OpenCV руу ачаалж, түүн рүү дамжуулахыг оролдъё.

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

    Энэ тохиолдолд сүүлчийн мөр нь тооцооллыг Neural Compute Stick руу шилжүүлэх боломжийг олгодог, үндсэн тооцооллыг процессор дээр хийдэг, гэхдээ Raspberry Pi-ийн хувьд энэ нь ажиллахгүй, танд саваа хэрэгтэй болно.

    Дараа нь логик нь дараах байдалтай байна: бид аудиогоо тодорхой хэмжээтэй цонхонд хуваадаг (бидний хувьд энэ нь 0.4 секунд), эдгээр цонх бүрийг MFCC болгон хувиргаж, дараа нь сүлжээнд оруулдаг.

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

    Дараа нь бүх цонхны хамгийн түгээмэл ангиллыг авч үзье. Энгийн шийдэл, гэхдээ та хакатоны хувьд хэтэрхий бүдүүлэг зүйл хийх шаардлагагүй, зөвхөн завтай л бол. Бидэнд хийх ажил их байгаа тул цаашаа явцгаая - бид дуу хоолой таних асуудлыг шийдэх болно. Урьдчилан бичигдсэн дуу хоолойны спектрограммыг хадгалах ямар нэгэн мэдээллийн санг бий болгох шаардлагатай байна. Хугацаа бага байгаа тул бид чадах чинээгээрээ энэ асуудлыг шийдэх болно.

    Тухайлбал, бид дуут бичлэгийг бичих скрипт үүсгэдэг (энэ нь дээр дурдсантай ижил аргаар ажилладаг, зөвхөн гарнаас тасалдсан тохиолдолд дууг файлд хадгалах болно).

    Оролдоод үзье:

    python3 voice_db/record_voice.py test.wav

    Бид хэд хэдэн хүний ​​дуу хоолойг бичдэг (манай тохиолдолд багийн гурван гишүүн)
    Дараа нь, бичигдсэн дуу хоолой бүрийн хувьд бид хурдан фурьер хувиргалтыг хийж, спектрограммыг авч, үүнийг numpy массив (.npy) болгон хадгална:

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

    Дэлгэрэнгүй мэдээллийг файлаас авна уу create_base.py
    Үүний үр дүнд бид үндсэн скриптийг ажиллуулахдаа хамгийн эхэнд эдгээр спектрограммуудын суулгацыг авах болно.

    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)

    Дуу чимээтэй сегментээс оруулгыг хүлээн авсны дараа бид мэдээллийн сан дахь бүх дуу хоолой хүртэлх косинусын зайг (бага байх тусмаа их магадлалтай) авах замаар хэнд хамаарахыг тодорхойлох боломжтой болно - үзүүлэнгийн хувьд бид босгыг тогтоодог. 0.3 хүртэл):

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

    Эцэст нь хэлэхэд, дүгнэлт гаргах хурд нь хурдан байсан бөгөөд 1-2 загвар нэмэх боломжтой болсон гэдгийг тэмдэглэхийг хүсч байна (түүврийн хувьд 7 секундын турш дүгнэлт хийхэд 2.5 зарцуулсан). Бидэнд шинэ загвар нэмэх цаг зав гарахаа больж, вэб програмын эх загварыг бичихэд анхаарлаа хандуулсан.

    Вэб програм

    Чухал зүйл: бид гэрээсээ чиглүүлэгч авч, дотоод сүлжээгээ тохируулдаг бөгөөд энэ нь төхөөрөмж болон зөөврийн компьютерийг сүлжээгээр холбоход тусалдаг.

    Backend нь websocket технологи (http over tcp протокол) дээр суурилсан урд болон Raspberry Pi хоёрын хоорондох төгсгөл хоорондын мессежийн суваг юм.

    Эхний үе шат бол бөөрөлзгөнөөөс боловсруулсан мэдээллийг хүлээн авах, өөрөөр хэлбэл json-д багцлагдсан урьдчилан таамаглагч, аяллынхаа хагаст мэдээллийн санд хадгалагдаж, тухайн үеийн хэрэглэгчийн сэтгэл хөдлөлийн талаарх статистикийг гаргах боломжтой. Дараа нь энэ пакетыг захиалгыг ашигладаг, вэбсокетийн төгсгөлийн цэгээс пакетуудыг хүлээн авдаг фронт руу илгээдэг. Backend механизмыг бүхэлд нь голанг хэл дээр бүтээгдсэн бөгөөд энэ нь горотинууд сайн зохицуулдаг асинхрон даалгавруудад тохиромжтой тул сонгосон.
    Төгсгөлийн цэг рүү нэвтрэх үед хэрэглэгч бүртгүүлж, бүтцэд нэвтэрч, дараа нь түүний мессежийг хүлээн авна. Хэрэглэгч болон мессеж хоёулаа нийтлэг төв рүү ордог бөгөөд үүнээс мессежүүд аль хэдийн илгээгддэг (захиалагдсан урд тал руу), хэрэв хэрэглэгч холболтоо (бөөрөлзгөнө эсвэл урд) хаавал түүний бүртгэл цуцлагдаж, тэр бүртгэлээс хасагдана. төв.

    OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних
    Бид араас холболт хүлээж байна

    Front-end нь хөгжүүлэлтийн процессыг хурдасгаж, хялбаршуулах зорилгоор React номын санг ашиглан JavaScript дээр бичигдсэн вэб програм юм. Энэхүү програмын зорилго нь арын хэсэг болон Raspberry Pi дээр шууд ажиллаж буй алгоритмуудыг ашиглан олж авсан өгөгдлийг дүрслэн харуулах явдал юм. Энэ хуудас нь react-router ашиглан хийгдсэн хэсэгчилсэн чиглүүлэлттэй боловч сонирхол татахуйц гол хуудас нь WebSocket технологийг ашиглан серверээс бодит цаг хугацаанд тасралтгүй мэдээллийн урсгалыг хүлээн авдаг үндсэн хуудас юм. Raspberry Pi нь дуу хоолойг илрүүлж, бүртгэгдсэн мэдээллийн сангаас тухайн хүнийх мөн эсэхийг тодорхойлж, магадлалын жагсаалтыг үйлчлүүлэгч рүү илгээдэг. Үйлчлүүлэгч нь хамгийн сүүлийн үеийн холбогдох өгөгдлийг харуулж, микрофон руу ярьж байсан хүний ​​аватар, мөн түүний үгсийг хэлж буй сэтгэл хөдлөлийг харуулдаг.

    OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних
    Шинэчлэгдсэн таамаглал бүхий нүүр хуудас

    дүгнэлт

    Бүх зүйлийг төлөвлөсний дагуу дуусгах боломжгүй байсан, бидэнд зүгээр л цаг байхгүй байсан тул бүх зүйл ажиллах болно гэсэн үндсэн найдвар нь демо дээр байсан. Танилцуулгад тэд бүх зүйл хэрхэн ажилладаг, ямар загвар авсан, ямар асуудал тулгарсан талаар ярилцав. Дараа нь үзүүлэнгийн хэсэг байсан - мэргэжилтнүүд өрөөг санамсаргүй дарааллаар тойрон алхаж, ажиллаж буй загвараа харахаар баг бүрд хандав. Тэд биднээс бас асуулт асууж, хүн бүр өөрт тохирсон хариултыг өгч, зөөврийн компьютер дээрээ вэбээ орхиж, бүх зүйл үнэхээр санаснаар болсон.

    Бидний шийдлийн нийт зардал 150 доллар байсныг тэмдэглэе.

    • Raspberry Pi 3 ~ 35 доллар
    • Google AIY Voice Bonnet (та илтгэгчийн хураамж авч болно) ~ 15$
    • Intel NCS 2 ~ 100$

    Хэрхэн сайжруулах вэ:

    • Үйлчлүүлэгчийн бүртгэлийг ашиглах - санамсаргүй байдлаар үүсгэсэн текстийг уншихыг хүс
    • Өөр хэдэн загвар нэмээрэй: та хүйс, насыг дуу хоолойгоор тодорхойлж болно
    • Нэгэн зэрэг сонсогдох дуу хоолойг салгах (тэмдэглэл)

    Хадгалах газар: https://github.com/vladimirwest/OpenEMO

    OpenVINO хакатон: Raspberry Pi дээр дуу хоолой, сэтгэл хөдлөлийг таних
    Бид ядарсан ч баяртай байна

    Төгсгөлд нь зохион байгуулагчид болон оролцогчиддоо баярлалаа гэж хэлмээр байна. Бусад багуудын төслүүдийн дотроос үнэ төлбөргүй зогсоолыг хянах шийдэл нь бидэнд таалагдсан. Бидний хувьд энэ нь бүтээгдэхүүн, хөгжилд шимтэх гайхалтай сайхан туршлага байсан. Бүс нутгуудад, тэр дундаа хиймэл оюун ухааны сэдвүүдээр илүү олон сонирхолтой арга хэмжээ зохион байгуулна гэж найдаж байна.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх