OpenVINO هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه

د نومبر 30 - دسمبر 1 په Nizhny Novgorod کې ترسره شوه OpenVINO هیکاتون. برخه اخیستونکو څخه وغوښتل شول چې د Intel OpenVINO Toolkit په کارولو سره د محصول حل پروټوټایپ رامینځته کړي. تنظیم کونکو د نږدې موضوعاتو لیست وړاندیز کړی چې د دندې غوره کولو پرمهال یې لارښود کیدی شي ، مګر وروستۍ پریکړه د ټیمونو سره پاتې شوه. سربیره پردې، د ماډلونو کارول چې په محصول کې شامل ندي هڅول شوي.

OpenVINO هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه

پدې مقاله کې به موږ تاسو ته ووایو چې څنګه موږ د خپل محصول پروټوټایپ رامینځته کړ، چې په پایله کې یې موږ لومړی ځای نیولی.

په هیکاتون کې له لسو څخه زیاتو ټیمونو برخه اخیستې وه. دا ښه ده چې ځینې یې د نورو سیمو څخه راغلي دي. د هیکاتون ځای د "کریملینسکي آن پوچین" کمپلیکس و ، چیرې چې د نزني نوګورډ لرغوني عکسونه دننه ځړول شوي و ، په یوه ډله کې! (زه تاسو ته یادونه کوم چې دا مهال د انټیل مرکزي دفتر په نزني نووګورډ کې موقعیت لري). ګډونوالو ته د کوډ لیکلو لپاره 10 ساعته وخت ورکړل شو، او په پای کې دوی باید خپل حل وړاندې کړي. یوه جلا ګټه د ډیمو ناستې شتون و ترڅو ډاډ ترلاسه کړي چې هرڅه پلان شوي واقعیا پلي شوي او په پریزنټشن کې نظرونه پاتې ندي. سودا، ناشته، خواړه، هر څه هم هلته وو!

سربیره پردې ، انټیل په اختیاري ډول کیمرې ، راسبیري PI ، نیورل کمپیوټ سټیک 2 چمتو کړي.

د دندې انتخاب

د وړیا فارم هیکاتون لپاره د چمتو کولو ترټولو ستونزمن برخه د ننګونې غوره کول دي. موږ سمدلاسه پریکړه وکړه چې د هغه څه سره راشو چې لاهم په محصول کې نه و ، ځکه چې اعلان وویل چې دا خورا ښه راغلاست وو.

تحلیل کول موډلونه، کوم چې په اوسني خپرونه کې په محصول کې شامل دي، موږ دې پایلې ته ورسیږو چې ډیری یې د کمپیوټر لید ستونزې حل کوي. سربیره پردې ، دا خورا ستونزمن کار دی چې د کمپیوټر لید په برخه کې د یوې ستونزې سره مخ شي چې د OpenVINO په کارولو سره نشي حل کیدی ، او حتی که یو اختراع هم کیدی شي ، په عامه ډومین کې دمخه روزل شوي ماډلونه موندل ګران دي. موږ پریکړه کوو چې بل لوري ته کیندنه وکړو - د وینا پروسس کولو او تحلیلونو په لور. راځئ چې د وینا څخه د احساساتو پیژندلو یوه زړه پورې دنده په پام کې ونیسو. دا باید وویل شي چې OpenVINO لا دمخه یو ماډل لري چې د یو شخص احساسات د دوی د مخ پراساس ټاکي، مګر:

  • په تیوري کې، دا ممکنه ده چې یو ګډ الګوریتم رامینځته کړي چې په دواړو غږ او عکس کې کار وکړي، کوم چې باید دقت زیاتوالی ورکړي.
  • کیمرې معمولا د لید لید زاویه لري؛ د یوې لویې ساحې پوښلو لپاره له یوې څخه ډیرې کیمرې ته اړتیا ده؛ غږ دومره محدودیت نلري.

راځئ چې نظر ته وده ورکړو: راځئ چې د پرچون برخې لپاره نظر د اساس په توګه واخلو. تاسو کولی شئ د پلورنځي چیک آوټ کې د پیرودونکي رضایت اندازه کړئ. که چیرې یو پیرودونکي د خدماتو څخه ناخوښه وي او خپل غږ پورته کړي، تاسو کولی شئ سمدستي د مرستې لپاره مدیر ته زنګ ووهئ.
پدې حالت کې ، موږ اړتیا لرو د انساني غږ پیژندنه اضافه کړو ، دا به موږ ته اجازه درکړو چې د پلورنځي کارمندان له پیرودونکو سره توپیر کړو او د هر فرد لپاره تحلیلونه چمتو کړو. ښه ، سربیره پردې ، دا به ممکن وي چې پخپله د پلورنځي کارمندانو چلند تحلیل کړئ ، په ټیم کې فضا ارزونه وکړئ ، ښه ښکاري!

موږ زموږ د حل لپاره اړتیاوې چمتو کوو:

  • د هدف آله کوچنۍ اندازه
  • په ریښتیني وخت عملیات
  • ټيټ نرخ
  • اسانه اندازه کولو وړتیا

د پایلې په توګه، موږ د هدف وسیلې په توګه Raspberry Pi 3 c غوره کوو Intel NCS 2.

دلته دا مهمه ده چې د NCS یو مهم ځانګړتیا یادونه وکړو - دا د معیاري CNN جوړښتونو سره غوره کار کوي، مګر که تاسو اړتیا لرئ چې په دې کې د دودیز پرتونو سره ماډل چل کړئ، نو د ټیټې کچې اصلاح تمه وکړئ.

د کولو لپاره یوازې یو کوچنی شی دی: تاسو اړتیا لرئ مایکروفون ترلاسه کړئ. یو منظم USB مایکروفون به وکړي، مګر دا به د RPI سره یوځای ښه نه ښکاري. مګر حتی دلته حل په لفظي ډول "نژدې پروت دی." د غږ ثبتولو لپاره، موږ پریکړه کوو چې د کټ څخه د غږ بونیټ بورډ وکاروو د ګوګل AIY غږ کټ، په کوم کې چې یو تار لرونکی سټیریو مایکروفون شتون لري.

راسبیان له دې څخه ډاونلوډ کړئ د AIY پروژو ذخیره او دا فلش ډرایو ته اپلوډ کړئ، ازموینه وکړئ چې مایکروفون د لاندې کمانډ په کارولو سره کار کوي (دا به د 5 ثانیو اوږد آډیو ثبت کړي او په فایل کې به یې خوندي کړي):

arecord -d 5 -r 16000 test.wav

زه باید سمدلاسه یادونه وکړم چې مایکروفون خورا حساس دی او ښه غږ پورته کوي. د دې د حل کولو لپاره ، راځئ چې السیمیکسر ته لاړ شو ، د کیپچر وسیلې غوره کړئ او د ان پټ سیګنال کچه 50-60٪ ته راټیټ کړئ.

OpenVINO هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه
موږ بدن د فایل سره بدلوو او هرڅه سم دي ، تاسو حتی کولی شئ دا د پوښ سره وتړئ

د شاخص تڼۍ اضافه کول

پداسې حال کې چې د AIY غږ کټ جلا کول، موږ په یاد لرو چې د RGB تڼۍ شتون لري، د هغې بیک لایټ د سافټویر لخوا کنټرول کیدی شي. موږ د "ګوګل AIY Led" لټون کوو او اسناد ومومئ: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
ولې دا تڼۍ د پیژندل شوي احساس ښودلو لپاره نه کاروئ، موږ یوازې 7 ټولګي لرو، او تڼۍ 8 رنګونه لري، بس!

موږ تڼۍ د GPIO له لارې د غږ بونیټ سره وصل کوو، اړین کتابتونونه پورته کوو (دوی دمخه د 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 هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه
تڼۍ، سوځول!

د غږ سره کار کول

موږ به د مایکروفون او webrtcvad څخه د جریان نیولو لپاره pyaudio وکاروو ترڅو شور فلټر کړو او غږ کشف کړو. سربیره پردې، موږ به یو کتار جوړ کړو چې موږ به په غیر متناسب ډول د غږ اقتباسونه اضافه او لرې کړو.

څرنګه چې webrtcvad د چمتو شوي ټوټې په اندازې کې محدودیت لري - دا باید د 10/20/30ms سره مساوي وي، او د احساساتو پیژندلو لپاره د ماډل روزنه (لکه څنګه چې موږ به وروسته زده کړو) په 48kHz ډیټاسیټ کې ترسره شوي، موږ به د 48000×20ms/1000×1 (مونو) = 960 بایټس اندازې ټوټې نیول. Webrtcvad به د دې هرې برخې لپاره ریښتیني/غلط بیرته راولي، کوم چې په ټوټه کې د رایې شتون یا نشتوالي سره مطابقت لري.

راځئ چې لاندې منطق پلي کړو:

  • موږ به هغه ټوټې په لیست کې اضافه کړو چیرې چې رایه شتون لري؛ که چیرې رایه نه وي، نو موږ به د خالي ټوټو شمیر زیات کړو.
  • که د خالي ټوټو کاونټر = 30 (600 ms) وي، نو موږ د راټولو شویو ټوټو د لیست اندازه ګورو؛ که دا > 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 = []

دا وخت دی چې په عامه ډومین کې د مخکې روزل شوي ماډلونو په لټه کې شئ، ګیتوب، ګوګل ته لاړ شئ، مګر په یاد ولرئ چې موږ د کارول شوي معمارۍ محدودیت لرو. دا یوه ډیره ستونزمنه برخه ده، ځکه چې تاسو باید په خپل ان پټ ډیټا کې موډلونه و ازموئ، او سربیره پردې، دوی د OpenVINO داخلي بڼه - IR (منځنۍ نمایندګۍ) ته بدل کړئ. موږ د ګیتوب څخه شاوخوا 5-7 مختلف حلونه هڅه وکړه ، او که چیرې د احساساتو پیژندلو ماډل سمدلاسه کار وکړي ، نو د غږ پیژندلو سره موږ باید ډیر انتظار وکړو - دوی ډیر پیچلي جوړښتونه کاروي.

موږ لاندې تمرکز کوو:

  • له غږ څخه احساسات - https://github.com/alexmuhr/Voice_Emotion
    دا د لاندې اصولو سره سم کار کوي: آډیو د یوې ټاکلې اندازې په برخو کې پرې کیږي، د دې هرې برخې لپاره چې موږ یې غوره کوو MFCC او بیا یې CNN ته د ان پټ په توګه وسپاري
  • غږ پیژندنه - https://github.com/linhdvu14/vggvox-speaker-identification
    دلته، د MFCC پرځای، موږ د سپیکٹروگرام سره کار کوو، د FFT وروسته موږ CNN ته سیګنال تغذیه کوو، چیرته چې موږ د غږ ویکتور استازیتوب ترلاسه کوو.

بیا به موږ د ماډلونو بدلولو په اړه وغږیږو، د تیوري سره پیل کوو. OpenVINO ډیری ماډلونه لري:

  • د موډل ژوبڼ پرانیزئ، هغه موډلونه چې ستاسو په محصول کې کارول کیدی شي او شامل شي
  • د موډل آپټیمزر، له دې څخه مننه چې تاسو کولی شئ یو ماډل د مختلفو چوکاټونو فارمیټونو (Tensorflow، ONNX etc) څخه د منځګړیتوب نمایندګۍ بڼه کې بدل کړئ، د کوم سره چې موږ به نور کار وکړو.
  • د انفرنس انجن تاسو ته اجازه درکوي چې موډلونه په IR فارمیټ کې د Intel پروسیسرونو، میریډ چپس او نیورل کمپیوټ سټیک سرعت کونکي پرمخ بوځي.
  • د OpenCV خورا مؤثره نسخه (د انفرنس انجن ملاتړ سره)
    هر ماډل په IR بڼه کې د دوو فایلونو لخوا تشریح شوي: .xml او .bin.
    ماډلونه په لاندې ډول د ماډل اصلاح کونکي له لارې 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 کې شتون لري، مګر موږ دومره لرې نه و ایستل او په ساده ډول یې د یو ماډل لپاره ټاکلی.
    بیا ، راځئ هڅه وکړو چې دمخه بدل شوي ماډل په IR فارمیټ کې د DNN ماډل له لارې OpenCV ته پورته کړو او دې ته یې واستوو.

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

    پدې قضیه کې وروستۍ کرښه تاسو ته اجازه درکوي حسابونه د نیورل کمپیوټ سټیک ته واړوئ ، لومړني محاسبې په پروسیسر کې ترسره کیږي ، مګر د راسبیري پای په حالت کې دا به کار ونکړي ، تاسو به یو سټیک ته اړتیا ولرئ.

    بیا، منطق په لاندې ډول دی: موږ خپل آډیو د یوې ټاکلې اندازې وینډوز ته ویشو (زموږ لپاره دا 0.4 s دی)، موږ د دې هرې کړکۍ په 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 وخت نیولی). موږ نور وخت نه درلود چې نوي ماډلونه اضافه کړو او د ویب غوښتنلیک پروټوټایپ لیکلو باندې تمرکز وکړو.

    د ویب غوښتنلیک

    یو مهم ټکی: موږ له کور څخه یو روټر اخلو او خپل محلي شبکه جوړه کړو، دا د شبکې له لارې د وسیلې او لپټاپونو سره نښلولو کې مرسته کوي.

    شاته د مخ او Raspberry Pi تر منځ د پای څخه تر پایه پیغام چینل دی، د ویب ساکټ ټیکنالوژۍ پراساس (http اوور tcp پروتوکول).

    لومړی مرحله د راسبیري څخه پروسس شوي معلومات ترلاسه کول دي ، دا په json کې بسته شوي وړاندوینې دي ، کوم چې د دوی د سفر په نیمایي کې ډیټابیس کې خوندي شوي ترڅو د مودې لپاره د کارونکي احساساتي شالید په اړه احصایې رامینځته شي. دا پاکټ بیا فرنټ اینډ ته لیږل کیږي، کوم چې ګډون کاروي او د ویب ساکټ پای ټکی څخه پاکټونه ترلاسه کوي. د پس منظر ټول میکانیزم په ګولنګ ژبه کې جوړ شوی؛ دا غوره شوی ځکه چې دا د غیر متناسب کارونو لپاره مناسب دی، کوم چې ګوروټینونه په ښه توګه اداره کوي.
    کله چې پای ټکي ته لاسرسی ومومي ، کارونکی ثبت شوی او جوړښت ته ننوځي ، بیا د هغه پیغام ترلاسه کیږي. کارونکي او پیغام دواړه یو ګډ مرکز ته داخل شوي ، له کوم ځای څخه چې پیغامونه لا دمخه لیږل شوي (د ګډون کونکي مخ ته) ، او که چیرې کارونکي اړیکه بنده کړي (راسبیري یا مخکی) ، نو د هغه ګډون لغوه کیږي او هغه له مینځه وړل کیږي. مرکز

    OpenVINO هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه
    موږ د شا څخه د پیوستون په تمه یو

    Front-end یو ویب اپلیکیشن دی چې په جاواسکریپټ کې لیکل شوی د عکس العمل کتابتون په کارولو سره د پراختیا پروسې ګړندي او ساده کوي. د دې غوښتنلیک هدف د الګوریتمونو په کارولو سره ترلاسه شوي ډیټا لیدل دي چې په شا او خوا کې روان دي او مستقیم په راسبیري پای کې. پاڼه د react-router په کارولو سره پلي شوي برخې برخې لري، مګر د ګټو اصلي پاڼه اصلي پاڼه ده، چیرې چې د ویب ساکټ ټیکنالوژۍ په کارولو سره د سرور څخه په ریښتینې وخت کې د معلوماتو دوامداره جریان ترلاسه کیږي. Raspberry Pi یو غږ کشف کوي، معلومه کوي چې ایا دا د راجستر شوي ډیټابیس څخه د یو ځانګړي کس پورې اړه لري، او پیرودونکي ته د احتمال لیست لیږي. پیرودونکي وروستي اړونده معلومات ښیې ، د هغه چا اوتار ښیې چې ډیری احتمال یې په مایکروفون کې خبرې کړې ، او همدارنګه هغه احساس چې ورسره یې ټکي تلفظ کوي.

    OpenVINO هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه
    کور پاڼه د تازه وړاندوینو سره

    پایلې

    دا ممکنه نه وه چې هرڅه لکه څنګه چې پلان شوي بشپړ کړي، موږ په ساده ډول وخت نه درلود، نو اصلي هیله په ډیمو کې وه، چې هرڅه به کار وکړي. په پریزنټشن کې دوی د دې په اړه خبرې وکړې چې هر څه څنګه کار کوي، کوم ماډلونه یې اخیستي، کومې ستونزې ورسره مخ دي. بل د ډیمو برخه وه - کارپوهان په تصادفي ترتیب کې د خونې شاوخوا ګرځي او هر ټیم ته نږدې شوي ترڅو کاري پروټوټایپ وګوري. دوی له موږ څخه پوښتنې هم وکړې، هرچا خپله برخه ځواب کړه، دوی ویب پاڼه په لپ ټاپ کې پریښوده، او هرڅه په حقیقت کې د توقع سره سم کار کوي.

    اجازه راکړئ یادونه وکړم چې زموږ د حل ټول لګښت $ 150 و:

    • Raspberry Pi 3 ~ $ 35
    • د ګوګل AIY غږ بونیټ (تاسو کولی شئ د ریسیکر فیس واخلئ) ~ 15 $
    • Intel NCS 2 ~ 100 $

    څنګه ښه کول:

    • د پیرودونکي څخه راجسټریشن وکاروئ - د متن لوستلو غوښتنه وکړئ چې په تصادفي ډول رامینځته شوی
    • یو څو نور ماډلونه اضافه کړئ: تاسو کولی شئ د غږ له لارې جنسیت او عمر وټاکئ
    • په ورته وخت کې د غږونو جلا کول (ډیری کول)

    ذخیره: https://github.com/vladimirwest/OpenEMO

    OpenVINO هیکاتون: په راسبیري پای کې د غږ او احساساتو پیژندنه
    ستړي خو خوشحاله یو

    په پای کې، زه غواړم د تنظیم کونکو او برخه اخیستونکو څخه مننه وکړم. د نورو ټیمونو پروژو په مینځ کې، موږ په شخصي توګه د وړیا پارکینګ ځایونو نظارت لپاره حل خوښ کړ. زموږ لپاره ، دا په محصول او پراختیا کې د ډوبیدو خورا ښه تجربه وه. زه امید لرم چې د AI موضوعاتو په شمول په سیمو کې به ډیرې په زړه پورې پیښې ترسره شي.

سرچینه: www.habr.com

Add a comment