ராஸ்பெர்ரி பையில் கிளவுட் ஆப்ஜெக்ட் டிடெக்டரின் வீடியோ

முன்னுரையாக

டெஸ்லாவின் தன்னியக்க பைலட் எப்படி சாலையைப் பார்க்கிறார் என்பதைக் காட்டும் வீடியோ இப்போது இணையத்தில் பரவி வருகிறது.

டிடெக்டர் மூலம் செறிவூட்டப்பட்ட வீடியோவை நிகழ்நேரத்தில் ஒளிபரப்ப நான் நீண்ட காலமாக அரிப்புக் கொண்டிருந்தேன்.

ராஸ்பெர்ரி பையில் கிளவுட் ஆப்ஜெக்ட் டிடெக்டரின் வீடியோ

பிரச்சனை என்னவென்றால், நான் ராஸ்பெர்ரியிலிருந்து வீடியோவை ஒளிபரப்ப விரும்புகிறேன், மேலும் அதில் உள்ள நியூரல் நெட்வொர்க் டிடெக்டரின் செயல்திறன் விரும்பத்தக்கதாக உள்ளது.

இன்டெல் நியூரல் கம்ப்யூட்டர் ஸ்டிக்

நான் வெவ்வேறு தீர்வுகளைக் கருத்தில் கொண்டேன்.

В கடந்த கட்டுரை இன்டெல் நியூரல் கம்ப்யூட்டர் ஸ்டிக் மூலம் பரிசோதனை செய்யப்பட்டது. வன்பொருள் சக்தி வாய்ந்தது, ஆனால் அதன் சொந்த பிணைய வடிவம் தேவைப்படுகிறது.

இன்டெல் முக்கிய கட்டமைப்புகளுக்கு மாற்றிகளை வழங்கினாலும், பல ஆபத்துகள் உள்ளன.

எடுத்துக்காட்டாக, தேவையான நெட்வொர்க்கின் வடிவம் பொருந்தாமல் இருக்கலாம், அது இணக்கமாக இருந்தால், சில அடுக்குகள் சாதனத்தில் ஆதரிக்கப்படாமல் போகலாம், மேலும் அவை ஆதரிக்கப்பட்டால், மாற்றும் செயல்பாட்டின் போது பிழைகள் ஏற்படலாம், இதன் விளைவாக வெளியீட்டில் சில விசித்திரமான விஷயங்களைப் பெறுகிறோம்.

பொதுவாக, நீங்கள் சில வகையான தன்னிச்சையான நரம்பியல் நெட்வொர்க்கை விரும்பினால், அது NCS உடன் வேலை செய்யாமல் போகலாம். எனவே, மிகவும் பரவலான மற்றும் அணுகக்கூடிய கருவிகளைப் பயன்படுத்தி சிக்கலைத் தீர்க்க முயற்சிக்க முடிவு செய்தேன்.

மேகம்

உள்ளூர் வன்பொருள் தீர்வுக்கான தெளிவான மாற்று மேகக்கணிக்குச் செல்வதாகும்.

ஆயத்த விருப்பங்கள் - என் கண்கள் காட்டுத்தனமாக ஓடுகின்றன.

அனைத்து தலைவர்களும்:

... மற்றும் டஜன் கணக்கான குறைவாக அறியப்பட்டவை.

இந்த வகையைத் தேர்ந்தெடுப்பது எளிதானது அல்ல.

நான் தேர்வு செய்ய வேண்டாம் என்று முடிவு செய்தேன், ஆனால் ஓபன்சிவியில் உள்ள நல்ல பழைய வேலை திட்டத்தை டோக்கரில் போர்த்தி அதை கிளவுட்டில் இயக்க வேண்டும்.

இந்த அணுகுமுறையின் நன்மை நெகிழ்வுத்தன்மை மற்றும் கட்டுப்பாடு - நீங்கள் நரம்பியல் நெட்வொர்க், ஹோஸ்டிங், சர்வர் - பொதுவாக, எந்த விருப்பத்தையும் மாற்றலாம்.

Сервер

உள்ளூர் முன்மாதிரியுடன் ஆரம்பிக்கலாம்.

பாரம்பரியமாக நான் REST API, OpenCV மற்றும் MobileSSD நெட்வொர்க்கிற்கு Flask ஐப் பயன்படுத்துகிறேன்.

டோக்கரில் தற்போதைய பதிப்புகளை நிறுவிய பிறகு, OpenCV 4.1.2 மொபைல் 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 வினாடிகள், ராஸ்பெர்ரியில் - 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 நொடி, ராஸ்பெர்ரி - 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

மேலும் Flask வழியாக இந்த செயல்பாட்டை ஏற்றுமதி செய்யவும்(உள்ளீடு என்பது ஒரு படம், வெளியீடு என்பது json இல் உள்ள டிடெக்டரின் முடிவுகள்).

ஒரு மாற்று விருப்பம், இதில் அதிக வேலைகள் சேவையகத்திற்கு மாற்றப்படும்: அதுவே கண்டுபிடிக்கப்பட்ட பொருட்களை வட்டமிட்டு முடிக்கப்பட்ட படத்தைத் தருகிறது.

Opencv ஐ சர்வருக்கு இழுக்க விரும்பாத இடத்தில் இந்த விருப்பம் நல்லது.

டோக்கர்

நாங்கள் படத்தை சேகரிக்கிறோம்.

குறியீடு சீப்பு மற்றும் இடுகையிடப்பட்டது கிதுப், டோக்கர் அங்கிருந்து நேரடியாக எடுத்துச் செல்வார்.

ஒரு தளமாக, ராஸ்பெர்ரியில் உள்ள அதே டெபியன் நீட்சியை நாங்கள் எடுப்போம் - நிரூபிக்கப்பட்ட தொழில்நுட்ப அடுக்கில் இருந்து நாங்கள் விலக மாட்டோம்.

நீங்கள் பிளாஸ்க், ப்ரோடோபஃப், கோரிக்கைகள், opencv_python ஆகியவற்றை நிறுவ வேண்டும், மொபைல் SSD, சர்வர் குறியீட்டை Github இலிருந்து பதிவிறக்கம் செய்து சர்வரைத் தொடங்க வேண்டும்.

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 இல் வெளியிடுகிறது

டோக்கர் ரெஜிஸ்ட்ரிகள் கிளவுட் டிடெக்டர்களைக் காட்டிலும் குறைவான வேகத்தில் பெருகும்.

தொந்தரவு செய்யாமல் இருக்க, நாங்கள் பழமைவாதமாக செல்வோம் DockerHub.

  1. பதிவு
  2. உள்நுழைய:
    டாக்கர் உள்நுழைவு
  3. ஒரு அர்த்தமுள்ள பெயரைக் கொண்டு வருவோம்:
    டோக்கர் டேக் opencv-detect tprlab/opencv-detect-ssd
  4. படத்தை சர்வரில் பதிவேற்றவும்:
    docker push tprlab/opencv-detect-ssd

நாங்கள் கிளவுட்டில் தொடங்குகிறோம்

கொள்கலனை எங்கு இயக்குவது என்ற தேர்வும் மிகவும் விரிவானது.

அனைத்து பெரிய பிளேயர்களும் (கூகிள், மைக்ரோசாப்ட், அமேசான்) முதல் வருடத்திற்கு இலவசமாக மைக்ரோ-இன்சென்ஸ் வழங்குகின்றன.
மைக்ரோசாஃப்ட் அஸூர் மற்றும் கூகுள் கிளவுட் ஆகியவற்றுடன் பரிசோதனை செய்த பிறகு, நான் பிந்தையதைத் தீர்மானித்தேன், ஏனெனில் அது வேகமாக வெளியேறியது.

நான் இங்கே வழிமுறைகளை எழுதவில்லை, ஏனெனில் இந்த பகுதி தேர்ந்தெடுக்கப்பட்ட வழங்குநருக்கு மிகவும் குறிப்பிட்டது.

நான் வெவ்வேறு வன்பொருள் விருப்பங்களை முயற்சித்தேன்,
குறைந்த அளவுகள் (பகிரப்பட்ட மற்றும் அர்ப்பணிக்கப்பட்ட) - 0.4 - 0.5 வினாடிகள்.
அதிக சக்திவாய்ந்த கார்கள் - 0.25 - 0.3.
சரி, மோசமான சூழ்நிலையில் கூட, வெற்றிகள் மூன்று மடங்கு, நீங்கள் முயற்சி செய்யலாம்.

வீடியோ

Google Cloud மூலம் கண்டறியும் எளிய OpenCV வீடியோ ஸ்ட்ரீமரை Raspberry இல் தொடங்குகிறோம்.
சோதனைக்காக, ஒரு முறை சீரற்ற சந்திப்பில் படமாக்கப்பட்ட வீடியோ கோப்பு பயன்படுத்தப்பட்டது.


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 பிரேம்களைக் கண்டறியலாம், ஆனால் வித்தியாசம் கண்ணுக்கு கிட்டத்தட்ட கண்ணுக்கு தெரியாதது, அது இன்னும் மெதுவாக உள்ளது.

ராஸ்பெர்ரி பையில் கிளவுட் ஆப்ஜெக்ட் டிடெக்டரின் வீடியோ

கிளவுட் மற்றும் போக்குவரத்து செலவுகள் இதற்கும் எந்த தொடர்பும் இல்லை; டிடெக்டர் சாதாரண வன்பொருளில் இயங்குகிறது மற்றும் அத்தகைய வேகத்தில் வேலை செய்கிறது.

நியூரல் கம்ப்யூட்டர் ஸ்டிக்

என்னால் எதிர்க்க முடியவில்லை மற்றும் NCS இல் பெஞ்ச்மார்க்கை இயக்க முடியவில்லை.

டிடெக்டரின் வேகம் 0.1 வினாடிகளை விட சற்றே மெதுவாக இருந்தது, எந்தவொரு சந்தர்ப்பத்திலும் பலவீனமான இயந்திரத்தில் மேகத்தை விட 2-3 மடங்கு வேகமாக இருந்தது, அதாவது வினாடிக்கு 8-9 பிரேம்கள்.

ராஸ்பெர்ரி பையில் கிளவுட் ஆப்ஜெக்ட் டிடெக்டரின் வீடியோ

NCS மொபைல் SSD பதிப்பு 2018_01_28ஐ இயக்கியதன் மூலம் முடிவுகளில் உள்ள வேறுபாடு விளக்கப்பட்டுள்ளது.

பி.எஸ். கூடுதலாக, சோதனைகள் 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ஐ விட சற்று குறைவான வேகம், ஆனால் ஒரு ஸ்ட்ரீமை விட அதிக வீரியம் கொண்டது.

ஆதாயம், நிச்சயமாக, நேரியல் அல்ல - ஓபன்சிவி படங்களை ஒத்திசைத்தல் மற்றும் ஆழமாக நகலெடுப்பதற்கான மேலடுக்குகள் உள்ளன.

முடிவுக்கு

ஒட்டுமொத்தமாக, நீங்கள் முயற்சித்தால், எளிய மேகத்துடன் நீங்கள் தப்பித்துக்கொள்ளலாம் என்ற முடிவுக்கு இந்தப் பரிசோதனை அனுமதிக்கிறது.

ஆனால் சக்திவாய்ந்த டெஸ்க்டாப் அல்லது உள்ளூர் வன்பொருள் எந்த தந்திரமும் இல்லாமல் சிறந்த முடிவுகளை அடைய உங்களை அனுமதிக்கிறது.

குறிப்புகள்

ஆதாரம்: www.habr.com

கருத்தைச் சேர்