[PYTHON] Analyse de l'utilisation de l'espace partagé par l'apprentissage automatique

Déclencheur

Le bureau du don où je travaille a déménagé le 08 mai 2017.

Dans le nouveau bureau, il y a des canapés et des sièges familiaux, etc. Différents types d'espaces partagés se sont multipliés. https://www.wantedly.com/companies/giftee/post_articles/64703

Par conséquent, je veux comprendre quel type d'espace partagé est utilisé et dans quelle mesure. Par conséquent, nous avons décidé d'examiner comment obtenir le statut d'utilisation.

Considération

L'utilisation d'un capteur humain et d'un capteur de pression était également un candidat pour saisir l'état d'utilisation. Il semble que le nombre de personnes ne puisse pas être pris avec le capteur humain, Étant donné que le capteur sensible à la pression nécessite un capteur pour chaque siège, J'ai pris une photo de chaque espace partagé régulièrement et j'ai mesuré le nombre de personnes.

Méthode d'analyse des nombres

J'ai décidé d'utiliser le cadre d'apprentissage automatique pour obtenir le nombre de personnes de l'image.

Cette fois ・ Les données apprises sont ouvertes au public · Facile à utiliser J'ai décidé d'utiliser darknet à partir des deux points.

https://pjreddie.com/darknet/

darknet

Installation

L'installation est très simple, il suffit de cloner depuis github et d'exécuter make.

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

Téléchargez les données de poids entraîné et vous êtes prêt à partir.

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

L'analyse d'image

Spécifiez la détection pour l'option darknet et transmettez la configuration, les données de poids et la photo cible. Lors de l'analyse des données / person.jpg incluses dans la source, ce sera comme suit.

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

Le résultat est sorti dans la même hiérarchie avec le nom "predictions.png ".

L'image originale

person.jpg

Image après analyse

predictions.png

Comment obtenir le nombre de personnes

Le résultat de l'analyse de darknet est également émis vers la sortie standard comme suit.

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

Cette fois, je grep simplement la personne de sortie standard et je prends le décompte pour obtenir le nombre de personnes dans l'image.

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

Flux global du système

Le système créé cette fois est divisé en trois phases.

  1. Prenez une photo de la zone cible avec l'iPhone à intervalles réguliers et téléchargez-la sur S3
  2. Exécutez régulièrement le script d'analyse avec cron pour obtenir le nombre de personnes dans l'image Insérez le nombre de personnes pouvant être obtenues dans DynamoDB
  3. Visualisez les données DynamoDB avec re: dash

La phase 1

@ koh518 Utilisez l'application iPhone créée pour filmer des espaces partagés à intervalles réguliers. (Cette fois toutes les 5 minutes) Je n'avais pas de support pour réparer l'iPhone, alors je l'ai mis dans une tasse et je l'ai réparé.

iphone_in_mug.jpg

L'image capturée sera téléchargée sur S3. Le nom de clé de S3 est "nom de l'espace partagé / time.jpeg " (par exemple, dinant / 20170620131500.jpeg).

Phase 2

Le script d'analyse démarré de cron sort les images accumulées dans S3 dans l'ordre et analyse le nombre de personnes. Cependant, comme darknet ne reconnaît pas les informations d'orientation de l'exif de jpeg, Utilisez la commande de conversion d'ImageMagick pour le convertir dans l'orientation correcte.

convert iphone.jpg -auto-orient converted.png

Si vous ne le faites pas, il sera analysé latéralement et la précision sera considérablement pire.

Ensuite, transmettez l'image convertie à darknet pour obtenir le décompte de la personne.

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

L'image a été analysée comme suit.

L'image originale

iphone.jpeg

Après analyse

detected.png

C'est un peu difficile à comprendre car les cadres violets se chevauchent, mais la personne est correctement reconnue comme trois personnes.

Insérez ce numéro dans DynamoDB. Déplacez l'image analysée vers un autre compartiment S3. L'image de sortie après analyse est également téléchargée sur S3 pour une vérification ultérieure.

Cette fois, la phase 2 est réalisée avec un script python. La source est ci-dessous.

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/"Étant donné que l'objet de est également récupéré, ignorez
    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

Utilisez re: dash pour visualiser les données DynamoDB.

Cette fois, l'horodatage était de type chaîne et a été mis au format AAAAMMJJhhmmss. Si je l'obtiens tel quel, ce ne sera pas l'heure normale, alors J'ai mis la fonction TIMESTAMP sur la chaîne de temps pour afficher l'heure normale.

Voici le DQL utilisé pour l'acquisition.

SCAN shared_space_name,TIMESTAMP(created_at),value FROM tbl_name

Le résultat est un graphique comme celui ci-dessous. redash.png

De plus, re: dash et le script d'analyse sont exécutés en tant que conteneurs en plaçant le docker dans un EC2.

Tâche

Seuil

Dans l'analyse, il y a eu de rares cas où une image montrant une seule personne a été identifiée comme deux personnes. Puisque darknet peut spécifier le seuil avec l'option thresh, Si la probabilité d'être une personne est faible, elle peut être définie pour ne pas compter. Cette fois, je l'ai déplacé avec la valeur par défaut de 25%, mais l'ajustement de cette valeur peut améliorer la précision.

Réflexion sur les personnes qui n'utilisent pas

Si une personne qui se trouve à marcher près de l'espace commun est reflétée, le nombre de personnes sera mesuré plus qu'il ne l'est en réalité. Si vous ne voulez pas autant de précision, vous pouvez l'ignorer, Si vous prenez plusieurs photos toutes les quelques dizaines de secondes en une seule mesure et prenez la valeur minimale du nombre de personnes sur la photo, Je pense que nous pouvons éliminer le nombre de personnes dans l'image. (Je n'ai pas encore essayé cela.)

finalement

Gifty Co., Ltd. recherche des ingénieurs. Si vous êtes intéressé par ce système ou souhaitez visiter un nouveau bureau N'hésitez pas à contacter ici

Recommended Posts

Analyse de l'utilisation de l'espace partagé par l'apprentissage automatique
Classification des images de guitare par apprentissage automatique Partie 1
[Français] scikit-learn 0.18 Introduction de l'apprentissage automatique par le didacticiel scikit-learn
Estimation raisonnable du prix de Mercari par apprentissage automatique
Classification des images de guitare par apprentissage automatique, partie 2
Histoire de l'analyse de données par apprentissage automatique
Prédire les travaux de courte durée de Weekly Shonen Jump par apprentissage automatique (Partie 1: Analyse des données)
Importance des ensembles de données d'apprentissage automatique
4 [/] Quatre arithmétiques par apprentissage automatique
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 7 Analyse de régression
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Résumé de l'apprentissage automatique par les débutants de Python
Algorithme d'apprentissage automatique (analyse de régression multiple)
Apprentissage automatique ③ Résumé de l'arbre de décision
Algorithme d'apprentissage automatique (analyse de régression unique)
Apprentissage automatique: analyse discriminante linéaire supervisée
Introduction aux bases de Python de l'apprentissage automatique (apprentissage non supervisé / analyse principale)
Effectuer une analyse morphologique dans l'environnement d'apprentissage automatique lancé par GCE
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 4)
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 5)
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
Faire le contrôle d'un homme sandwich par l'apprentissage automatique ver4
[Mémo d'apprentissage] Bases de la classe par python
Apprentissage automatique avec python (2) Analyse de régression simple
Exemple d'analyse de squelette tridimensionnelle par Python
[Échec] Trouvez Maki Horikita par apprentissage automatique
Quatre règles de fonctionnement avec l'apprentissage automatique 6 [Commercial]
Apprentissage automatique
Algorithme d'apprentissage automatique (implémentation de la classification multi-classes)
[Python] Première analyse de données / apprentissage automatique (Kaggle)
Analyse émotionnelle des tweets avec apprentissage en profondeur
<Cours> Machine learning Chapitre 4: Analyse des principaux composants
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 13 Bases du réseau neuronal
Analyse d'image de microtomographie à rayons X par Python
[Apprentissage automatique] Liste des packages fréquemment utilisés
Mémo d'étude Python & Machine Learning ④: Machine Learning par rétro-propagation
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
Déterminez l'authenticité des articles publiés par machine learning (API Google Prediction).
Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
Mise en place d'un modèle de prédiction des taux de change (taux dollar-yen) par machine learning
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 1
Début de l'apprentissage automatique (matériel didactique / informations recommandés)
Essayez de prédire la demande de puissance par l'apprentissage automatique
Mémo d'étude Python & Machine Learning ⑤: Classification d'Ayame
Tournoi Numerai - Fusion de quants traditionnels et apprentissage automatique -
Mémo d'étude Python & Machine Learning ②: Introduction de la bibliothèque
Divulgation complète des méthodes utilisées dans l'apprentissage automatique
[Python] Analyse de données, pratique du machine learning (Kaggle) -Prétraitement des données-
Liste des liens que les débutants en apprentissage automatique apprennent
Apprentissage parallèle du deep learning par Keras et Kubernetes
Vue d'ensemble des techniques d'apprentissage automatique apprises grâce à scikit-learn
À propos du contenu de développement de l'apprentissage automatique (exemple)
Résumé des fonctions d'évaluation utilisées dans l'apprentissage automatique
Classer les informations liées à l'apprentissage automatique par modèle de sujet
Amélioration de la metrix de performance par modèle d'apprentissage en 2 étapes
Prévision du cours de l'action par machine learning Numerai Signals
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 2