1. skeleton now works completely from taking video to putting together a file. 2. outputframe uses mp.Queue for taking frames from. 3. Still cannot display frames as they are being received in outputframeThread owing to a bug related to PyQt5.refactoring
| @@ -11,7 +11,6 @@ class PARAMS(object): | |||||
| _YOLOV3_OD_INPUT_IMAGE_SIZE = (416,416) #(Width, Height) | _YOLOV3_OD_INPUT_IMAGE_SIZE = (416,416) #(Width, Height) | ||||
| #_YOLOV3_OD_NUMBER_PLATE_OBJECT_LIST = ['car','bus','truck','motorbike'] | #_YOLOV3_OD_NUMBER_PLATE_OBJECT_LIST = ['car','bus','truck','motorbike'] | ||||
| _YOLOV3_OD_NUMBER_PLATE_OBJECT_LIST = ['car'] | _YOLOV3_OD_NUMBER_PLATE_OBJECT_LIST = ['car'] | ||||
| _OBJECT_DETECTION_PROCESS_CORES = 2 | |||||
| # Number Plate Detection | # Number Plate Detection | ||||
| _YOLOV3_NP_WEIGHT = os.path.join(_CMD_PMT_,'resources/trainedModels/yolov3_number_plate_detection/lapi.weights') | _YOLOV3_NP_WEIGHT = os.path.join(_CMD_PMT_,'resources/trainedModels/yolov3_number_plate_detection/lapi.weights') | ||||
| @@ -1,91 +1,116 @@ | |||||
| import argparse | import argparse | ||||
| import multiprocessing as mp | import multiprocessing as mp | ||||
| import os | import os | ||||
| import random | |||||
| import threading as th | import threading as th | ||||
| import time | import time | ||||
| from datetime import datetime | |||||
| from queue import Queue | from queue import Queue | ||||
| import numpy as np | |||||
| os.environ['DISPLAY'] = ':0' | |||||
| import cv2 | import cv2 | ||||
| inputQueue = mp.Queue() | inputQueue = mp.Queue() | ||||
| vehicleDetectionQueue = mp.Queue() | vehicleDetectionQueue = mp.Queue() | ||||
| outputQueue = mp.Queue() | outputQueue = mp.Queue() | ||||
| IMAGE_HEIGHT = mp.Value('i',0) | |||||
| IMAGE_WIDTH = mp.Value('i',0) | |||||
| class ReadFrame(th.Thread): | class ReadFrame(th.Thread): | ||||
| global inputQueue | |||||
| global IMAGE_HEIGHT,IMAGE_WIDTH | |||||
| def __init__(self,source,name='Input thread',custom_id=1) -> None: | def __init__(self,source,name='Input thread',custom_id=1) -> None: | ||||
| super().__init__() | super().__init__() | ||||
| self.frameId = 1 | self.frameId = 1 | ||||
| self.stopped = False | self.stopped = False | ||||
| self.grabbed = True | self.grabbed = True | ||||
| self.name = f'{name} {custom_id}' | self.name = f'{name} {custom_id}' | ||||
| self.videoCaptureObject = cv2.VideoCapture(source) | self.videoCaptureObject = cv2.VideoCapture(source) | ||||
| if(self.videoCaptureObject.isOpened()): | |||||
| IMAGE_HEIGHT.value = int(self.videoCaptureObject.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |||||
| IMAGE_WIDTH.value = int(self.videoCaptureObject.get(cv2.CAP_PROP_FRAME_WIDTH)) | |||||
| print(f'Reading from source = {source}') | print(f'Reading from source = {source}') | ||||
| global inputQueue | |||||
| def run(self): | def run(self): | ||||
| while (self.grabbed): | while (self.grabbed): | ||||
| (self.grabbed, self.frame) = self.videoCaptureObject.read() | (self.grabbed, self.frame) = self.videoCaptureObject.read() | ||||
| IMAGE_HEIGHT.value = int(self.videoCaptureObject.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |||||
| IMAGE_WIDTH.value = int(self.videoCaptureObject.get(cv2.CAP_PROP_FRAME_WIDTH)) | |||||
| inputQueue.put((self.frame,self.frameId)) | inputQueue.put((self.frame,self.frameId)) | ||||
| print(f"{self.name}frame added with id {self.frameId}\n") | |||||
| print(f"{self.name} frame added with id {self.frameId}\n") | |||||
| self.frameId+=1 | self.frameId+=1 | ||||
| print('--Done reading frames--\n') | print('--Done reading frames--\n') | ||||
| self.videoCaptureObject.release() | |||||
| return | return | ||||
| class VehicleDetection(mp.Process): | class VehicleDetection(mp.Process): | ||||
| global inputQueue | |||||
| global vehicleDetectionQueue | |||||
| def __init__(self,name='Vehicle Detection Process',custom_id=1): | def __init__(self,name='Vehicle Detection Process',custom_id=1): | ||||
| super(VehicleDetection,self).__init__() | super(VehicleDetection,self).__init__() | ||||
| self.name = f'{name} {custom_id}' | self.name = f'{name} {custom_id}' | ||||
| global inputQueue | |||||
| def run(self): | def run(self): | ||||
| while (True): | while (True): | ||||
| if(inputQueue.qsize() == 0): | if(inputQueue.qsize() == 0): | ||||
| vehicleDetectionQueue.put(None) | |||||
| print(f'{self.name} exiting !! \n') | |||||
| return | return | ||||
| (frame,frameId) = inputQueue.get() | (frame,frameId) = inputQueue.get() | ||||
| #inputQueue.task_done() | |||||
| print(f"{self.name}Got frame with ID {frameId} qsize = {inputQueue.qsize()}\n") | |||||
| print(f"{self.name} Got frame with ID {frameId} qsize = {inputQueue.qsize()}\n") | |||||
| #do some processing here. | #do some processing here. | ||||
| time.sleep(.5) | time.sleep(.5) | ||||
| vehicleDetectionQueue.put_nowait((frame,frameId)) | |||||
| vehicleDetectionQueue.put((frame,frameId)) | |||||
| class NumberPlateOcr(mp.Process): | class NumberPlateOcr(mp.Process): | ||||
| global vehicleDetectionQueue | |||||
| global outputQueue | |||||
| def __init__(self,name='Number plate OCR Process',custom_id=1): | def __init__(self,name='Number plate OCR Process',custom_id=1): | ||||
| super(NumberPlateOcr,self).__init__() | super(NumberPlateOcr,self).__init__() | ||||
| self.name=f'{name} {custom_id}' | self.name=f'{name} {custom_id}' | ||||
| global inputQueue | |||||
| global vehicleDetectionQueue | |||||
| global outputQueue | |||||
| def run(self): | def run(self): | ||||
| while True: | while True: | ||||
| (frame,frameId) = vehicleDetectionQueue.get() | |||||
| #inputQueue.task_done() | |||||
| value = vehicleDetectionQueue.get() | |||||
| if(value == None): | |||||
| print(f'{self.name} exiting !! \n') | |||||
| outputQueue.put(None) | |||||
| return | |||||
| (frame,frameId) = value | |||||
| print(f"{self.name} Got frame with ID {frameId}\n") | print(f"{self.name} Got frame with ID {frameId}\n") | ||||
| #do some processing here. | #do some processing here. | ||||
| time.sleep(.25) | time.sleep(.25) | ||||
| outputQueue.put_nowait((frame,frameId)) | |||||
| if((inputQueue.empty()) and (vehicleDetectionQueue.empty())): | |||||
| return | |||||
| class outputframe(th.Thread): | |||||
| def __init__(self,name='output thread',custom_id=1): | |||||
| outputQueue.put((frame,frameId)) | |||||
| class OutputFrame(th.Thread): | |||||
| global IMAGE_HEIGHT,IMAGE_WIDTH | |||||
| global outputQueue | |||||
| def __init__(self,name='output thread',custom_id=1,outputfilename="output.avi"): | |||||
| super().__init__() | super().__init__() | ||||
| self.name = f'{name} {custom_id}' | self.name = f'{name} {custom_id}' | ||||
| self.outputfilename = outputfilename | |||||
| print(f'frame size {IMAGE_HEIGHT.value} {IMAGE_WIDTH.value}') | |||||
| self.videoWriterObject = cv2.VideoWriter(outputfilename,cv2.VideoWriter_fourcc(*'MJPG'),30,(IMAGE_WIDTH.value,IMAGE_HEIGHT.value)) | |||||
| self.winName = "DISPLAY" | |||||
| def run(self): | def run(self): | ||||
| cv2.namedWindow(self.winName,cv2.WINDOW_NORMAL) | |||||
| while True: | while True: | ||||
| (frame,frameId) = outputQueue.get() | |||||
| print(f'{self.name} got frame {frameId}\n') | |||||
| try: | |||||
| value = outputQueue.get() | |||||
| if(value == None): | |||||
| return | |||||
| (frame,frameId) = value | |||||
| print(f'{self.name} got frame with ID {frameId} shape = {frame.shape}') | |||||
| cv2.imshow(self.winName,frame) | |||||
| self.videoWriterObject.write(frame) | |||||
| except(AttributeError): | |||||
| continue | |||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||
| import cProfile | import cProfile | ||||
| @@ -97,16 +122,25 @@ if __name__ == '__main__': | |||||
| parser.add_argument('--realtime',help='Camera Connected Input') | parser.add_argument('--realtime',help='Camera Connected Input') | ||||
| args = parser.parse_args() | args = parser.parse_args() | ||||
| #Name of the video file. | |||||
| outputvideo = f'output {os.path.basename(args.video)[:-4]} {datetime.now()}.avi' | |||||
| print(f'-----> Writing to file {outputvideo} <-------\n') | |||||
| #enable profiler here. | #enable profiler here. | ||||
| app_profiler.enable() | app_profiler.enable() | ||||
| readFramesThread = ReadFrame(args.video) | readFramesThread = ReadFrame(args.video) | ||||
| vehicleDetectionProcess = VehicleDetection() | vehicleDetectionProcess = VehicleDetection() | ||||
| numberPlateOcrProcess = NumberPlateOcr() | numberPlateOcrProcess = NumberPlateOcr() | ||||
| outputframeThread = OutputFrame(outputfilename = outputvideo) | |||||
| readFramesThread.start() | readFramesThread.start() | ||||
| time.sleep(.25) | time.sleep(.25) | ||||
| vehicleDetectionProcess.start() | vehicleDetectionProcess.start() | ||||
| numberPlateOcrProcess.start() | numberPlateOcrProcess.start() | ||||
| outputframeThread.start() | |||||
| print(f'{vehicleDetectionProcess.name} {vehicleDetectionProcess.pid} \n') | |||||
| print(f'{numberPlateOcrProcess.name} {numberPlateOcrProcess.pid} \n') | |||||
| readFramesThread.join() | readFramesThread.join() | ||||
| print(f'readframesthread {readFramesThread.is_alive()}\n') | print(f'readframesthread {readFramesThread.is_alive()}\n') | ||||
| @@ -114,11 +148,14 @@ if __name__ == '__main__': | |||||
| print(f'vehicleDetectionProcess {vehicleDetectionProcess.is_alive()}\n') | print(f'vehicleDetectionProcess {vehicleDetectionProcess.is_alive()}\n') | ||||
| numberPlateOcrProcess.join() | numberPlateOcrProcess.join() | ||||
| print(f'numberPlateOcrProcess {numberPlateOcrProcess.is_alive()}\n') | print(f'numberPlateOcrProcess {numberPlateOcrProcess.is_alive()}\n') | ||||
| outputframeThread.join() | |||||
| print(f'{outputframeThread.name} {outputframeThread.is_alive()}') | |||||
| #disable profiler here. | #disable profiler here. | ||||
| app_profiler.disable() | app_profiler.disable() | ||||
| profile_name = str('temp.prof'.format(os.path.basename(args.video)[0:-4])) | |||||
| profile_name = str('{}.prof'.format(os.path.basename(args.video)[0:-4])) | |||||
| print("------------------------\nEnd of execution, dumping profile stats\n-------------------------") | print("------------------------\nEnd of execution, dumping profile stats\n-------------------------") | ||||
| app_profiler.dump_stats(profile_name) | app_profiler.dump_stats(profile_name) | ||||
| @@ -115,7 +115,7 @@ class ObjectDetection(object): | |||||
| return boxes, confidences, classids | return boxes, confidences, classids | ||||
| def run_object_detection(self,img,frameId,imageH,imageW,vehicleDetectionQueue,doPlotBoxNLabel = True): | |||||
| def run_object_detection(self,img,imageH,imageW,doPlotBoxNLabel = True): | |||||
| status = True | status = True | ||||
| # Image preprocess - make RGB,Resize,Scale by 1/255 | # Image preprocess - make RGB,Resize,Scale by 1/255 | ||||
| blob = cv.dnn.blobFromImage(img, 1 / 255.0, PARAMS._YOLOV3_OD_INPUT_IMAGE_SIZE, | blob = cv.dnn.blobFromImage(img, 1 / 255.0, PARAMS._YOLOV3_OD_INPUT_IMAGE_SIZE, | ||||
| @@ -149,6 +149,5 @@ class ObjectDetection(object): | |||||
| if doPlotBoxNLabel: | if doPlotBoxNLabel: | ||||
| # Draw labels and boxes on the image | # Draw labels and boxes on the image | ||||
| img = self.draw_labels_and_boxes(img, boxes, confidences, classids, idxs, self.colors, self.labels) | img = self.draw_labels_and_boxes(img, boxes, confidences, classids, idxs, self.colors, self.labels) | ||||
| return img, frameId, boxes, confidences, classids, idxs, status | |||||
| return img, boxes, confidences, classids, idxs,status | |||||
| @@ -160,7 +160,7 @@ def extract_all_number_plates_text(img, region_of_interests): | |||||
| # ============================================================================ | # ============================================================================ | ||||
| def get_number_plate_ocr_from_rois(img, np_rois_info,save_number_plate): | |||||
| def get_number_plate_ocr_from_rois(img, np_rois_info, save_number_plate): | |||||
| np_roi_text_dict= {} | np_roi_text_dict= {} | ||||
| for idx,roiinfo in enumerate(np_rois_info): | for idx,roiinfo in enumerate(np_rois_info): | ||||
| conf, classID, roi = roiinfo | conf, classID, roi = roiinfo | ||||
| @@ -1,16 +1,11 @@ | |||||
| import argparse | import argparse | ||||
| import cv2 as cv | import cv2 as cv | ||||
| import numpy as np | import numpy as np | ||||
| from tqdm import tqdm | |||||
| import os | import os | ||||
| import signal | |||||
| import multiprocessing as mp | |||||
| os.environ['DISPLAY'] = ':0' | os.environ['DISPLAY'] = ':0' | ||||
| from config.config import PARAMS | from config.config import PARAMS | ||||
| from src.numberPlateRoiDetection import NumberPlateROIDetection | from src.numberPlateRoiDetection import NumberPlateROIDetection | ||||
| from src.objectDetection import ObjectDetection | from src.objectDetection import ObjectDetection | ||||
| @@ -18,9 +13,6 @@ from src.ocrNumberPlate import get_number_plate_ocr_from_rois | |||||
| from src.parkingDetection import ParkingDetection | from src.parkingDetection import ParkingDetection | ||||
| from src.trackingManager import TrackerManager | from src.trackingManager import TrackerManager | ||||
| # TODO 2 processes for objectdetection using queues (queue1) | |||||
| # TODO implement queue for taking frames, frameid from queue1 | |||||
| class TrafficApp(object): | class TrafficApp(object): | ||||
| def __init__(self,args): | def __init__(self,args): | ||||
| self.args = args | self.args = args | ||||
| @@ -36,16 +28,9 @@ class TrafficApp(object): | |||||
| if self.args.video is not None: | if self.args.video is not None: | ||||
| self.vid_writer = None | self.vid_writer = None | ||||
| self.runVideoFlow() | self.runVideoFlow() | ||||
| def runVideoFlow(self): | def runVideoFlow(self): | ||||
| frame_count = 0 | frame_count = 0 | ||||
| frame1_id=0 | |||||
| frame2_id= 1 | |||||
| vehicleDetectionQueue = mp.Queue() | |||||
| framesList=[] | |||||
| outputfile = "output-{}.mp4".format(os.path.basename(args.video)[:-4]) | |||||
| if args.video is not None: | if args.video is not None: | ||||
| try: | try: | ||||
| videoObj = cv.VideoCapture(args.video) | videoObj = cv.VideoCapture(args.video) | ||||
| @@ -82,85 +67,62 @@ class TrafficApp(object): | |||||
| print('Frames-{},Height-{}, Width-{}'.format(totalFrames,imgH,imgW)) | print('Frames-{},Height-{}, Width-{}'.format(totalFrames,imgH,imgW)) | ||||
| if self.args.saveoutput and (imgH > 0 and imgW > 0): | if self.args.saveoutput and (imgH > 0 and imgW > 0): | ||||
| self.vid_writer = cv.VideoWriter(outputfile, | |||||
| self.vid_writer = cv.VideoWriter(self.outputfile, | |||||
| cv.VideoWriter_fourcc(*"MJPG"), 30, | cv.VideoWriter_fourcc(*"MJPG"), 30, | ||||
| (round(imgW),round(imgH))) | (round(imgW),round(imgH))) | ||||
| progress_bar=tqdm(total = totalFrames) | |||||
| # start reading frame | # start reading frame | ||||
| while True : | |||||
| grabbed1, frame1 = videoObj.read() | |||||
| grabbed2, frame2 = videoObj.read() | |||||
| frame1_id+=1 | |||||
| frame2_id+=2 | |||||
| while True: | |||||
| grabbed, frame = videoObj.read() | |||||
| #frame[:,450:,:] = 0 | #frame[:,450:,:] = 0 | ||||
| # end of frame | # end of frame | ||||
| if not grabbed1: | |||||
| if not grabbed: | |||||
| break | break | ||||
| frame_count +=1 | frame_count +=1 | ||||
| #print('Frame_count-',frame_count) | #print('Frame_count-',frame_count) | ||||
| #Use jump argument to skip frames. | #Use jump argument to skip frames. | ||||
| # get object detection on this frame | |||||
| objectDetectionProcess1=mp.Process(name='Object Detection Process 1',target=self.objectDetection.run_object_detection, args=(frame1.copy(),frame1_id,imgH,imgW,vehicleDetectionQueue)) | |||||
| objectDetectionProcess2=mp.Process(name='Object Detection Process 2',target=self.objectDetection.run_object_detection, args=(frame2.copy(),frame2_id,imgH,imgW,vehicleDetectionQueue)) | |||||
| objectDetectionProcess1.start() | |||||
| objectDetectionProcess2.start() | |||||
| print(f'{objectDetectionProcess1.name},{objectDetectionProcess1.pid},\n' ) | |||||
| print(f'{objectDetectionProcess2.name},{objectDetectionProcess2.pid} \n' ) | |||||
| #print(f'Vehicle detection Queue size = {vehicleDetectionQueue.qsize()}') | |||||
| #img_objectMarking, boxes, confidences, classids, idxs,status = self.objectDetection.run_object_detection(frame.copy(),imageH=imgH,imageW=imgW) | |||||
| img, frameId, boxes, confidences, classids, idxs,status = vehicleDetectionQueue.get() | |||||
| #append the frames and frameid. | |||||
| framesList.append((img,frameId)) | |||||
| print(f'frames stored = {len(framesList)} \n') | |||||
| '''Assign Trackers''' | |||||
| object_detect_info = [boxes, confidences, classids, idxs, status] | |||||
| bbox_labels_tracking = self.parseObjDetectInfo(object_detect_info) | |||||
| TrackerManager.FrameCount = frame_count | |||||
| TrackerManager.manageTracker(bbox_labels_tracking) | |||||
| ''' Get Parking Status''' | |||||
| if PARAMS._ALGO_MODE_PARKING: | |||||
| self.parkingDetection.getParkingStatus(TrackerManager.TrackerList) | |||||
| '''Filter ROIs for Number Plate Detection''' | |||||
| tentative_numberplate_rios = self.objectDetection.filterRoiforNumberPlate(boxes, classids, idxs) | |||||
| ''' Get Number Plate ROI''' | |||||
| detected_np_info = self.numberPlateDetection.run_number_plate_detection_rois(image=img,rois=tentative_numberplate_rios) | |||||
| ''' Get Number plate OCR ''' | |||||
| number_plate_ocr_dict = get_number_plate_ocr_from_rois(img,detected_np_info, False) | |||||
| objectDetectionProcess1.join() | |||||
| objectDetectionProcess2.join() | |||||
| #Display frame | |||||
| displayFrame = self.displayFrame(img,detected_np_info,number_plate_ocr_dict,object_detect_info) | |||||
| # ISSUE how to kil the processes? New processes spawn on every iteration. | |||||
| print(f'objectDetectionProcess1 is alive = {objectDetectionProcess1.is_alive()}\n') | |||||
| print(f'objectDetectionProcess2 is alive = {objectDetectionProcess2.is_alive()}\n') | |||||
| print("+++++++++++++++++++end of cycle++++++++++++++++++") | |||||
| #winName = 'YOLOV3 Object Detection' | |||||
| #cv.namedWindow(winName, cv.WINDOW_NORMAL) | |||||
| #cv.imshow(winName, displayFrame) | |||||
| #cv.resizeWindow('objectDetection',680,420) | |||||
| if self.vid_writer: | |||||
| self.vid_writer.write(displayFrame.astype(np.uint8)) | |||||
| c = cv.waitKey(1) | |||||
| if c & 0xFF == ord('q'): | |||||
| self.vid_writer.release() | |||||
| videoObj.release() | |||||
| break | |||||
| if (frame_count % self.args.jump == 0): | |||||
| # get object detection on this frame | |||||
| img_objectMarking, boxes, confidences, classids, idxs,status = self.objectDetection.run_object_detection(frame.copy(),imageH=imgH,imageW=imgW) | |||||
| '''Assign Trcakers''' | |||||
| object_detect_info = [boxes, confidences, classids, idxs, status] | |||||
| bbox_labels_tracking = self.parseObjDetectInfo(object_detect_info) | |||||
| TrackerManager.FrameCount = frame_count | |||||
| TrackerManager.manageTracker(bbox_labels_tracking) | |||||
| ''' Get Parking Status''' | |||||
| if PARAMS._ALGO_MODE_PARKING: | |||||
| self.parkingDetection.getParkingStatus(TrackerManager.TrackerList) | |||||
| '''Filter ROIs for Number Plate Detection''' | |||||
| tentative_numberplate_rios = self.objectDetection.filterRoiforNumberPlate(boxes, classids, idxs) | |||||
| ''' Get Number Plate ROI''' | |||||
| detected_np_info = self.numberPlateDetection.run_number_plate_detection_rois(image=frame.copy(),rois=tentative_numberplate_rios) | |||||
| ''' Get Number plate OCR ''' | |||||
| number_plate_ocr_dict = get_number_plate_ocr_from_rois(frame.copy(),detected_np_info, False) | |||||
| #Display frame | |||||
| displayFrame = self.displayFrame(frame.copy(),detected_np_info,number_plate_ocr_dict,object_detect_info) | |||||
| winName = 'YOLOV3 Object Detection' | |||||
| cv.namedWindow(winName, cv.WINDOW_NORMAL) | |||||
| cv.imshow(winName, displayFrame) | |||||
| cv.resizeWindow('objectDetection',680,420) | |||||
| if self.vid_writer: | |||||
| self.vid_writer.write(displayFrame.astype(np.uint8)) | |||||
| c = cv.waitKey(1) | |||||
| if c & 0xFF == ord('q'): | |||||
| self.vid_writer.release() | |||||
| videoObj.release() | |||||
| break | |||||
| progress_bar.close() | |||||
| def parseObjDetectInfo(self,object_roi_info): | def parseObjDetectInfo(self,object_roi_info): | ||||
| boxes, confidences, classids, idxs, status = object_roi_info | boxes, confidences, classids, idxs, status = object_roi_info | ||||
| #[[list of bbox ][list of conf and labels]] | #[[list of bbox ][list of conf and labels]] | ||||
| @@ -285,7 +247,7 @@ class TrafficApp(object): | |||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||
| import cProfile | |||||
| import cProfile, pstats | |||||
| app_profiler = cProfile.Profile() | app_profiler = cProfile.Profile() | ||||
| parser = argparse.ArgumentParser(description='BitSilica Traffic Analysis Solution') | parser = argparse.ArgumentParser(description='BitSilica Traffic Analysis Solution') | ||||
| @@ -294,14 +256,12 @@ if __name__ == '__main__': | |||||
| parser.add_argument('--realtime', help='Camera Connected Input') | parser.add_argument('--realtime', help='Camera Connected Input') | ||||
| parser.add_argument('--target', type=str,default = 'CPU',help='Target for CNN to run') | parser.add_argument('--target', type=str,default = 'CPU',help='Target for CNN to run') | ||||
| parser.add_argument('--saveoutput',type=bool,default=True, help='save video or not') | parser.add_argument('--saveoutput',type=bool,default=True, help='save video or not') | ||||
| parser.add_argument('--debug',type=bool,default=False, help='print time taken by function') | |||||
| parser.add_argument('--outputfile',type=str,default='./result.avi', help='save video path') | |||||
| parser.add_argument('--debug',type=bool,default=False, help='print time taken by function') | |||||
| parser.add_argument('--jump',type=int,default=1,help='integer value for jumping frames') | |||||
| args = parser.parse_args() | args = parser.parse_args() | ||||
| #enable profiler here. | |||||
| app_profiler.enable() | app_profiler.enable() | ||||
| app = TrafficApp(args = args) | app = TrafficApp(args = args) | ||||
| #disable profiler here. | |||||
| app_profiler.disable() | app_profiler.disable() | ||||
| profile_name = str('{}.prof'.format(os.path.basename(args.video)[0:-4])) | |||||
| profile_name = str('profile_info-{}.prof'.format(args.jump)) | |||||
| app_profiler.dump_stats(profile_name) | app_profiler.dump_stats(profile_name) | ||||