Dienstag, 12. Januar 2016

Heal your cat with Python

Ich habe drei Katzen, Kater um genau zu sein: Max, Dima und Filou. Alle total verrückt, jeder auf seine Weise. Einer davon hat ein Problem. Filou haben wir als kleines Katerchen mit nichtmal einem Kilo von einer lokalen Tierschutzorganisation bekommen. Die Pflegefamilie hatte ihn mühsam mit der Flasche aufgezogen, nachdem er im Alter von wenigen Wochen allein im Wald gefunden worden war. Inzwischen hat er sich sehr gut gemacht und ist total wild. Ein Problem hat er aber bisher behalten: Er hat einen sehr ausgeprägten Gastro-Ösophagealen Reflux – auf Deutsch Sodbrennen. Das hat ihm von Anfang an große Probleme bereitet und  er wollte eigentlich immer nur ganz aufrecht sitzen, damit nichts hochkommt. Zum Glück kann man sowas sehr effektiv behandeln – mit Omeprazol, das die Säureproduktion im Magen blockiert. Macht man auch beim Menschen so. Da gibt es nur ein kleines Problem: Omeprazol kommt in recht großen säurefesten Kapseln (damit der Wirkstoff nicht im Magen kaputt geht) und Katzen nehmen freiwillig keine Tabletten. Zudem  wären die Kapseln für so einen kleinen Kater viel zu hoch dosiert.

Dosisanpassung

Nun gibt es Omeprazolkapseln, die man öffnen darf, weil die darin enthaltenen Wirkstoffkügelchen (nein keine Globuli, sondern richtige Medizin) selbst einen säurefesten Überzug haben. Das ist v.a. für Kinder gedacht, die die Kapseln nicht nehmen wollen. Denen  mischt man das dann in Apfelmus oder so. Sollte doch auch bei Katzen gehen, nur eben mit Hühnermus statt Apfelmus ;-)

Aber wieviele Kügelchen braucht er? Simpel: eine Kapsel enthält 20mg Omeprazol. Die korrekte Dosierung ist 1mg Omeprazol pro kg Körpergewicht. Der Kater wiegt momentan 2.4kg. Also braucht er 2.4mg. Aber wievielen Kügelchen entspricht das? Na das ist doch einfach - ich muss ja nur die 20mg durch die Anzahl der Kügelchen pro Kapsel teilen und schon weiß ich wieviel Wirkstoff ein Kügelchen enthält. Gesagt getan. Kapsel aufmachen und Inhalt ausschütten:
Hm – das sind aber viele!

Um ein zuverlässiges Bild zu erhalten sollte man zudem eine Handvoll Kapseln öffnen und auszählen. Hab ich Lust diese Sisyphosarbeit zu machen? Nö. Und wie man von Larry Wall weiß, sind die drei Tugenden des Programmierers Faulheit, Ungeduld und Hybris. In diesem Fall also Faulheit – also die Eigenschaft die einen dazu antreibt, Programme zu schreiben, die einem die Arbeit abnehmen.

Bildanalyse

Statt selber zählen lieber zählen lassen! Also Kapsel aufmachen und den Inhalt auf schwarzen Karton entleeren (s.o.), Foto schießen, nächste Kapsel. Sechs Kapseln habe ich so dokumentiert. Das sollte reichen um ausreichend genau zu sein.

Nun erstmal den Kontrast anheben, damit das Kügelchenzählen einfacher wird. Dazu habe ich imagemagick verwendet:

   convert -threshold 30% pic1.jpg pic1-hicontrast.jpg

Das sieht dann so aus:


Zum Zählen habe ich ein kleines Python Skript geschrieben, das das scikit-image Modul verwendet und das geht so:

  from skimage import data, io, color, feature
 

  image = io.imread(imagename)
  image_gray = color.rgb2gray(image)
  blobs = feature.blob_dog(image_gray, min_sigma=5, max_sigma=10, threshold=.5)
  print len(blobs[:,2])


Im Wesentlichen ist der Code aus der Doku für die Feature detection geklaut. Im echten Skript ist dann auch noch ein bisschen Code drin, der das Bild mit Markierungen der detektierten Features überlagert, damit man das Ergebniss visuell kontrollieren kann. Das habe ich genutzt, um per trial and error die besten Werte für min_sigma und max_sigma zu finden:


Das Bild ist in Falschfarben: Blau ist der Hintergrund, rot die hellen Bildelemente und die grünen Kringel markieren detektierte Features. Passt hier schon perfekt.

Nach ein klein wenig herumprobieren lief es problemlos und hat die folgenden Counts geliefert;

Kapsel 1: 230
Kapsel 2: 233
Kapsel 3: 234
Kapsel 4: 243
Kapsel 5: 236
Kapsel 6: 244

Im Mittel also 236.6 Kügelchen pro Kapsel. Also enthält jedes Kügelchen 20mg/236.6 = 0.085mg. Der Kater braucht also 2.4 / 0.085 = 28 Kügelchen am Tag. Jetzt muss ich nur noch einen automatischen Kügelchensortierer konstruieren...

Der Kater ist nun sehr zufrieden...

... und widmet sich intensiv seinen Hobbies:


1 Kommentar:

  1. Mei süss :-). Echt eine liebe Katze. Leider bin ich allergisch... Ist eine super coole Anwendung von computer vision und zeigt wieder mal, dass es in Python (fast) nichts gibt was es nicht gibt ;-). Es gibt ja z.B. auch komplette Bindings für OpenCV und für ROS. Auch am Raspberry Pi ist Python ja fast nativ.

    AntwortenLöschen