|
|
@@ -1,343 +0,0 @@ |
|
|
|
{ |
|
|
|
"metadata": { |
|
|
|
"language_info": { |
|
|
|
"codemirror_mode": { |
|
|
|
"name": "ipython", |
|
|
|
"version": 3 |
|
|
|
}, |
|
|
|
"file_extension": ".py", |
|
|
|
"mimetype": "text/x-python", |
|
|
|
"name": "python", |
|
|
|
"nbconvert_exporter": "python", |
|
|
|
"pygments_lexer": "ipython3", |
|
|
|
"version": 3 |
|
|
|
}, |
|
|
|
"orig_nbformat": 2 |
|
|
|
}, |
|
|
|
"nbformat": 4, |
|
|
|
"nbformat_minor": 2, |
|
|
|
"cells": [ |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [ |
|
|
|
"import argparse\n", |
|
|
|
"\n", |
|
|
|
"import cv2 as cv\n", |
|
|
|
"import numpy as np\n", |
|
|
|
"from tqdm import tqdm\n", |
|
|
|
"import os\n", |
|
|
|
"os.environ['DISPLAY'] = ':0'\n", |
|
|
|
"\n", |
|
|
|
"from config.config import PARAMS\n", |
|
|
|
"from src.numberPlateRoiDetection import NumberPlateROIDetection\n", |
|
|
|
"from src.objectDetection import ObjectDetection\n", |
|
|
|
"from src.ocrNumberPlate import get_number_plate_ocr_from_rois\n", |
|
|
|
"from src.parkingDetection import ParkingDetection\n", |
|
|
|
"from src.trackingManager import TrackerManager\n" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [ |
|
|
|
"class TrafficApp(object):\n", |
|
|
|
" def __init__(self,args):\n", |
|
|
|
" self.args = args\n", |
|
|
|
"\n", |
|
|
|
" #get Object Detection Up\n", |
|
|
|
" self.objectDetection = ObjectDetection(debug=args.debug,target=args.target)\n", |
|
|
|
" self.numberPlateDetection = NumberPlateROIDetection(args= args,algoType='NumberPlate')\n", |
|
|
|
" self.parkingDetection = None #intilize later when we will have height/width\n", |
|
|
|
" np.random.seed(41)\n", |
|
|
|
"\n", |
|
|
|
" #fix color\n", |
|
|
|
" self.colorToDisplay = {'numberplate':(0,255,255),'car':(0,255,0),'bus':(128,255,0),'truck':(0,0,255),'moterbike':(255,0,255),'ocr':(0,140,240)}\n", |
|
|
|
" if self.args.video is not None:\n", |
|
|
|
" self.vid_writer = None\n", |
|
|
|
" self.runVideoFlow()\n", |
|
|
|
"\n", |
|
|
|
" def runVideoFlow(self):\n", |
|
|
|
" frame_count = 0\n", |
|
|
|
" if args.video is not None:\n", |
|
|
|
" try:\n", |
|
|
|
" videoObj = cv.VideoCapture(args.video)\n", |
|
|
|
" imgH, imgW = None, None\n", |
|
|
|
" writer = None\n", |
|
|
|
" except:\n", |
|
|
|
" raise Exception('Video cannot be loaded! Please check the path provided!')\n", |
|
|
|
"\n", |
|
|
|
" finally:\n", |
|
|
|
" try:\n", |
|
|
|
" totalFrames = videoObj.get(cv.cv.CV_CAP_PROP_FRAME_COUNT)\n", |
|
|
|
" except:\n", |
|
|
|
" totalFrames = -1\n", |
|
|
|
"\n", |
|
|
|
" try:\n", |
|
|
|
" totalFrames = videoObj.get(cv.CAP_PROP_FRAME_COUNT)\n", |
|
|
|
" except:\n", |
|
|
|
" totalFrames = -1\n", |
|
|
|
" try:\n", |
|
|
|
" imgH = int(videoObj.get(cv.CAP_PROP_FRAME_HEIGHT))\n", |
|
|
|
" imgW = int(videoObj.get(cv.CAP_PROP_FRAME_WIDTH))\n", |
|
|
|
" TrackerManager.FrameHeight = imgH\n", |
|
|
|
" TrackerManager.FrameWidth = imgW\n", |
|
|
|
" print('Height, Width',imgH,imgW)\n", |
|
|
|
" if PARAMS._ALGO_MODE_PARKING:\n", |
|
|
|
" self.parkingDetection = ParkingDetection(imgW=imgW,imgH=imgH)\n", |
|
|
|
" self.parkingDetection.getParkingRegionMask()\n", |
|
|
|
" #videoObj.set(cv.CAP_PROP_POS_FRAMES, 225)\n", |
|
|
|
" except:\n", |
|
|
|
" imgH = -1\n", |
|
|
|
" imgW = -1\n", |
|
|
|
" raise ValueError('Issue with video')\n", |
|
|
|
" if self.args.debug:\n", |
|
|
|
" print('Frames-{},Height-{}, Width-{}'.format(totalFrames,imgH,imgW))\n", |
|
|
|
"\n", |
|
|
|
" if self.args.saveoutput and (imgH > 0 and imgW > 0):\n", |
|
|
|
" self.vid_writer = cv.VideoWriter(self.args.outputfile,\n", |
|
|
|
" cv.VideoWriter_fourcc(*\"MJPG\"), 30,\n", |
|
|
|
" (round(imgW),round(imgH)))\n", |
|
|
|
" \n", |
|
|
|
" progress_bar=tqdm(total = totalFrames)\n", |
|
|
|
" # start reading frame\n", |
|
|
|
" while True:\n", |
|
|
|
" grabbed, frame = videoObj.read()\n", |
|
|
|
" #frame[:,450:,:] = 0\n", |
|
|
|
" # end of frame\n", |
|
|
|
" if not grabbed:\n", |
|
|
|
" break\n", |
|
|
|
" frame_count +=1\n", |
|
|
|
"\n", |
|
|
|
" #print('Frame_count-',frame_count)\n", |
|
|
|
" #Use jump argument to skip frames.\n", |
|
|
|
" if (frame_count % self.args.jump == 0):\n", |
|
|
|
" \n", |
|
|
|
" # get object detection on this frame\n", |
|
|
|
" img_objectMarking, boxes, confidences, classids, idxs,status = self.objectDetection.run_object_detection(frame.copy(),imageH=imgH,imageW=imgW)\n", |
|
|
|
" '''Assign Trcakers'''\n", |
|
|
|
" object_detect_info = [boxes, confidences, classids, idxs, status]\n", |
|
|
|
" bbox_labels_tracking = self.parseObjDetectInfo(object_detect_info)\n", |
|
|
|
" TrackerManager.FrameCount = frame_count\n", |
|
|
|
" TrackerManager.manageTracker(bbox_labels_tracking)\n", |
|
|
|
"\n", |
|
|
|
" ''' Get Parking Status'''\n", |
|
|
|
" if PARAMS._ALGO_MODE_PARKING:\n", |
|
|
|
" self.parkingDetection.getParkingStatus(TrackerManager.TrackerList)\n", |
|
|
|
"\n", |
|
|
|
" '''Filter ROIs for Number Plate Detection'''\n", |
|
|
|
" tentative_numberplate_rios = self.objectDetection.filterRoiforNumberPlate(boxes, classids, idxs)\n", |
|
|
|
"\n", |
|
|
|
"\n", |
|
|
|
" ''' Get Number Plate ROI'''\n", |
|
|
|
" detected_np_info = self.numberPlateDetection.run_number_plate_detection_rois(image=frame.copy(),rois=tentative_numberplate_rios)\n", |
|
|
|
"\n", |
|
|
|
"\n", |
|
|
|
" ''' Get Number plate OCR '''\n", |
|
|
|
" number_plate_ocr_dict = get_number_plate_ocr_from_rois(frame.copy(),detected_np_info, False)\n", |
|
|
|
"\n", |
|
|
|
" #Display frame\n", |
|
|
|
" displayFrame = self.displayFrame(frame.copy(),detected_np_info,number_plate_ocr_dict,object_detect_info)\n", |
|
|
|
"\n", |
|
|
|
" winName = 'YOLOV3 Object Detection'\n", |
|
|
|
" cv.namedWindow(winName, cv.WINDOW_NORMAL)\n", |
|
|
|
" cv.imshow(winName, displayFrame)\n", |
|
|
|
" #cv.resizeWindow('objectDetection',680,420)\n", |
|
|
|
" if self.vid_writer:\n", |
|
|
|
" self.vid_writer.write(displayFrame.astype(np.uint8))\n", |
|
|
|
" c = cv.waitKey(1)\n", |
|
|
|
" if c & 0xFF == ord('q'):\n", |
|
|
|
" self.vid_writer.release()\n", |
|
|
|
" videoObj.release()\n", |
|
|
|
" break\n", |
|
|
|
" progress_bar.close()\n", |
|
|
|
" def parseObjDetectInfo(self,object_roi_info):\n", |
|
|
|
" boxes, confidences, classids, idxs, status = object_roi_info\n", |
|
|
|
" #[[list of bbox ][list of conf and labels]]\n", |
|
|
|
" bboxList =[]\n", |
|
|
|
" confidence_labels = []\n", |
|
|
|
" if len(idxs) > 0 and status:\n", |
|
|
|
" for i in idxs.flatten():\n", |
|
|
|
" # Get the bounding box coordinates\n", |
|
|
|
" if self.objectDetection.labels[classids[i]] not in PARAMS._TRACKER_OBJECT_LIST +\\\n", |
|
|
|
" PARAMS._YOLOV3_OD_NUMBER_PLATE_OBJECT_LIST:\n", |
|
|
|
" continue\n", |
|
|
|
" x, y = boxes[i][0], boxes[i][1]\n", |
|
|
|
" w, h = boxes[i][2], boxes[i][3]\n", |
|
|
|
" bboxList.append ([x,y,w,h])\n", |
|
|
|
" confidence_labels.append([confidences[i],self.objectDetection.labels[classids[i]]])\n", |
|
|
|
" return [bboxList,confidence_labels]\n", |
|
|
|
"\n", |
|
|
|
" def displayFrame(self,displayFrame,numberplate_roi,number_plate_ocr_dict,object_roi_info):\n", |
|
|
|
" debug = self.args.debug\n", |
|
|
|
" if PARAMS._ALGO_MODE_NUMBER_PLATE:\n", |
|
|
|
" #for nuber plate\n", |
|
|
|
" for idx,roiinfo in enumerate(numberplate_roi):\n", |
|
|
|
" conf, classID, roi = roiinfo\n", |
|
|
|
" x, y, w, h = roi\n", |
|
|
|
" cv.rectangle(displayFrame, (x, y), (x + w, y + h), self.colorToDisplay['numberplate'], 2)\n", |
|
|
|
" text = \"{}: {:.3f}\".format(self.numberPlateDetection.labels[classID], conf)\n", |
|
|
|
" #cv.putText(displayFrame, text, (x, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, self.colorToDisplay['numberplate'], 1)\n", |
|
|
|
"\n", |
|
|
|
" #add Number plate OCR\n", |
|
|
|
" if number_plate_ocr_dict[idx]:\n", |
|
|
|
" thickness = 4\n", |
|
|
|
" font_face = cv.FONT_HERSHEY_SIMPLEX\n", |
|
|
|
" font_scale = 1\n", |
|
|
|
" cv.putText(displayFrame, number_plate_ocr_dict[idx], (x, y-5), font_face, font_scale,\\\n", |
|
|
|
" self.colorToDisplay['ocr'], thickness)\n", |
|
|
|
"\n", |
|
|
|
" if False:\n", |
|
|
|
" #for objects\n", |
|
|
|
" boxes, confidences, classids, idxs, status = object_roi_info\n", |
|
|
|
" if len(idxs) > 0 and status:\n", |
|
|
|
" for i in idxs.flatten():\n", |
|
|
|
" # Get the bounding box coordinates\n", |
|
|
|
" x, y = boxes[i][0], boxes[i][1]\n", |
|
|
|
" w, h = boxes[i][2], boxes[i][3]\n", |
|
|
|
"\n", |
|
|
|
" # Get the unique color for this class\n", |
|
|
|
" if self.objectDetection.labels[classids[i]] in self.colorToDisplay:\n", |
|
|
|
" color = self.colorToDisplay[self.objectDetection.labels[classids[i]]]\n", |
|
|
|
" else:\n", |
|
|
|
" color = [int(c) for c in self.objectDetection.colors[classids[i]]]\n", |
|
|
|
" #color = (255,255,255)\n", |
|
|
|
" # Draw the bounding box rectangle and label on the image\n", |
|
|
|
" cv.rectangle(displayFrame, (x, y), (x + w, y + h), color, 2)\n", |
|
|
|
" text = \"{}: {:.3f}\".format(self.objectDetection.labels[classids[i]], confidences[i])\n", |
|
|
|
" cv.putText(displayFrame, text, (x, y - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)\n", |
|
|
|
"\n", |
|
|
|
"\n", |
|
|
|
" if True:\n", |
|
|
|
" if len(TrackerManager.DetectionWithNoTracker)>0:\n", |
|
|
|
" color = (0,0,0)\n", |
|
|
|
" for item in TrackerManager.DetectionWithNoTracker:\n", |
|
|
|
" bbox,(conf,label) = item\n", |
|
|
|
" x,y,w,h = bbox\n", |
|
|
|
" # Draw the bounding box rectangle and label on the image\n", |
|
|
|
" cv.rectangle(displayFrame, (x, y), (x + w, y + h), color, 2)\n", |
|
|
|
" if debug:\n", |
|
|
|
" text = \"NotTrack-{}: {:.3f}\".format(label,conf)\n", |
|
|
|
" cv.putText(displayFrame, text, (x, y - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)\n", |
|
|
|
"\n", |
|
|
|
" if PARAMS._ALGO_MODE_PARKING:\n", |
|
|
|
" cv.line(displayFrame,PARAMS._NO_PARAKING_LINE_POINT_1_XY,PARAMS._NO_PARAKING_LINE_POINT_2_XY,\\\n", |
|
|
|
" (0,0,255),3,2)\n", |
|
|
|
"\n", |
|
|
|
" if PARAMS._ALGO_MODE_KALMAN_TRCAKING:\n", |
|
|
|
" if len(TrackerManager.TrackerList) > 0:\n", |
|
|
|
" color = (0,255,0)\n", |
|
|
|
" for tracker in TrackerManager.TrackerList:\n", |
|
|
|
" bbox = tracker.curr_frame_predict_bbox\n", |
|
|
|
" x,y,w,h = np.int32(bbox)\n", |
|
|
|
" missframe = tracker.objectInfo.ObjectTrackerMissedFrame\n", |
|
|
|
" direction = 'XX' if tracker.objectInfo.ObjectDirection is None else tracker.objectInfo.ObjectDirection\n", |
|
|
|
" objectType = tracker.objectInfo.ObjectType\n", |
|
|
|
" objectID = tracker.objectID\n", |
|
|
|
" if not tracker.objectInfo.ObjectParkingStatus:\n", |
|
|
|
" cv.rectangle(displayFrame, (x, y), (x + w, y + h), color, 2)\n", |
|
|
|
" else:\n", |
|
|
|
" cv.rectangle(displayFrame, (x, y), (x + w, y + h), (0,0,0), 3)\n", |
|
|
|
"\n", |
|
|
|
" #update curr box by which it was updated\n", |
|
|
|
" if False:\n", |
|
|
|
" bbox_detect = tracker.curr_frame_update_bbox\n", |
|
|
|
" xp,yp,wp,hp = bbox_detect\n", |
|
|
|
" cv.rectangle(displayFrame, (xp, yp), (xp + wp, yp + hp), (0,255,255), 2)\n", |
|
|
|
" if debug:\n", |
|
|
|
" text = \"{}-f{}-{}\".format(objectID,missframe,direction)\n", |
|
|
|
" else:\n", |
|
|
|
" text = \"{}\".format(direction)\n", |
|
|
|
"\n", |
|
|
|
" if tracker.objectInfo.ObjectParkingStatus and PARAMS._ALGO_MODE_PARKING:\n", |
|
|
|
" if tracker.objectInfo.ObjectType in PARAMS._YOLOV3_OD_NUMBER_PLATE_OBJECT_LIST:\n", |
|
|
|
" text = \"{}\".format(PARAMS._PARKING_STRING)\n", |
|
|
|
" font_scale = 1.5\n", |
|
|
|
" font = cv.FONT_HERSHEY_SIMPLEX #PLAIN #cv.FONT_HERSHEY_SIMPLEX\n", |
|
|
|
" # set the rect bg - BLACK\n", |
|
|
|
" rect_bgr = (0,0,0)\n", |
|
|
|
" # get the width and height of the text box\n", |
|
|
|
" (text_width, text_height) = np.int32(cv.getTextSize(text, font, fontScale=font_scale, thickness=2)[0])\n", |
|
|
|
" # make the coords of the box with a small padding of two pixels\n", |
|
|
|
" box_coords = ((x, y), (x + text_width + 5, y - text_height - 5))\n", |
|
|
|
" cv.rectangle(displayFrame, box_coords[0], box_coords[1], rect_bgr, cv.FILLED)\n", |
|
|
|
" cv.putText(displayFrame, text, (x, y), font, fontScale=font_scale, color=(0, 0, 255),thickness=2)\n", |
|
|
|
" if True:\n", |
|
|
|
" imglogo = cv.imread(PARAMS.LOGO_FILE_PATH)\n", |
|
|
|
" logo = cv.resize(imglogo,dsize=(300,100),interpolation=cv.INTER_LINEAR)\n", |
|
|
|
" h,w,c = logo.shape\n", |
|
|
|
" H,W,C = displayFrame.shape\n", |
|
|
|
" displayFrame[0:h,W-w-10:W-10,:] = logo\n", |
|
|
|
"\n", |
|
|
|
" return displayFrame\n" |
|
|
|
] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
}, |
|
|
|
{ |
|
|
|
"cell_type": "code", |
|
|
|
"execution_count": null, |
|
|
|
"metadata": {}, |
|
|
|
"outputs": [], |
|
|
|
"source": [] |
|
|
|
} |
|
|
|
] |
|
|
|
} |