Prologue
Mae fideo bellach yn cylchredeg ar y Rhyngrwyd yn dangos sut mae awtobeilot Tesla yn gweld y ffordd.
Rydw i wedi bod yn cosi ers amser maith i ddarlledu fideo wedi'i gyfoethogi â synhwyrydd, ac mewn amser real.
Y broblem yw fy mod am ddarlledu fideo o Raspberry, ac mae perfformiad y synhwyrydd rhwydwaith niwral arno yn gadael llawer i'w ddymuno.
Ffon Gyfrifiadurol Newral Intel
Ystyriais atebion gwahanol.
В
Er bod Intel yn darparu trawsnewidwyr ar gyfer fframweithiau mawr, mae yna nifer o beryglon.
Er enghraifft, efallai y bydd fformat y rhwydwaith gofynnol yn anghydnaws, ac os yw'n gydnaws, yna efallai na fydd rhai haenau'n cael eu cefnogi ar y ddyfais, ac os cânt eu cefnogi, yna gall gwallau ddigwydd yn ystod y broses drosi, ac o ganlyniad i hynny rydym yn cael rhai pethau rhyfedd yn yr allbwn.
Yn gyffredinol, os ydych chi eisiau rhyw fath o rwydwaith niwral mympwyol, yna efallai na fydd yn gweithio gyda NCS. Felly, penderfynais geisio datrys y broblem gan ddefnyddio'r offer mwyaf eang a hygyrch.
Cwmwl
Y dewis arall amlwg yn lle datrysiad caledwedd lleol yw mynd i'r cwmwl.
Opsiynau parod - mae fy llygaid yn rhedeg yn wyllt.
Pob arweinydd:
... A dwsinau o rai llai adnabyddus.
Nid yw dewis ymhlith yr amrywiaeth hon yn hawdd o gwbl.
A phenderfynais beidio â dewis, ond lapio'r hen gynllun gweithio da ar OpenCV yn Docker a'i redeg yn y cwmwl.
Mantais y dull hwn yw hyblygrwydd a rheolaeth - gallwch newid y rhwydwaith niwral, cynnal, gweinydd - yn gyffredinol, unrhyw fympwy.
Gweinydd
Gadewch i ni ddechrau gyda phrototeip lleol.
Yn draddodiadol rwy'n defnyddio Fflasg ar gyfer rhwydwaith REST API, OpenCV a MobileSSD.
Ar ôl gosod y fersiynau cyfredol ar Docker, darganfyddais nad yw OpenCV 4.1.2 yn gweithio gyda Mobile SSD v1_coco_2018_01_28, a bu'n rhaid i mi rolio'n ôl i'r 11/06_2017 profedig.
Ar ddechrau'r gwasanaeth, rydyn ni'n llwytho enwau'r dosbarthiadau a'r rhwydwaith:
def init():
tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)
Ar dociwr lleol (ar liniadur nad yw'n ifanc iawn) mae'n cymryd 0.3 eiliad, ar Raspberry - 3.5.
Gadewch i ni ddechrau'r cyfrifiad:
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()
Dociwr - 0.2 eiliad, Mafon - 1.7.
Troi gwacáu tensor yn json darllenadwy:
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
Ymhellach
Opsiwn arall, lle mae mwy o waith yn cael ei symud i'r gweinydd: mae ei hun yn cylchu'r gwrthrychau a ddarganfuwyd ac yn dychwelyd y ddelwedd orffenedig.
Mae'r opsiwn hwn yn dda lle nad ydym am lusgo opencv i'r gweinydd.
Dociwr
Rydyn ni'n casglu'r ddelwedd.
Mae'r cod yn cael ei gribo a'i bostio ymlaen
Fel platfform, byddwn yn cymryd yr un Debian Stretch ag ar Raspberry - ni fyddwn yn gwyro oddi wrth y pentwr technoleg profedig.
Mae angen i chi osod fflasg, protobuf, ceisiadau, opencv_python, lawrlwytho SSD Symudol, cod gweinydd o Github a chychwyn y gweinydd.
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"]
Syml
Cyhoeddi i Docker Hub
Mae cofrestrfeydd docwyr yn lluosi ar gyflymder nad yw'n llai na synwyryddion cwmwl.
Er mwyn peidio â thrafferthu, byddwn yn mynd drwodd yn geidwadol
- Cofrestrwch
- Mewngofnodi:
mewngofnodi docwr - Gadewch i ni feddwl am enw ystyrlon:
tag docwr opencv-canfod tprlab/opencv-detect-ssd - Llwythwch y ddelwedd i'r gweinydd:
gwthio docwr tprlab/opencv-detect-ssd
Rydym yn lansio yn y cwmwl
Mae'r dewis o ble i redeg y cynhwysydd hefyd yn eithaf eang.
Mae'r holl chwaraewyr mawr (Google, Microsoft, Amazon) yn cynnig micro-enghraifft am ddim am y flwyddyn gyntaf.
Ar ôl arbrofi gyda Microsoft Azure a Google Cloud, fe wnes i setlo ar yr olaf oherwydd iddo gymryd i ffwrdd yn gyflymach.
Ni ysgrifennais gyfarwyddiadau yma, gan fod y rhan hon yn benodol iawn i'r darparwr a ddewiswyd.
Rhoddais gynnig ar wahanol opsiynau caledwedd,
Lefelau isel (rhannu ac ymroddedig) - 0.4 - 0.5 eiliad.
Ceir mwy pwerus - 0.25 - 0.3.
Wel, hyd yn oed yn y senario waethaf, mae'r enillion dair gwaith, gallwch chi geisio.
Fideo
Rydym yn lansio ffrwd fideo OpenCV syml ar Raspberry, gan ganfod trwy Google Cloud.
Ar gyfer yr arbrawf, defnyddiwyd ffeil fideo a gafodd ei ffilmio ar un adeg ar groesffordd ar hap.
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")
Gyda'r synhwyrydd nid ydym yn cael mwy na thair ffrâm yr eiliad, mae popeth yn mynd yn araf iawn.
Os cymerwch beiriant pwerus i mewn i GCloud, gallwch ganfod 4-5 ffrâm yr eiliad, ond mae'r gwahaniaeth bron yn anweledig i'r llygad, mae'n dal yn araf.
Nid oes gan y cwmwl a chostau cludiant unrhyw beth i'w wneud ag ef; mae'r synhwyrydd yn rhedeg ar galedwedd arferol ac yn gweithio mor gyflym.
Ffyn Cyfrifiadur Niwral
Ni allwn wrthsefyll a rhedeg y meincnod ar NCS.
Roedd cyflymder y synhwyrydd ychydig yn arafach na 0.1 eiliad, beth bynnag 2-3 gwaith yn gyflymach na'r cwmwl ar beiriant gwan, h.y. 8-9 ffrâm yr eiliad.
Esbonnir y gwahaniaeth mewn canlyniadau gan y ffaith bod NCS yn rhedeg fersiwn SSD Symudol 2018_01_28.
PS Yn ogystal, mae arbrofion wedi dangos bod peiriant bwrdd gwaith eithaf pwerus gyda phrosesydd I7 yn dangos canlyniadau ychydig yn well a bu'n bosibl gwasgu 10 ffrâm yr eiliad arno.
Clwstwr
Aeth yr arbrawf ymhellach a gosodais y synhwyrydd ar bum nod yn Google Kubernetes.
Roedd y codennau eu hunain yn wan ac ni allai pob un ohonynt brosesu mwy na 2 ffrâm yr eiliad.
Ond os ydych chi'n rhedeg clwstwr gyda nodau N a fframiau dosrannu mewn edafedd N, yna gyda nifer digonol o nodau (5) gallwch chi gyflawni'r 10 ffrâm yr eiliad a ddymunir.
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
Dyma beth ddigwyddodd:
Ychydig yn llai cyflym na gyda NCS, ond yn fwy egnïol nag mewn un ffrwd.
Nid yw'r fantais, wrth gwrs, yn llinol - mae troshaenau ar gyfer cydamseru a chopïo dwfn o ddelweddau opencv.
Casgliad
Yn gyffredinol, mae'r arbrawf yn ein galluogi i ddod i'r casgliad, os ceisiwch, y gallwch chi ddianc â chwmwl syml.
Ond mae bwrdd gwaith pwerus neu galedwedd lleol yn caniatáu ichi gyflawni canlyniadau gwell, a heb unrhyw driciau.
cyfeiriadau
Ffynhonnell: hab.com