[PYTHON] Ich möchte Bilder von Katzen von Instagram erkennen

1. Zuallererst

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. notcat.png

2. Objekterkennung

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.

3. Vorbereitung vorbereiten

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.

mosaiccat.png Ich konnte das Bild so bekommen.

4. Implementierung

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.

5. Ergebnis

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. 代替テキスト

Zusammenfassung

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!

Referenzierte Site

https://qiita.com/code0327/items/3b23fd5002b373dc8ae8 https://github.com/arc298/instagram-scraper https://githubja.com/rarcega/instagram-scraper

Recommended Posts

Ich möchte Bilder von Katzen von Instagram erkennen
Ich möchte Bilder kratzen und trainieren
Ich möchte viele Prozesse von Python aus starten
Ich möchte Objekte mit OpenCV erkennen
Ich möchte ein Glas aus Python verwenden
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte Passungen aus meinem Kopf machen
Ich möchte die Daten von League of Legends ③ erhalten
Ich möchte die Daten von League of Legends ② erhalten
Ich möchte Ceres Solver aus Python verwenden
[Ich möchte Bilder mit Tensorflow klassifizieren] (2) Lassen Sie uns Bilder klassifizieren
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte League of Legends-Daten erhalten ①
Ich möchte Variablen / Funktionen / Klassen externer Dateien von Python abrufen / ausführen
Ich möchte den Dateinamen von DataLoader sehen
Ich möchte mit Jubatus (1) eine nicht autorisierte Anmeldung bei Facebook erkennen.
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich möchte das Ausführungsergebnis von strace erfassen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte ein Paket von Php Redis installieren
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich wollte viele Bilder sammeln, also habe ich versucht, "Google Image Download" zu verwenden.
Ich möchte SUDOKU lösen
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen
Ich möchte mit GAN Schwarzweißfotos von Erinnerungen ausmalen
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte die Natur von Python und Pip kennenlernen
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich möchte das symbolische Linkziel von / lib64 unter CentOS von / usr / lib64 in / my-lib64 ändern
Ich möchte Importwarnungen von Pyright und pylint in VSCode entfernen
Ich habe versucht, den Trend der Anzahl der Schiffe in der Bucht von Tokio anhand von Satellitenbildern zu ermitteln.
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
[Pytorch] Ich möchte die Trainingsparameter des Modells manuell zuweisen
Ich möchte automatisch hochwertige Teile aus den von mir aufgenommenen Videos finden
Post-it anhand von Whiteboard-Bildern erkennen
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Ich möchte systemd grob verstehen
Ich möchte die HTML-Version der OpenCV 3.1-Version "OpenCV-Python Tutorials" lesen
Ich möchte, dass Sie wissen, was wir ab dem nächsten Jahr gemeinsam entwickeln werden. (Aus "Lesbarer Code")
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
TensorFlow Aus einer großen Anzahl von Bildern lernen ... ~ (fast) Lösung ~
Vergleich von GCP-Computerdiensten [Ich möchte es serverlos verwenden]
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Poste ein Bild von Python auf Tumblr
Ich möchte eine Parameterliste aus CloudFormation-Code (yaml) erstellen.
Ich möchte mich mit der Standardsicherheitsgruppe von ALB von CDK anlegen
Ich möchte ○○ mit Pandas machen