[PYTHON] Ich habe versucht, die Bayes'sche Optimierung zu durchlaufen. (Mit Beispielen)

Überblick

Die Bayes'sche Optimierung ist eine der Methoden zum Ermitteln des Maximal- oder Minimalwerts für eine unbekannte Funktion "f (x)". Aufgrund seiner Natur soll es für die folgenden Problemfälle geeignet sein.

Die nächste Folie war für bestimmte Algorithmen und mathematische Erklärungen leicht zu verstehen.

Einführung in die Bayes'sche Optimierung für SlideShare für maschinelles Lernen [01. Übersicht über die Bayes'sche Optimierung](https://colab.research.google.com/github/TatsuyaKatayama/OpenFOAMandBaysianOpt_Notebooks/blob/master/01.%E3%83%99%E3%82%A4%E3%82% Ba

Dann fand ich ein Ereignis, das ich ein wenig optimieren wollte, also baute ich ein Programm dafür.

Bibliotheks- und Beispielcode für die Bayes'sche Optimierung

Verwenden Sie die Bibliothek GPyOpt, die auch in der oben genannten Python Notebook-Dokumentation verwendet wurde. Dies ist eine Bibliothek, mit der Sie auf einfache Weise Bayes'sche Optimierungsberechnungen in Python durchführen können. Wenn Sie Beispielcode schreiben, sieht dies folgendermaßen aus.

import GPyOpt
from numpy.core.multiarray import ndarray


def func(x: float, y: float) -> float:
    # Rosenbrock function
    #Ziel dieser Optimierung. Die genaue Lösung ist(x, y) = (1, 1)Zum Zeitpunkt von f(x, y) = 0
    val = 100.0 * (y - x * x) ** 2 + (1 - x) ** 2
    print(f'f({x}, {y}) = {val}')
    return val


def func_wrapper(arr: ndarray) -> float:
    #Standardmäßig werden alle Argumente zusammen im ndarray-Typ übergeben, was schwer zu verstehen ist.
    #Eine Funktion zum Stehen und Umwickeln mit der eigentlichen Funktion
    return func(arr[:, 0][0], arr[:, 1][0])


if __name__ == '__main__':
    #Name in jeder Variablen(Variablennamen)-Kontinuierlicher Wert oder diskreter Wert-Wertebereich.
    # type=Typ statt fortlaufend=Wenn diskret, kann es diskrete Werte verarbeiten
    bounds = [
        {'name': 'x', 'type': 'continuous', 'domain': (-2, 2)},
        {'name': 'y', 'type': 'continuous', 'domain': (-1, 3)},
        # {'name': 'y', 'type': 'discrete', 'domain': tuple(range(-1, 3))},
        ]

    #Problem Definition. maximieren=Wenn dies der Fall ist, streben Sie eine Maximierung an
    problem = GPyOpt.methods.BayesianOptimization(func_wrapper, domain=bounds, maximize=False, verbosity=True)

    #Lauf. Ausführlichkeit=Bei der Einstellung True wird auch die verstrichene Berechnungszeit angezeigt.
    max_iter = 25
    problem.run_optimization(max_iter, verbosity=True)

    #Grafische Darstellung des Bewertungswerts und des Übergangs des besten Werts bei jeder Ausführung im Optimierungsprozess
    problem.plot_convergence()

    #Beste Lösung(Die beste Note, die ich je gesehen habe)Show
    print(problem.x_opt, problem.fx_opt)

    #Diagramm der geschätzten Funktionsform(Mittelwert / Streuung)Und eine Grafik, die zeigt, wo als nächstes gesucht werden muss(Erfassungsfunktion)Anzeigen
    problem.plot_acquisition()

** Bewertungswert bei jeder Implementierung und Übergang des besten Werts ** Figure_1.png

** Diagramm der geschätzten Funktionsform (Mittelwert / Varianz) und Diagramm, das zeigt, wo als nächstes gesucht werden soll (Erfassungsfunktion) ** Figure_2.png

Welches Ereignis möchten Sie optimieren?

** Es handelt sich um einen Weißabgleich der Kamera, der der Farbe des Objektivs entspricht. ** ** **

Ich glaube nicht, dass es an die Mehrheit der Menschen weitergegeben wird, deshalb werde ich es Schritt für Schritt erklären.

Was ist Weißabgleich?

Sie können ein Gefühl dafür bekommen, aber selbst wenn die Objekte, die Sie mit der Kamera aufnehmen, dieselben sind, Die Farbe des Objekts ändert sich abhängig von "welcher Art von Licht (Beleuchtung) es ausgesetzt ist". Zum Beispiel ** wenn es sonnig ist **. Zum Beispiel ** bei bewölktem Himmel **. Zum Beispiel **, wenn Sie sich in einem Raum mit Glühbirnenbeleuchtung befinden ** …….

Die Farbe der Beleuchtung wird als "Farbtemperatur" bezeichnet. Bei der "Weißabgleichanpassung" wird außerdem die Farbtemperatur berechnet, das Foto korrigiert und auf die richtige Farbe zurückgesetzt.

image.png (Zitiert aus https://av.jpn.support.panasonic.com/support/dsc/knowhow/knowhow31.html)

Welche Farbe hat das Objektiv?

Die Linse besteht grundsätzlich aus Glas. Wie Sie von der Seite des Flachglases sehen können, hat das Glas auch eine leichte "Farbe". Dann hat das Licht, das durch das Glas einschließlich der Linse gegangen ist, eine leichte "Farbe".

Darüber hinaus sind moderne Kameraobjektive dünn beschichtet. Dadurch sieht das Foto noch besser aus, aber diese Beschichtung hat auch eine leichte "Farbe".

image.png (Zitiert aus https://av.jpn.support.panasonic.com/support/dsc/knowhow/knowhow17.html)

Darüber hinaus verwenden nicht alle Hersteller die gleiche Glasbeschichtung Der Typ und die Anzahl der verwendeten Objektive unterscheiden sich für jedes Kameraobjektiv. Daher hat ** jedes Kameraobjektiv einen geringfügigen Farbunterschied **.

Die Beschichtung, die eine herstellerspezifische Technologie ist, hat jedoch eine stärkere Wirkung, und die Situation ist "Unterschied zwischen Linsenherstellern> Unterschied in Glas". (Nun, sogar derselbe Hersteller kann je nach Marke unterschiedliche Farben haben.)

Dieser Fall

Normalerweise Panasonic LUMIX G9 PRO und Panasonics LEICA DG LENS. Ich habe HTML angehängt), aber manchmal verwende ich M.ZUIKO PRO Objektiv. Die beiden sind jedoch ** etwas unterschiedlich in der Farbe **, daher habe ich mich gefragt, wie viel ich korrigieren soll.

Nehmen Sie daher eine weißliche Wand mit der ersteren auf (* verwischen Sie absichtlich den Fokus, um ein einheitliches Bild zu erhalten) und nehmen Sie dasselbe Motiv ** auf, während Sie den Weißabgleich jedes Mal ** in der letzteren ändern, welches weiß Stellen Sie fest, ob der Saldoanpassungswert als Korrektur geeignet ist.

Im obigen Bild gibt es nur eine Dimensionsanpassungsachse, die als "Farbtemperatur" bezeichnet wird. Die Weißabgleicheinstellung von G9 PRO lautet jedoch "A (orange) -B (blau)" und "G (grün) -M - rot (rot)". Es gibt zwei Achsen, und die optimale Lösung wird gesucht, indem diese im Bereich von ± 9 eingestellt werden.

image.png

(Zitiert aus https://panasonic.jp/p-db/contents/manualdl/1428353073217.pdf)

Schritt durch die Bayes'sche Optimierung!

Betrachten Sie zunächst die Funktion, die Sie optimieren möchten. Erstellen Sie zuvor eine Funktion, die "das Bild liest und den Farbton mit (R, G, B) berechnet".

from typing import Tuple
from PIL import Image
from PIL.Image import BOX
from PIL.MpoImagePlugin import MpoImageFile

def get_sample_color(path: str) -> Tuple[int, int, int]:
    """Lesen Sie die Bilddatei des angegebenen Pfads, vertikal und horizontal 1/Schneiden Sie 10 Felder von der Mitte aus, erhalten Sie die durchschnittliche Farbe und kehren Sie zurück

    :param path:Dateiname
    :return: (R, G, B)
    """
    im: MpoImageFile = Image.open(path)
    image_size = im.size
    image_size2 = (image_size[0] / 10, image_size[1] / 10)
    left_upper_pos = ((image_size[0] - image_size2[0]) / 2, (image_size[1] - image_size2[1]) / 2)
    cropped_im = im.crop((left_upper_pos[0], left_upper_pos[1],
                          left_upper_pos[0] + image_size2[0], left_upper_pos[1] + image_size2[1]))
    resized_im = cropped_im.resize((1, 1), resample=BOX)
    data_r = resized_im.getcolors()[0][1][0]
    data_g = resized_im.getcolors()[0][1][1]
    data_b = resized_im.getcolors()[0][1][2]
    return data_r, data_g, data_b

Sie benötigen auch eine Funktion, um den Farbunterschied zu berechnen. Konvertieren Sie in den YCbCr-Farbraum anstelle des RGB-Raums und berechnen Sie die L2-Norm für Cb und Cr.

def calc_color_diff(color1: Tuple[int, int, int], color2: Tuple[int, int, int]) -> float:
    """Berechnen Sie die Differenz zwischen den beiden Farben

    :param color1:Farbe 1
    :param color2:Farbe 2
    :return:Unterschied zwischen zwei Farben im YCrCr-Raum
    """
    #JPEG YCbCr Formel diff
    cb_1 = -0.1687 * color1[0] - 0.3313 * color1[1] + 0.5 * color1[2] + 128
    cr_1 = 0.5 * color1[0] - 0.4187 * color1[1] - 0.0813 * color1[2] + 128
    cb_2 = -0.1687 * color2[0] - 0.3313 * color2[1] + 0.5 * color2[2] + 128
    cr_2 = 0.5 * color2[0] - 0.4187 * color2[1] - 0.0813 * color2[2] + 128
    return (cb_1 - cb_2) ** 2 + (cr_1 - cr_2) ** 2

Und die Funktion, die Sie optimieren möchten, aber im Gegensatz zur allgemeinen Pyhon-Funktion, Es ist notwendig, den Vorgang "** Stoppen Sie den Vorgang, bis er durch Aufnehmen eines Bildes gelesen werden kann **" auszuführen. Ich dachte, dass der schnellste Weg die Funktion input () ist, also habe ich sie damit implementiert.

import os

def get_score(a: float, g: float) -> float:
    """Punktzahl in den angegebenen Einstellungen(= Abstand zur Standardfarbe)Berechnen

    :param a:Parameter A.(Bernstein)Der Wert des. B wenn es eine negative Zahl ist(Blau)Werde die Farbe der Seite
    :param g:Parameter G.(Grün)Der Wert des. Wenn es eine negative Zahl ist, M.(Magenta)Werde die Farbe der Seite
    :return:Der Abstand zwischen den Farben. Je kleiner desto besser
    """

    #Generieren Sie den Namen der Datei, die Sie lesen möchten
    if a >= 0.0:
        temp1 = f'A{int(a)}'
    else:
        temp1 = f'B{int(-a)}'
    if g >= 0.0:
        temp2 = f'G{int(g)}'
    else:
        temp2 = f'M{int(-g)}'
    file_name = f'MZD_{temp1}{temp2}.jpg'

    #Überprüfen Sie, ob die Datei nicht vorhanden ist, und lassen Sie sie erstellen, wenn sie nicht vorhanden ist
    while not os.path.exists(file_name):
        _ = input(f'{file_name}Drücken Sie nach dem Erstellen die Eingabetaste.')

    #Lesen Sie die Datei und die durchschnittliche Farbe in der Nähe der Mitte(= Messwert)Bekommen
    mzd_rgb = get_sample_color(file_name)

    #Vergleichen Sie mit der Farbe der Probendaten
    score = calc_color_diff(mzd_rgb, base_rgb)
    print(f'a={a} g={g} score={score}')
    return score

Der Rest des Flusses ist fast der gleiche. Bitte beachten Sie, dass dieser Eingang (Weißabgleich-Einstellwert) ein diskreter Wert ist. Daher muss für den diskreten Wert der Typ "diskret" eingestellt werden. Nun, wie oben erwähnt, wird der ganzzahlige Wert ("int type") auch bei "type": "discrete" nicht an die Funktion übergeben, die Sie optimieren möchten, sondern immer beim Typ "float".

from numpy.core.multiarray import ndarray

def get_score2(x: ndarray) -> float:
    """Punktzahl in den angegebenen Einstellungen(= Abstand zur Standardfarbe)Berechnen"""
    return get_score(x[:, 0][0], x[:, 1][0])


if __name__ == '__main__':
    bounds = [{'name': 'a', 'type': 'discrete', 'domain': tuple(range(-9, 10))},
              {'name': 'g', 'type': 'discrete', 'domain': tuple(range(-9, 10))}]

    myProblem = GPyOpt.methods.BayesianOptimization(get_score2,
                                                    domain=bounds,
                                                    maximize=False,
                                                    verbosity=True)
    max_iter = 25
    myProblem.run_optimization(max_iter, verbosity=True)
    myProblem.plot_convergence()
    print(myProblem.x_opt, myProblem.fx_opt)
    myProblem.plot_acquisition()

Optimierungsergebnis

Es sieht aus wie das. Da der Bewertungswert etwas klebrig war, war die Konvergenz schlecht, aber die Ergebnisse waren im Allgemeinen zufriedenstellend.

Figure_1.jpg Figure_2.jpg

Wenn Sie es weiter ändern möchten

Bei "Farbe" geht es nicht nur um den Weißabgleich, sondern auch um den Kontrast des Bildes. Einige Menschen sind beispielsweise der Meinung, dass der Kontrast unterschiedlich ist, je nachdem, ob es sich um die Marke LUMIX oder die Marke LEICA handelt.

Dieses Mal habe ich es mit "weiße unscharfe Wand (≒ 18% grau)" eingestellt, so dass ich nur den Weißabgleich einstellen kann, aber Durch Einstellen mit "Objekt mit schrittweise gedruckter weißer bis schwarzer Farbe (graue Tabelle)" Der Grad der neutralen Farbe ... Mit anderen Worten, der Kontrast kann auch eingestellt werden.

Neben der Bayes'schen Optimierung werden auch Eingaben von 3 oder mehr Dimensionen unterstützt Wenn Sie genauere Einstellungen vornehmen möchten, ändern Sie das obige Programm.

Recommended Posts

Ich habe versucht, die Bayes'sche Optimierung zu durchlaufen. (Mit Beispielen)
Ich habe die Bayes'sche Optimierung ausprobiert!
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
Ich habe versucht zu debuggen.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, Faster R-CNN mit Pytorch auszuführen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, ObjectId (Primärschlüssel) mit Pymongo zu generieren
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
Ich habe versucht, unsere Dunkelheit mit der Chatwork-API aufzudecken
Ich habe versucht, vier Optimierungsmethoden für neuronale Netze zusammenzufassen
[Einführung in Pytorch] Ich habe versucht, Cifar10 mit VGG16 ♬ zu kategorisieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, Mask R-CNN mit Optical Flow zu interpolieren
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
[Einführung in AWS] Ich habe versucht, mit der Sprach-Text-Konvertierung zu spielen ♪
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, das Problem der Optimierung der Platzierung virtueller Maschinen (einfache Version) mit blueqat zu lösen
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, mit PyCaret zu clustern