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.
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.
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
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
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 ".
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
Le système créé cette fois est divisé en trois phases.
@ 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é.
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).
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.
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)
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.
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.
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.
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.)
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