ããããŒã°
ãã¹ã©ã®èªåæçžŠè£ çœ®ãéè·¯ãã©ã®ããã«èªèããŠãããã瀺ããããªãçŸåšãã€ã³ã¿ãŒãããäžã§åºãŸã£ãŠããã
ç§ã¯é·ãéãæ€åºåšã䜿ã£ãŠåŒ·åããããããªããªã¢ã«ã¿ã€ã ã§é ä¿¡ããããŠããããããŠããŸããã
åé¡ã¯ãRaspberry ãããããªããããŒããã£ã¹ããããã®ã§ãããRaspberry äžã®ãã¥ãŒã©ã« ãããã¯ãŒã¯æ€åºåšã®ããã©ãŒãã³ã¹ã«ã¯ãŸã æ¹åã®äœå°ããããšããããšã§ãã
ã€ã³ãã« ãã¥ãŒã©ã« ã³ã³ãã¥ãŒã¿ãŒ ã¹ãã£ãã¯
ããŸããŸãªè§£æ±ºçãæ€èšããŸããã
Ð
Intel ã¯äž»èŠãªãã¬ãŒã ã¯ãŒã¯çšã®ã³ã³ããŒã¿ãæäŸããŠããŸãããèœãšãç©Žãããã€ããããŸãã
ããšãã°ãå¿ èŠãªãããã¯ãŒã¯ã®åœ¢åŒã«äºææ§ããªãå¯èœæ§ããããäºææ§ãããå Žåã§ããäžéšã®ã¬ã€ã€ãŒãããã€ã¹ã§ãµããŒããããŠããªãå¯èœæ§ãããããµããŒããããŠããå Žåã§ããå€æããã»ã¹äžã«ãšã©ãŒãçºçããå¯èœæ§ããããŸããåºåã§å¥åŠãªããšãããã€ãåŸãããŸãã
äžè¬ã«ãããçš®ã®ä»»æã®ãã¥ãŒã©ã« ãããã¯ãŒã¯ãå¿ èŠãªå ŽåãNCS ã§ã¯æ©èœããªãå¯èœæ§ããããŸãã ãããã£ãŠãç§ã¯æãæ®åããŠããŠã¢ã¯ã»ã¹ããããããŒã«ã䜿çšããŠåé¡ã解決ããããšè©Šã¿ãããšã«ããŸããã
ã¯ã©ãŠã
ããŒã«ã« ããŒããŠã§ã¢ ãœãªã¥ãŒã·ã§ã³ã«ä»£ããæçœãªéžæè¢ã¯ãã¯ã©ãŠãã䜿çšããããšã§ãã
æ¢è£œã®ãªãã·ã§ã³ - ç§ã®ç®ã¯è奮ããŸãã
ãã¹ãŠã®ãªãŒããŒ:
...ãã®ä»ãããŸãç¥ãããŠããªããã®ãå€æ°ãããŸãã
ãã®åçš®ã®äžããéžã¶ã®ã¯æ±ºããŠç°¡åã§ã¯ãããŸããã
ãããŠç§ã¯éžæãããOpenCV äžã®å€ãè¯ãæ©èœã¹ããŒã ã Docker ã§ã©ããããã¯ã©ãŠãã§å®è¡ããããšã«ããŸããã
ãã®ã¢ãããŒãã®å©ç¹ã¯æè»æ§ãšå¶åŸ¡ã§ããäžè¬ã«ããã¥ãŒã©ã« ãããã¯ãŒã¯ããã¹ãã£ã³ã°ããµãŒããŒãæ°ãŸããã«å€æŽã§ããŸãã
СеÑвеÑ
ããŒã«ã«ãããã¿ã€ãããå§ããŸãããã
ç§ã¯äŒçµ±çã«ãREST APIãOpenCVãMobileSSD ãããã¯ãŒã¯ã« Flask ã䜿çšããŠããŸãã
Docker ã«çŸåšã®ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããšãããOpenCV 4.1.2 ã Mobile 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)
ããŒã«ã« Docker (ããã»ã©è¥ãã©ãããããã§ã¯ãªã) ã§ã¯ 0.3 ç§ããããŸãããRaspberry ã§ã¯ 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()
Docker - 0.2 ç§ãRaspberry - 1.7 ç§ã
tensor ã®åºåãèªã¿åãå¯èœãª 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
ããã«
代æ¿ãªãã·ã§ã³ã§ã¯ãããå€ãã®äœæ¥ããµãŒããŒã«ç§»ãããŸãããµãŒããŒèªäœããèŠã€ãã£ããªããžã§ã¯ããäžžããŠãå®æããã€ã¡ãŒãžãè¿ããŸãã
ãã®ãªãã·ã§ã³ã¯ãopencv ããµãŒããŒã«ãã©ãã°ããããªãå Žåã«é©ããŠããŸãã
ããã«ãŒ
ç»åãéããŠãããŸãã
ã³ãŒãã¯ç²Ÿæ»ãããŠæçš¿ãããŸã
ãã©ãããã©ãŒã ãšããŠãRaspberry ãšåã Debian Stretch ãæ¡çšããŸããå®èšŒæžã¿ã®æè¡ã¹ã¿ãã¯ããéžââè±ããããšã¯ãããŸããã
flaskãprotobufãrequestsãopencv_python ãã€ã³ã¹ããŒã«ããMobile SSDãGithub ãããµãŒã㌠ã³ãŒããããŠã³ããŒãããŠããµãŒããŒãèµ·åããå¿ èŠããããŸãã
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"]
ã·ã³ãã«
Docker Hub ãžã®å ¬é
Docker ã¬ãžã¹ããªã¯ãã¯ã©ãŠã ãã£ãã¯ã¿ãšåããããã®ã¹ããŒãã§å¢å ããŠããŸãã
è¿·æã«ãªããªãããã«ãæ§ããã«ééããŸã
- ç»é²
- ãã°ã€ã³ïŒ
ããã«ãŒãã°ã€ã³ - æå³ã®ããååãèããŠã¿ãŸãããã
docker ã¿ã° opencv-detect tprlab/opencv-detect-ssd - ç»åããµãŒããŒã«ã¢ããããŒãããŸãã
ããã«ãŒããã·ã¥ tprlab/opencv-detect-ssd
ã¯ã©ãŠãã§èµ·åããŸã
ã³ã³ãããŒãå®è¡ããå Žæã®éžæãéåžžã«å¹ åºãã§ãã
ãã¹ãŠã®å€§æäŒæ¥ (GoogleãMicrosoftãAmazon) ã¯ããã€ã¯ãã€ã³ã¹ã¿ã³ã¹ãå幎床ç¡æã§æäŸããŠããŸãã
Microsoft Azure ãš Google Cloud ãè©ŠããåŸãåŸè
ãããæ©ãæ®åãããããåŸè
ã«èœã¡çããŸããã
ãã®éšåã¯éžæãããããã€ããŒã«éåžžã«åºæã§ãããããããã§ã¯æé ãæžããŸããã§ããã
ããŸããŸãªããŒããŠã§ã¢ãªãã·ã§ã³ãè©ŠããŸãããã
äœã¬ãã« (å
±æããã³å°çš) - 0.4 ïœ 0.5 ç§ã
ãã匷åãªè» - 0.25 - 0.3ã
ãŸããææªã®ã·ããªãªã§ãè³é㯠XNUMX åãªã®ã§ãè©ŠããŠã¿ãããšãã§ããŸãã
ãããª
Raspberry äžã§ã·ã³ãã«ãª OpenCV ãã㪠ã¹ããªãŒããŒãèµ·åããGoogle Cloud ãéããŠæ€åºããŸãã
å®éšã«ã¯ãã©ã³ãã ãªäº€å·®ç¹ã§æ®åœ±ããããã㪠ãã¡ã€ã«ã䜿çšãããŸããã
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")
æ€åºåšã䜿çšãããšãXNUMX ç§ããã XNUMX ãã¬ãŒã ããååŸã§ããããã¹ãŠãéåžžã«é
ããªããŸãã
匷åãªãã·ã³ã GCloud ã«å°å
¥ãããšã4 ç§ããã 5 ïœ XNUMX ãã¬ãŒã ãæ€åºã§ããŸããããã®éãã¯ç®ã«ã¯ã»ãšãã©èŠãããããã§ãé
ãã§ãã
ã¯ã©ãŠãã茞éã³ã¹ãã¯é¢ä¿ãªããæ€åºåšã¯éåžžã®ããŒããŠã§ã¢äžã§åäœããéåžžã«é«éã«åäœããŸãã
ãã¥ãŒã©ã«ã³ã³ãã¥ãŒã¿ãŒã¹ãã£ãã¯
ææ ¢ã§ããã« NCS ã§ãã³ãããŒã¯ãå®è¡ããŠã¿ãŸããã
æ€åºåšã®é床㯠0.1 ç§ãããããã«é ãããããã«ããŠãã匱ããã·ã³äžã®é²ããã 2 ïœ 3 åéãã£ããã€ãŸã 8 ç§ããã 9 ïœ XNUMX ãã¬ãŒã ã§ããã
çµæã®éãã¯ãNCS ã Mobile SSD ããŒãžã§ã³ 2018_01_28 ãå®è¡ããŠããããšã«ãã£ãŠèª¬æãããŸãã
PS ããã«ãå®éšã§ã¯ãI7 ããã»ããµãæèŒããããªã匷åãªãã¹ã¯ããã ãã·ã³ããããã«è¯ãçµæã瀺ãã10 ç§ããã XNUMX ãã¬ãŒã ãå§çž®ã§ããããšãå€æããŸããã
éãŸã
å®éšã¯ããã«é²ãã§ãGoogle Kubernetes ã® XNUMX ã€ã®ããŒãã«æ€åºåšãã€ã³ã¹ããŒã«ããŸããã
ãããèªäœã匱ããåããã㯠2 ç§ããã XNUMX ãã¬ãŒã ãè¶
ããåŠçãã§ããŸããã§ããã
ãã ãã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 ãããé床ã¯å°ãå£ããŸãããXNUMX ã€ã®ã¹ããªãŒã ããã掻çºã§ãã
ãã¡ãããã²ã€ã³ã¯ç·åœ¢ã§ã¯ãããŸãããopencv ã€ã¡ãŒãžã®åæãšãã£ãŒã ã³ããŒã®ããã®ãªãŒããŒã¬ã€ãååšããŸãã
ãŸãšã
å šäœãšããŠããã®å®éšã«ãããè©ŠããŠã¿ãã°åçŽãªã¯ã©ãŠãã§åé¡ã解決ã§ãããšçµè«ä»ããããšãã§ããŸããã
ãã ãã匷åãªãã¹ã¯ããããŸãã¯ããŒã«ã« ããŒããŠã§ã¢ã䜿çšãããšãç¹å¥ãªããªãã¯ãå¿ èŠãšããã«ãããè¯ãçµæãéæã§ããŸãã
ãªãã¡ã¬ã³ã¹
Github äžã®ã³ãŒã DockerHub ã® Docker ã€ã¡ãŒãž OpenCV ãš Python äžã®ãã㪠ãµãŒããŒ
åºæïŒ habr.com