Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev/code review #6

Closed
wants to merge 49 commits into from
Closed

Dev/code review #6

wants to merge 49 commits into from

Conversation

bertrandlalo
Copy link
Collaborator

@bertrandlalo bertrandlalo commented May 1, 2020

Hello la team ETL :) @cl3m3nt , @rcourivaud

J'ai fait pas quelques refactoring, en appliquant es corrections détaillées dans cette issue.

Pour résumer :

Changement de forme

Réorganisation du repo

J'ai essayé de faire du tri dans tous les codes, et ce que je propose comme orga du repo, c'est :

  • /data avec des échantillons de données d'entrées possibles (pour les tests)
  • /etl qui contient l'ETL principale et les utilitaires dans un paquet /etl/utils
  • docs: avec la docs (source & build)
  • /tests: qui contiendra les tests unitaires
  • /wip_devel: avec les notebooks & co. Pour l'instant azure est dedans.

PEP 8 et doc-string

  • J'ai appliqué les changements nécessaires pour répondre aux standards Python
  • La doc-string est de type 'numpy' et nous permet de générer de la jolie doc avec Sphinx
  • J'ai essayé de compléter le README avec les infos qui manquaient

Pandas

  • J'utilise des DataFrame pandas, qui nous permettent d'avoir accès à pleins d'utilitaires cool. Par exemple, les données GPS ont maintenant cette tête là :

                                   latitude   longitude  elevation
      2018-01-24 19:27:58+00:00  33.126515 -117.327168    -17.228
      2018-01-24 19:27:59+00:00  33.126543 -117.327153    -18.199
      2018-01-24 19:28:12+00:00  33.126616 -117.325690    -18.440
      2018-01-24 19:28:13+00:00  33.126540 -117.327072    -19.161
      2018-01-24 19:28:14+00:00  33.126539 -117.327218    -18.472
    

Misc

  • Print -> Logs
  • Camel case -> lower
  • ajout de requirements.txt et environment.yml pour faciliter l'installation
  • ajout de setup.py pour utiliser ce repo comme un paquet via pip install git+..., pas besoin de tout cloner)
  • sphinx doc à build avec make html, qui ressemble à :

Screenshot 2020-05-01 at 16 25 37

[source](https://github.com/surfriderfoundationeurope/etl/tree/dev/code-review/docs/source) [build](https://github.com/surfriderfoundationeurope/etl/tree/dev/code-review/docs/build) à compléter !

Optimisations

  • correction/optimisation de fillGPS
    La fonction fillGPS me semblait compliquée et sujet à erreurs (par ex, si le GPS et la vidéo commencent ou finissent pas ensemble). Puis, j'ai réalisé que les seuls points qui nous intéressaient étaient en fait ceux où il y a un déchet détecté. Donc, au lieu d'interpoler toutes les données manquantes du fichier GPS, je n'interpole que les données dont le timestamp correspond à un déchet détecté par l'IA (cf mon point correction de trashGPS ci-après).

  • changement d'ordre pour FAIL le plus tôt possible (sanity checks)
    Par ex, c'est dommage de faire un call à l'IA si à la fin la connection à la DB échoue. ou si on n'arrive pas à extraire les données GPS du fichier.

  • J'ai enlevé le script shell qui faisait appelle à une commande juste pour avoir la durée du média, et j'ai remplacer par une fonction python.

  • J'ai remplacé l'appel par ligne de commande à goproToGPx pour utiliser le paquet Pypi de Raph. D'ailleurs @rcourivaud , comment je fais pour fixer un truc sur le paquet ? (je trouve pas ton repo)

  • J'ai implémenté un CLI pour lancer l'ETL depuis le shell. C'est peut être un peu plus pratique que le parseargs (je trouve) et on le lance avec etl [OPTIONS]

Nouvelles features

Correction du trashGPS

  • On n'utilisait pas l'information 'frame_to_box' donnée par l'IA, qui donne le numero de la frame sur laquelle se trouve le trash. Etant donné que tu as aussi le fps et la durée, à partir du timestamp de début, on peut retrouver le timestamp du trash. Confirmé avec la team MOT (@charlesollion ), cf explication ici et fix .
    Du coup, ça permet d'optimiser la fonction qui prenait longtemps pour estimer les géométrie (X, Y, Z) ) partir de (latitude, longitude) car celle ci ne loop que sur les lignes où y a des déchets.

Accepte les entrées de type Smartphone vidéos et Manuelles

L'hypothèse faite ici, c'est qu'il y a 4 types de source d'acquisition possibles et que les fichiers GPX associés aux médias portent le même nom (@AntoineBruge, ok?) :

  • gopro: fichier foo.mp4
  • smartphone video: fichier foo.mov + fichier foo.gpx (@AntoineBruge , quelles autres extensions ?)
  • smartphone photo: fichier foo.jpg + fichier foo.gpx
    -manuelle: fichier foo.gpx

NB1: La sortie de la version manuelle est légèrement différente:

  • colones pour les sorties gopro et smartphones : ['time', 'longitude', 'latitude', 'elevation', 'id', 'label', 'box', 'frame', 'geom']
  • colones pour les sorties manuelles : [time', 'longitude', 'latitude', 'label', 'geom']

NB2: Les labels des données manuelles sont différents :
{'Objet vie courante', 'Bouteille boisson', 'Peche et chasse', 'Autre dechet', 'Industriel ou construction', 'Emballage alimentaire', 'Dechet agricole', 'Autres dechets +10'}

Pour tester ça en local, vous pouvez faire (après avoir activé l'environnement, cf README.rst) :

  • pour les données manuelles :
etl --data-source local --media sample.gpx  --data-dir  data/osm_tracker/ --target-storage local
  • pour les données gopro:
etl --data-source local --media sample.mp4  --data-dir  data/gopro/ --target-storage local
  • pour les données smartphone vidéos:
etl --data-source local --media sample.mp4  --data-dir  data/smartphone_video/ --target-storage local
  • Données smartphone photo : @AntoineBruge, si t'as un exemple de GPX associé à une photo ?

Pouvoir travailler 100% en local (sans se connecter à Azure & Postgre)

En fait, quand on veut tester ou développer, c'est pratique de ne pas être dépendant de Postgre et de Azure. Donc tu verras, j'ai essayé de documenter, mais dans la commande pour lancer l'ETL, on peut choisir de travailler avec des données locales plutôt que de télécharger depuis Azure (on pourra comme ça imaginer à l'avenir télécharger depuis d'autres sources). Pareil pour la sortie, on peut choisir de sauver le résultat en CSV localement plutôt que de l'insérer dans la base de données.

Todo, next steps

  • Voir comment télécharger un seul fichier du blob
  • Voir comment noter que l'ETL a déjà tourné sur un média, si ça a SUCCESS ou FAIL, ainsi que sa version, celle de l'IA.
  • Quelques fix dans le paquet de @rcourivaud qui extrait les données GPX
  • Ajout de tests unitaires
  • Prévoir les migrations de la base de données
  • Question: Est-ce qu'on peut rediscuter ce qu'on doit insérer dans la base de données ? J'ai peur qu'il manque quelques infos.
  • Tester l'image docker, car je suis pas hyper sûre de moi (@rcourivaud)
  • Porter sur Azure fonction

Qu'en dites vous ?

++

@bertrandlalo bertrandlalo self-assigned this May 1, 2020
@bertrandlalo bertrandlalo linked an issue May 1, 2020 that may be closed by this pull request
@bertrandlalo bertrandlalo linked an issue May 3, 2020 that may be closed by this pull request
@bertrandlalo bertrandlalo requested a review from AntoineBruge May 3, 2020 07:18
@AntoineBruge
Copy link
Contributor

AntoineBruge commented May 4, 2020 via email

@cl3m3nt
Copy link
Contributor

cl3m3nt commented May 5, 2020 via email

@cl3m3nt
Copy link
Contributor

cl3m3nt commented May 13, 2020

Dear @bertrandlalo, thanks for the hard work. Following our call, please find some feebacks in italic related to your PR in front of each section:

Changement de forme

Réorganisation du repo

Your proposal makes sense and the reorganisation could be done later on
J'ai essayé de faire du tri dans tous les codes, et ce que je propose comme orga du repo, c'est :

  • /data avec des échantillons de données d'entrées possibles (pour les tests)
  • /etl qui contient l'ETL principale et les utilitaires dans un paquet /etl/utils
  • docs: avec la docs (source & build)
  • /tests: qui contiendra les tests unitaires
  • /wip_devel: avec les notebooks & co. Pour l'instant azure est dedans.

PEP 8 et doc-string

Ok to apply Numpy docstring
I like the idea of having Sphinx documentation, this could be done later alongside repository reorganisation

  • J'ai appliqué les changements nécessaires pour répondre aux standards Python
  • La doc-string est de type 'numpy' et nous permet de générer de la jolie doc avec Sphinx
  • J'ai essayé de compléter le README avec les infos qui manquaient

Pandas

I find the idea of introducing Pandas dataframe very interesting to better fit to a data pipeline process. I want to evaluate pros/cons versus list/dico data structure but definitely worth to consider it

  • J'utilise des DataFrame pandas, qui nous permettent d'avoir accès à pleins d'utilitaires cool. Par exemple, les données GPS ont maintenant cette tête là :

                                   latitude   longitude  elevation
      2018-01-24 19:27:58+00:00  33.126515 -117.327168    -17.228
      2018-01-24 19:27:59+00:00  33.126543 -117.327153    -18.199
      2018-01-24 19:28:12+00:00  33.126616 -117.325690    -18.440
      2018-01-24 19:28:13+00:00  33.126540 -117.327072    -19.161
      2018-01-24 19:28:14+00:00  33.126539 -117.327218    -18.472
    

Misc

No pb to convert print to logs as well as Came case to lower
Can you double check requirements.txt ? I had to add python-dotenv package to it to be able to successfully run the etl after building the Docker Image.

  • Print -> Logs
  • Camel case -> lower
  • ajout de requirements.txt et environment.yml pour faciliter l'installation
  • ajout de setup.py pour utiliser ce repo comme un paquet via pip install git+..., pas besoin de tout cloner)
  • sphinx doc à build avec make html, qui ressemble à :

Screenshot 2020-05-01 at 16 25 37

[source](https://github.com/surfriderfoundationeurope/etl/tree/dev/code-review/docs/source) [build](https://github.com/surfriderfoundationeurope/etl/tree/dev/code-review/docs/build) à compléter !

Optimisations

There are two important changes here that we could merge asap: shell script removal for getMediaInfo as well as goproToGPx package from Raph

  • correction/optimisation de fillGPS
    La fonction fillGPS me semblait compliquée et sujet à erreurs (par ex, si le GPS et la vidéo commencent ou finissent pas ensemble). Puis, j'ai réalisé que les seuls points qui nous intéressaient étaient en fait ceux où il y a un déchet détecté. Donc, au lieu d'interpoler toutes les données manquantes du fichier GPS, je n'interpole que les données dont le timestamp correspond à un déchet détecté par l'IA (cf mon point correction de trashGPS ci-après).

  • changement d'ordre pour FAIL le plus tôt possible (sanity checks)
    Par ex, c'est dommage de faire un call à l'IA si à la fin la connection à la DB échoue. ou si on n'arrive pas à extraire les données GPS du fichier.

  • J'ai enlevé le script shell qui faisait appelle à une commande juste pour avoir la durée du média, et j'ai remplacer par une fonction python.

  • J'ai remplacé l'appel par ligne de commande à goproToGPx pour utiliser le paquet Pypi de Raph. D'ailleurs @rcourivaud , comment je fais pour fixer un truc sur le paquet ? (je trouve pas ton repo)

  • J'ai implémenté un CLI pour lancer l'ETL depuis le shell. C'est peut être un peu plus pratique que le parseargs (je trouve) et on le lance avec etl [OPTIONS]

Nouvelles features

Correction du trashGPS

  • On n'utilisait pas l'information 'frame_to_box' donnée par l'IA, qui donne le numero de la frame sur laquelle se trouve le trash. Etant donné que tu as aussi le fps et la durée, à partir du timestamp de début, on peut retrouver le timestamp du trash. Confirmé avec la team MOT (@charlesollion ), cf explication ici et fix .
    Du coup, ça permet d'optimiser la fonction qui prenait longtemps pour estimer les géométrie (X, Y, Z) ) partir de (latitude, longitude) car celle ci ne loop que sur les lignes où y a des déchets.

Accepte les entrées de type Smartphone vidéos et Manuelles

L'hypothèse faite ici, c'est qu'il y a 4 types de source d'acquisition possibles et que les fichiers GPX associés aux médias portent le même nom (@AntoineBruge, ok?) :

  • gopro: fichier foo.mp4
  • smartphone video: fichier foo.mov + fichier foo.gpx (@AntoineBruge , quelles autres extensions ?)
  • smartphone photo: fichier foo.jpg + fichier foo.gpx
    -manuelle: fichier foo.gpx

NB1: La sortie de la version manuelle est légèrement différente:

  • colones pour les sorties gopro et smartphones : ['time', 'longitude', 'latitude', 'elevation', 'id', 'label', 'box', 'frame', 'geom']
  • colones pour les sorties manuelles : [time', 'longitude', 'latitude', 'label', 'geom']

NB2: Les labels des données manuelles sont différents :
{'Objet vie courante', 'Bouteille boisson', 'Peche et chasse', 'Autre dechet', 'Industriel ou construction', 'Emballage alimentaire', 'Dechet agricole', 'Autres dechets +10'}

Pour tester ça en local, vous pouvez faire (après avoir activé l'environnement, cf README.rst) :

  • pour les données manuelles :
etl --data-source local --media sample.gpx  --data-dir  data/osm_tracker/ --target-storage local
  • pour les données gopro:
etl --data-source local --media sample.mp4  --data-dir  data/gopro/ --target-storage local
  • pour les données smartphone vidéos:
etl --data-source local --media sample.mp4  --data-dir  data/smartphone_video/ --target-storage local
  • Données smartphone photo : @AntoineBruge, si t'as un exemple de GPX associé à une photo ?

Pouvoir travailler 100% en local (sans se connecter à Azure & Postgre)

En fait, quand on veut tester ou développer, c'est pratique de ne pas être dépendant de Postgre et de Azure. Donc tu verras, j'ai essayé de documenter, mais dans la commande pour lancer l'ETL, on peut choisir de travailler avec des données locales plutôt que de télécharger depuis Azure (on pourra comme ça imaginer à l'avenir télécharger depuis d'autres sources). Pareil pour la sortie, on peut choisir de sauver le résultat en CSV localement plutôt que de l'insérer dans la base de données.

Todo, next steps

  • Voir comment télécharger un seul fichier du blob
  • Voir comment noter que l'ETL a déjà tourné sur un média, si ça a SUCCESS ou FAIL, ainsi que sa version, celle de l'IA.
  • Quelques fix dans le paquet de @rcourivaud qui extrait les données GPX
  • Ajout de tests unitaires
  • Prévoir les migrations de la base de données
  • Question: Est-ce qu'on peut rediscuter ce qu'on doit insérer dans la base de données ? J'ai peur qu'il manque quelques infos.
  • Tester l'image docker, car je suis pas hyper sûre de moi (@rcourivaud)
  • Porter sur Azure fonction

Qu'en dites vous ?

++

@cl3m3nt
Copy link
Contributor

cl3m3nt commented May 13, 2020

Dear @bertrandlalo, following previous feedbacks, my recommendation to integrated smoothly first updates is for you to open a new PR with:

  • data: add the /data folder
  • media: add the media.py module (within scripts folder) with only get_media_duration function. The infer_media_source function might be of interest but we need to consider first how media are going to be stored within blob storage. Typically, media from different source might be stored within different containers.
  • gps: update the gps.py module with extract_gpx_from_gopro function to replace the previous one that was calling the os.subprocess
  • exception :add the exception.py module at the extract_gpx_from_gopro function rely on it.

This is an important step as this will allow us to remove dependancies to subprocess call as well as to gopro2gpx 3rd party. Tx

@cl3m3nt cl3m3nt closed this May 13, 2020
@bertrandlalo
Copy link
Collaborator Author

@cl3m3nt @AntoineBruge
Juste un petit message, Clément, pour te dire que ce n'est pas très cool de :

  • fermer une Pull-Request sans en informer l'auteur
  • prendre la quasi entièreté du code de la Pull-Request en question et le re-commit comme s'il était de toi
  • accepter ses propres Pull-Request... c'est presque absurde !

C'est dommage, j'aurais bien aimé faire une team ETL... le code, c'est tellement mieux à plusieurs !

@cl3m3nt
Copy link
Contributor

cl3m3nt commented Jul 22, 2020 via email

@bertrandlalo
Copy link
Collaborator Author

bertrandlalo commented Jul 22, 2020 via email

@bertrandlalo
Copy link
Collaborator Author

bertrandlalo commented Jul 22, 2020 via email

@cl3m3nt
Copy link
Contributor

cl3m3nt commented Jul 24, 2020 via email

@cl3m3nt cl3m3nt deleted the dev/code-review branch April 14, 2022 13:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Attaching the timestamp to each trash, and not to each box Code review
3 participants