[PYTHON] Pokemon-Symbolbildunterscheidung mithilfe von HOG-Funktionen

Zweck

  1. Es gibt verschiedene Pokemon-Battle-Log-Tools, aber es ist zu mühsam, den Inhalt der anderen Partei selbst eingeben zu müssen. Deshalb wollte ich etwas erstellen, das ihn automatisch ermittelt.
  2. Ich wollte die HOG-Funktionsmenge verwenden.

Die implementierten befinden sich am Ende des Artikels.

Über HOG-Funktionen

HOG (Histgram Of Gradient) ist wie die Verteilung von Helligkeitsgradienten in einem Bild. Da Sie erkennen können, wo sich die Helligkeit erheblich ändert, können Sie die Kantenverteilung des Bildes grob ermitteln. Die Erklärung von hier war leicht zu verstehen.

6.png Als Bild ausgedrückt

hogimage.jpg Ich fühle mich so. (Die Quelle des Bildes ist Kotoba Schwestern stehendes Bildmaterial (jeweils 30 Typen))

  1. Die Hintergrundfarbe der verfügbaren Daten und die Hintergrundfarbe auf dem zu unterscheidenden Spielbildschirm sind unterschiedlich
  2. Auf dem Spielbildschirm unterscheidet sich die Hintergrundfarbe je nach Position.

Diesmal ist es besonders wichtig, dass es schwierig ist, sich von diesen beiden Punkten beeinflussen zu lassen.

Die HOG-Extraktionsmethode ist in verschiedenen Bibliotheken implementiert. In dem Bereich habe ich es versucht

--scikit-image hog --OOGCV (für Python) HOG-Deskriptor --OpenCV (für Java) HOGDescriptor

Ich habe drei Typen ausprobiert. Erschreckend ** Die in diesen implementierten Methoden liefern unterschiedliche Ergebnisse (nur die Anzahl der Dimensionen ist gleich) **. Der Umriss des Algorithmus ist der gleiche, aber es scheint, dass die detaillierte Implementierung wie das Berechnungsverfahren unterschiedlich ist.

Algorithmus

Verfahrensbeschreibung

  1. Party-Frames aus Bildern extrahieren
  2. Schneiden Sie das Pokemon-Symbol aus dem Party-Frame-Teil aus
  3. Namensschätzung für jedes Symbolteil

Extraktion von Party Slots

Greifen Sie einfach mit dem Canny-Filter nach der Kante und hohlen Sie die Innenseite aus. Es ist fast dies.

test_PT_1.jpg Das Originalbild

canny.png Kantenextraktionsbild

trimmed_EPT.jpg Bild zuschneiden

Schneiden Sie den Symbolteil aus

Da die Position des Symbolbildteils im Rahmen festgelegt ist, müssen Sie lediglich die Position bestimmen und ausschneiden. Ich habe es beim Experimentieren entsprechend angepasst.

0.jpg4.jpg5.jpg Sie können ein Bild wie dieses erhalten.

Namensschätzung mit HOG-Funktionen

  1. Teilen Sie das 30x30-Bild in 3 BGR-Farbkanäle
  2. Entfernen Sie das Rauschen mit dem Gaußschen Filter für jedes Bild
  3. Berechnen Sie HOG mit einer Zellengröße von 5 Pixel und einer Blockgröße von 30 Pixel (6 Zellen) (324 Dimensionen).
  4. Kombinieren Sie HOGs für 3 Farben zu einem 972-dimensionalen Vektor
  5. Berechnen Sie für jedes Lehrerbild den Manhattan-Abstand vom ähnlich extrahierten Vektor
  6. Das Bild mit der größten Entfernung ist die richtige Antwort

Ich habe verschiedene Arten von Zellengröße und Blockgröße ausprobiert, aber diese Kombination war gut. Um diese Kombination gut nutzen zu können, wird die Größe des Beurteilungsbildes auf 30 x 30 eingestellt. Ich werde den Python-Code einfügen (geschätzter Teil). Da die erste eingefügte Version alt war, habe ich nur die für die HOG-Berechnung verwendeten Hyperparameter ersetzt (2017/3/4).

estimate.py


#Eine Methode zum Schätzen des Pokemon-Namens. Die Argumentdaten sind ein Paar aus Pokemon-Namen und dessen HOG.
def estimate_poke_index(image, data):
    hog = calculateHOG(image)
    distance_list = calculate_manhattan_distance(hog, data)
    return np.argmin(np.array(distance_list))

#Eine Methode, die ein Bild liest, HOG-Funktionen berechnet und zurückgibt
def calculateHOG(image, orient=9, cell_size=5, block_size=6):
    #Bild laden
    number_color_channels = np.shape(image)[2]
    if number_color_channels > 3:
        mask = image[:, :, 3]
        image = image[:, :, :3]
        for i in range(len(mask)):
            for j in range(len(mask[0])):
                if mask[i][j] == 0:
                    image[i, j, :] = 255
    #Ändern Sie die Bildgröße auf 30 x 30
    resized_image = cv2.resize(image, (30, 30))
    images = cv2.split(resized_image)
    fd = []
    for monocolor_image in images:
        blur_image = cv2.GaussianBlur(monocolor_image, (3,3),0)
        fd.extend(hog(blur_image, orientations=orient,
                      pixels_per_cell=(cell_size, cell_size), cells_per_block=(block_size, block_size)))
    return fd

#Entfernungsberechnungsmethode zwischen HOG-Merkmalen
def calculate_distance_HOG(target, data):
    distance_list = []
    rows, columns = np.shape(data)
    for i in range(rows):
        distance_list.append(np.linalg.norm(data[i, :] - target))
    return distance_list

#Manhattan Entfernungsberechnungsmethode
def calculate_manhattan_distance(target, data):
    distance_list = []
    rows, columns = np.shape(data)
    for i in range(rows):
        distance_list.append(np.sum(np.abs(data[i, :] - target)))
    return distance_list

Impressionen

Obwohl es sich um einen groben Algorithmus handelt, können Sie 70 bis 80% erleben. Es wäre schön, wenn ich über die Testergebnisse schreiben könnte, aber ich fürchte, ich habe keinen konsistenten Test durchgeführt. (Hinzugefügt am 04.03.2017) Als ich die Daten für 19 Spiele erhielt und die falsche Erkennungsrate überprüfte, habe ich einen Fehler mit 20/114 gemacht. Es scheint, dass ungefähr 80% erraten werden können, aber ich möchte die Fehlerkennung von Pokemon mit hohem KP wie "Gekkouga → Fukuslow" und "Garula → Chilt" bewältigen.

  1. In Farbe und Form ähnlich (Gabite und Gabrias usw.)
  2. Pokémon mit kleinen Symbolen (Garula, Lucario, Metamon, Lucky usw.) befinden sich näher rechts unten als erwartet.

Zwei sind wahrscheinlich die Hauptfehlwahrnehmungen. Der zweite kann korrekt sein, wenn der Algorithmus leicht verbessert ist.

Obwohl es für Tool-Entwickler ist, werde ich [in Java implementiert und gehärtet] setzen (https://drive.google.com/open?id=0B8aizdB6tJH6aVJWU25RZWx5QVU). Es ist in Ordnung, es frei zu benutzen, aber ich würde mich freuen, wenn Sie es mich wissen lassen könnten. (Weil ich das fertige Produkt sehen will)

Recommended Posts

Pokemon-Symbolbildunterscheidung mithilfe von HOG-Funktionen
Bildsegmentierung mit U-Net