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.
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.
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
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
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 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
Das diesmal erstellte System ist grob in drei Phasen unterteilt.
@ 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.
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).
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.
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)
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.
Darüber hinaus werden re: dash und das Analyseskript als Container ausgeführt, indem Docker in einem EC2 platziert werden.
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.
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.)
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