# SPIGA library import spiga.inference.config as model_cfg from spiga.inference.framework import SPIGAFramework # Demo modules import spiga.demo.analyze.extract.processor as pr class SPIGAProcessor(pr.Processor): def __init__(self, dataset='wflw', features=('lnd', 'pose'), gpus=[0]): super().__init__() # Configure and load processor self.processor_cfg = model_cfg.ModelConfig(dataset) self.processor = SPIGAFramework(self.processor_cfg, gpus=gpus) # Define attributes if 'lnd' in features: self.attributes.append('landmarks') self.attributes.append('landmarks_ids') if 'pose' in features: self.attributes.append('headpose') def process_frame(self, frame, tracked_obj): bboxes = [] for obj in tracked_obj: x1, y1, x2, y2 = obj.bbox[:4] bbox_wh = [x1, y1, x2-x1, y2-y1] bboxes.append(bbox_wh) features = self.processor.inference(frame, bboxes) for obj_idx in range(len(tracked_obj)): # Landmarks output if 'landmarks' in self.attributes: tracked_obj[obj_idx].landmarks = features['landmarks'][obj_idx] tracked_obj[obj_idx].landmarks_ids = self.processor_cfg.dataset.ldm_ids # Headpose output if 'headpose' in self.attributes: tracked_obj[obj_idx].headpose = features['headpose'][obj_idx] return tracked_obj def plot_features(self, image, features, plotter, show_attributes): if 'landmarks' in self.attributes and 'landmarks' in show_attributes: x1, y1, x2, y2 = features.bbox[:4] thick = int(plotter.landmarks.thickness['lnd'] * (x2-x1)/200 + 0.5) if thick == 0: thick = 1 image = plotter.landmarks.draw_landmarks(image, features.landmarks, thick=thick) if 'headpose' in self.attributes and 'headpose' in show_attributes: image = plotter.hpose.draw_headpose(image, features.bbox[:5], features.headpose[:3], features.headpose[3:], euler=True) return image