Kürzlich habe ich einen solchen Stapelüberlauf gefunden. sparse_image_warp in Tensorflow doesn't work?
Es scheint, dass TensorFlow Addons eine Funktion hat, die zwei Bilder vorbereitet und das Bild mit einem als Basis und dem anderen als Referenz verzieht (verzerrt). Als Mechanismus werden das Basisbild und der Orientierungspunkt jedes Bildes eingegeben, und das dem Referenz-Orientierungspunkt entsprechende Basisbild wird erzeugt.
~~ Ich habe es nicht im Detail betrachtet, aber ich habe es versucht, weil es interessant aussieht. ~~
Kurz gesagt, eine zusätzliche Funktion von TensorFlow. https://www.tensorflow.org/addons?hl=ja
Zitiert aus dem Beamten unten
TensorFlow SIG Addons ist ein von der Community bereitgestelltes Repository, das sich an etablierte API-Muster hält. Es werden jedoch neue Funktionen implementiert, die im Kern-TensorFlow nicht verfügbar sind.
OS: Ubuntu 18.04 LTS CPU: i7-8700K CPU @ 3.70GHz Speicher: 32 GB Python version: 3.6.9
DataSet The Ryerson Audio-Visual Database of Emotional Speech and Song (RAVDESS)
Unter Verwendung dieses Datensatzes haben wir die Daten verwendet, die durch geeignetes Ausschneiden von Bildern aus bewegten Bildern erhalten wurden. Die Bildgröße wurde auf 256 * 256 eingestellt.
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()
Ausführungsbeispiel
python3 warp_image.py --input hoge.png --reference hoge2.png
--input: Dateiname des Eingabebildes --reference: Name der Referenzbilddatei
Das Ausführungsergebnis wird im Ergebnisordner gespeichert. Das Vorhandensein oder Fehlen des Orientierungspunkts soll das Ergebnis leicht verständlich machen. Der Orientierungspunkt wird für Warp (Ausgabe) nicht angezeigt.
ex1
landmarks | input | reference | warp(output) |
---|---|---|---|
kein Bildschirm | |||
Mit Anzeige |
ex2
landmarks | input | reference | warp(output) |
---|---|---|---|
kein Bildschirm | |||
Mit Anzeige |
TensorFlow Addons docs sparse_image_warp Gesichtsmarkierungen mit Python + OpenCV + dlib erkennen
Recommended Posts