Spaces:
Runtime error
Runtime error
fixing border and adding logo
Browse files- app.py +66 -19
- inference.py +1 -1
- metrics.py +2 -0
app.py
CHANGED
@@ -33,7 +33,7 @@ import pathlib
|
|
33 |
import multiprocessing as mp
|
34 |
from time import time
|
35 |
|
36 |
-
if not os.path.exists('videos_example'):
|
37 |
REPO_ID='SharkSpace/videos_examples'
|
38 |
snapshot_download(repo_id=REPO_ID, token=os.environ.get('SHARK_MODEL'),repo_type='dataset',local_dir='videos_example')
|
39 |
|
@@ -65,6 +65,46 @@ def overlay_text_on_image(image, text_list, font=cv2.FONT_HERSHEY_SIMPLEX, font_
|
|
65 |
cv2.putText(image, line, (image.shape[1] - text_width - margin, y), font, font_size, color, font_thickness, lineType=cv2.LINE_AA)
|
66 |
return image
|
67 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
def draw_cockpit(frame, top_pred,cnt):
|
69 |
# Bullet points:
|
70 |
high_danger_color = (255,0,0)
|
@@ -80,17 +120,21 @@ def draw_cockpit(frame, top_pred,cnt):
|
|
80 |
strings = [shark_sighted, human_sighted, shark_size_estimate, shark_weight_estimate, danger_level]
|
81 |
relative = max(frame.shape[0],frame.shape[1])
|
82 |
if top_pred['shark_sighted'] and top_pred['dangerous_dist'] and cnt%2 == 0:
|
83 |
-
relative = max(frame.shape[0],frame.shape[1])
|
84 |
frame = add_border(frame, color=high_danger_color, thickness=int(relative*0.025))
|
|
|
85 |
elif top_pred['shark_sighted'] and not top_pred['dangerous_dist'] and cnt%2 == 0:
|
86 |
-
relative = max(frame.shape[0],frame.shape[1])
|
87 |
frame = add_border(frame, color=low_danger_color, thickness=int(relative*0.025))
|
|
|
|
|
|
|
|
|
|
|
88 |
overlay_text_on_image(frame, strings, font=cv2.FONT_HERSHEY_SIMPLEX, font_size=relative*0.0007, font_thickness=1, margin=int(relative*0.05), color=(255, 255, 255))
|
89 |
return frame
|
90 |
|
91 |
|
92 |
|
93 |
-
def process_video(input_video,
|
94 |
cap = cv2.VideoCapture(input_video)
|
95 |
|
96 |
output_path = "output.mp4"
|
@@ -110,6 +154,8 @@ def process_video(input_video, out_fps = 'auto', skip_frames = 7):
|
|
110 |
cnt = 0
|
111 |
|
112 |
while iterating:
|
|
|
|
|
113 |
if (cnt % skip_frames) == 0:
|
114 |
print('starting Frame: ', cnt)
|
115 |
# flip frame vertically
|
@@ -124,38 +170,39 @@ def process_video(input_video, out_fps = 'auto', skip_frames = 7):
|
|
124 |
|
125 |
|
126 |
#frame = cv2.resize(frame, (int(width), int(height)))
|
|
|
127 |
|
128 |
if cnt*skip_frames %2==0 and top_pred['shark_sighted']:
|
129 |
-
|
130 |
frame =prediction_frame
|
131 |
-
|
132 |
if top_pred['shark_sighted']:
|
133 |
frame = draw_cockpit(frame, top_pred,cnt*skip_frames)
|
134 |
-
|
|
|
|
|
135 |
pred_dashbord = prediction_dashboard(top_pred = top_pred)
|
136 |
#print('sending frame')
|
137 |
print('finalizing frame:',cnt)
|
138 |
print(pred_dashbord.shape)
|
139 |
print(frame.shape)
|
140 |
print(prediction_frame.shape)
|
141 |
-
yield
|
142 |
-
|
143 |
cnt += 1
|
144 |
iterating, frame = cap.read()
|
145 |
|
146 |
video.release()
|
147 |
-
yield None,
|
148 |
|
149 |
with gr.Blocks(theme=theme) as demo:
|
150 |
-
with gr.Row().style(equal_height=True
|
151 |
input_video = gr.Video(label="Input")
|
152 |
-
processed_frames = gr.Image(label="Shark Engine")
|
153 |
-
output_video = gr.Video(label="Output Video")
|
154 |
-
dashboard = gr.Image(label="Dashboard")
|
155 |
-
|
156 |
-
with gr.Row():
|
157 |
|
158 |
-
original_frames = gr.Image(label="
|
|
|
|
|
|
|
159 |
|
160 |
with gr.Row():
|
161 |
paths = sorted(pathlib.Path('videos_example/').rglob('*.mp4'))
|
@@ -163,8 +210,8 @@ with gr.Blocks(theme=theme) as demo:
|
|
163 |
examples = gr.Examples(samples, inputs=input_video)
|
164 |
process_video_btn = gr.Button("Process Video")
|
165 |
|
166 |
-
process_video_btn.click(process_video, input_video, [processed_frames, original_frames, output_video, dashboard])
|
167 |
-
|
168 |
demo.queue()
|
169 |
if os.getenv('SYSTEM') == 'spaces':
|
170 |
demo.launch(width='40%',auth=(os.environ.get('SHARK_USERNAME'), os.environ.get('SHARK_PASSWORD')))
|
|
|
33 |
import multiprocessing as mp
|
34 |
from time import time
|
35 |
|
36 |
+
if not os.path.exists('videos_example') and not os.getenv('SYSTEM') == 'spaces':
|
37 |
REPO_ID='SharkSpace/videos_examples'
|
38 |
snapshot_download(repo_id=REPO_ID, token=os.environ.get('SHARK_MODEL'),repo_type='dataset',local_dir='videos_example')
|
39 |
|
|
|
65 |
cv2.putText(image, line, (image.shape[1] - text_width - margin, y), font, font_size, color, font_thickness, lineType=cv2.LINE_AA)
|
66 |
return image
|
67 |
|
68 |
+
def overlay_logo(frame,logo, position=(10, 10)):
|
69 |
+
"""
|
70 |
+
Overlay a transparent logo (with alpha channel) on a frame.
|
71 |
+
|
72 |
+
Parameters:
|
73 |
+
- frame: The main image/frame to overlay the logo on.
|
74 |
+
- logo_path: Path to the logo image.
|
75 |
+
- position: (x, y) tuple indicating where the logo starts (top left corner).
|
76 |
+
"""
|
77 |
+
# Load the logo and its alpha channel
|
78 |
+
alpha_channel = np.ones(logo.shape[:2], dtype=logo.dtype)
|
79 |
+
print(logo.min(),logo.max())
|
80 |
+
logo = np.dstack((logo, alpha_channel))
|
81 |
+
|
82 |
+
indexes = logo[:,:,1]>150
|
83 |
+
logo[indexes,3] = 0
|
84 |
+
l_channels = cv2.split(logo)
|
85 |
+
if len(l_channels) != 4:
|
86 |
+
raise ValueError("Logo doesn't have an alpha channel!")
|
87 |
+
l_b, l_g, l_r, l_alpha = l_channels
|
88 |
+
cv2.imwrite('l_alpha.png',l_alpha*255)
|
89 |
+
# Extract regions of interest (ROI) from both images
|
90 |
+
roi = frame[position[1]:position[1]+logo.shape[0], position[0]:position[0]+logo.shape[1]]
|
91 |
+
|
92 |
+
# Blend the logo using the alpha channel
|
93 |
+
for channel in range(0, 3):
|
94 |
+
roi[:, :, channel] = (l_alpha ) * l_channels[channel] + (1.0 - l_alpha ) * roi[:, :, channel]
|
95 |
+
|
96 |
+
return frame
|
97 |
+
|
98 |
+
|
99 |
+
def add_danger_symbol_from_image(frame, top_pred):
|
100 |
+
relative = max(frame.shape[0],frame.shape[1])
|
101 |
+
if top_pred['shark_sighted'] and top_pred['dangerous_dist']:
|
102 |
+
# Add the danger symbol
|
103 |
+
danger_symbol = cv2.imread('static/danger_symbol.jpeg')
|
104 |
+
danger_symbol = cv2.resize(danger_symbol, (int(relative*0.1), int(relative*0.1)), interpolation = cv2.INTER_AREA)[:,:,::-1]
|
105 |
+
frame = overlay_logo(frame,danger_symbol, position=(int(relative*0.05), int(relative*0.05)))
|
106 |
+
return frame
|
107 |
+
|
108 |
def draw_cockpit(frame, top_pred,cnt):
|
109 |
# Bullet points:
|
110 |
high_danger_color = (255,0,0)
|
|
|
120 |
strings = [shark_sighted, human_sighted, shark_size_estimate, shark_weight_estimate, danger_level]
|
121 |
relative = max(frame.shape[0],frame.shape[1])
|
122 |
if top_pred['shark_sighted'] and top_pred['dangerous_dist'] and cnt%2 == 0:
|
|
|
123 |
frame = add_border(frame, color=high_danger_color, thickness=int(relative*0.025))
|
124 |
+
frame = add_danger_symbol_from_image(frame, top_pred)
|
125 |
elif top_pred['shark_sighted'] and not top_pred['dangerous_dist'] and cnt%2 == 0:
|
|
|
126 |
frame = add_border(frame, color=low_danger_color, thickness=int(relative*0.025))
|
127 |
+
frame = add_danger_symbol_from_image(frame, top_pred)
|
128 |
+
else:
|
129 |
+
|
130 |
+
frame = add_border(frame, color=(0,0,0), thickness=int(relative*0.025))
|
131 |
+
|
132 |
overlay_text_on_image(frame, strings, font=cv2.FONT_HERSHEY_SIMPLEX, font_size=relative*0.0007, font_thickness=1, margin=int(relative*0.05), color=(255, 255, 255))
|
133 |
return frame
|
134 |
|
135 |
|
136 |
|
137 |
+
def process_video(input_video,out_fps = 'auto', skip_frames = 7):
|
138 |
cap = cv2.VideoCapture(input_video)
|
139 |
|
140 |
output_path = "output.mp4"
|
|
|
154 |
cnt = 0
|
155 |
|
156 |
while iterating:
|
157 |
+
print('overall count ', cnt)
|
158 |
+
|
159 |
if (cnt % skip_frames) == 0:
|
160 |
print('starting Frame: ', cnt)
|
161 |
# flip frame vertically
|
|
|
170 |
|
171 |
|
172 |
#frame = cv2.resize(frame, (int(width), int(height)))
|
173 |
+
video.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
|
174 |
|
175 |
if cnt*skip_frames %2==0 and top_pred['shark_sighted']:
|
176 |
+
prediction_frame = cv2.resize(prediction_frame, (int(width), int(height)))
|
177 |
frame =prediction_frame
|
178 |
+
|
179 |
if top_pred['shark_sighted']:
|
180 |
frame = draw_cockpit(frame, top_pred,cnt*skip_frames)
|
181 |
+
video.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
|
182 |
+
|
183 |
+
|
184 |
pred_dashbord = prediction_dashboard(top_pred = top_pred)
|
185 |
#print('sending frame')
|
186 |
print('finalizing frame:',cnt)
|
187 |
print(pred_dashbord.shape)
|
188 |
print(frame.shape)
|
189 |
print(prediction_frame.shape)
|
190 |
+
yield frame , None
|
191 |
+
|
192 |
cnt += 1
|
193 |
iterating, frame = cap.read()
|
194 |
|
195 |
video.release()
|
196 |
+
yield None, output_path
|
197 |
|
198 |
with gr.Blocks(theme=theme) as demo:
|
199 |
+
with gr.Row().style(equal_height=True):
|
200 |
input_video = gr.Video(label="Input")
|
|
|
|
|
|
|
|
|
|
|
201 |
|
202 |
+
original_frames = gr.Image(label="Processed Frame").style( height=650)
|
203 |
+
#processed_frames = gr.Image(label="Shark Engine")
|
204 |
+
output_video = gr.Video(label="Output Video")
|
205 |
+
#dashboard = gr.Image(label="Events")
|
206 |
|
207 |
with gr.Row():
|
208 |
paths = sorted(pathlib.Path('videos_example/').rglob('*.mp4'))
|
|
|
210 |
examples = gr.Examples(samples, inputs=input_video)
|
211 |
process_video_btn = gr.Button("Process Video")
|
212 |
|
213 |
+
#process_video_btn.click(process_video, input_video, [processed_frames, original_frames, output_video, dashboard])
|
214 |
+
process_video_btn.click(process_video, input_video, [ original_frames, output_video])
|
215 |
demo.queue()
|
216 |
if os.getenv('SYSTEM') == 'spaces':
|
217 |
demo.launch(width='40%',auth=(os.environ.get('SHARK_USERNAME'), os.environ.get('SHARK_PASSWORD')))
|
inference.py
CHANGED
@@ -133,7 +133,7 @@ classes_is_human_id = [i for i, x in enumerate(classes_is_human) if x == 1]
|
|
133 |
classes_is_unknown_id = [i for i, x in enumerate(classes_is_unknown) if x == 1]
|
134 |
|
135 |
|
136 |
-
if not os.path.exists('model'):
|
137 |
REPO_ID = "SharkSpace/maskformer_model"
|
138 |
FILENAME = "mask2former"
|
139 |
snapshot_download(repo_id=REPO_ID, token= os.environ.get('SHARK_MODEL'),local_dir='model/')
|
|
|
133 |
classes_is_unknown_id = [i for i, x in enumerate(classes_is_unknown) if x == 1]
|
134 |
|
135 |
|
136 |
+
if not os.path.exists('model') and not os.getenv('SYSTEM') == 'spaces':
|
137 |
REPO_ID = "SharkSpace/maskformer_model"
|
138 |
FILENAME = "mask2former"
|
139 |
snapshot_download(repo_id=REPO_ID, token= os.environ.get('SHARK_MODEL'),local_dir='model/')
|
metrics.py
CHANGED
@@ -119,6 +119,8 @@ def get_min_distance_shark_person(top_pred, class_sizes = None, dangerous_distan
|
|
119 |
'dangerous_dist': min_dist < dangerous_distance}
|
120 |
|
121 |
def _calculate_dist_estimate(bbox1, bbox2, labels, class_sizes = None, measurement = 'feet'):
|
|
|
|
|
122 |
class_feet_size_mean = np.array([class_sizes[labels[0]][measurement][0],
|
123 |
class_sizes[labels[1]][measurement][0]]).mean()
|
124 |
box_pixel_size_mean = np.array([np.linalg.norm(bbox1[[0, 1]] - bbox1[[2, 3]]),
|
|
|
119 |
'dangerous_dist': min_dist < dangerous_distance}
|
120 |
|
121 |
def _calculate_dist_estimate(bbox1, bbox2, labels, class_sizes = None, measurement = 'feet'):
|
122 |
+
if class_sizes[labels[0]] == None or class_sizes[labels[1]] == None:
|
123 |
+
return 9999
|
124 |
class_feet_size_mean = np.array([class_sizes[labels[0]][measurement][0],
|
125 |
class_sizes[labels[1]][measurement][0]]).mean()
|
126 |
box_pixel_size_mean = np.array([np.linalg.norm(bbox1[[0, 1]] - bbox1[[2, 3]]),
|