Prolog
Pidéo ayeuna beredar di Internét anu nunjukkeun kumaha autopilot Tesla ningali jalanna.
Kuring geus itching pikeun lila pikeun siaran video enriched kalawan detektor a, sarta sacara real waktu.
Masalahna nyaéta kuring hoyong nyiarkeun pidéo tina Raspberry, sareng kinerja detektor jaringan neural dina éta seueur anu dipikahoyong.
Intel Neural Komputer Stick
Kuring dianggap solusi béda.
В
Sanaos Intel nyayogikeun konvérsi pikeun kerangka utama, aya sababaraha pitfalls.
Contona, format jaringan diperlukeun bisa jadi sauyunan, sarta lamun éta cocog, sababaraha lapisan bisa jadi teu dirojong dina alat, sarta lamun aranjeunna dirojong, kasalahan bisa lumangsung salila prosés konvérsi, salaku hasil tina nu. urang meunang sababaraha hal aneh dina kaluaran.
Sacara umum, upami anjeun hoyong sababaraha jinis jaringan neural sawenang, maka éta moal tiasa dianggo sareng NCS. Ku alatan éta, kuring mutuskeun pikeun nyobaan pikeun ngajawab masalah ngagunakeun alat paling nyebar sarta diaksés.
Méga
Alternatif anu jelas pikeun solusi hardware lokal nyaéta angkat ka méga.
Pilihan siap-dijieun - panon kuring ngajalankeun liar.
Sadaya pimpinan:
... Jeung puluhan leuwih Lesser dipikawanoh.
Milih diantara rupa-rupa ieu henteu gampang pisan.
Sareng kuring mutuskeun henteu milih, tapi pikeun ngabungkus skéma kerja lami anu saé dina OpenCV di Docker sareng ngajalankeun éta dina méga.
Kauntungannana pendekatan ieu kalenturan jeung kontrol - Anjeun bisa ngarobah jaringan neural, hosting, server - sacara umum, whim nanaon.
server
Hayu urang mimitian ku prototipe lokal.
Sacara tradisional kuring nganggo Flask pikeun REST API, OpenCV sareng jaringan MobileSSD.
Saatos dipasang versi ayeuna dina Docker, kuring mendakan yén OpenCV 4.1.2 henteu tiasa dianggo sareng Mobile SSD v1_coco_2018_01_28, sareng kuring kedah ngagulung deui ka 11/06_2017 anu kabuktian.
Dina mimiti jasa, urang muka nami kelas sareng jaringan:
def init():
tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)
Dina docker lokal (dina laptop teu ngora pisan) butuh 0.3 detik, dina buah prambus - 3.5.
Hayu urang mimitian itungan:
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 detik, buah prambus - 1.7.
Ngarobih knalpot tensor janten json anu tiasa dibaca:
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
Salajengna
Pilihan alternatip, dimana langkung seueur padamelan dialihkeun ka server: éta nyalira ngurilingan objék anu kapendak sareng ngabalikeun gambar anu parantos réngsé.
Pilihan ieu saé dimana urang henteu hoyong nyered opencv ka server.
Docker
Urang ngumpulkeun gambar.
Kode ieu combed tur dipasang dina
Salaku platform, kami bakal nyandak Debian Stretch anu sami sareng Raspberry - kami moal nyimpang tina tumpukan téknologi anu kabuktian.
Anjeun kudu masang flask, protobuf, requests, opencv_python, ngundeur Mobile SSD, kode server ti Github tur mimitian server.
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"]
Простой
Publikasikeun ka Docker Hub
Pendaptaran Docker ngalikeun dina laju teu kurang ti detéktor awan.
Dina raraga teu ganggu, urang bakal konservatif ngaliwatan
- Ngadaptar
- Lebet:
login docker - Hayu urang datang kalayan ngaran bermakna:
tag docker opencv-deteksi tprlab/opencv-detect-ssd - Unggah gambar ka server:
docker push tprlab/opencv-detect-ssd
Urang ngajalankeun dina awan
Pilihan dimana ngajalankeun wadahna ogé rada lega.
Sadaya pamaén gedé (Google, Microsoft, Amazon) nawiskeun conto mikro gratis kanggo taun kahiji.
Saatos ékspérimén sareng Microsoft Azure sareng Google Cloud, kuring netepkeun anu terakhir sabab éta langkung gancang.
Kuring henteu nyerat paréntah di dieu, sabab bagian ieu khusus pikeun panyadia anu dipilih.
Kuring nyobian sababaraha pilihan hardware,
tingkat low (dibagikeun sarta dedicated) - 0.4 - 0.5 detik.
Mobil anu langkung kuat - 0.25 - 0.3.
sumur, sanajan dina skenario hal awon, nu winnings tilu kali, anjeun tiasa nyobian.
Видео
Urang ngajalankeun streamer video OpenCV basajan dina Raspberry, ngadeteksi ngaliwatan Google Cloud.
Pikeun ékspérimén, file vidéo dianggo anu sakali difilmkeun di simpang acak.
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")
Kalawan detektor urang meunang teu leuwih ti tilu pigura per detik, sagalana mana lambat pisan.
Lamun nyandak hiji mesin kuat kana GCloud, Anjeun bisa ngadeteksi 4-5 pigura per detik, tapi bédana ampir halimunan ku panon, éta masih slow.
Biaya awan sareng transportasi henteu aya hubunganana; detektor dijalankeun dina hardware biasa sareng tiasa dianggo dina laju sapertos kitu.
Neural Komputer Stick
Abdi henteu tiasa nolak sareng ngajalankeun patokan dina NCS.
Laju detektor éta rada laun ti 0.1 detik, dina sagala hal 2-3 kali leuwih gancang ti awan dina mesin lemah, nyaéta 8-9 pigura per detik.
Bédana dina hasil dijelaskeun ku kanyataan yén NCS ngajalankeun versi Mobile SSD 2018_01_28.
PS Salaku tambahan, percobaan nunjukkeun yén mesin desktop anu cukup kuat kalayan prosésor I7 nunjukkeun hasil anu langkung saé sareng tétéla tiasa squeeze 10 pigura per detik dina éta.
Kluster
Eksperimen langkung jauh sareng kuring masang detektor dina lima titik dina Google Kubernetes.
Polong sorangan lemah sareng masing-masing henteu tiasa ngolah langkung ti 2 pigura per detik.
Tapi lamun ngajalankeun klaster kalawan N titik sarta parse pigura dina N threads, lajeng kalawan jumlah cukup titik (5) anjeun bisa ngahontal 10 pigura per detik nu dipikahoyong.
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
Kieu anu kajantenan:
A saeutik kirang gancang ti kalawan NCS, tapi leuwih vigorous ti dina hiji aliran.
Keuntungan, tangtosna, henteu linier - aya overlays pikeun sinkronisasi sareng nyalin jero gambar opencv.
kacindekan
Gemblengna, percobaan ngamungkinkeun urang pikeun nyimpulkeun yén upami anjeun nyobian, anjeun tiasa kabur ku awan anu sederhana.
Tapi desktop anu kuat atanapi hardware lokal ngamungkinkeun anjeun ngahontal hasil anu langkung saé, sareng tanpa trik.
rujukan
sumber: www.habr.com