ΠΡΠΎΠ»ΠΎΠ³
ΠΠΎ ΡΠ΅ΡΠΈ ΡΠ΅ΠΉΡΠ°Ρ Π³ΡΠ»ΡΠ΅Ρ Π²ΠΈΠ΄Π΅ΠΎ β ΠΊΠ°ΠΊ Π°Π²ΡΠΎΠΏΠΈΠ»ΠΎΡ Π’Π΅ΡΠ»Ρ Π²ΠΈΠ΄ΠΈΡ Π΄ΠΎΡΠΎΠ³Ρ.
Π£ ΠΌΠ΅Π½Ρ Π΄Π°Π²Π½ΠΎ ΡΠ΅ΡΠ°Π»ΠΈΡΡ ΡΡΠΊΠΈ ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ, ΠΎΠ±ΠΎΠ³Π°ΡΠ΅Π½Π½ΠΎΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΠΌ, Π΄Π° ΠΈ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ Ρ Ρ
ΠΎΡΡ Ρ Raspberry, Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½Π΅ΠΉΡΠΎΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° Π½Π° Π½Π΅ΠΉ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΆΠ΅Π»Π°ΡΡ Π»ΡΡΡΠ΅Π³ΠΎ.
Intel Neural Computer Stick
Π― ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π» ΡΠ°Π·Π½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
Π
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΠ½ΡΠ΅Π» ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠ΅ΡΡ Π΄Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ², Π·Π΄Π΅ΡΡ Π΅ΡΡΡ ΡΡΠ΄ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ°ΠΌΠ½Π΅ΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΡΠΌΠ°Ρ Π½ΡΠΆΠ½ΠΎΠΉ ΡΠ΅ΡΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ, Π° Π΅ΡΠ»ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ, ΡΠΎ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΠ»ΠΎΠΈ ΠΌΠΎΠ³ΡΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π½Π° Π΄Π΅Π²Π°ΠΉΡΠ΅, Π° Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ, ΡΠΎ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΊΠΎΡΠΎΡΡΡ Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΡΡΠ°Π½Π½ΡΠ΅ Π²Π΅ΡΠΈ.
Π ΠΎΠ±ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠ΅ΡΡΡ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ Π½Π΅ΠΉΡΠΎΡΠ΅ΡΡ, ΡΠΎ Ρ NCS ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ. ΠΠΎΡΡΠΎΠΌΡ, Ρ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΌΡΠ΅ ΠΌΠ°ΡΡΠΎΠ²ΡΠ΅ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ.
ΠΠ±Π»Π°ΠΊΠΎ
ΠΡΠ΅Π²ΠΈΠ΄Π½Π°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ-Ρ Π°ΡΠ΄Π²Π°ΡΠ½ΠΎΠΌΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ β ΠΏΠΎΠΉΡΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠΎ.
ΠΠΎΡΠΎΠ²ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² β Π³Π»Π°Π·Π° ΡΠ°Π·Π±Π΅Π³Π°ΡΡΡΡ.
ΠΡΠ΅ Π»ΠΈΠ΄Π΅ΡΡ:
β¦ Π Π΄Π΅ΡΡΡΠΊΠΈ ΠΌΠ΅Π½Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ .
ΠΡΠ±ΡΠ°ΡΡ ΡΡΠ΅Π΄ΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±ΡΠ°Π·ΠΈΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΠΏΡΠΎΡΡΠΎ.
Π Ρ ΡΠ΅ΡΠΈΠ» Π½Π΅ Π²ΡΠ±ΠΈΡΠ°ΡΡ, Π° Π·Π°Π²Π΅ΡΠ½ΡΡΡ ΡΡΠ°ΡΡΡ Π΄ΠΎΠ±ΡΡΡ ΡΠ°Π±ΠΎΡΡΡ ΡΡ Π΅ΠΌΡ Π½Π° OpenCV Π² Π΄ΠΎΠΊΠ΅Ρ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅Π³ΠΎ Π² ΠΎΠ±Π»Π°ΠΊΠ΅.
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π² Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ β ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π½Π΅ΠΉΡΠΎΡΠ΅ΡΡ, Ρ ΠΎΡΡΠΈΠ½Π³, ΡΠ΅ΡΠ²Π΅Ρ β Π² ΠΎΠ±ΡΠ΅ΠΌ, Π»ΡΠ±ΠΎΠΉ ΠΊΠ°ΠΏΡΠΈΠ·.
Π‘Π΅ΡΠ²Π΅Ρ
ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°.
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Flask Π΄Π»Ρ REST API, OpenCV ΠΈ MobileSSD ΡΠ΅ΡΡ.
ΠΠΎΡΡΠ°Π²ΠΈΠ² Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΡΠ΅ΠΊΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ, ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ» ΡΡΠΎ 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)
ΠΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ Π΄ΠΎΠΊΠ΅ΡΠ΅ (Π½Π° Π½Π΅ ΡΠ°ΠΌΠΎΠΌ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌ Π»Π°ΠΏΡΠΎΠΏΠ΅) ΡΡΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 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()
ΠΠΎΠΊΠ΅Ρ β 0.2 ΡΠ΅ΠΊ, Raspberry β 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
ΠΠ°Π»ΡΡΠ΅
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ: ΠΎΠ½ ΡΠ°ΠΌ ΠΎΠ±Π²ΠΎΠ΄ΠΈΡ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π³ΠΎΡΠΎΠ²ΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ.
Π’Π°ΠΊΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Ρ ΠΎΡΠΎΡ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΌΡ Π½Π΅ Ρ ΠΎΡΠΈΠΌ ΡΡΠ½ΡΡΡ opencv Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠΎΠΊΠ΅Ρ
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°Π·.
ΠΠΎΠ΄ ΠΏΡΠΈΡΠ΅ΡΠ°Π½ ΠΈ Π²ΡΠ»ΠΎΠΆΠ΅Π½ Π½Π°
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ ΡΠΎΡ ΠΆΠ΅ Debian Stretch, ΡΡΠΎ ΠΈ Π½Π° Raspberry β Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΡ ΠΎΠ΄ΠΈΡΡ ΠΎΡ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Ρ ΡΡΠ΅ΠΊΠ°.
ΠΠ°Π΄ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ flask, protobuf, requests, opencv_python, ΡΠΊΠ°ΡΠ°ΡΡ Mobile 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"]
ΠΡΠΎΡΡΠΎΠΉ
ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° Docker Hub
Π Π΅Π΅ΡΡΡΡ Π΄ΠΎΠΊΠ΅ΡΠ° ΠΏΠ»ΠΎΠ΄ΡΡΡΡ ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ, ΡΠ΅ΠΌ ΠΎΠ±Π»Π°ΡΠ½ΡΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡ.
Π§ΡΠΎΠ±Ρ Π½Π΅ Π·Π°ΠΌΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ, ΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠΉΠ΄Π΅ΠΌ ΡΠ΅ΡΠ΅Π·
- Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌΡΡ
- ΠΠ²ΡΠΎΡΠΈΠ·ΡΠ΅ΠΌΡΡ:
docker login - ΠΡΠΈΠ΄ΡΠΌΠ°Π΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ:
docker tag opencv-detect tprlab/opencv-detect-ssd - ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°Π· Π½Π° ΡΠ΅ΡΠ²Π΅Ρ:
docker push tprlab/opencv-detect-ssd
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π² ΠΎΠ±Π»Π°ΠΊΠ΅
ΠΡΠ±ΠΎΡ, Π³Π΄Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠΎΠΆΠ΅ Π²Π΅ΡΡΠΌΠ° ΡΠΈΡΠΎΠΊ.
ΠΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠΈ (ΠΡΠ³Π», ΠΠΈΠΊΡΠΎΡΠΎΡΡ, ΠΠΌΠ°Π·ΠΎΠ½) ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΠΌΠΈΠΊΡΠΎΠΈΠ½ΡΡΠ°Π½Ρ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ Π² ΠΏΠ΅ΡΠ²ΡΠΉ Π³ΠΎΠ΄.
ΠΠΎΡΠΊΡΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π² Ρ Microsoft Azure ΠΈ Google Cloud, ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ β ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π±ΡΡΡΡΠ΅Π΅ Π²Π·Π»Π΅ΡΠ΅Π»ΠΎ.
ΠΠ΅ ΡΡΠ°Π» ΠΏΠΈΡΠ°ΡΡ Π·Π΄Π΅ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ° ΡΠ°ΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½Π°Ρ Π΄Π»Ρ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°.
ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΠ°Π·Π½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΆΠ΅Π»Π΅Π·Π°,
ΠΠΈΠ·ΠΊΠΈΠ΅ ΡΡΠΎΠ²Π½ΠΈ (shared ΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠ΅) β 0.4 β 0.5 ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΠ°ΡΠΈΠ½Ρ ΠΏΠΎΠΌΠΎΡΠ½Π΅Π΅ β 0.25 β 0.3.
Π§ΡΠΎ ΠΆ, Π² Π΄Π°ΠΆΠ΅ Π² Ρ
ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠΈΠ³ΡΡΡ Π² ΡΡΠΈ ΡΠ°Π·Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ.
ΠΠΈΠ΄Π΅ΠΎ
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ OpenCV Π²ΠΈΠ΄Π΅ΠΎΡΡΡΠΈΠΌΠ΅Ρ Π½Π° Raspberry, Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· 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")
Π‘ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ΅Ρ
ΠΊΠ°Π΄ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π²ΡΠ΅ ΠΈΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
ΠΡΠ»ΠΈ Π² GCloud Π²Π·ΡΡΡ ΠΌΠΎΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΡ 4-5 ΠΊΠ°Π΄ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π½ΠΎ ΡΠ°Π·Π½ΠΈΡΠ° Π³Π»Π°Π·ΠΎΠΌ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅Π·Π°ΠΌΠ΅ΡΠ½Π°, Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
ΠΠ±Π»Π°ΠΊΠΎ ΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΠ΅ ΡΠ°ΡΡ
ΠΎΠ΄Ρ Π·Π΄Π΅ΡΡ Π½Π΅ ΠΏΡΠΈΡΠ΅ΠΌ, Π½Π° ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΠΆΠ΅Π»Π΅Π·Π΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΡΡ.
Neural Computer Stick
ΠΠ΅ ΡΠ΄Π΅ΡΠΆΠ°Π»ΡΡ ΠΈ ΠΏΡΠΎΠ³Π½Π°Π» Π±Π΅Π½ΡΠΌΠ°ΡΠΊ Π½Π° NCS.
Π‘ΠΊΠΎΡΠΎΡΡΡ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠ° Π±ΡΠ»Π° ΡΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ 0.1 ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² 2-3 ΡΠ°Π·Π° Π±ΡΡΡΡΠ΅Π΅ ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° ΡΠ»Π°Π±ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅, Ρ.Π΅ 8-9 ΠΊΠ°Π΄ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Π Π°Π·Π½ΠΈΡΠ° Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ
ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π° NCS Π·Π°ΠΏΡΡΠΊΠ°Π»ΡΡ Mobile SSD Π²Π΅ΡΡΠΈΠΈ 2018_01_28.
P.S. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, ΡΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠΎΡΠ½Π°Ρ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° Ρ I7 ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΡΡ Π»ΡΡΡΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΈ Π½Π° Π½Π΅ΠΉ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΆΠ°ΡΡ 10 ΠΊΠ°Π΄ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΠ»Π°ΡΡΠ΅Ρ
ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ ΠΏΠΎΡΠ΅Π» Π΄Π°Π»ΡΡΠ΅ ΠΈ Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΠ» Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π½Π° ΠΏΡΡΠΈ ΡΠ·Π»Π°Ρ
Π² Google Kubernetes.
Π‘Π°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΏΠΎΠ΄Ρ Π±ΡΠ»ΠΈ ΡΠ»Π°Π±ΡΠ΅ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ
Π½Π΅ ΠΌΠΎΠ³ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ 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.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ΅Π»ΠΎΠΌ, ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΊΡΡΡΠΈΡΡΡΡ Ρ ΠΏΡΠΎΡΡΡΠΌ ΠΎΠ±Π»Π°ΠΊΠΎΠΌ.
ΠΠΎ ΠΌΠΎΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΎΠΏ ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΆΠ΅Π»Π΅Π·ΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π»ΡΡΡΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΏΡΠΈΡΠ΅ΠΌ Π±Π΅Π· Π²ΡΡΠΊΠΈΡ ΡΡ ΠΈΡΡΠ΅Π½ΠΈΠΉ.
Π‘ΡΡΠ»ΠΊΠΈ
ΠΠΎΠ΄ Π½Π° ΠΠΈΡΡ Π°Π±Π΅ ΠΠΎΠΊΠ΅Ρ-ΠΎΠ±ΡΠ°Π· Π½Π° DockerHub ΠΠΈΠ΄Π΅ΠΎΡΠ΅ΡΠ²Π΅Ρ Π½Π° OpenCV & Python
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com