Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
iperov
GitHub Repository: iperov/deepfacelab
Path: blob/master/samplelib/Sample.py
628 views
1
from enum import IntEnum
2
from pathlib import Path
3
4
import cv2
5
import numpy as np
6
7
from core.cv2ex import *
8
from facelib import LandmarksProcessor
9
from core import imagelib
10
from core.imagelib import SegIEPolys
11
12
class SampleType(IntEnum):
13
IMAGE = 0 #raw image
14
15
FACE_BEGIN = 1
16
FACE = 1 #aligned face unsorted
17
FACE_PERSON = 2 #aligned face person
18
FACE_TEMPORAL_SORTED = 3 #sorted by source filename
19
FACE_END = 3
20
21
QTY = 4
22
23
class Sample(object):
24
__slots__ = ['sample_type',
25
'filename',
26
'face_type',
27
'shape',
28
'landmarks',
29
'seg_ie_polys',
30
'xseg_mask',
31
'xseg_mask_compressed',
32
'eyebrows_expand_mod',
33
'source_filename',
34
'person_name',
35
'pitch_yaw_roll',
36
'_filename_offset_size',
37
]
38
39
def __init__(self, sample_type=None,
40
filename=None,
41
face_type=None,
42
shape=None,
43
landmarks=None,
44
seg_ie_polys=None,
45
xseg_mask=None,
46
xseg_mask_compressed=None,
47
eyebrows_expand_mod=None,
48
source_filename=None,
49
person_name=None,
50
pitch_yaw_roll=None,
51
**kwargs):
52
53
self.sample_type = sample_type if sample_type is not None else SampleType.IMAGE
54
self.filename = filename
55
self.face_type = face_type
56
self.shape = shape
57
self.landmarks = np.array(landmarks) if landmarks is not None else None
58
59
if isinstance(seg_ie_polys, SegIEPolys):
60
self.seg_ie_polys = seg_ie_polys
61
else:
62
self.seg_ie_polys = SegIEPolys.load(seg_ie_polys)
63
64
self.xseg_mask = xseg_mask
65
self.xseg_mask_compressed = xseg_mask_compressed
66
67
if self.xseg_mask_compressed is None and self.xseg_mask is not None:
68
xseg_mask = np.clip( imagelib.normalize_channels(xseg_mask, 1)*255, 0, 255 ).astype(np.uint8)
69
ret, xseg_mask_compressed = cv2.imencode('.png', xseg_mask)
70
if not ret:
71
raise Exception("Sample(): unable to generate xseg_mask_compressed")
72
self.xseg_mask_compressed = xseg_mask_compressed
73
self.xseg_mask = None
74
75
self.eyebrows_expand_mod = eyebrows_expand_mod if eyebrows_expand_mod is not None else 1.0
76
self.source_filename = source_filename
77
self.person_name = person_name
78
self.pitch_yaw_roll = pitch_yaw_roll
79
80
self._filename_offset_size = None
81
82
def has_xseg_mask(self):
83
return self.xseg_mask is not None or self.xseg_mask_compressed is not None
84
85
def get_xseg_mask(self):
86
if self.xseg_mask_compressed is not None:
87
xseg_mask = cv2.imdecode(self.xseg_mask_compressed, cv2.IMREAD_UNCHANGED)
88
if len(xseg_mask.shape) == 2:
89
xseg_mask = xseg_mask[...,None]
90
return xseg_mask.astype(np.float32) / 255.0
91
return self.xseg_mask
92
93
def get_pitch_yaw_roll(self):
94
if self.pitch_yaw_roll is None:
95
self.pitch_yaw_roll = LandmarksProcessor.estimate_pitch_yaw_roll(self.landmarks, size=self.shape[1])
96
return self.pitch_yaw_roll
97
98
def set_filename_offset_size(self, filename, offset, size):
99
self._filename_offset_size = (filename, offset, size)
100
101
def read_raw_file(self, filename=None):
102
if self._filename_offset_size is not None:
103
filename, offset, size = self._filename_offset_size
104
with open(filename, "rb") as f:
105
f.seek( offset, 0)
106
return f.read (size)
107
else:
108
with open(filename, "rb") as f:
109
return f.read()
110
111
def load_bgr(self):
112
img = cv2_imread (self.filename, loader_func=self.read_raw_file).astype(np.float32) / 255.0
113
return img
114
115
def get_config(self):
116
return {'sample_type': self.sample_type,
117
'filename': self.filename,
118
'face_type': self.face_type,
119
'shape': self.shape,
120
'landmarks': self.landmarks.tolist(),
121
'seg_ie_polys': self.seg_ie_polys.dump(),
122
'xseg_mask' : self.xseg_mask,
123
'xseg_mask_compressed' : self.xseg_mask_compressed,
124
'eyebrows_expand_mod': self.eyebrows_expand_mod,
125
'source_filename': self.source_filename,
126
'person_name': self.person_name
127
}
128
129