# USAGE
# python real_time_object_detection.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel

# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2
import socket
import threading


def remote_server():
    global rx_message
    global tx_message
    global conn, addr
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serv.bind(('10.0.0.90', 12345))
    serv.listen(5)
    while True:
        conn, addr = serv.accept()

        try:
            print("connected to: {}".format(addr))
            # conn.send(bytes("Hello Christy's Server \n", encoding='utf8'))
            # conn.send(bytes(tx_message, encoding='utf8'))
            print(tx_message)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                rx_message = str(data).rstrip()
                print(rx_message)
            # conn.send(bytes(tx_message, encoding='utf8'))
        finally:
            conn.close()
            print('client disconnected')


serverThread = threading.Thread(target=remote_server)
serverThread.start()

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--prototxt", required=True,
                help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
                help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2,
                help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

# initialize the list of class labels MobileNet SSD was trained to
# detect, then generate a set of bounding box colors for each class
CLASSES = ["kiwi", "cherry", "cabbage", "spinach", "bok_choy",
           "tomato", "pepper", "carrot", "peach", "banana", "apricot", "asparagus",
           "celery", "onion", "orange", "broccoli", "garlic", "ginger",
           "lemon", "pear", "apple", "okra"]
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))

# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

# initialize the video stream, allow the cammera sensor to warmup,
# and initialize the FPS counter
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
# vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)
fps = FPS().start()

# holders for incoming and outgoing messages
tx_message = "null,0"
rx_message = ""
conn, addr = (0,0)

# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream and resize it
    # to have a maximum width of 400 pixels
    frame = vs.read()
    frame = imutils.resize(frame, width=400)

    # grab the frame dimensions and convert it to a blob
    (h, w) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),
                                 0.007843, (300, 300), 127.5)

    # pass the blob through the network and obtain the detections and
    # predictions
    net.setInput(blob)
    detections = net.forward()

    # loop over the detections
    for i in np.arange(0, detections.shape[2]):
        # extract the confidence (i.e., probability) associated with
        # the prediction
        confidence = detections[0, 0, i, 2]

        # filter out weak detections by ensuring the `confidence` is
        # greater than the minimum confidence
        if confidence > args["confidence"]:
            # extract the index of the class label from the
            # `detections`, then compute the (x, y)-coordinates of
            # the bounding box for the object
            idx = int(detections[0, 0, i, 1])
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")

            # draw the prediction on the frame
            label = "{}: {:.2f}%".format(CLASSES[idx],
                                         confidence * 100)
            cv2.rectangle(frame, (startX, startY), (endX, endY),
                          COLORS[idx], 2)
            y = startY - 15 if startY - 15 > 15 else startY + 15
            cv2.putText(frame, label, (startX, y),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)

            tx_message = "{},{:.2f}%\n".format(CLASSES[idx], confidence * 100)
            if conn != 0:
                conn.send(bytes(tx_message, encoding='utf8'))

    # show the output frame
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

    # update the FPS counter
    fps.update()

# stop the timer and display FPS information
fps.stop()
print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

c9a03dc0f6e9229bf1386e47e95927445694c180
<mask token>


def remote_server():
    global rx_message
    global tx_message
    global conn, addr
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serv.bind(('10.0.0.90', 12345))
    serv.listen(5)
    while True:
        conn, addr = serv.accept()
        try:
            print('connected to: {}'.format(addr))
            print(tx_message)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                rx_message = str(data).rstrip()
                print(rx_message)
        finally:
            conn.close()
            print('client disconnected')


<mask token>

<mask token>


def remote_server():
    global rx_message
    global tx_message
    global conn, addr
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serv.bind(('10.0.0.90', 12345))
    serv.listen(5)
    while True:
        conn, addr = serv.accept()
        try:
            print('connected to: {}'.format(addr))
            print(tx_message)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                rx_message = str(data).rstrip()
                print(rx_message)
        finally:
            conn.close()
            print('client disconnected')


<mask token>
serverThread.start()
<mask token>
ap.add_argument('-p', '--prototxt', required=True, help=
    "path to Caffe 'deploy' prototxt file")
ap.add_argument('-m', '--model', required=True, help=
    'path to Caffe pre-trained model')
ap.add_argument('-c', '--confidence', type=float, default=0.2, help=
    'minimum probability to filter weak detections')
<mask token>
print('[INFO] loading model...')
<mask token>
print('[INFO] starting video stream...')
<mask token>
time.sleep(2.0)
<mask token>
while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    h, w = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (
        300, 300), 127.5)
    net.setInput(blob)
    detections = net.forward()
    for i in np.arange(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > args['confidence']:
            idx = int(detections[0, 0, i, 1])
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            startX, startY, endX, endY = box.astype('int')
            label = '{}: {:.2f}%'.format(CLASSES[idx], confidence * 100)
            cv2.rectangle(frame, (startX, startY), (endX, endY), COLORS[idx], 2
                )
            y = startY - 15 if startY - 15 > 15 else startY + 15
            cv2.putText(frame, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX,
                0.5, COLORS[idx], 2)
            tx_message = '{},{:.2f}%\n'.format(CLASSES[idx], confidence * 100)
            if conn != 0:
                conn.send(bytes(tx_message, encoding='utf8'))
    cv2.imshow('Frame', frame)
    key = cv2.waitKey(1) & 255
    if key == ord('q'):
        break
    fps.update()
fps.stop()
print('[INFO] elapsed time: {:.2f}'.format(fps.elapsed()))
print('[INFO] approx. FPS: {:.2f}'.format(fps.fps()))
cv2.destroyAllWindows()
vs.stop()

<mask token>


def remote_server():
    global rx_message
    global tx_message
    global conn, addr
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serv.bind(('10.0.0.90', 12345))
    serv.listen(5)
    while True:
        conn, addr = serv.accept()
        try:
            print('connected to: {}'.format(addr))
            print(tx_message)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                rx_message = str(data).rstrip()
                print(rx_message)
        finally:
            conn.close()
            print('client disconnected')


serverThread = threading.Thread(target=remote_server)
serverThread.start()
ap = argparse.ArgumentParser()
ap.add_argument('-p', '--prototxt', required=True, help=
    "path to Caffe 'deploy' prototxt file")
ap.add_argument('-m', '--model', required=True, help=
    'path to Caffe pre-trained model')
ap.add_argument('-c', '--confidence', type=float, default=0.2, help=
    'minimum probability to filter weak detections')
args = vars(ap.parse_args())
CLASSES = ['kiwi', 'cherry', 'cabbage', 'spinach', 'bok_choy', 'tomato',
    'pepper', 'carrot', 'peach', 'banana', 'apricot', 'asparagus', 'celery',
    'onion', 'orange', 'broccoli', 'garlic', 'ginger', 'lemon', 'pear',
    'apple', 'okra']
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))
print('[INFO] loading model...')
net = cv2.dnn.readNetFromCaffe(args['prototxt'], args['model'])
print('[INFO] starting video stream...')
vs = VideoStream(src=0).start()
time.sleep(2.0)
fps = FPS().start()
tx_message = 'null,0'
rx_message = ''
conn, addr = 0, 0
while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    h, w = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (
        300, 300), 127.5)
    net.setInput(blob)
    detections = net.forward()
    for i in np.arange(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > args['confidence']:
            idx = int(detections[0, 0, i, 1])
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            startX, startY, endX, endY = box.astype('int')
            label = '{}: {:.2f}%'.format(CLASSES[idx], confidence * 100)
            cv2.rectangle(frame, (startX, startY), (endX, endY), COLORS[idx], 2
                )
            y = startY - 15 if startY - 15 > 15 else startY + 15
            cv2.putText(frame, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX,
                0.5, COLORS[idx], 2)
            tx_message = '{},{:.2f}%\n'.format(CLASSES[idx], confidence * 100)
            if conn != 0:
                conn.send(bytes(tx_message, encoding='utf8'))
    cv2.imshow('Frame', frame)
    key = cv2.waitKey(1) & 255
    if key == ord('q'):
        break
    fps.update()
fps.stop()
print('[INFO] elapsed time: {:.2f}'.format(fps.elapsed()))
print('[INFO] approx. FPS: {:.2f}'.format(fps.fps()))
cv2.destroyAllWindows()
vs.stop()

from imutils.video import VideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2
import socket
import threading


def remote_server():
    global rx_message
    global tx_message
    global conn, addr
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serv.bind(('10.0.0.90', 12345))
    serv.listen(5)
    while True:
        conn, addr = serv.accept()
        try:
            print('connected to: {}'.format(addr))
            print(tx_message)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                rx_message = str(data).rstrip()
                print(rx_message)
        finally:
            conn.close()
            print('client disconnected')


serverThread = threading.Thread(target=remote_server)
serverThread.start()
ap = argparse.ArgumentParser()
ap.add_argument('-p', '--prototxt', required=True, help=
    "path to Caffe 'deploy' prototxt file")
ap.add_argument('-m', '--model', required=True, help=
    'path to Caffe pre-trained model')
ap.add_argument('-c', '--confidence', type=float, default=0.2, help=
    'minimum probability to filter weak detections')
args = vars(ap.parse_args())
CLASSES = ['kiwi', 'cherry', 'cabbage', 'spinach', 'bok_choy', 'tomato',
    'pepper', 'carrot', 'peach', 'banana', 'apricot', 'asparagus', 'celery',
    'onion', 'orange', 'broccoli', 'garlic', 'ginger', 'lemon', 'pear',
    'apple', 'okra']
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))
print('[INFO] loading model...')
net = cv2.dnn.readNetFromCaffe(args['prototxt'], args['model'])
print('[INFO] starting video stream...')
vs = VideoStream(src=0).start()
time.sleep(2.0)
fps = FPS().start()
tx_message = 'null,0'
rx_message = ''
conn, addr = 0, 0
while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    h, w = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (
        300, 300), 127.5)
    net.setInput(blob)
    detections = net.forward()
    for i in np.arange(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > args['confidence']:
            idx = int(detections[0, 0, i, 1])
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            startX, startY, endX, endY = box.astype('int')
            label = '{}: {:.2f}%'.format(CLASSES[idx], confidence * 100)
            cv2.rectangle(frame, (startX, startY), (endX, endY), COLORS[idx], 2
                )
            y = startY - 15 if startY - 15 > 15 else startY + 15
            cv2.putText(frame, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX,
                0.5, COLORS[idx], 2)
            tx_message = '{},{:.2f}%\n'.format(CLASSES[idx], confidence * 100)
            if conn != 0:
                conn.send(bytes(tx_message, encoding='utf8'))
    cv2.imshow('Frame', frame)
    key = cv2.waitKey(1) & 255
    if key == ord('q'):
        break
    fps.update()
fps.stop()
print('[INFO] elapsed time: {:.2f}'.format(fps.elapsed()))
print('[INFO] approx. FPS: {:.2f}'.format(fps.fps()))
cv2.destroyAllWindows()
vs.stop()

# USAGE
# python real_time_object_detection.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel

# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2
import socket
import threading


def remote_server():
    global rx_message
    global tx_message
    global conn, addr
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serv.bind(('10.0.0.90', 12345))
    serv.listen(5)
    while True:
        conn, addr = serv.accept()

        try:
            print("connected to: {}".format(addr))
            # conn.send(bytes("Hello Christy's Server \n", encoding='utf8'))
            # conn.send(bytes(tx_message, encoding='utf8'))
            print(tx_message)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                rx_message = str(data).rstrip()
                print(rx_message)
            # conn.send(bytes(tx_message, encoding='utf8'))
        finally:
            conn.close()
            print('client disconnected')


serverThread = threading.Thread(target=remote_server)
serverThread.start()

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--prototxt", required=True,
                help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
                help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2,
                help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

# initialize the list of class labels MobileNet SSD was trained to
# detect, then generate a set of bounding box colors for each class
CLASSES = ["kiwi", "cherry", "cabbage", "spinach", "bok_choy",
           "tomato", "pepper", "carrot", "peach", "banana", "apricot", "asparagus",
           "celery", "onion", "orange", "broccoli", "garlic", "ginger",
           "lemon", "pear", "apple", "okra"]
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))

# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

# initialize the video stream, allow the cammera sensor to warmup,
# and initialize the FPS counter
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
# vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)
fps = FPS().start()

# holders for incoming and outgoing messages
tx_message = "null,0"
rx_message = ""
conn, addr = (0,0)

# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream and resize it
    # to have a maximum width of 400 pixels
    frame = vs.read()
    frame = imutils.resize(frame, width=400)

    # grab the frame dimensions and convert it to a blob
    (h, w) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),
                                 0.007843, (300, 300), 127.5)

    # pass the blob through the network and obtain the detections and
    # predictions
    net.setInput(blob)
    detections = net.forward()

    # loop over the detections
    for i in np.arange(0, detections.shape[2]):
        # extract the confidence (i.e., probability) associated with
        # the prediction
        confidence = detections[0, 0, i, 2]

        # filter out weak detections by ensuring the `confidence` is
        # greater than the minimum confidence
        if confidence > args["confidence"]:
            # extract the index of the class label from the
            # `detections`, then compute the (x, y)-coordinates of
            # the bounding box for the object
            idx = int(detections[0, 0, i, 1])
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")

            # draw the prediction on the frame
            label = "{}: {:.2f}%".format(CLASSES[idx],
                                         confidence * 100)
            cv2.rectangle(frame, (startX, startY), (endX, endY),
                          COLORS[idx], 2)
            y = startY - 15 if startY - 15 > 15 else startY + 15
            cv2.putText(frame, label, (startX, y),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)

            tx_message = "{},{:.2f}%\n".format(CLASSES[idx], confidence * 100)
            if conn != 0:
                conn.send(bytes(tx_message, encoding='utf8'))

    # show the output frame
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

    # update the FPS counter
    fps.update()

# stop the timer and display FPS information
fps.stop()
print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()
