Fiyeli

De fablab
Aller à : navigation, rechercher

IMPORTANT : l'ensemble des sources, incluant des README expliquant plus en profondeur les différents modules de notre projet, est disponible sur les répertoires de notre organisation GitHub : https://github.com/fiyeli

Fiyeli
Fiyeli petit.png
Un Fiyeli fini

Introduction

Ce projet vise à créer un dispositif, facilement intégrable, permettant de restituer des données relatives à l’affluence d’un lieu. Le projet a été réalisé dans le cadre du Projet d'Infrastructure Logicielle pour le Bâtiment Intelligent.

Membres de l'équipe

  • Valérian GONNOT
  • David IDMANSOUR
  • Thibault RUBY
  • Emilien MOTTET
  • Cyril DUSSERT

Problématique

Chacun appréhende la problématique de l’affluence différemment. Certains décident d’être présents sur les lieux le plus tôt possible, d’autres subissent tout simplement la foule, et prennent leur mal en patience. Une chose est sûre, si chacun disposait d’un outil leur permettant de voir, en temps réel, l’affluence d’un lieu, la vie serait plus paisible.

Scénario principal

Un utilisateur veut se rendre à un endroit sujet aux files d'attente, où Fiyeli est installé. Il ne veut pas se déplacer si il y a déjà une longue file d'attente. Il peut alors se connecter à une interface (web/application mobile, etc) mise en place par le lieu en question, qui lui permet de visualiser la fréquentation de ce lieu à certains instants donnés. De nouvelles données sont mises à disposition régulièrement (toutes les quelques minutes), ce qui permet à l'utilisateur de planifier son départ de manière à optimiser son temps d'attente. L'accès à l'historique de fréquentation sur toute l'année passée permet également de se faire une idée des tendances en terme d'affluence.

Technologies utilisées

Les technologies utilisées sont :

  • Raspberry Pi 3 + Raspbian
  • Camera Raspberry Pi V2
  • Python + Flask pour le module API
  • Module Darknet (avec Yolo et NNPACK) pour le module IA
  • HTML / CSS / JavaScript avec les librairies suivantes : jQuery, jQuery UI, Moment.js, Chart.js
  • Ruby / Hooray / Ansible pour le module install

Architecture

Fiyeli schema general.png

Le but de Fiyeli est de compter régulièrement le nombre de personnes présentes à un endroit précis. Pour cela, Fiyeli prend une photo et utilise un framework de deep learning pour calculer le nombre de personnes sur cette photo. Cette donnée est ensuite sauvegardée est rendue accessible par le biais d'une API.

Notre projet a vocation à être aussi modulaire que possible afin de permettre à chacun de l'adapter à ses besoins et à son matériel.

Core

Ce module gère la routine exécutée de manière périodique par Fiyeli. Il gère les différents appels aux modules Camera et IA, puis se charge de stocker les données calculées sur le disque. Tous les appels sont faits par le biais de variables d'environnement, ce qui permet d'assurer la modularité du projet.

Camera

Ce module se contente de prendre une photo avec la caméra Raspberry Pi branchée et de la stocker dans un répertoire dédié.

Intelligence Artificielle (Fiyeli-Darknet-NNPACK )

La partie gérant l'intelligence artificielle utilise le framework de deep learning Darknet que nous avons adapté à nos besoins. Ce dernier a été écrit par les très populaires auteurs de YOLO, un modèle de réseau de neurones profonds. Nous recommandons d'ailleurs l'utilisation de YoloV2 pour l'utilisation du Fiyeli car il s'agit à ce jour (17/01/2019) de la dernière version pouvant tourner sur une Raspberry Pi 3 Model B.

C'est ce module qui permet de réaliser la reconnaissance de personnes sur les images. En utilisant un modèle entraîné sur le dataset COCO (par exemple) il est possible de très facilement étendre la reconnaissance de personnes à des voitures, des snowboards, des chaises ou tout autre objet de la vie quotidienne.

API

Afin d'exposer les données calculées par Fiyeli, nous avons mis en place une API REST.

Cette API REST, codée en Python, utilise le framework Flask. L'avantage principal de Flask est sa légèreté, il se résume à un seul fichier contenant le code (api.py).

Fonctionnement

Nous avons créé plusieurs routes :

  • / : Liste des URIs disponibles (pour le moment, uniquement /stats
  • /stats : Liste des dates pour lesquelles nous avons des données. Autrement dit : Les données sont stockées sur Fiyeli à l'aide de fichiers CSV, pour chaque jour, nous créons un nouveau fichier CSV. </stats va lister les les URIs des jours correspondant aux fichiers CSV présents sur le disque.
  • /stats/<jour> : Liste le contenu du fichier CSV pour le jour <jour>. Syntaxe attendue : YYYY-MM-JJ.
  • /stats/range : Liste l'ensemble des données récoltées entre deux dates. Prends deux paramètres de type GET (syntaxe attendue : YYYY-MM-JJ) :
    • start_date : La date de début
    • end_date : La date de fin

Déploiement en production

Afin d'avoir un minimum d'industrialisation du déploiement, nous avons fait le choix d'utiliser Gunicorn, qui est un serveur WSGI HTTP. Nous pouvons ainsi facilement démarrer l'API en utilisant plusieurs workers de manière à répartir la charge sur différents threads.

Nous avons aussi créé un service System.d, que nous démarrons au démarrage de Fiyeli. Ainsi, les données sont toujours accessibles.

IMPORTANT : L'API étant exposée par défaut sur le port 8000, elle n'est pas accessible depuis les réseaux publics dédiés aux étudiants (eduroam, wifi-campus...) qui bloquent les ports non conventionnels. Nous recommandons l'usage d'une connexion à l'aide d'un point d'accès wifi sur lequel sera branchée Fiyeli (typiquement celui d'un smartphone).

Install

Ce module à part permet d'installer Raspbian et Fiyeli sur une carte SD. Cela consiste en l'installation de toutes les dépendances nécessaires, la création de l'arborescence de fichiers, le téléchargement des différents modules Fiyeli et la définition des différentes variables d'environnement utilisées par Fiyeli. Ce module permet également de régler une entrée cron, qui permet d'appeler périodiquement la routine principale.

Cette installation est relativement longue car il est nécessaire de compiler par nous-mêmes certains modules (en particulier le module d'IA et ses dépendances).

Front

Cette partie du projet est un exemple d'utilisation de l'API exposée par Fiyeli. Nous l'avons voulue simple et minimaliste afin de se concentrer sur l'essentiel : la visualisation des données.

La configuration est très facile, il suffit de rentrer l'adresse à laquelle l'API de Fiyeli est disponible. Ensuite, le frontend va récupérer toutes les données dont il a besoin :

  • Les jours pour lesquels nous avons des données
  • Les données pour le jour en cours (si existant)

Cette interface utilise HTML, CSS et JavaScript, un simple navigateur permet de la démarrer. Les librairies JS utilisées (jQuery, jQuery UI, Chart.js et Moment.js) sont récupérées sur leurs CDN respectifs et ne sont pas stockées sur l'ordinateur. Une connexion internet est donc nécessaire.

Boitier

Nous avons imprimé en 3D un boitier pour la Raspberry Pi et la caméra grâce à des modèles 3D récupérés sur plusieurs projets Thingiverse, distribués sous licence Creative Commons CC BY 3.0 ou CC BY-SA 3.0:

L'impression 3D a été réalisée au FabLab.

Installation

  • Insérez une carte microSD sur votre machine
  • Exécutez les scripts d'installation (marche à suivre détaillée dans le README du module Install). IMPORTANT : Assurez-vous que le réseau wi-fi est disponible avant de démarrer le Fiyeli
  • Le Fiyeli est prêt à être utilisé

Livrables

  • Le code, disponible sur GitHub
  • Ce wiki
  • Un prototype

Références

Module Darknet, distribué sous licence MIT : https://pjreddie.com/darknet/