Récemment, j'ai trouvé un tel débordement de pile. sparse_image_warp in Tensorflow doesn't work?
Il semble que TensorFlow Addons a une fonction qui prépare deux images et déforme (déforme) l'image avec l'une comme base et l'autre comme référence. En tant que mécanisme, l'image de base et le repère de chaque image sont entrés, et l'image de base correspondant au repère de référence est générée.
~~ Je ne l'ai pas regardé en détail, mais je l'ai essayé parce que ça a l'air intéressant. ~~
En un mot, une fonctionnalité supplémentaire de TensorFlow. https://www.tensorflow.org/addons?hl=ja
Cité par le fonctionnaire ci-dessous
TensorFlow SIG Addons est un référentiel fourni par la communauté qui adhère aux modèles d'API établis. Cependant, il implémente de nouvelles fonctionnalités qui ne sont pas disponibles dans le noyau TensorFlow.
OS: Ubuntu 18.04 LTS CPU: i7-8700K CPU @ 3.70GHz Mémoire: 32 Go Python version: 3.6.9
DataSet The Ryerson Audio-Visual Database of Emotional Speech and Song (RAVDESS)
En utilisant cet ensemble de données, nous avons utilisé les données obtenues en découpant de manière appropriée des images à partir d'images en mouvement. La taille de l'image a été définie sur 256 * 256.
pip3 install tensorflow==2.2.0
pip3 install tensorflow-addons==0.10.0
pip3 install opencv-python==3.4.0.12
pip3 install dlib==19.21.0
wget https://raw.githubusercontent.com/davisking/dlib-models/master/shape_predictor_68_face_landmarks.dat.bz2
bunzip2 shape_predictor_68_face_landmarks.dat.bz2
wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml
warp_imege.py
#!/usr/bin/python
# code modified from : https://tech-blog.s-yoshiki.com/entry/65
import cv2
import dlib
import tensorflow as tf
import tensorflow_addons as tfa
import numpy as np
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument("--input", required=True, help="image name")
parser.add_argument("--reference", required=True, help="reference image name")
args = parser.parse_args()
PREDICTOR_PATH = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(PREDICTOR_PATH)
cascade_path='haarcascade_frontalface_default.xml'
cascade = cv2.CascadeClassifier(cascade_path)
def get_landmarks(img):
rects = cascade.detectMultiScale(img, 1.3,5)
(x,y,w,h) = rects[0]
rect = dlib.rectangle(x,y,x+w,y+h)
return np.matrix([[p.y, p.x] for p in predictor(img, rect).parts()])
def annotate_landmarks(img, landmarks):
img = img.copy()
for idx, point in enumerate(landmarks):
pos = (point[0, 1], point[0, 0])
"""
cv2.putText(img, str(idx), pos,
fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
fontScale=0.4,
color=(255, 0, 0))
"""
cv2.circle(img, pos, 2, color=(255, 255, 0))
return img
def tfa_warp(img, source_landmarks, dest_landmarks):
img = img.astype(np.float32)
source_landmarks = source_landmarks.astype(np.float32)
dest_landmarks = dest_landmarks.astype(np.float32)
# image
# [batch, height, width, channels]
img = img[np.newaxis, :, :, :]
# coordinate
# [batch, num_control_points, 2]
source_landmarks = source_landmarks[np.newaxis, :, :]
dest_landmarks = dest_landmarks[np.newaxis, :, :]
warped_image, flow_field = tfa.image.sparse_image_warp(img, source_landmarks, dest_landmarks)
return warped_image
if __name__ == "__main__" :
img = cv2.imread(args.input)
ref_img = cv2.imread(args.reference)
warped_image = tfa_warp(img, get_landmarks(img), get_landmarks(ref_img))
warped_image = np.array(warped_image)
warped_image = np.squeeze(warped_image)
if not os.path.exists('./results'):
os.mkdir('results')
print("make dir: results")
cv2.imwrite("./results/warped_image_result.png ", warped_image)
cv2.imwrite("./results/"+os.path.splitext(args.input)[0]+"_landmarks.png ",annotate_landmarks(img,get_landmarks(img)))
cv2.imwrite("./results/"+os.path.splitext(args.reference)[0]+"_landmarks.png ",annotate_landmarks(ref_img,get_landmarks(ref_img)))
cv2.waitKey(0)
cv2.destroyAllWindows()
Exemple d'exécution
python3 warp_image.py --input hoge.png --reference hoge2.png
--input: nom de fichier de l'image d'entrée --reference: nom du fichier image de référence
Le résultat de l'exécution est stocké dans le dossier des résultats. La présence ou l'absence du repère est de rendre le résultat facile à comprendre. Le repère n'est pas affiché pour la déformation (sortie).
ex1
landmarks | input | reference | warp(output) |
---|---|---|---|
pas d'affichage | |||
Avec affichage |
ex2
landmarks | input | reference | warp(output) |
---|---|---|---|
pas d'affichage | |||
Avec affichage |
TensorFlow Addons docs sparse_image_warp Détecter les repères faciaux à l'aide de Python + OpenCV + dlib
Recommended Posts