Prolog
Video saiki nyebar ing Internet sing nuduhake carane autopilot Tesla ndeleng dalan kasebut.
Aku wis gatel kanggo dangu kanggo siaran video enriched karo detektor, lan ing wektu nyata.
Masalahe yaiku aku pengin nyebarake video saka Raspberry, lan kinerja detektor jaringan syaraf kasebut akeh sing dikarepake.
Intel Neural Computer Stick
Aku dianggep solusi beda.
Π
Sanajan Intel nyedhiyakake konverter kanggo kerangka utama, ana sawetara pitfalls.
Contone, format jaringan sing dibutuhake bisa uga ora kompatibel, lan yen kompatibel, sawetara lapisan bisa uga ora didhukung ing piranti kasebut, lan yen didhukung, kesalahan bisa kedadeyan sajrone proses konversi, minangka asil saka kita njaluk sawetara iku aneh ing output.
UmumΓ©, yen sampeyan pengin sawetara jinis jaringan saraf arbitrer, mula bisa uga ora bisa digunakake karo NCS. Mulane, aku mutusake kanggo nyoba ngatasi masalah kasebut kanthi nggunakake alat sing paling umum lan bisa diakses.
Awan
Alternatif sing jelas kanggo solusi hardware lokal yaiku pindhah menyang awan.
Opsi sing wis siap - mripatku dadi liar.
Kabeh pimpinan:
... Lan puluhan sing kurang dikenal.
Milih ing antarane macem-macem iki ora gampang.
Lan aku mutusake ora milih, nanging kanggo mbungkus skema kerja lawas sing apik ing OpenCV ing Docker lan mbukak ing mΓ©ga.
Kauntungan saka pendekatan iki yaiku keluwesan lan kontrol - sampeyan bisa ngganti jaringan saraf, hosting, server - umume, apa wae.
Server
Ayo dadi miwiti karo prototipe lokal.
Biasane aku nggunakake Flask kanggo REST API, OpenCV lan jaringan MobileSSD.
Sawise nginstal versi saiki ing Docker, aku nemokake OpenCV 4.1.2 ora bisa digunakake karo Mobile SSD v1_coco_2018_01_28, lan aku kudu bali menyang 11/06_2017 sing wis kabukten.
Ing wiwitan layanan, kita mbukak jeneng kelas lan jaringan:
def init():
tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)
Ing docker lokal (ing laptop ora enom banget) njupuk 0.3 detik, ing Raspberry - 3.5.
Ayo miwiti pitungan:
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, Raspberry - 1.7.
Ngowahi knalpot tensor dadi json sing bisa diwaca:
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
Luwih
Opsi alternatif, ing ngendi luwih akeh karya dipindhah menyang server: iku dhewe ngubengi obyek sing ditemokake lan ngasilake gambar sing wis rampung.
Opsi iki apik ing ngendi kita ora pengin nyeret opencv menyang server.
Docker
Kita ngumpulake gambar kasebut.
Kode wis combed lan dikirim ing
Kita bakal nggunakake Debian Stretch sing padha karo platform kaya ing Raspberry - kita ora bakal nyimpang saka tumpukan teknologi sing wis kabukten.
Sampeyan kudu nginstal flask, protobuf, panjalukan, opencv_python, download Mobile SSD, kode server saka Github lan miwiti 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"]
Prasaja
Nerbitake menyang Docker Hub
Registri Docker mundhak kanthi kacepetan ora kurang saka detektor awan.
Supaya ora keganggu, kita bakal kanthi konservatif
- Ndaftar
- mlebu:
mlebu docker - Ayo goleki jeneng sing migunani:
tag docker opencv-detect tprlab/opencv-detect-ssd - Unggah gambar menyang server:
docker push tprlab/opencv-detect-ssd
Kita miwiti ing mΓ©ga
Pilihan ngendi kanggo mbukak wadhah uga cukup amba.
Kabeh pemain gedhe (Google, Microsoft, Amazon) nawakake conto mikro gratis kanggo taun pisanan.
Sawise nyobi karo Microsoft Azure lan Google Cloud, aku mapan ing terakhir amarga njupuk mati luwih cepet.
Aku ora nulis instruksi ing kene, amarga bagean iki khusus kanggo panyedhiya sing dipilih.
Aku nyoba macem-macem opsi hardware,
Tingkat kurang (dibagi lan darmabakti) - 0.4 - 0.5 detik.
Mobil sing luwih kuat - 0.25 - 0.3.
Inggih, sanajan ing skenario paling awon, menang kaping telu, sampeyan bisa nyoba.
Video
Kita miwiti streamer video OpenCV prasaja ing Raspberry, ndeteksi liwat Google Cloud.
Kanggo eksperimen, file video digunakake sing tau direkam ing persimpangan 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")
Kanthi detektor kita entuk ora luwih saka telung pigura per detik, kabeh dadi alon banget.
Yen sampeyan njupuk mesin kuat menyang GCloud, sampeyan bisa ndeteksi 4-5 pigura per detik, nanging prabΓ©dan meh ora katon ing mripat, iku isih alon.
Biaya awan lan transportasi ora ana hubungane; detektor kasebut nganggo piranti keras biasa lan bisa digunakake kanthi cepet.
Stik Komputer Neural
Aku ora bisa nolak lan mlayu pathokan ing NCS.
Kacepetan detektor rada luwih alon tinimbang 0.1 detik, ing kasus apa wae 2-3 kaping luwih cepet tinimbang awan ing mesin sing ringkih, yaiku 8-9 pigura per detik.
Bentenipun ing asil diterangake dening kasunyatan sing NCS mbukak Mobile SSD versi 2018_01_28.
P.S. Kajaba iku, eksperimen nuduhake manawa mesin desktop sing cukup kuat kanthi prosesor I7 nuduhake asil sing luwih apik lan bisa nyepetake 10 pigura per detik.
Kluster
Eksperimen kasebut luwih maju lan aku nginstal detektor ing limang simpul ing Google Kubernetes.
Polong kasebut ora kuwat lan saben-saben ora bisa ngolah luwih saka 2 pigura per detik.
Nanging yen sampeyan mbukak kluster karo N simpul lan parse pigura ing N Utas, banjur karo nomer cekap saka kelenjar (5) sampeyan bisa entuk 10 pigura per detik sing dikarepake.
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
Punika kedadosan:
A sethitik kurang cepet saka karo NCS, nanging luwih vigorous saka ing siji stream.
Keuntungan, mesthi, ora linear - ana overlay kanggo sinkronisasi lan nyalin jero gambar opencv.
kesimpulan
Sakabèhé, eksperimen ngidini kita nyimpulake yen sampeyan nyoba, sampeyan bisa lolos kanthi awan sing prasaja.
Nanging desktop utawa hardware lokal sing kuat ngidini sampeyan entuk asil sing luwih apik, lan tanpa trik.
referensi
Source: www.habr.com