Pourquoi je l'ai créé
Un laboratoire de recherche d'une université suisse étudie comment les cellules se débarrassent des bactéries. Ils filment des cellules au microscope pendant environ deux heures, une image toutes les 30 secondes, avec des bactéries fluorescentes. Chaque fois qu'une cellule avale une bactérie, ils veulent savoir quand elle est entrée, et si la cellule l'a détruite ou l'avait encore à la fin du film.
Jusqu'ici, quelqu'un s'asseyait devant chaque film et le notait à la main, image par image, dans un tableur. Un film, c'est quelques centaines d'images avec des centaines de cellules : ça prend des heures. Ça ressemblait à un travail pour un ordinateur, alors je l'ai construit.
Comment ça marche
On ouvre un film et on appuie sur Run Analysis. L'application passe par quatre étapes :
- Détecter les bactéries dans chaque image, grâce à leur cœur lumineux.
- Les suivre d'une image à l'autre, malgré de courtes absences et des croisements.
- Trouver les cellules, et suivre chacune pendant tout le film.
- Repérer les événements. Une bactérie qui entre dans une cellule lance un événement. Si elle disparaît, c'est une bactérie tuée, chronométrée depuis l'image où elle est entrée. Si elle est toujours là à la fin du film, c'est un échec.
Ensuite, un chercheur passe les événements en revue, en commençant par les plus clairs. Il peut confirmer, rejeter, déplacer l'image de début ou de fin, couper un événement en deux, ou en ajouter un que l'application a manqué. Sa revue est enregistrée à côté du film, et le résultat est un fichier Excel avec chaque événement.
Sous le capot, c'est du Python. Les cellules sont trouvées par un modèle de deep learning (Cellpose). Le faire tourner sur chaque image prenait trop de temps sur un Mac normal, alors il tourne sur une image sur trois, et les images entre les deux reprennent le résultat le plus proche : elles sont espacées de 30 secondes et une cellule ne bouge que de quelques pixels pendant ce temps. Les bactéries sont trouvées par traitement d'image classique et reliées en trajectoires avec trackpy. Un ensemble de règles décide de ce qui compte comme un événement, par exemple quand deux bactéries sont dans la même cellule et qu'on ne peut pas savoir laquelle a été tuée.
Travailler avec les chercheurs
L'application n'aide que si elle s'adapte à la façon dont le labo travaille déjà. Le fichier Excel a les mêmes colonnes que la feuille qu'ils remplissaient à la main, plus le résultat sous forme de nombre qu'ils peuvent compter et moyenner. Les réglages utilisent leurs mots, comme « failed kill » et « shared cells », pas les miens.
L'essentiel du travail est venu de leurs retours. Ils m'envoyaient des films et me disaient où l'application se trompait : un événement coupé en deux parce qu'une bactérie était floue un instant, un échec manqué dans une zone chargée du film, une bactérie qui ne faisait que passer près d'une cellule comptée comme avalée. Chacun de ces cas est devenu une règle ou un réglage, et une nouvelle version à essayer.
| Event | Frame start | Frame end | Duration (frames) | Duration (min) | Outcome | Outcome code |
|---|---|---|---|---|---|---|
| 1 | 12 | 27 | 15 | 7.5 | Killed | 1 |
| 2 | 31 | 241 | 210 | 105.0 | Failed kill | 0 |
| 3 | 48 | 59 | 11 | 5.5 | Killed | 1 |
Mesurer plutôt que deviner
En analyse d'image, il est facile de changer un réglage, de regarder une image et de décider que c'est mieux. Je voulais des chiffres. J'ai créé un jeu de référence d'images où chaque cellule est délimitée, et chaque version de l'application est notée par rapport à lui : combien de cellules elle trouve, combien elle en invente, et à quel point les contours correspondent.
Ça a changé les décisions. Ma première approche utilisait le traitement d'image classique, et l'ajuster avec le jeu de référence a fait passer son score de 0,61 à 0,78. Les mesures ont aussi montré pourquoi elle se trompait encore : deux cellules qui se touchent étaient souvent vues comme une seule, parce que l'une des deux n'avait jamais de point de départ. Corriger ça a divisé par deux le nombre de cellules fusionnées. Au final, les chiffres ont montré qu'un petit modèle de deep learning était nettement meilleur, et assez rapide s'il ne tourne que sur une image sur trois. C'est ce que l'application utilise aujourd'hui.
Chaque fichier Excel enregistre aussi la version de l'application qui l'a produit, pour que chaque résultat puisse être relié au code exact qui l'a compté.
Le livrer proprement
Les chercheurs ne sont pas programmeurs, alors elle devait s'installer comme n'importe quelle application Mac. Elle est signée et notariée par Apple, donc elle s'ouvre sans avertissement de sécurité, et il existe des versions pour Apple silicon et pour les anciens Mac Intel que le labo utilise réellement.
Tout tourne sur leur propre Mac. Aucun film, aucune image, aucun résultat n'en sort, ce qui compte pour de la recherche non publiée. L'application vérifie sa licence hors ligne au démarrage, et un petit serveur sur Cloudflare ne fait que distribuer les licences renouvelées : s'il tombe en panne, personne n'est bloqué. La seule chose qu'elle envoie, ce sont des statistiques d'utilisation anonymes, et le site du produit dit exactement lesquelles et pourquoi.
Le labo l'utilise maintenant sur ses propres films.