[PYTHON] Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren

Einführung

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. ~~

Was sind TensorFlow-Addons?

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.

Vorgehensweise

Ausführungsumgebung

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.

1. Installieren Sie die erforderlichen Bibliotheken

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

2. Holen Sie sich trainierte Daten

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

3. Führen Sie aus

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

4. Ergebnis

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

Zusammenfassung

Referenzseite

TensorFlow Addons docs sparse_image_warp Gesichtsmarkierungen mit Python + OpenCV + dlib erkennen

Recommended Posts

Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die Gesichtsverdeckungsarbeit des Koordinationsbildes für das Tragen zu automatisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, die Höhen und Tiefen des Schlusskurses des Aktienkurses von Guru Navi mit TensorFlow vorherzusagen (Fortschritt)
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich wollte viele Bilder sammeln, also habe ich versucht, "Google Image Download" zu verwenden.
Ich habe versucht, Objekte aus dem Bild des Steak-Sets zu sortieren
Ich habe versucht, den für TensorFlow geschriebenen Code nach Theano zu portieren
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe das TensorFlow-Tutorial als erstes ausprobiert