Spaces:
Sleeping
Sleeping
import os | |
import cv2 | |
import pkg_resources | |
# My libs | |
import spiga.demo.analyze.track.get_tracker as tr | |
import spiga.demo.analyze.extract.spiga_processor as pr_spiga | |
from spiga.demo.analyze.analyzer import VideoAnalyzer | |
from spiga.demo.visualize.viewer import Viewer | |
# Paths | |
video_out_path_dft = pkg_resources.resource_filename('spiga', 'demo/outputs') | |
if not os.path.exists(video_out_path_dft): | |
os.makedirs(video_out_path_dft) | |
def main(): | |
import argparse | |
pars = argparse.ArgumentParser(description='Face App') | |
pars.add_argument('-i', '--input', type=str, default='0', help='Video input') | |
pars.add_argument('-d', '--dataset', type=str, default='wflw', | |
choices=['wflw', '300wpublic', '300wprivate', 'merlrav'], | |
help='SPIGA pretrained weights per dataset') | |
pars.add_argument('-t', '--tracker', type=str, default='RetinaSort', | |
choices=['RetinaSort', 'RetinaSort_Res50'], help='Tracker name') | |
pars.add_argument('-sh', '--show', nargs='+', type=str, default=['fps', 'face_id', 'landmarks', 'headpose'], | |
choices=['fps', 'bbox', 'face_id', 'landmarks', 'headpose'], | |
help='Select the attributes of the face to be displayed ') | |
pars.add_argument('-s', '--save', action='store_true', help='Save record') | |
pars.add_argument('-nv', '--noview', action='store_false', help='Do not visualize the window') | |
pars.add_argument('--outpath', type=str, default=video_out_path_dft, help='Video output directory') | |
pars.add_argument('--fps', type=int, default=30, help='Frames per second') | |
pars.add_argument('--shape', nargs='+', type=int, help='Visualizer shape (W,H)') | |
args = pars.parse_args() | |
if args.shape: | |
if len(args.shape) != 2: | |
raise ValueError('--shape requires two values: width and height. Ej: --shape 256 256') | |
else: | |
video_shape = tuple(args.shape) | |
else: | |
video_shape = None | |
if not args.noview and not args.save: | |
raise ValueError('No results will be saved neither shown') | |
video_app(args.input, spiga_dataset=args.dataset, tracker=args.tracker, fps=args.fps, | |
save=args.save, output_path=args.outpath, video_shape=video_shape, visualize=args.noview, plot=args.show) | |
def video_app(input_name, spiga_dataset=None, tracker=None, fps=30, save=False, | |
output_path=video_out_path_dft, video_shape=None, visualize=True, plot=()): | |
# Load video | |
try: | |
capture = cv2.VideoCapture(int(input_name)) | |
video_name = None | |
if not visualize: | |
print('WARNING: Webcam must be visualized in order to close the app') | |
visualize = True | |
except: | |
try: | |
capture = cv2.VideoCapture(input_name) | |
video_name = input_name.split('/')[-1][:-4] | |
except: | |
raise ValueError('Input video path %s not valid' % input_name) | |
if capture is not None: | |
# Initialize viewer | |
if video_shape is not None: | |
vid_w, vid_h = video_shape | |
else: | |
vid_w, vid_h = capture.get(3), capture.get(4) | |
viewer = Viewer('face_app', width=vid_w, height=vid_h, fps=fps) | |
if save: | |
viewer.record_video(output_path, video_name) | |
# Initialize face tracker | |
faces_tracker = tr.get_tracker(tracker) | |
faces_tracker.detector.set_input_shape(capture.get(4), capture.get(3)) | |
# Initialize processors | |
processor = pr_spiga.SPIGAProcessor(dataset=spiga_dataset) | |
# Initialize Analyzer | |
faces_analyzer = VideoAnalyzer(faces_tracker, processor=processor) | |
# Convert FPS to the amount of milliseconds that each frame will be displayed | |
if visualize: | |
viewer.start_view() | |
while capture.isOpened(): | |
ret, frame = capture.read() | |
if ret: | |
# Process frame | |
faces_analyzer.process_frame(frame) | |
# Show results | |
key = viewer.process_image(frame, drawers=[faces_analyzer], show_attributes=plot) | |
if key: | |
break | |
else: | |
break | |
capture.release() | |
viewer.close() | |
if __name__ == '__main__': | |
main() | |