Prologue
Usa ka video ang naglibot karon sa Internet nga nagpakita kung giunsa nakita sa autopilot ni Tesla ang dalan.
Dugay na kong nangalisang sa pagsibya sa video nga gipadato sa usa ka detector, ug sa tinuod nga panahon.
Ang problema mao nga gusto nakong i-broadcast ang video gikan sa Raspberry, ug ang pasundayag sa neural network detector niini nagbilin ug daghan nga gitinguha.
Intel Neural Computer Stick
Gikonsiderar nako ang lainlaing mga solusyon.
Π
Bisan kung naghatag ang Intel og mga converter alang sa dagkong mga balangkas, adunay daghang mga lit-ag.
Pananglitan, ang format sa gikinahanglan nga network mahimong dili magkauyon, ug kung kini magkatugma, nan ang pipila ka mga lut-od mahimong dili suportahan sa device, ug kung kini gisuportahan, nan ang mga sayup mahimong mahitabo sa panahon sa proseso sa pagkakabig, ingon nga resulta niini. nakakuha kami pipila ka katingad-an nga mga butang sa output.
Sa kinatibuk-an, kung gusto nimo ang usa ka matang sa arbitraryong neural network, nan dili kini mahimo sa NCS. Busa, nakahukom ko nga sulayan ang pagsulbad sa problema gamit ang labing kaylap ug ma-access nga mga himan.
Panganod
Ang klaro nga alternatibo sa usa ka lokal nga solusyon sa hardware mao ang pag-adto sa panganod.
Andam nga gihimo nga mga kapilian - ang akong mga mata nagdilaab.
Tanan nga mga lider:
... Ug daghang mga dili kaayo nailhan.
Ang pagpili sa kini nga lahi dili gyud kadali.
Ug nakahukom ko nga dili mopili, apan ibutang ang maayo nga daan nga pamaagi sa pagtrabaho sa OpenCV sa Docker ug ipadagan kini sa panganod.
Ang bentaha sa kini nga pamaagi mao ang pagka-flexible ug pagkontrol - mahimo nimong usbon ang neural network, hosting, server - sa kinatibuk-an, bisan unsang kapritso.
Server
Magsugod kita sa usa ka lokal nga prototype.
Sa naandan akong gigamit ang Flask para sa REST API, OpenCV ug MobileSSD network.
Sa pag-instalar sa kasamtangan nga mga bersyon sa Docker, akong nadiskobrehan nga ang OpenCV 4.1.2 wala magtrabaho sa Mobile SSD v1_coco_2018_01_28, ug kinahanglan kong mobalik sa napamatud-an nga 11/06_2017.
Sa pagsugod sa serbisyo, among gikarga ang mga ngalan sa klase ug network:
def init():
tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)
Sa usa ka lokal nga pantalan (sa usa ka dili kaayo bata nga laptop) nagkinahanglan kini og 0.3 segundos, sa Raspberry - 3.5.
Atong sugdan ang kalkulasyon:
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 ka segundo, Raspberry - 1.7.
Ang paghimo sa tensor nga tambutso ngadto sa mabasa nga 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
Dugang pa
Usa ka alternatibo nga kapilian, diin daghang trabaho ang gibalhin sa server: kini mismo ang naglibot sa nakit-an nga mga butang ug gibalik ang nahuman nga imahe.
Maayo kini nga opsyon diin dili namo gusto nga i-drag ang opencv ngadto sa server.
Docker
Gikolekta namon ang imahe.
Ang code gisuklay ug gibutang sa
Ingon usa ka plataporma, kuhaon namon ang parehas nga Debian Stretch sama sa Raspberry - dili kami motipas gikan sa napamatud-an nga tech stack.
Kinahanglan nimo nga i-install ang flask, protobuf, mga hangyo, opencv_python, pag-download sa Mobile SSD, server code gikan sa Github ug pagsugod sa 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"]
Kapatagan
Pagmantala sa Docker Hub
Ang mga rehistro sa Docker nagkadaghan sa katulin nga dili moubos sa mga detektor sa panganod.
Aron dili na mahasol, konserbatibo ta nga moagi
- Pagrehistro
- Sulod:
pag-login sa docker - Maghimo kita og usa ka makahuluganon nga ngalan:
tag sa docker opencv-detect tprlab/opencv-detect-ssd - I-upload ang imahe sa server:
pagduso sa docker tprlab/opencv-detect-ssd
Naglunsad kami sa panganod
Ang pagpili kung asa modagan ang sudlanan medyo lapad usab.
Ang tanan nga dagkong mga magdudula (Google, Microsoft, Amazon) nagtanyag usa ka micro-instance nga libre sa unang tuig.
Pagkahuman sa pag-eksperimento sa Microsoft Azure ug Google Cloud, gihusay nako ang ulahi tungod kay mas paspas kini.
Wala ako magsulat og mga instruksyon dinhi, tungod kay kini nga bahin espesipiko kaayo sa pinili nga provider.
Gisulayan nako ang lainlaing mga kapilian sa hardware,
Ubos nga lebel (gipaambit ug gipahinungod) - 0.4 - 0.5 segundos.
Mas kusgan nga mga awto - 0.25 - 0.3.
Aw, bisan sa pinakagrabe nga senaryo sa kaso, ang mga kadaugan tulo ka beses, mahimo nimong sulayan.
Video
Naglunsad kami og usa ka yano nga OpenCV video streamer sa Raspberry, nga nakamatikod pinaagi sa Google Cloud.
Alang sa eksperimento, usa ka video file ang gigamit nga kaniadto gi-film sa usa ka random nga intersection.
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")
Uban sa detector nga kita dili mosobra sa tulo ka mga frame kada segundo, ang tanan hinay kaayo.
Kung magdala ka usa ka kusgan nga makina sa GCloud, makit-an nimo ang 4-5 nga mga frame matag segundo, apan ang kalainan hapit dili makita sa mata, hinay ra gihapon.
Ang mga gasto sa panganod ug transportasyon walaβy kalabotan niini; ang detector nagdagan sa ordinaryong hardware ug nagtrabaho sa ingon ka tulin.
Neural Computer Stick
Wala ko makasukol ug midagan sa benchmark sa NCS.
Ang katulin sa detector gamay nga hinay kaysa 0.1 segundos, sa bisan unsang kaso 2-3 ka beses nga mas paspas kaysa sa panganod sa usa ka huyang nga makina, i.e. 8-9 nga mga frame matag segundo.
Ang kalainan sa mga resulta gipatin-aw sa kamatuoran nga ang NCS nagpadagan sa Mobile SSD nga bersyon 2018_01_28.
P.S. Dugang pa, gipakita sa mga eksperimento nga ang usa ka medyo kusgan nga makina sa desktop nga adunay usa ka processor sa I7 nagpakita nga labi ka maayo nga mga sangputanan ug nahimoβg posible nga pug-on ang 10 nga mga frame matag segundo.
Cluster
Ang eksperimento nagpadayon ug akong gi-install ang detector sa lima ka node sa Google Kubernetes.
Ang mga pod mismo huyang ug ang matag usa kanila dili makaproseso labaw pa sa 2 ka mga frame matag segundo.
Apan kung nagpadagan ka usa ka kumpol nga adunay mga N node ug nag-parse sa mga frame sa N nga mga hilo, unya sa igo nga gidaghanon sa mga node (5) mahimo nimong makab-ot ang gitinguha nga 10 ka mga frame matag segundo.
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
Ania ang nahitabo:
Dili kaayo paspas kaysa sa NCS, apan labi ka kusog kaysa sa usa ka sapa.
Ang ganansya, siyempre, dili linear - adunay mga overlay alang sa pag-synchronize ug lawom nga pagkopya sa mga imahe sa opencv.
konklusyon
Sa kinatibuk-an, ang eksperimento nagtugot kanamo sa paghinapos nga kung imong sulayan, mahimo ka nga makalayo sa usa ka yano nga panganod.
Apan ang usa ka gamhanan nga desktop o lokal nga hardware nagtugot kanimo sa pagkab-ot sa mas maayo nga mga resulta, ug walay bisan unsa nga mga limbong.
mga pakisayran
Source: www.habr.com