swap-mukham_WIP / face_parsing.py
Peleck's picture
Initial
fa8453f
import cv2
import onnxruntime
import numpy as np
mask_regions = {
"Background":0,
"Skin":1,
"L-Eyebrow":2,
"R-Eyebrow":3,
"L-Eye":4,
"R-Eye":5,
"Eye-G":6,
"L-Ear":7,
"R-Ear":8,
"Ear-R":9,
"Nose":10,
"Mouth":11,
"U-Lip":12,
"L-Lip":13,
"Neck":14,
"Neck-L":15,
"Cloth":16,
"Hair":17,
"Hat":18
}
class FaceParser:
def __init__(self, model_path=None, provider=['CPUExecutionProvider'], session_options=None):
self.session_options = session_options
if self.session_options is None:
self.session_options = onnxruntime.SessionOptions()
self.session = onnxruntime.InferenceSession(model_path, sess_options=self.session_options, providers=provider)
self.mean = np.array([0.485, 0.456, 0.406]).reshape((1, 1, 3))
self.std = np.array([0.229, 0.224, 0.225]).reshape((1, 1, 3))
def parse(self, img, regions=[1,2,3,4,5,10,11,12,13]):
img = cv2.resize(img, (512, 512), interpolation=cv2.INTER_LINEAR)
img = img.astype(np.float32)[:,:,::-1] / 255.0
img = (img - self.mean) / self.std
img = np.expand_dims(img.transpose((2, 0, 1)), axis=0).astype(np.float32)
out = self.session.run(None, {'input':img})[0]
out = out.squeeze(0).argmax(0)
out = np.isin(out, regions).astype('float32')
return out.clip(0, 1)
def mask_regions_to_list(values):
out_ids = []
for value in values:
if value in mask_regions.keys():
out_ids.append(mask_regions.get(value))
return out_ids