Hallo zusammen. @best_not_best. Meine aktuelle Aufgabe besteht darin, die Jobempfehlungsfunktion der Rekrutierungswebsite zu implementieren und die Website mithilfe von Google Analytics und Adobe Analytics zu analysieren. (Der Rest ist nur das Posten von Tierbildern im hauseigenen Slack.)
In Letzter Adventskalender wurde die Beurteilung der Bildähnlichkeit mithilfe von Deep Learning durchgeführt. Die Genauigkeit war gut, aber das Sammeln von Trainingsdaten ist immer noch ein Engpass ... Dieses Mal möchte ich einfach die beiden Bilder vergleichen, um die Ähnlichkeit der Bilder festzustellen.
Vergleichen Sie die Ähnlichkeiten der folgenden Bilder. Das Bild wird vom Google-Lehrer aufgenommen. Für eine bessere Genauigkeit habe ich ein nach vorne gerichtetes Bild gewählt.
Vergleichsbild
Dateiname | Bild | Erläuterung |
---|---|---|
05.png | Shiba Hund (süß) |
Vergleich
Dateiname | Bild | Erläuterung |
---|---|---|
01.png | Daxfund (süß) | |
02.png | Corgi (süß) | |
03.png | Golden Retriever (süß) | |
04.png | Shiba Hund (süß) | |
06.png | Labrador Retriever (süß) |
Wenn die Ähnlichkeit zwischen 05.png und 04.png, die dieselbe Hunderasse sind, hoch ist, ist dies ein Erfolg.
hist_matching.py
feature_detection.py
images
├─ 01.png
├─ 02.png
├─ 03.png
├─ 04.png
├─ 05.png
└─ 06.png
Grob gesagt handelt es sich um eine Methode zum Vergleichen nach Farbton. Siehe unten für Details.
Die Graustufenkonvertierung wird nicht durchgeführt, da der Vergleich auf dem Farbton basiert. Außerdem wird die Bildgröße zum Vergleich einheitlich in 200 x 200 Pixel konvertiert.
hist_matching.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""hist matching."""
import cv2
import os
TARGET_FILE = '05.png'
IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/images/'
IMG_SIZE = (200, 200)
target_img_path = IMG_DIR + TARGET_FILE
target_img = cv2.imread(target_img_path)
target_img = cv2.resize(target_img, IMG_SIZE)
target_hist = cv2.calcHist([target_img], [0], None, [256], [0, 256])
print('TARGET_FILE: %s' % (TARGET_FILE))
files = os.listdir(IMG_DIR)
for file in files:
if file == '.DS_Store' or file == TARGET_FILE:
continue
comparing_img_path = IMG_DIR + file
comparing_img = cv2.imread(comparing_img_path)
comparing_img = cv2.resize(comparing_img, IMG_SIZE)
comparing_hist = cv2.calcHist([comparing_img], [0], None, [256], [0, 256])
ret = cv2.compareHist(target_hist, comparing_hist, 0)
print(file, ret)
Verbraucht es Speicher? Segmentierungsfehler: 11
oder Python (18114,0x7fff7a45b000) malloc: *** Fehler für Objekt 0x102000e00: falsche Prüfsumme für freigegebenes Objekt - Objekt wurde wahrscheinlich nach dem Freigeben geändert.
Es wird selten angezeigt. Ich konnte keine Lösung finden (sorry), aber bei einer großen Anzahl von Bildern scheint es besser, die Anzahl der Vergleichsbilder zu reduzieren und die Verarbeitung mehrmals durchzuführen.
Ausführungsergebnis
TARGET_FILE: 05.png
01.png 0.3064316801821619
02.png -0.09702013809004943
03.png 0.5273343981076624
04.png 0.5453261576844468
06.png 0.1256772923432995
Für genau das gleiche Bild beträgt die Ähnlichkeit 1. Sie können sehen, dass die Ähnlichkeit zwischen 05.png und 04.png hoch ist. Es war überraschend, dass der Ähnlichkeitsgrad mit 01.png hoch war.
2 Extrahieren Sie die Merkmalspunkte des Bildes und vergleichen Sie ihre Abstände. Ich bezog mich auf Folgendes.
Eine Graustufenumwandlung wird durchgeführt, um die Extraktionsgenauigkeit zu verbessern. Wie im vorherigen Abschnitt wird die Bildgröße zum Vergleich einheitlich in 200 x 200 Pixel konvertiert.
feature_detection.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""feature detection."""
import cv2
import os
TARGET_FILE = '05.png'
IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/images/'
IMG_SIZE = (200, 200)
target_img_path = IMG_DIR + TARGET_FILE
target_img = cv2.imread(target_img_path, cv2.IMREAD_GRAYSCALE)
target_img = cv2.resize(target_img, IMG_SIZE)
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
# detector = cv2.ORB_create()
detector = cv2.AKAZE_create()
(target_kp, target_des) = detector.detectAndCompute(target_img, None)
print('TARGET_FILE: %s' % (TARGET_FILE))
files = os.listdir(IMG_DIR)
for file in files:
if file == '.DS_Store' or file == TARGET_FILE:
continue
comparing_img_path = IMG_DIR + file
try:
comparing_img = cv2.imread(comparing_img_path, cv2.IMREAD_GRAYSCALE)
comparing_img = cv2.resize(comparing_img, IMG_SIZE)
(comparing_kp, comparing_des) = detector.detectAndCompute(comparing_img, None)
matches = bf.match(target_des, comparing_des)
dist = [m.distance for m in matches]
ret = sum(dist) / len(dist)
except cv2.error:
ret = 100000
print(file, ret)
In seltenen Fällen benutze ich "try Except", um "cv2.error" auszuspucken. Ich habe die Extraktionsmethode mit AKAZE und ORB ausprobiert.
Ausführungsergebnis (AKAZE)
TARGET_FILE: 05.png
01.png 143.925
02.png 134.05
03.png 140.775
04.png 127.8
06.png 148.725
Ausführungsergebnis (ORB)
TARGET_FILE: 05.png
01.png 67.59139784946237
02.png 58.60931899641577
03.png 59.354838709677416
04.png 53.59498207885304
06.png 63.55913978494624
Da der Abstand berechnet wird, ist der Wert für genau dasselbe Bild 0, und je kleiner der Wert ist, desto höher ist die Ähnlichkeit. Bei beiden implementierten Methoden ist die Ähnlichkeit zwischen 05.png und 04.png wie im vorherigen Abschnitt hoch.
Recommended Posts