[PYTHON] Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen

Auslösen

Das fünfzehn Büro, in dem ich arbeite, ist am 08. Mai 2017 umgezogen.

Im neuen Büro gibt es Sofasitze und Familiensitze usw. Verschiedene Arten von gemeinsamen Räumen haben zugenommen. https://www.wantedly.com/companies/giftee/post_articles/64703

Daher möchte ich verstehen, welche Art von gemeinsam genutztem Speicherplatz verwendet wird und wie viel. Aus diesem Grund haben wir uns überlegt, wie wir den Nutzungsstatus erhalten können.

Erwägung

Die Verwendung eines menschlichen Sensors und eines Drucksensors war auch ein Kandidat für die Erfassung des Verwendungsstatus. Es scheint, dass die Anzahl der Personen nicht mit dem menschlichen Sensor erfasst werden kann. Da der druckempfindliche Sensor für jeden Sitz einen Sensor benötigt, Ich machte regelmäßig ein Foto von jedem gemeinsamen Raum und maß die Anzahl der Personen darin.

Methode zur Zahlenanalyse

Ich entschied mich für das Framework für maschinelles Lernen, um die Anzahl der Personen aus dem Bild zu ermitteln.

Diesmal ・ Gelernte Daten sind öffentlich zugänglich · Einfach zu verwenden Ich entschied mich für Darknet aus den beiden Punkten.

https://pjreddie.com/darknet/

darknet

Installation

Die Installation ist sehr einfach, einfach von Github klonen und make ausführen.

git clone https://github.com/pjreddie/darknet
cd darknet
make

Laden Sie die trainierten Gewichtsdaten dazu herunter und Sie können loslegen.

wget https://pjreddie.com/media/files/yolo.weights

Bildanalyse

Geben Sie die Erkennung für die Darknet-Option an und übergeben Sie die Konfiguration, die Gewichtsdaten und das Zielfoto. Bei der Analyse der in der Quelle enthaltenen Daten / person.jpg ist dies wie folgt.

./darknet detect cfg/yolo.cfg yolo.weights data/person.jpg

Das Ergebnis wird in derselben Hierarchie mit dem Namen "Vorhersagen.png " ausgegeben.

Das Originalbild

person.jpg

Bild nach der Analyse

predictions.png

Wie man die Anzahl der Personen ermittelt

Das Analyseergebnis von darknet wird ebenfalls wie folgt in die Standardausgabe ausgegeben.

data/person.jpg: Predicted in 14.067749 seconds.
person: 86%
horse: 82%
dog: 86%

Dieses Mal greife ich einfach nach der Standardausgabeperson und zähle, um die Anzahl der Personen im Bild zu ermitteln.

./darknet detect cfg/yolo.cfg yolo.weights data/person.jpg | grep person | wc -l

Gesamtfluss des Systems

Das diesmal erstellte System ist grob in drei Phasen unterteilt.

  1. Nehmen Sie in regelmäßigen Abständen mit dem iPhone ein Bild des Zielbereichs auf und laden Sie es auf S3 hoch
  2. Führen Sie das Analyseskript regelmäßig mit cron aus, um die Anzahl der Personen im Bild zu ermitteln Geben Sie die Anzahl der Personen ein, die in DynamoDB abgerufen werden konnten
  3. Visualisieren Sie DynamoDB-Daten mit re: dash

Phase 1

@ koh518 Verwenden Sie die erstellte iPhone-App, um in regelmäßigen Abständen gemeinsam genutzte Räume aufzunehmen. (Diesmal alle 5 Minuten) Ich hatte keinen Ständer, um das iPhone zu reparieren, also steckte ich es in einen Becher und reparierte es.

iphone_in_mug.jpg

Das aufgenommene Bild wird in S3 hochgeladen. Der Schlüsselname von S3 lautet "Name des gemeinsam genutzten Raums / time.jpeg " (z. B. speisen / 20170620131500.jpeg).

Phase 2

Das von cron gestartete Analyseskript nimmt die in S3 gesammelten Bilder der Reihe nach heraus und analysiert die Anzahl der Personen. Da darknet jedoch die Orientierungsinformationen von jpegs exif nicht erkennt, Verwenden Sie den Befehl convert von ImageMagick, um ihn in die richtige Ausrichtung zu konvertieren.

convert iphone.jpg -auto-orient converted.png

Wenn Sie dies nicht tun, wird es seitwärts analysiert und die Genauigkeit wird erheblich schlechter.

Übergeben Sie dann das konvertierte Bild an darknet, um die Anzahl der Personen zu ermitteln.

./darknet detect cfg/yolo.cfg yolo.weights ../converted.png | grep person | wc -l

Das Bild wurde wie folgt analysiert.

Das Originalbild

iphone.jpeg

Nach der Analyse

detected.png

Es ist etwas schwer zu verstehen, da sich die lila Rahmen überlappen, aber die Person wird korrekt als drei Personen erkannt.

Fügen Sie diese Nummer in DynamoDB ein. Verschieben Sie das analysierte Bild in einen anderen S3-Bucket. Das Ausgabebild nach der Analyse wird zur späteren Überprüfung ebenfalls in S3 hochgeladen.

Diesmal wird Phase 2 mit einem Python-Skript durchgeführt. Die Quelle ist unten.

import boto3
import botocore
import subprocess
import os
import subprocess

BUCKET_NAME = os.environ["BUCKET_NAME"]
BUCKET_NAME_DONE = os.environ["BUCKET_NAME_DONE"]
DYNAMODB_REGION = os.environ["DYNAMODB_REGION"]
DYNAMODB_TABLE = os.environ["DYNAMODB_TABLE"]

s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET_NAME)
client = boto3.client('s3')

for obj in bucket.objects.all():
    key = obj.key
    shared_space_name, filename = key.split('/')

    # "prefix/"Da das Objekt von auch abgerufen wird, überspringen Sie
    if not filename:
      continue

    created_at, extention = filename.split('.')

    # download
    s3.Bucket(BUCKET_NAME).download_file(key, 'iphone.jpg')

    command = "convert iphone.jpg -auto-orient converted.png "
    proc = subprocess.Popen(
      command,
      shell  = True,
      stdin  = subprocess.PIPE,
      stdout = subprocess.PIPE,
      stderr = subprocess.PIPE)

    stdout_data, stderr_data = proc.communicate()

    # yolo
    command = "cd darknet;./darknet detect cfg/yolo.cfg yolo.weights ../converted.png | grep person | wc -l"
    proc = subprocess.Popen(
      command,
      shell  = True,
      stdin  = subprocess.PIPE,
      stdout = subprocess.PIPE,
      stderr = subprocess.PIPE)

    stdout_data, stderr_data = proc.communicate()

    value = int(stdout_data.decode('ascii'))

    # insert dynamo
    dynamodb = boto3.resource('dynamodb', region_name=DYNAMODB_REGION)
    table = dynamodb.Table(DYNAMODB_TABLE)

    resposne = table.put_item(
      Item = {
        'shared_space_name' : shared_space_name,
        'created_at' : created_at,
        'value': value
      }
    )

    # copy file to done bucket
    copy_source = {
      'Bucket': BUCKET_NAME,
      'Key': key
    }
    s3.meta.client.copy(copy_source, BUCKET_NAME_DONE, key)

    # delete file
    obj.delete()

    # upload image
    yolo_key = shared_space_name + '/' + created_at + '_yolo.png'
    client.upload_file('darknet/predictions.png', BUCKET_NAME_DONE, yolo_key)

Phase 3

Verwenden Sie re: dash, um DynamoDB-Daten zu visualisieren.

Diesmal war der Zeitstempel ein String-Typ und wurde im Format JJJJMMTThhmmss eingegeben. Wenn ich es so bekomme, wie es ist, wird es nicht die normale Zeit sein, also Ich habe die TIMESTAMP-Funktion in die Zeitzeichenfolge eingefügt, um die normale Zeit anzuzeigen.

Unten finden Sie die für die Erfassung verwendete DQL.

SCAN shared_space_name,TIMESTAMP(created_at),value FROM tbl_name

Das Ergebnis ist eine Grafik wie die folgende. redash.png

Darüber hinaus werden re: dash und das Analyseskript als Container ausgeführt, indem Docker in einem EC2 platziert werden.

Aufgabe

Schwelle

In der Analyse gab es einen seltenen Fall, in dem ein Bild, das nur eine Person zeigte, als zwei Personen identifiziert wurde. Da Darknet den Schwellenwert mit der Schwellenwertoption angeben kann, Wenn die Wahrscheinlichkeit, eine Person zu sein, gering ist, kann festgelegt werden, dass sie nicht zählt. Dieses Mal habe ich es mit dem Standardwert von 25% verschoben, aber das Anpassen dieses Werts kann die Genauigkeit verbessern.

Reflexion von Menschen, die nicht benutzen

Wenn eine Person, die zufällig in der Nähe des Gemeinschaftsraums geht, reflektiert wird, wird die Anzahl der Personen mehr gemessen als sie tatsächlich ist. Wenn Sie nicht so viel Präzision wollen, können Sie es ignorieren, Wenn Sie alle paar zehn Sekunden mehrere Bilder in einer Messung aufnehmen und den Mindestwert für die Anzahl der Personen auf dem Bild ermitteln, Ich denke, wir können die Anzahl der Personen auf dem Bild eliminieren. (Ich habe das noch nicht ausprobiert.)

Schließlich

Gifty Co., Ltd. sucht Ingenieure. Wenn Sie an diesem System interessiert sind oder ein neues Büro besuchen möchten Sie können sich gerne an [hier] wenden (https://www.wantedly.com/companies/giftee/projects).

Recommended Posts

Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
[Übersetzung] scikit-learn 0.18 Einführung in maschinelles Lernen durch Tutorial scikit-learn
Angemessene Preisschätzung von Mercari durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Vorhersage kurzlebiger Arbeiten von Weekly Shonen Jump durch maschinelles Lernen (Teil 1: Datenanalyse)
Bedeutung von Datensätzen für maschinelles Lernen
4 [/] Vier Arithmetik durch maschinelles Lernen
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 7 Regressionsanalyse
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Zusammenfassung des maschinellen Lernens von Python-Anfängern
Algorithmus für maschinelles Lernen (multiple Regressionsanalyse)
Maschinelles Lernen ③ Zusammenfassung des Entscheidungsbaums
Algorithmus für maschinelles Lernen (Einzelregressionsanalyse)
Maschinelles Lernen: Überwacht - Lineare Diskriminanzanalyse
Einführung in die Python-Grundlagen des maschinellen Lernens (unbeaufsichtigtes Lernen / Hauptanalyse)
Führen Sie eine morphologische Analyse in der von GCE gestarteten maschinellen Lernumgebung durch
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 4)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 5)
Algorithmus für maschinelles Lernen (Verallgemeinerung der linearen Regression)
Kontrolle eines Sandwich-Mannes durch maschinelles Lernen ver4
[Lernnotiz] Grundlagen des Unterrichts mit Python
Maschinelles Lernen mit Python (2) Einfache Regressionsanalyse
Beispiel einer dreidimensionalen Skelettanalyse von Python
[Fehler] Finde Maki Horikita durch maschinelles Lernen
Vier Betriebsregeln mit maschinellem Lernen 6 [Kommerziell]
Maschinelles Lernen
Algorithmus für maschinelles Lernen (Implementierung einer Klassifizierung mit mehreren Klassen)
[Python] Erste Datenanalyse / maschinelles Lernen (Kaggle)
Emotionale Analyse von Tweets mit Deep Learning
<Kurs> Maschinelles Lernen Kapitel 4: Hauptkomponentenanalyse
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 13 Grundlagen des neuronalen Netzwerks
Analyse des Röntgenmikrotomographiebildes durch Python
[Maschinelles Lernen] Liste der häufig verwendeten Pakete
Python & maschinelles Lernen Lernnotiz Machine: Maschinelles Lernen durch Rückausbreitung
Python-Lernnotiz für maschinelles Lernen von Chainer bis zum Ende von Kapitel 2
Vorverarbeitung beim maschinellen Lernen 1 Datenanalyseprozess
[Maschinelles Lernen] Regressionsanalyse mit Scicit Learn
Bestimmen Sie die Authentizität von veröffentlichten Artikeln durch maschinelles Lernen (Google Prediction API).
Maschinelles Lernen: Bilderkennung von MNIST mithilfe von PCA und Gaussian Native Bayes
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Maschinelles Lernen eines jungen Ingenieurs Teil 1
Beginn des maschinellen Lernens (empfohlene Unterrichtsmaterialien / Informationen)
Versuchen Sie, den Strombedarf durch maschinelles Lernen vorherzusagen
Python & Machine Learning Study Memo ⑤: Klassifikation von Ayame
Numerai Turnier-Fusion von traditionellen Quants und maschinellem Lernen-
Python & Machine Learning Study Memo Introduction: Einführung in die Bibliothek
Vollständige Offenlegung der beim maschinellen Lernen verwendeten Methoden
[Python] Datenanalyse, maschinelles Lernen (Kaggle) -Datenvorverarbeitung-
Liste der Links, die Anfänger des maschinellen Lernens lernen
Paralleles Lernen von Deep Learning durch Keras und Kubernetes
Überblick über maschinelle Lerntechniken, die aus Scikit-Learn gelernt wurden
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Zusammenfassung der beim maschinellen Lernen verwendeten Bewertungsfunktionen
Klassifizieren Sie Informationen zum maschinellen Lernen nach Themenmodellen
Verbesserung der Leistungsmetrik durch 2-Stufen-Lernmodell
Aktienkursprognose durch maschinelles Lernen Numerai Signals
Maschinelles Lernen eines jungen Ingenieurs Teil 2