Dies ist ATcat, ein Aidemy-Auszubildender. Benutzt ihr Instagram? Ich benutze oft Instagram, um Bilder von Katzen zu betrachten, aber wenn ich nach Bildern von Katzen suche, werde ich oft mit anderen Bildern als denen von Katzen gemischt, wie in der folgenden Abbildung gezeigt. Ich mag nur Katzenbilder, es ist schwierig, das System auf der Insta-Seite zu ändern, und ich habe nicht genug Zeit, um eine dedizierte Anwendung zu erstellen. Daher habe ich ein Bild erhalten, das auf Insta als "Katze" bezeichnet wird Ich habe ein System erstellt, das nur Bilder von Katzen extrahieren kann.
Dieses Mal habe ich die Objekterkennung verwendet, um das Bild einer Katze zu extrahieren, und ich werde diese Technik, die als Objekterkennung bezeichnet wird, kurz erläutern. Die Bilderkennung ist eine Technologie, die nur identifiziert, was aus den Merkmalen des gesamten Bildes erfasst wird, wenn sich ein interessierendes Objekt im Bild befindet. Die Objekterkennung ist eine Technologie, die identifiziert, wo und was erfasst wird. Mit anderen Worten, für die im Bild enthaltenen Objekte wird angegeben, was das bemerkenswerte Objekt im Objekt ist und wo das Objekt angegeben ist, und es wird durch ein Rechteck dargestellt, das als Begrenzungsrahmen bezeichnet wird. Es gibt auch eine Technik namens semantische Segmentierung, die komplexer ist, weil sie nach Pixeln sortiert. Dieses Mal haben wir das vorab trainierte Modell von Google implementiert. Der Grund dafür ist jedoch, dass das Vorbereiten eines Datensatzes, das Erlernen der Zeit, das Festlegen einer angemessenen Anzahl von Klassen usw. sehr viel Zeit in Anspruch nimmt, um ein Modell von Grund auf neu zu erstellen und zu lernen. Dies liegt daran, dass vorgefertigte Modelle in der Industrie sehr häufig verwendet werden.
Zunächst habe ich beschlossen, Bilder von den Hash-Tags von #cat und #cat zu sammeln, um Bilder von Katzen von Instagram zu sammeln. Zu dieser Zeit habe ich eine API namens Instagram Scraper verwendet.
pip install instagram-scraper
Zuerst mit pip installieren. Mit Instagram Scraper können Sie Beiträge bestimmter Benutzer sowie Bilder und Videos abrufen, die mit bestimmten Hash-Tags gepostet wurden. Dieses Mal habe ich es wie folgt ausgeführt.
insta.sh
#!/bin/sh
instagram_login_user='' #Dein Benutzername
instagram_login_pass='' #Ihr Passwort
target_tag='cat' #Tags, die abgekratzt werden sollen
instagram-scraper \
--login_user $instagram_login_user \
--login_pass $instagram_login_pass \
--tag $target_tag \
--media-types image \ #Geben Sie den zu erfassenden Datentyp an
--maximum 100 \ #Maximale Anzahl abzurufender Daten
--latest \ #Beginnen Sie dort, wo Sie zuletzt geschabt haben
Ich habe die Zahl auf 200 gesetzt.
Ich konnte das Bild so bekommen.
Als nächstes wird das erfasste Bild durch Objekterkennung als Katze bestimmt. Hier haben wir Faster R-CNN und SSD, die vorgelernten Modelle von Google, mithilfe von Google Colaboratory über Tensorflow Hub implementiert.
Dieses Mal habe ich es mit Bezug auf die folgende Site implementiert. https://qiita.com/code0327/items/3b23fd5002b373dc8ae8
Hier geht es darum, ein vorab trainiertes Modell über den Tensorflow Hub zu erfassen und zu definieren und eine Objekterkennung für das auf Instagram aufgenommene Katzenbild durchzuführen. Danach wird nur dann ein Bild ausgegeben, das das Erkennungsergebnis zeigt, wenn eine Katze erkannt wird.
Wählen Sie zunächst das importierte und trainierte Modell aus.
# For running inference on the TF-Hub module.
import tensorflow as tf
import tensorflow_hub as hub
import os
import glob
import time
import numpy as np
import matplotlib.patheffects as pe
import matplotlib.pyplot as plt
import tempfile
from six.moves.urllib.request import urlopen
from six import BytesIO
import numpy as np
from PIL import Image
from PIL import ImageColor
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageOps
#SSD oder schneller R.-Wählen Sie CNN
#module_handle = 'https://tfhub.dev/google/openimages_v4/ssd/mobilenet_v2/1'
module_handle = 'https://tfhub.dev/google/faster_rcnn/openimages_v4/inception_resnet_v2/1'
detector = hub.load(module_handle).signatures['default']
Das Bild des Ergebnisses der Objekterkennung ist wie folgt.
def showImage(img, r, imgfile, min_score=0.1):
fig = plt.figure(dpi=150,figsize=(8,8))
ax = plt.gca()
ax.tick_params(axis='both', which='both', left=False,
labelleft=False, bottom=False, labelbottom=False)
ax.imshow(img)
decode = np.frompyfunc( lambda p : p.decode("ascii"), 1, 1)
boxes = r['detection_boxes']
scores = r['detection_scores']
class_names = decode( r['detection_class_entities'] )
n = np.count_nonzero(scores >= min_score)
# class_Farbvorbereitung entsprechend Namen
class_set = np.unique(class_names[:n])
colors = dict()
cmap = plt.get_cmap('tab10')
for i, v in enumerate(class_set):
colors[v] =cmap(i)
#Zeichnen Sie ein Rechteck Zeichnen Sie das Rechteck mit der niedrigsten Punktzahl
img_w = img.shape[1]
img_h = img.shape[0]
for i in reversed(range(n)):
text = f'{class_names[i]} {100*scores[i]:.0f}%'
color = colors[class_names[i]]
y1, x1, y2, x2 = tuple(boxes[i])
y1, y2 = y1*img_h, y2*img_h
x1, x2 = x1*img_w, x2*img_w
#Rahmen
r = plt.Rectangle(xy=(x1, y1), width=(x2-x1), height=(y2-y1),
fill=False, edgecolor=color, joinstyle='round',
clip_on=False, zorder=8+(n-i) )
ax.add_patch( r )
#Tags: Text
t = ax.text(x1+img_w/200, y1-img_h/300, text, va='bottom', fontsize=6, color=color,zorder=8+(n-i))
t.set_path_effects([pe.Stroke(linewidth=1.5,foreground='white'), pe.Normal()])
fig.canvas.draw()
r = fig.canvas.get_renderer()
coords = ax.transData.inverted().transform(t.get_window_extent(renderer=r))
tag_w = abs(coords[0,0]-coords[1,0])+img_w/100
tag_h = abs(coords[0,1]-coords[1,1])+img_h/120
#Tags: Hintergrund
r = plt.Rectangle(xy=(x1, y1-tag_h), width=tag_w, height=tag_h,
edgecolor=color, facecolor=color,
joinstyle='round', clip_on=False, zorder=8+(n-i))
ax.add_patch( r )
#sparen
plt.savefig('/content/save/'+imgfile)
plt.close()
Ich versuche zu lokalisieren, indem ich es mit einem Rechteck für diejenigen mit einer Zuverlässigkeit von min_score oder höher einschließe.
Definieren Sie abschließend die zu erkennende Funktion.
import time
import numpy as np
import PIL.Image as Image
def run_detector(detector, path,img_file):
#Importieren Sie das Bild und konvertieren Sie es in ein Format, das in den Detektor eingegeben werden kann
img = Image.open(path+img_file) # Pillow(PIL)
if img.mode == 'RGBA' :
img = img.convert('RGB')
converted_img = img.copy()
converted_img = converted_img.resize((227,227),Image.LANCZOS) #Auf Eingabegröße reduzieren
converted_img = np.array(converted_img, dtype=np.float32) # np.In Array konvertieren
converted_img = converted_img / 255. # 0.0 ~ 1.Normalisiert auf 0
converted_img = converted_img.reshape([1,227,227,3])
converted_img = tf.constant(converted_img)
t1 = time.time()
result = detector(converted_img) #Allgemeine Objekterkennung (Hauptkörper)
t2 = time.time()
print(f'Erkennungszeit: {t2-t1:.3f}Sekunden' )
#Vorbereitung zur Ausgabe des Ergebnisses als Text
r = {key:value.numpy() for key,value in result.items()}
boxes = r['detection_boxes']
scores = r['detection_scores']
decode = np.frompyfunc( lambda p : p.decode('ascii'), 1, 1)
class_names = decode( r['detection_class_entities'] )
#Punktzahl ist 0.Textausgabe für mehr als 25 Ergebnisse (n)
print(f'Erkennungsobjekt' )
n = np.count_nonzero(scores >= 0.25 )
for i in range(n):
y1, x1, y2, x2 = tuple(boxes[i])
x1, x2 = int(x1*img.width), int(x2*img.width)
y1, y2 = int(y1*img.height),int(y2*img.height)
t = f'{class_names[i]:10} {100*scores[i]:3.0f}% '
t += f'({x1:>4},{y1:>4}) - ({x2:>4},{y2:>4})'
print(t)
#Ausgabe, wenn eine Katze erkannt wird
if "Cat" in t:
showImage(np.array(img), r, img_file,min_score=0.25) #Überlagern Sie das Erkennungsergebnis auf dem Bild
return t2-t1
Dieses Mal möchte ich es ausgeben, wenn eine Katze erkannt wird, also habe ich es ausgegeben, wenn die Klasse "Katze" erkannt wird.
Infolge dieser Zeit wurden 73 von 100 Bildern erkannt und als Ergebnis von schnellerem R-CNN ausgegeben. Hier ist ein Beispiel, das von beiden erkannt werden könnte.
<img width="340" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689144/66be9ed0-b85c-9f6f-64d2-d384179cf23f.jpeg " "SSDの結果"><img width="340" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689144/3b5b960a-26e5-90aa-3187-ac236aefcb60.jpeg " "Faster R-CNNの結果"> In dieser Abbildung ist die linke Seite das SSD-Ergebnis und die rechte Seite das schnellere R-CNN-Ergebnis. Die durchschnittliche Erkennungszeit betrug 0,23 Sekunden für SSD und 1,30 Sekunden für Faster R-CNN. Darüber hinaus war das Ergebnis 74 für SSD. Obwohl die Anzahl der Blätter nahe ist, denke ich, dass es gut verstanden wird, dass überraschend viele Bilder als Katzen erkannt werden, die nicht abgedeckt sind, und dass sie bei Bildern mit der Erkennungsmethode gut oder schlecht sind. Beide Ergebnisse enthielten fast keine anderen Bilder als Katzen, so dass gesagt werden kann, dass es ihnen gelungen ist, nur Bilder von Katzen aufzunehmen. Das folgende Bild war ein Beispiel für das, was ich bekam, obwohl ich keine Katze war. Als ich mir die Liste ansah, dachte ich, es sei eine Katze, aber als ich genau hinschaute, war es ein Hund. Unter den als Katzen erkannten Bildern war auch dasjenige selten, das die Katze auf dem Bild erkannte. Ich fand es ziemlich interessant, auch nur eine Bildkatze erkennen zu können, aber es scheint schwierig, eine Klasse festzulegen, da es notwendig ist, dort zu studieren, wenn zwischen einer Bildkatze und einer echten Katze unterschieden wird.
Ich konnte das Bild der Katze erkennen und verhindern, dass sie andere Bilder aufnimmt. Da jedoch festgestellt wurde, dass jede Erkennungsmethode Auslassungen aufweist, wird sie in Zukunft mit beiden Methoden erfasst und in Zukunft durch Implementierung der Objekterkennung mit DETR und YOLOv5, die derzeit beliebt sind, und semantischer Segmentierung berechnet. Ich möchte versuchen, ein System zu erstellen, das nur den Katzenteil im Bild extrahieren kann. Vielen Dank, dass Sie bis zum Ende bei uns bleiben!
https://qiita.com/code0327/items/3b23fd5002b373dc8ae8 https://github.com/arc298/instagram-scraper https://githubja.com/rarcega/instagram-scraper
Recommended Posts