په راسبیري پای کې د کلاوډ اعتراض کشف کونکي ویډیو

پرولوګ

یوه ویډیو اوس په انټرنیټ کې خپریږي ښیې چې څنګه د ټیسلا آٹو پیلوټ سړک ګوري.

زه د اوږدې مودې لپاره خارښ کوم چې د کشف کونکي سره بډایه شوي ویډیو نشر کړم ، او په ریښتیني وخت کې.

په راسبیري پای کې د کلاوډ اعتراض کشف کونکي ویډیو

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

د انټیل عصبي کمپیوټر سټیک

ما مختلف حلونه په پام کې ونیول.

В وروستنی مقاله د Intel Neural Computer Stick سره تجربه وکړه. هارډویر پیاوړی دی، مګر د خپل شبکې بڼه ته اړتیا لري.

که څه هم Intel د لوی چوکاټونو لپاره کنورټرونه چمتو کوي، یو شمیر نیمګړتیاوې شتون لري.

د بیلګې په توګه، د اړتیا وړ شبکې بڼه ممکن نامناسب وي، او که دا مطابقت ولري، نو ځینې پرتونه کیدای شي په وسیله کې ملاتړ ونه کړي، او که دوی ملاتړ شوي وي، نو بیا د تبادلې پروسې په جریان کې غلطی واقع کیدی شي، چې په پایله کې. موږ په محصول کې ځینې عجیب شیان ترلاسه کوو.

په عموم کې، که تاسو یو ډول خپل سري عصبي شبکه غواړئ، نو دا ممکن د NCS سره کار ونکړي. له همدې امله ما پریکړه وکړه چې د خورا پراخه او لاسرسي وسیلو په کارولو سره د ستونزې حل کولو هڅه وکړم.

وريځ

د محلي هارډویر حل لپاره ښکاره بدیل بادل ته ځي.

چمتو شوي انتخابونه - زما سترګې ځنګل چلوي.

ټول مشران:

... او په لسګونو لږ پیژندل شوي.

د دې ډولونو څخه غوره کول خورا اسانه ندي.

او ما پریکړه وکړه چې غوره نه کړم ، مګر په ډاکر کې په OpenCV کې ښه زوړ کاري سکیم وتړئ او په بادل کې یې پرمخ وړئ.

د دې تګلارې ګټه انعطاف او کنټرول دی - تاسو کولی شئ عصبي شبکه ، کوربه توب ، سرور - په عموم کې ، هرډول بدل کړئ.

سیریل

راځئ چې د محلي پروټوټایپ سره پیل وکړو.

په دودیز ډول زه د REST API، OpenCV او MobileSSD شبکې لپاره فلاسک کاروم.

په ډاکر کې د اوسني نسخو نصبولو سره، ما وموندله چې OpenCV 4.1.2 د ګرځنده SSD v1_coco_2018_01_28 سره کار نه کوي، او زه باید بیرته ثابت شوي 11/06_2017 ته لاړ شم.

د خدمت په پیل کې، موږ د ټولګي نومونه او شبکه پورته کوو:

def init():
    tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
    return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)

په محلي ډاکر کې (په ډیر ځوان لیپ ټاپ کې) دا 0.3 ثانیې وخت نیسي ، په راسبیري - 3.5 کې.

راځئ چې محاسبه پیل کړو:

def inference(img):
    net.setInput(cv.dnn.blobFromImage(img, 1.0/127.5, (300, 300), (127.5, 127.5, 127.5), swapRB=True, crop=False))
    return net.forward()

ډاکر - 0.2 ثانیه، راسبیري - 1.7.

د لوستلو وړ json ته د ټینسر اخراج بدلول:

def build_detection(data, thr, rows, cols):
    ret = []
    for detection in data[0,0,:,:]:
        score = float(detection[2])
        if score > thr:
            cls = int(detection[1])
            a = {"class" : cls, "name" : tf_labels.getLabel(cls),  "score" : score}
            a["x"] = int(detection[3] * cols)
            a["y"] = int(detection[4] * rows)
            a["w"] = int(detection[5] * cols ) - a["x"]
            a["h"] = int(detection[6] * rows) - a["y"]
            ret.append(a)
    return ret

نور دا عملیات د فلاسک له لارې صادر کړئ(ان پټ یو انځور دی، محصول په json کې د کشف کونکي پایلې دي).

یو بدیل اختیار، په کوم کې چې ډیر کار سرور ته لیږدول کیږي: دا پخپله موندل شوي توکي حلقوي او بشپړ شوی عکس بیرته راولي.

دا اختیار ښه دی چیرې چې موږ نه غواړو Opencv سرور ته کش کړو.

ډاکر

موږ عکس راټولوو.

کوډ کنډ شوی او پوسټ شوی ګیتوب، ډاکر به دا مستقیم له هغه ځایه واخلي.

د یو پلیټ فارم په توګه، موږ به د راسبیري په څیر ورته ډیبیان سټریچ واخلو - موږ به د ثابت ټیک سټیک څخه انحراف ونه کړو.

تاسو اړتیا لرئ فلاسک، پروټوبف، غوښتنې، opencv_python نصب کړئ، د موبایل SSD ډاونلوډ کړئ، د ګیتوب څخه د سرور کوډ او سرور پیل کړئ.

FROM python:3.7-stretch

RUN pip3 install flask
RUN pip3 install protobuf
RUN pip3 install requests
RUN pip3 install opencv_python

ADD http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz /
RUN tar -xvf /ssd_mobilenet_v1_coco_11_06_2017.tar.gz

ADD https://github.com/tprlab/docker-detect/archive/master.zip /
RUN unzip /master.zip

EXPOSE 80

CMD ["python3", "/docker-detect-master/detect-app/app.py"]

ساده د کشف کونکي پیرودونکي د غوښتنو پر بنسټ.

ډاکر هب ته خپرول

د ډاکر راجسترونه په سرعت سره ضرب کوي د کلاوډ کشف کونکو څخه لږ نه.

د دې لپاره چې زیان ونه رسوو، موږ به په محافظه کار ډول تیر شو DockerHub.

  1. راجستر
  2. د ننه کیدل:
    ډاکر ننوتل
  3. راځئ چې یو معنی لرونکی نوم راوړو:
    د ډاکر ټګ opencv-detect tprlab/opencv-detect-ssd
  4. انځور سرور ته پورته کړئ:
    docker push tprlab/opencv-detect-ssd

موږ په بادل کې پیل کوو

د کانټینر چلولو لپاره انتخاب هم خورا پراخه دی.

ټول لوی لوبغاړي (ګوګل، مایکروسافټ، ایمیزون) د لومړي کال لپاره وړیا مایکرو مثال وړاندې کوي.
د مایکروسافټ ازور او ګوګل کلاوډ سره تجربه کولو وروسته ، زه په وروستي کې میشته شوم ځکه چې دا ګړندی پیل شو.

ما دلته لارښوونې ندي لیکلي، ځکه چې دا برخه د ټاکل شوي چمتو کونکي لپاره خورا ځانګړې ده.

ما د هارډویر مختلف انتخابونه هڅه وکړه،
ټیټې کچې (شریک شوي او وقف شوي) - 0.4 - 0.5 ثانیې.
ډیر پیاوړي موټرې - 0.25 - 0.3.
ښه، حتی په بدترین حالت کې، ګټونکي درې ځله دي، تاسو کولی شئ هڅه وکړئ.

Видео

موږ په راسبیري کې یو ساده OpenCV ویډیو سټیمر لانچ کوو ، د ګوګل کلاوډ له لارې کشف کول.
د تجربې لپاره، یو ویډیو فایل کارول شوی و چې یو ځل په تصادفي تقاطع کې فلم شوی و.


def handle_frame(frame):
    return detect.detect_draw_img(frame)
       
def generate():
    while True:
        rc, frame = vs.read()
        outFrame = handle_frame(frame)
        if outFrame is None:
            (rc, outFrame) = cv.imencode(".jpg", frame)
        yield(b'--framern' b'Content-Type: image/jpegrnrn' + bytearray(outFrame) + b'rn')

@app.route("/stream")
def video_feed():
    return Response(generate(), mimetype = "multipart/x-mixed-replace; boundary=frame")

د کشف کونکي سره موږ په یوه ثانیه کې له دریو چوکاټونو څخه ډیر نه ترلاسه کوو ، هرڅه خورا ورو پرمخ ځي.
که تاسو په GCloud کې یو پیاوړی ماشین واخلئ، تاسو کولی شئ په یوه ثانیه کې 4-5 چوکاټونه کشف کړئ، مګر توپیر د سترګو لپاره تقریبا ناڅرګند دی، دا لاهم ورو دی.

په راسبیري پای کې د کلاوډ اعتراض کشف کونکي ویډیو

د بادل او ترانسپورت لګښتونه د دې سره هیڅ تړاو نلري؛ کشف کونکی په منظم هارډویر چلوي او په دې سرعت کار کوي.

د عصبي کمپیوټر سټیک

ما مقاومت نشم کولی او په NCS کې بنچمارک پرمخ وړم.

د کشف کونکي سرعت د 0.1 ثانیو په پرتله یو څه ورو و، په هر حالت کې په ضعیف ماشین کې د بادل په پرتله 2-3 ځله ګړندی، د بیلګې په توګه په هر ثانیه کې 8-9 چوکاټونه.

په راسبیري پای کې د کلاوډ اعتراض کشف کونکي ویډیو

په پایلو کې توپیر د دې حقیقت له مخې تشریح شوی چې NCS د ګرځنده SSD نسخه 2018_01_28 چلوله.

P.S. برسېره پردې، تجربو ښودلې چې د I7 پروسیسر سره یو کافي ځواکمن ډیسټاپ ماشین یو څه ښه پایلې ښیې او دا په یوه ثانیه کې د 10 چوکاټونو د راټولولو لپاره ممکنه وه.

کلستر

تجربه نوره هم لاړه او ما په ګوګل کوبرنیټس کې په پنځو نوډونو کې کشف کونکی نصب کړ.
پوډونه پخپله ضعیف وو او هر یو یې نشي کولی په یوه ثانیه کې له 2 چوکاټونو څخه ډیر پروسس کړي.
مګر که تاسو د N نوډونو سره کلسټر چل کړئ او په N تارونو کې چوکاټونه پارس کړئ ، نو د کافي شمیر نوډونو (5) سره تاسو کولی شئ په هره ثانیه کې مطلوب 10 چوکاټونه ترلاسه کړئ.

def generate():
    while True:
        rc, frame = vs.read()
        if frame is not None:
            future = executor.submit(handle_frame, (frame.copy()))
            Q.append(future)

        keep_polling = len(Q) > 0
        while(keep_polling):            
            top = Q[0]
            if top.done():
                outFrame = top.result()
                Q.popleft()
                if outFrame:
                    yield(b'--framern' b'Content-Type: image/jpegrnrn' + bytearray(outFrame) + b'rn')
                keep_polling = len(Q) > 0
            else:
                keep_polling = len(Q) >= M

دلته هغه څه دي چې پیښ شوي:

په راسبیري پای کې د کلاوډ اعتراض کشف کونکي ویډیو

د NCS سره یو څه لږ ګړندی ، مګر د یوې جریان په پرتله خورا پیاوړی.

لاسته راوړنه، البته، خطي نه ده - د Opencv انځورونو د همغږي کولو او ژورې کاپي کولو لپاره پوښښ شتون لري.

پایلې

په ټولیز ډول، تجربه موږ ته اجازه راکوي چې دې پایلې ته ورسیږو چې که تاسو هڅه وکړئ، تاسو کولی شئ د ساده بادل سره لرې شئ.

مګر یو پیاوړی ډیسټاپ یا محلي هارډویر تاسو ته اجازه درکوي غوره پایلې ترلاسه کړئ، او پرته له کوم چال چلن.

مرجع

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

Add a comment