Die implementierten befinden sich am Ende des Artikels.
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.
Als Bild ausgedrückt
Ich fühle mich so. (Die Quelle des Bildes ist Kotoba Schwestern stehendes Bildmaterial (jeweils 30 Typen))
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.
Greifen Sie einfach mit dem Canny-Filter nach der Kante und hohlen Sie die Innenseite aus. Es ist fast dies.
Das Originalbild
Kantenextraktionsbild
Bild zuschneiden
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.
Sie können ein Bild wie dieses erhalten.
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
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.
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)