Archive pour la catégorie 'Informatique'

Deep Learning, premier essai

Dimanche 25 mars 2018

Ouch… dernier post en 2014… Pas sûr que je reprenne l’écriture sur ce blog de façon continue pour autant.

Entre-temps, beaucoup de choses se sont produites. A titre perso, mais ça tout le monde s’en moque (oui, maintenant je peux dire que je connais un peu mieux les métiers du bâtiment). Dans le vaste monde, mais d’autres en parlent mieux que moi. Les choses du vaste monde qui m’affectent vous affectent aussi peut-être, alors parlons-en.

Je me suis mis au deep learning. Deux lectures:

- 1 le “Bengio”, particulièrement aride, parfait pour un étudiant ou un chercheur. Violent pour mes petits neurones (biologiques, ceux-là) et qui réveille des vieux souvenirs de prépa.

bengio_dl

- 2 Le “Hands-On Machine Learning with Scikit-Learn and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems” (titre un peu long). Orienté ingéniérie et pratique avec TensorFlow.

ml-tensor

Donc, après 3 mois de lutte acharnée avec le premier (auto-formation le matin de 7h à 8h) , et gobage du second en 3 mois, je me suis lancé à faire un projet perso. Objectif simple pour commencer: détecter et lire des étiquettes de supermarché sur une photo de rayon.

En 2 parties:

1/ détection de la position des étiquettes, avec une heatmap.
2/ lecture des étiquettes.

Aujourd’hui, j’estime que la partie dure de la première partie est finie.

Pour ça:
- Séance photo dans le E.Leclerc du coin, en mitraillant avec le téléphone planqué sous le manteau. (2h)
- Prise en main de tensorflow en python, heureusement que j’avais déjà des notions. (2 mois), apprentissage sur MNIST.
- Ecriture d’un modèle à l’arrache (1 semaine)
- Annotation des images (4h). Gasp, j’aurais peut-être pu utiliser un auto-encodeur. Trop tard…
- Résolution des problèmes, dans le sens des plus triviaux qui n’ont parfois rien à voir (tag exif d’orientation dans le JPEG, virgule oubliée à la fin d’une ligne python,…), aux plus complexes (bug de tensorflow sur tf.squeeze(axis)), 1 semaine
- Laisser la machine faire son travail, superviser l’apprentissage (2j)
- Prendre du plaisir devant le résultat (ça n’a pas de prix)

Le résultat:


deep_learning

De gauche à droite:

- imagette de la photo, l’original est en 800×600, là on distingue à peine les étiquettes
- cible annotée, en 80×60. C’est le résultat vers lequel la machine doit converger.
- heatmap, en probablité. Plus c’est blanc, plus le pixel a de chances d’appartenir à une étiquette. C’est donc le passage d’une image réelle après passage au travers de mon réseau de neurones profonds, une fois l’apprentissage effectué.
- Résultat précédent seuillé à 65%. Idéalement ca devrait être 50%, mais il y a encore trop de faux-positifs. Cette imagette doit ressembler à la version annotée, là ça me semble correct.

Morale de l’histoire pour le moment:
- Ce n’est pas si compliqué qu’il y parait, à mitiger aussi parce que j’étais à fond.
- Il y a beaucoup de fantasmes autour de ces techniques. NON, on n’a pas encore construit Skynet.
- On en est encore à faire de l’artisanat pour trouver les couches et les paramétrages.
- La puissance machine compte beaucoup. Le passage sur GPU ne vaut pas le coup avec une carte de milieu de gamme: j’obtiens le même temps entre mon core i5 et une GeForce 610. Vu que les GeForce 1070ti ou 1080 sont hors de prix et comptent le rester à cause des crypto-monnaies, je vais opter pour un CPU gonflé aux stéroïdes (et avec beaucoup, beaucoup, vraiment beaucoup plus de RAM…)
- Il faut faire preuve de créativité pour deboguer le bouzin.
- Les étiquettes de supermarché sont formatées n’importe comment. Sur ce seul magasin, 3 formats différents. Et c’est sans compter les étiquettes erronées (prix négatif) ou arrachées, etc… Quand on n’y fait pas attention, on ne s’en aperçoit pas, mais en regardant de plus près, je me dis que ca ressemble à une grande foire !

Ce qu’il faudrait améliorer:
- utiliser les outils de debug (tfdbg) et suivi de convergence de tensorflow (tensorboard)
- avoir une échantillon de validation (OMG ! Grosse erreur de nOOb de valider visuellement avec l’échantillon d’apprentissage !!!)
- Faire la seconde étape, lecture du contenu de l’étiquette…

GWT 2.5 et les enums

Samedi 9 novembre 2013

GWT 2.5 a du modifier sa manière de sérialiser les enums, ce qui provoque des erreurs incompréhensibles du type:

An IncompatibleRemoteServiceException was thrown while processing this call.

Après avoir passé des soirées à chercher une solution, je peux dire que tout ça ne fonctionne pas:

  1. Nettoyer le cache du browser
  2. Clean du code dans eclipse
  3. Créer un construction vide public de l’enum
  4. Lui rajouter IsSerializable
  5. … Serializable
  6. Effacer les répertoires war/bla
  7. Effacer les répertoire unitCacheblablab

Le seul post intéressant que j’ai trouvé:

http://code.google.com/p/google-web-toolkit/issues/detail?id=7836

Workaround: hériter de

com.google.gwt.user.RemoteServiceObfuscateTypeNames

Autant faire la pub de cette “solution”, vu le nombre de propositions qui trainent sur le web.

Ubuntu Unity

Jeudi 9 février 2012

Ha ! La nouvelle version d’Ubuntu est sublime, avec transparence, menus intelligents, et j’en passe. On dirait presque un Windows 7 !

….

….

Bon, si comme moi, cette interface vous hérisse les poils sur la nuque, il y a moyen de la dégager vite-fait. Pour cela, installer Gnome Classic, et virer le paquetage unity. A la connexion, choisir Gnome Classic. Au passage, virer Ubuntu One: être prisonnier d’un cloud, non merci.

Seconde astuce du jour: pour virer un lanceur d’application dans le menu du haut, faire alt+click droit sur l’icône de l’application. Un menu apparaît qui propose de supprimer le raccourci. C’est loin d’être intuitif.

Sauvegarde pas cher

Dimanche 5 février 2012

Vous avez:

  • Des données personnelles à sauvegarder ?
  • Un Linux ?
  • Une freebox ?
#!/bin/bash
val=`mount | grep SAVE`
if [ "$val" = "" ]

then

mkdir /SAVE

mount -t cifs "//mafreebox.freebox.fr/Disque dur" /SAVE -o guest,iocharset=utf8,file_mode=0777,dir_mode=0777

result=$?

if [ "$result" != "0" ]

then

echo "Can't mount"

exit 1

fi

fi

mkdir /SAVE/rsync

rsync -rltgoDv --del --ignore-errors --force /home/ /SAVE/rsync/

Reste à rajouter ça quelque part en crontab et la sauvegarde est faite.

Les (le ?) sysadmins qui liront cette entrée de blog apprécieront particulièrement le style cracra du script, les tests d’erreurs et autres.

Mais mieux vaut une sauvegarde, même limitée, que rien du tout, non ?

Quelques remarques:

  • Le nom d’hôte “mafreebox.freebox.fr” est générique et pointe vers la bonne freebox.
  • Les attributs de fichiers ne sont pas sauvegardés, ce qui bien souvent n’est pas un problème; en général, on est déjà content de retrouver tous ses fichiers.

Disruptive ?

Dimanche 5 février 2012

Habituellement, je ne m’extasie pas devant du nouveau matériel informatique. N’en déplaise à mes collègues, je ne saute pas de joie devant un graphe de débit d’I/O disques ou une nouvelle nappe SAS 4 ports.

Mais là, j’ai été scotché.

Pourtant je savais bien à quoi m’attendre avec ce SSD.

Oui, je savais que le débit était maintenu avec des petites I/O, de l’ordre de 270 Mo/s… Que le lancement des applis serait instantané, et je dis biens “des applis”, c’est-à-dire en les lançant en même temps; le tout sans bruit, sans latence. Que le boot serait quasi-instantané…

Bon, ca fait quand même son effet. Et c’est agréable. Pas sûr de vouloir revenir sur un HDD après ça. En tout cas, le retour lundi au travail sur mon laptop pourrave sera pénible.

Quant à la capacité, 60Go, c’est largement suffisant pour stocker un système et le /home. Pour le reste, les “vidéos de vacances” et “mes compositions musicales”, resteront sur l’ancien HDD, là ou la latence reprend ses droits sans gêner l’utilisateur.

Du côté d’Ubuntu, il a fallu tweaker un tout petit peu: ce coquin n’active pas l’option “discard” par défaut pour les partitions ext4. Un moyen sûr de fusiller son SSD rapidement.

Update: le graphe de boot:

deimos-oneiric-20120210-1.png

Compatibilité du XML de QT

Samedi 21 août 2010

Voici la méthode la plus propre que j’ai trouvé pour écrire des fichiers XML en UTF-8 compatibles entre Windows et Linux avec Qt. (2.6.2 sous Windows et sous Linux):

Ecrire:


QDomDocument doc("toto");
QDomElement root=doc.createElement("toto");
// ... remplir root
QDomProcessingInstruction instr =doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instr);
doc.appendChild(root);
QFile file(_userFile);
if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate))
{
// gestion d'erreur
}
QTextStream stream("file");
stream.setCodec(QTextCodec::codecForName("UTF-8")); // Sous Windows, forcer UTF-8, sinon il utilisera le codec de la locale
stream << doc.toString();
file.close();

Passer par un QDataStream et/ou un QByteArray n’est pas une bonne idée.
Par ailleurs, la BOM UTF-8 en début de fichier est correctement lue sous Linux mais pas sous Windows (pourquoi ? mystère…). Donc il vaut mieux la supprimer et spécifier l’encodage en tant que processing instruction XML.

Pour lire:


QDomDocument doc("tata");
QFile file("myFile");
if (!file.open(QIODevice::ReadOnly))
{
// gestion d'erreur
}
if (!doc.setContent(&file, &errorMsg))
{
// gestion d'erreur
}

C++ vs Java

Jeudi 5 août 2010

Et c’est parti pour un troll des familles comme à la belle époque !

A ma gauche: Java

  • Cohérent de bout en bout.
  • Ne s’appuie pas sur un langage tout pourri des années 70; repensé par la base.
  • Bibliothèque large
  • Bonne intégration pour les SI et le Web
  • Disposent d’EDIs vraiment efficaces, comme Eclipse.

Mais…

  • Plutôt inadapté pour le TR et l’embarqué proche du système (mais ca n’a jamais été l’intention initiale)
  • Pas hyper-innovant non-plus. L’objectif est la cohérence et la productivité
  • Souffre d’une image de gros consommateur de mémoire…
  • Son GC est parfois incontrôlable

A ma droite, C++ (c’est de droite, C++ ???)

  • Construit sur un langage connu, C
  • Passe bien en embarqué et système

Mais:

  • Hérite de problèmes du C
  • … Rajoute une couche de problèmes par dessus - héritage multiple, templates…qui le rende bugogène.
  • Lourd à compiler (merci les templates)
  • Peut rester assez proche de la machine en cas de besoin
  • Niveau bibliothèque pour les SI, c’est pas ça (mais ce n’est pas son intention). Quant au web…
  • Le bazar niveau standard.
  • Dur à rendre cross-plateforme.
  • Pour les EDI, c’est la galère (à cause du préprocesseur, entre autres).

Moralité: C++ par dépit, mais Java quand c’est possible !

Quand le windsurf se fait bouffer par Microsoft

Mercredi 7 avril 2010

Ca fait longtemps que je n’ai pas bloggué, il parait. Pour rompre le silence, un petit billet d’humeur bien senti !

Qui ne connait pas le Défi Wind et ses records en nombre de participants ? Tout le monde connait, bien sûr !

Grâce à ses sponsors et à ses bénévoles, l’organisation est un véritable … défi, relevé chaque année avec brio ! Parmi ces sponsors, on trouve Microsoft; jusque-là, tout va bien. Sauf que comme par hasard, le site Web du défi repose sur SilverLight, le plugin de Microsoft concurrent de Flash. Et vous savez quoi ? Je n’arrive pas à l’installer sur mon Firefox sous Linux ! Dingue, non ? L’alternative: MoonLight, développé par Novell en utilisant Mono. Mais je ne veux pas avoir à maintenir un énième plugin pour Firefox…Du coup, comme l’an dernier, je n’irai pas voir le site du Défi !

Vous me direz, ce n’est plus très grave puisque je ne participe pas (et que je me drogue maintenant à un sport de glisse alternatif), mais tout de même, c’est moche de se faire bouffer comme ça par un partenaire qui cherche à refourguer sa camelote.

Un petit projet qui avance

Samedi 23 janvier 2010

Pour ma recherche d’emploi active, je me suis mis en quête d’un outil dédié et unique pour rechercher des offres et les suivre à l’aide d’un journal d’évènement.

Et voici FreeJobFinder !

Ce petit outil encore au stade du développement, mais déjà fonctionnel pour moi (je m’en sers tous les jours) me fournit le niveau d’organisation que je cherche. Finies les feuilles volantes,les numéros de téléphone disséminés et sans nom, les “oublis” malencontreux.

Il permet entre autres:

  • De rechercher des offres sur expectra, monster et apec
  • De faire un suivre d’offres dédié par journaux avec possibilité d’attacher des références à des fichiers
  • De faire le même suivi d’offres avec des offres rentrées manuellement (pour les veinards qui se font contacter directement)
  • D’avoir un calendrier des évènements à venir (entretiens, rappels, …)
  • De faire des synthèses sous forme HTML, pratiques pour avoir un justificatif de recherche auprès de Pôle Emploi

(plus de screenshots sur la page du projet)

Bref, l’essayer c’est l’adopter.

Scrum, l’obsession

Jeudi 7 janvier 2010

Ces temps-ci, j’enchaine à un rythme effréné (*) les lectures sur Scrum.

L’incontournable Scrum and XP From the Trenches

Les aventures d’un homme et son équipe qui implémentent Scrum. Ce qu’ils ont testé, ce qui marche, ce qui ne marche pas. Pragmatique et honnête. L’important dans tout ça, c’est d’être capable d’affronter l’auto-critique et de s’adapter.


The Enterprise and Scrum

Par Ken Schwaber, un des grands penseurs (!!) de Scrum. Comment intégrer Scrum dans une entreprise moyenne ou grande, comment migrer les anciens postes de manager (vers ScrumMaster et P.O), comment gérer les dépendances entres les modules logiciels ?

Là, c’est un peu moins paragmatique, il cherche à vendre son truc à tout prix. Là ou j’ai été très le moins convainc, c’est à propos de la rémunération: l’équipe est prise dans son ensemble, et les primes sont distribuées également entre tous les individus. Communiste, monsieur Schwaber ? Ça se rapproche de la réponse qu’on m’avait faite lors de ma formation de P.O: les développeurs sont rémunérés par la reconnaissance de leurs pairs….. bah non en fait, il y a des gens motivés par l’idée d’une grosse prime pour pouvoir partir en vacances :-) J’avais lu que les gens ne considèrent pas la rémunération financière comme l’aspect le plus important de leur travail, mais quand même, j’ai du mal à m’en convaincre.

Pareil sur la gestion humaine: un “banc” ou les développeurs sont en attente d’un projet. Quand ils restent trop longtemps sur le banc, on vire. Pas sûr que le code du travail français s’accommode de ce genre de méthodes….

On pourrait rapprocher le poste de P.O de celui de “chef de projet fonctionnel” et celui de ScrumMaster de “chef de projet technique”, mais les noms ont été volontairement changé pour réprésenter le fait que le ScrumMaster est un facilitateur et non pas un “chef”à la sauce Command’n Control, et que le P.O n’a pas de prise sur l’architecture et la technique. Sauf qu’en pratique, le P.O a vraiment intérêt à comprendre tous les rouages techniques pour pouvoir demander des solutions alternatives au besoin. Ce qui est intéressant, c’est de constater que le ScrumMaster a quand même beaucoup de pouvoir dans sa vision des choses; c’est très éloigné de ce que j’en avais retenu.

Enfin, pour le reste, c’est intéressant, ça contient de bonnes idées.

(*) Chômage Power