Video-Summary/Application/LayerManager.py

123 lines
4.2 KiB
Python
Raw Normal View History

import time
2020-10-23 22:14:43 +00:00
from multiprocessing.pool import ThreadPool
2020-10-23 22:14:43 +00:00
import cv2
import numpy as np
from Application.Classifiers.Classifier import Classifier
from Application.Config import Config
from Application.Exporter import Exporter
from Application.Layer import Layer
from Application.VideoReader import VideoReader
2020-12-05 19:57:24 +00:00
2022-01-02 22:40:05 +00:00
2020-10-23 22:14:43 +00:00
class LayerManager:
def __init__(self, config, layers):
self.data = {}
self.layers = layers
self.tolerance = config["tolerance"]
self.ttolerance = config["ttolerance"]
2022-09-11 09:25:36 +00:00
self.min_layer_length = config["minLayerLength"]
self.max_layer_length = config["maxLayerLength"]
self.resize_width = config["resizeWidth"]
self.footage_path = config["inputPath"]
2020-10-23 22:14:43 +00:00
self.config = config
2022-01-09 19:25:44 +00:00
# self.classifier = Classifier()
2020-10-31 19:36:43 +00:00
self.tags = []
2020-10-23 22:14:43 +00:00
print("LayerManager constructed")
2022-09-11 09:25:36 +00:00
def clean_layers(self):
2020-11-05 22:17:05 +00:00
print("'Cleaning' Layers")
2020-12-18 20:27:19 +00:00
print("Before deleting short layers ", len(self.layers))
2022-09-11 09:25:36 +00:00
self.free_min()
2020-12-18 20:27:19 +00:00
print("Before deleting long layers ", len(self.layers))
2022-09-11 09:25:36 +00:00
self.free_max()
self.sort_layers()
2021-02-05 19:04:10 +00:00
print("Before deleting sparse layers ", len(self.layers))
2022-09-11 09:25:36 +00:00
self.delete_sparse()
2020-12-18 20:27:19 +00:00
print("after deleting sparse layers ", len(self.layers))
#self.calcTimeOffset()
2020-12-18 20:27:19 +00:00
2022-09-11 09:25:36 +00:00
def delete_sparse(self):
to_delete = []
2020-12-18 20:27:19 +00:00
for i, l in enumerate(self.layers):
empty = l.bounds.count([])
2021-02-05 19:04:10 +00:00
if empty / len(l) > 0.5:
2022-09-11 09:25:36 +00:00
to_delete.append(i)
2020-12-18 20:27:19 +00:00
2022-09-11 09:25:36 +00:00
for i, id in enumerate(to_delete):
2020-12-18 20:27:19 +00:00
del self.layers[id - i]
2022-09-11 09:25:36 +00:00
def free_min(self):
2020-10-23 22:14:43 +00:00
self.data.clear()
layers = []
for l in self.layers:
2022-09-11 09:25:36 +00:00
if len(l) > self.min_layer_length:
2022-01-02 22:40:05 +00:00
layers.append(l)
2020-10-23 22:14:43 +00:00
self.layers = layers
2022-01-02 22:40:05 +00:00
2022-09-11 09:25:36 +00:00
def free_max(self):
2020-10-23 22:14:43 +00:00
layers = []
for l in self.layers:
2022-09-11 09:25:36 +00:00
if len(l) < self.max_layer_length:
2022-01-02 22:40:05 +00:00
layers.append(l)
2020-10-23 22:14:43 +00:00
self.layers = layers
2022-09-11 09:25:36 +00:00
def tag_layers(self):
2022-01-09 19:25:44 +00:00
"""Use classifieres the tag all Layers, by reading the contour content from the original video, then applying the classifier"""
2020-11-05 22:17:05 +00:00
print("Tagging Layers")
2020-10-31 19:36:43 +00:00
exporter = Exporter(self.config)
start = time.time()
2020-12-26 13:58:58 +00:00
for i, layer in enumerate(self.layers):
2022-01-09 19:25:44 +00:00
print(f"{round(i/len(self.layers)*100,2)} {round((time.time() - start), 2)}")
2020-10-31 19:36:43 +00:00
start = time.time()
if len(layer.bounds[0]) == 0:
continue
2022-09-11 09:25:36 +00:00
list_of_frames = exporter.make_list_of_frames([layer])
2020-10-23 22:14:43 +00:00
2022-09-11 09:25:36 +00:00
video_reader = VideoReader(self.config, list_of_frames)
video_reader.fill_buffer()
2020-10-23 22:14:43 +00:00
2022-09-11 09:25:36 +00:00
while not video_reader.video_ended():
frame_count, frame = video_reader.pop()
2020-10-31 19:36:43 +00:00
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
data = []
2022-09-11 09:25:36 +00:00
for (x, y, w, h) in layer.bounds[frame_count - layer.startFrame]:
2020-10-31 19:36:43 +00:00
if x is None:
break
2022-09-11 09:25:36 +00:00
factor = video_reader.w / self.resize_width
2020-10-31 19:36:43 +00:00
x = int(x * factor)
y = int(y * factor)
w = int(w * factor)
h = int(h * factor)
2022-01-09 19:25:44 +00:00
data.append(np.copy(frame[y : y + h, x : x + w]))
2020-10-31 19:36:43 +00:00
layer.data.append(data)
tags = self.classifier.tagLayer(layer.data)
print(tags)
self.tags.append(tags)
2020-10-23 22:14:43 +00:00
2022-09-11 09:25:36 +00:00
video_reader.thread.join()
2020-10-23 22:14:43 +00:00
2022-09-11 09:25:36 +00:00
def sort_layers(self):
2022-01-02 22:40:05 +00:00
self.layers.sort(key=lambda c: c.startFrame)
2021-02-06 14:49:46 +00:00
2022-09-11 09:25:36 +00:00
def calc_time_offset(self):
len_l = len(self.layers)
for i in range(1, len(self.layers)):
layer = self.layers[i]
2022-09-11 09:25:36 +00:00
print(f"\r {i}/{len_l}", end="\r")
2021-02-06 14:49:46 +00:00
overlap = True
tries = 1
2021-02-06 14:49:46 +00:00
while overlap:
overlap = False
2022-01-02 22:40:05 +00:00
for l in self.layers[:i:-1]:
if layer.timeOverlaps(l) and layer.spaceOverlaps(l):
overlap = True
break
2021-02-06 14:49:46 +00:00
if overlap:
self.layers[i].exportOffset += 20 * tries
tries += 1
2021-02-06 14:49:46 +00:00
2022-01-09 19:25:44 +00:00
# if self.layers[i].exportOffset >= 300000:
# break