python - Tensorflow और OpenCV वास्तविक समय वर्गीकरण



machine-learning classification (1)

मैं अपने वांछित वस्तुओं को वर्गीकृत करने के लिए नेटवर्क को प्रशिक्षित करने के लिए मशीन सीखने के लिए परीक्षण कर रहा हूं और टीएस स्थापना मॉडल का उपयोग कर रहा हूं।

प्रारंभ में, मेरी भविष्यवाणियों को स्थानीय रूप से संग्रहीत छवियों पर चलाया गया था और मुझे एहसास हुआ कि यह फ़ाइल के ग्राफ को अप्रतिबंधित करने के लिए 2-5 सेकंड के बीच कहीं और वास्तविक भविष्यवाणियों को चलाने के लिए एक ही समय के आसपास ले गया।

इसके बाद, मैंने अपने कोड को ओपनसीवी से कैमरा फीड को शामिल करने के लिए अनुकूलित किया, लेकिन उपर्युक्त समय के साथ, वीडियो लेंस अनिवार्य हैं

शुरुआती ग्राफ लोड के दौरान एक बार हिट की उम्मीद थी; यही वजह है कि initialSetup() पहले से भाग गया है, लेकिन 2-5 सेकंड बस बेतुका है मुझे लगता है कि मेरे वर्तमान आवेदन के साथ; वास्तविक समय वर्गीकरण, यह लोड करने का सबसे अच्छा तरीका नहीं है। क्या ऐसा करने का एक और तरीका है? मुझे मोबाइल संस्करण के साथ पता है कि टीएस ग्राफ को नीचे ट्रिम करने की अनुशंसा करता है। इसे नीचे जाने के लिए यहां जाने का तरीका हो सकता है? अगर यह मेरे ग्राफ़ का विषय है तो वर्तमान में 87.4 एमबी है

इस के साथ, भविष्यवाणी की प्रक्रिया को गति देने का एक तरीका है?

import os
import cv2
import timeit
import numpy as np
import tensorflow as tf

camera = cv2.VideoCapture(0)

# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line
               in tf.gfile.GFile('retrained_labels.txt')]

def grabVideoFeed():
    grabbed, frame = camera.read()
    return frame if grabbed else None

def initialSetup():
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    start_time = timeit.default_timer()

    # This takes 2-5 seconds to run
    # Unpersists graph from file
    with tf.gfile.FastGFile('retrained_graph.pb', 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        tf.import_graph_def(graph_def, name='')

    print 'Took {} seconds to unpersist the graph'.format(timeit.default_timer() - start_time)

def classify(image_data):
    print '********* Session Start *********'

    with tf.Session() as sess:
        start_time = timeit.default_timer()

        # Feed the image_data as input to the graph and get first prediction
        softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')

        print 'Tensor', softmax_tensor

        print 'Took {} seconds to feed data to graph'.format(timeit.default_timer() - start_time)

        start_time = timeit.default_timer()

        # This takes 2-5 seconds as well
        predictions = sess.run(softmax_tensor, {'Mul:0': image_data})

        print 'Took {} seconds to perform prediction'.format(timeit.default_timer() - start_time)

        start_time = timeit.default_timer()

        # Sort to show labels of first prediction in order of confidence
        top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

        print 'Took {} seconds to sort the predictions'.format(timeit.default_timer() - start_time)

        for node_id in top_k:
            human_string = label_lines[node_id]
            score = predictions[0][node_id]
            print('%s (score = %.5f)' % (human_string, score))

        print '********* Session Ended *********'

initialSetup()

while True:
    frame = grabVideoFeed()

    if frame is None:
        raise SystemError('Issue grabbing the frame')

    frame = cv2.resize(frame, (299, 299), interpolation=cv2.INTER_CUBIC)

    # adhere to TS graph input structure
    numpy_frame = np.asarray(frame)
    numpy_frame = cv2.normalize(numpy_frame.astype('float'), None, -0.5, .5, cv2.NORM_MINMAX)
    numpy_final = np.expand_dims(numpy_frame, axis=0)

    classify(numpy_final)

    cv2.imshow('Main', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

camera.release()
cv2.destroyAllWindows()

1 संपादित करें

मेरे कोड को डीबग करने के बाद, मुझे एहसास हुआ कि सत्र सृजन एक संसाधन और समय लेने वाला ऑपरेशन है।

पूर्व कोड में, पूर्वानुमानों को चलाने के शीर्ष पर प्रत्येक OpenCV फ़ीड के लिए एक नया सत्र बनाया गया था। ओपनसीवी ऑपरेशन को एक सत्र के अंदर लपेटने से बड़े पैमाने पर सुधार होता है लेकिन यह अभी भी प्रारंभिक रन पर बड़े पैमाने पर ओवरहेड जोड़ता है; पूर्वानुमान 2-3 सेकंड लेता है इसके बाद, भविष्यवाणी में लगभग 0.5 सेंटीमीटर लगते हैं जिससे कैमरे का फीड अभी भी कम हो जाता है।

import os
import cv2
import timeit
import numpy as np
import tensorflow as tf

camera = cv2.VideoCapture(0)

# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line
               in tf.gfile.GFile('retrained_labels.txt')]

def grabVideoFeed():
    grabbed, frame = camera.read()
    return frame if grabbed else None

def initialSetup():
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    start_time = timeit.default_timer()

    # This takes 2-5 seconds to run
    # Unpersists graph from file
    with tf.gfile.FastGFile('retrained_graph.pb', 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        tf.import_graph_def(graph_def, name='')

    print 'Took {} seconds to unpersist the graph'.format(timeit.default_timer() - start_time)

initialSetup()

with tf.Session() as sess:
    start_time = timeit.default_timer()

    # Feed the image_data as input to the graph and get first prediction
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')

    print 'Took {} seconds to feed data to graph'.format(timeit.default_timer() - start_time)

    while True:
        frame = grabVideoFeed()

        if frame is None:
            raise SystemError('Issue grabbing the frame')

        frame = cv2.resize(frame, (299, 299), interpolation=cv2.INTER_CUBIC)

        cv2.imshow('Main', frame)

        # adhere to TS graph input structure
        numpy_frame = np.asarray(frame)
        numpy_frame = cv2.normalize(numpy_frame.astype('float'), None, -0.5, .5, cv2.NORM_MINMAX)
        numpy_final = np.expand_dims(numpy_frame, axis=0)

        start_time = timeit.default_timer()

        # This takes 2-5 seconds as well
        predictions = sess.run(softmax_tensor, {'Mul:0': numpy_final})

        print 'Took {} seconds to perform prediction'.format(timeit.default_timer() - start_time)

        start_time = timeit.default_timer()

        # Sort to show labels of first prediction in order of confidence
        top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

        print 'Took {} seconds to sort the predictions'.format(timeit.default_timer() - start_time)

        for node_id in top_k:
            human_string = label_lines[node_id]
            score = predictions[0][node_id]
            print('%s (score = %.5f)' % (human_string, score))

        print '********* Session Ended *********'

        if cv2.waitKey(1) & 0xFF == ord('q'):
            sess.close()
            break

camera.release()
cv2.destroyAllWindows()

2 संपादित करें

चारों तरफ नगण्य होने के बाद, मैं ग्राफ़ क्वानाइजेशन और ग्राफ रूपांतरण में ठोकर खाई और ये परिणाम प्राप्त हुए।

मूल ग्राफ़: 87.4 एमबी

क्वांटिफाइड ग्राफ़: 87.5 एमबी

ट्रांसफ़ॉर्टेड ग्राफ़: 87.1 एमबी

आठ बिट गणना: 22 एमबी, लेकिन इस पर उपयोग में भाग गया


मैंने हाल ही में कवियों के लिए TensorFlow का उपयोग करके छोटे मोबिलैनेट मॉडल को प्रशिक्षित करने का विकल्प जोड़ा है: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/docs_src/tutorials/image_retraining.md#other-model-architectures

इससे कुछ सटीकता की कीमत पर आपके वर्गीकरण को गति देने में मदद मिल सकती है।





classification