-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathdetector.py
More file actions
128 lines (103 loc) · 3.77 KB
/
detector.py
File metadata and controls
128 lines (103 loc) · 3.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import base64
import io
from shapely.geometry import Polygon as shapely_poly
from shapely.geometry import box
import argparse
import pickle
from pathlib import Path
from mrcnn.model import MaskRCNN
import mrcnn.utils
import mrcnn.config
import cv2
import numpy as np
import git
import os
if not os.path.exists("Mask_RCNN"):
print("Cloning M-RCNN repository...")
git.Git("./").clone("https://github.com/matterport/Mask_RCNN.git")
class Config(mrcnn.config.Config):
NAME = "model_config"
IMAGES_PER_GPU = 1
GPU_COUNT = 1
NUM_CLASSES = 81
config = Config()
config.display()
ROOT_DIR = os.getcwd()
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
print(COCO_MODEL_PATH)
if not os.path.exists(COCO_MODEL_PATH):
mrcnn.utils.download_trained_weights(COCO_MODEL_PATH)
model = MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=Config())
model.load_weights(COCO_MODEL_PATH, by_name=True)
def get_cars(boxes, class_ids):
cars = []
for i, box in enumerate(boxes):
if class_ids[i] in [3, 8, 6]:
cars.append(box)
return np.array(cars)
def compute_overlaps(parked_car_boxes, car_boxes):
new_car_boxes = []
for box in car_boxes:
y1 = box[0]
x1 = box[1]
y2 = box[2]
x2 = box[3]
p1 = (x1, y1)
p2 = (x2, y1)
p3 = (x2, y2)
p4 = (x1, y2)
new_car_boxes.append([p1, p2, p3, p4])
overlaps = np.zeros((len(parked_car_boxes), len(new_car_boxes)))
for i in range(len(parked_car_boxes)):
for j in range(car_boxes.shape[0]):
pol1_xy = parked_car_boxes[i]
pol2_xy = new_car_boxes[j]
polygon1_shape = shapely_poly(pol1_xy)
polygon2_shape = shapely_poly(pol2_xy)
polygon_intersection = polygon1_shape.intersection(
polygon2_shape).area
polygon_union = polygon1_shape.union(polygon2_shape).area
IOU = polygon_intersection / polygon_union
overlaps[i][j] = IOU
return overlaps
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('video_path', help="Video file")
parser.add_argument('regions_path', help="Regions file",
default="regions.p")
args = parser.parse_args()
regions = args.regions_path
with open(regions, 'rb') as f:
parked_car_boxes = pickle.load(f)
VIDEO_SOURCE = args.video_path
alpha = 0.6
video_capture = cv2.VideoCapture(VIDEO_SOURCE)
video_FourCC = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
video_fps = video_capture.get(cv2.CAP_PROP_FPS)
video_size = (int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter("out_test.avi", video_FourCC, video_fps, video_size)
while video_capture.isOpened():
success, frame = video_capture.read()
overlay = frame.copy()
if not success:
break
rgb_image = frame[:, :, ::-1]
results = model.detect([rgb_image], verbose=0)
cars = get_cars(results[0]['rois'], results[0]['class_ids'])
overlaps = compute_overlaps(parked_car_boxes, cars)
for parking_area, overlap_areas in zip(parked_car_boxes, overlaps):
max_IoU_overlap = np.max(overlap_areas)
if max_IoU_overlap < 0.15:
cv2.fillPoly(overlay, [np.array(parking_area)], (71, 27, 92))
free_space = True
cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 0, frame)
cv2.imshow('output', frame)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
out.release()
cv2.destroyAllWindows()
print("output saved as out.avi")