Sieger steht fest!
Liebe Teilnehmer des Java-Wettbewerbs,
hocherfreut blicken wir auf die Einsendungen und wir können sagen, dass wirklich sehr gute Programme dabei sind. Das Testen der Programme hat aus verschiedenen Gründen etwas länger gedauert, da unter anderem einige Programme nicht direkt kompilierbar waren. Sämtliche Programme konnten zum Laufen gebracht werden, so dass ein umfassender Vergleich möglich war.
Von uns wurde die Pixelreihenfolge [row][col] als auch die Reihenfolge [x][y] getestet. Ferner wurde sowohl der tatsächliche Pixelwert der Bilder genutzt, als auch der „falsche“ von getRGB() gelieferte Wert. Es hat sich herausgestellt, dass alle Teilnehmer mit den richtigen Pixelwerten die besten Ergebnisse erzielten.
- Den 1. Platz hat der Teilnehmer Matthias Hertog erreicht, herzlichen Glückwunsch!
- Der 2. Platz geht an Klaus Broelemann, sowie Jan-Christoph Küster und Tobias Ullrich die sehr knapp dem Erstplatzierten folgen.
- Der 3. Platz geht an Jan Roters und Markus Madeja, die trotz eines etwas übertrainierten Klassifikators auf eine stattliche Erkennungsrate kommen.
Die folgende Liste zeigt die eingereichten Programme der Sieger sowie die von uns festgestellte Erkennungsperformance auf Testdaten.
Team | Teilnehmer | Erkennungsrate |
A | Matthias Hertog | 92,32 % |
B | Klaus Broelemann / Küster & Ullrich | 91,06 % / 91,65% *) |
C | Jan Roters, Markus Madeja | 87,68 % |
*) Update (23.06.2009): Bei der Veröffentlichung der Ergebnisse ist den Teilnehmern Jan-Christoph Küster und Tobias Ullrich das Fehlen Ihres Beitrags in der Liste aufgefallen. Die Einreichung hatte bislang das Wettbewerbsteam nicht erreicht - wir vermuten ein Problem in einer Mailserver-Konfiguration bezüglich EU-Domains außerhalb der viadee-Infrastruktur. Der Beitrag wurde nachträglich von Dr. Steffen Wachenfeld geprüft und erreichte eine hervorragende Erkennungsrate von 91,65%. Glückwunsch zu dieser Leistung und der "technischen" Zweitplatzierung!
Nähere Informationen zu den Tests, die genau zeigen, welche Buchstaben wie oft erkannt oder verwechselt wurden, enthalten die confusion matrixes. Einen Überblick über die Leistungen gibt die Ergebnistabelle.
Wir bedanken uns bei allen Teilnehmern und hoffen dass es Spaß gemacht hat. Wir freuen uns auf die Preisübergabe, die wir in den nächsten Tagen planen möchten.
Das Wettbewerbsteam
Bewertungsphase des Java-Wettbewerbs läuft
Das Wettbewerbsteam bedankt sich bei allen Beteiligten - es gibt vielversprechende Lösungsansätze. Aktuell beschäftigen wir uns mit der Analyse der eingereichten Lösungen. Hierzu möchten wir nachfolgend einige technische Details dokumentieren.
1 - Reihenfolge der Dimensionen
Die Reihenfolge der Dimensionen eines zweidimensionales Bildes taucht in zwei Formen auf. Die Reihenfolge x,y ist bei get- und set-Methoden üblich, wie z.B. bei der BufferedImage.getRGB(x,y) Methode. Die umgekehrte Reihenfolge row,col entspricht der mathematischen Matrix-Schreibweise und ist üblich für Arrays.
Unser erstes Interface sollte die mathematische Reihenfolge suggerieren.
Da uns Teilnehmer kontaktiert haben, die von x,y ausgegangen sind, sind wir davon ausgegangen, dass das Interface als x,y verstanden wurde und haben das im 2. Interface so zu formulieren versucht. Dies wiederum hat diejenigen verwirrt, die von row,col ausgegangen waren.
Um das Interface nicht noch ein weiteres Mal zu ändern gilt für die Bewertung folgendes: BEIDE Reihenfolgen werden akzeptiert!
Das bedeutet von uns werden die Testdaten einmal komplett in der Form x,y und dann nocheinmal in der Form row,col an den Klassifikator geleitet. Das bessere der beiden Ergebnisse wird gewertet.
2 - Einlesen der Bitmaps (Falsche Pixelwerte)
Die Bilder im Java Wettbewerb sind Graustufen Bitmaps. Während Programme wie Adobe Photoshop oder MATLAB diese Dateien wie erwartet öffnen, hat Java diesbezüglich einen Fehler (seit 2006, der bisher nicht behoben wurde):
Davon sind die meisten Wege betroffen, wie man an die Pixeldaten eines Bildes kommt. Z.B. per BufferedImage und getRGB(x,y). Der Bug bewirkt, dass auf veränderte Pixelwerte zugegriffen wird, sozusagen nach einem von Java durchgeführten Anti-Aliasing.
Der Buchstabe 28081-a.bmp hat z.B. tatsächlich die folgenden Grauwerte:
Row 0: 153 56 153 255
Row 1: 181 122 0 255
Row 2: 140 140 0 255
Row 3: 122 83 0 237
Dies kann man leicht mit einem Bildbetrachtungsprogramm oder MATLAB verifizieren. Java liest dieses Bild ein und wendet eine Art Gammakorrektur auf die Grauwerte an. Das Ergebnis ist:
Row 0: 203 129 203 255
Row 1: 219 184 0 255
Row 2: 196 196 0 255
Row 3: 184 155 0 247
Man kann dies umgehen, indem man direkt auf den DataBuffer des BufferedImage zugreift und die Grauwerte die dort als Bytes stehen direkt ausliest. Man kann es auch nachträglich korrigieren, indem man ein neues BufferedImage mit linearem ColorSampleModel erstellt. Diesen Vorschlag findet man auch bei einem der related Bugs.
Beides wurde für die Bewertung getestet. Code-Beispiele, die die Wettbewerbsbitmaps korrekt einlesen sind unter Punkt 3) zu finden.
3 - CODE-Beispiele
3.1 - Direkter Zugriff auf den DataBuffer (Code von Klaus Broelemann, Reihenfolge x,y):
public static int[][] loadGrayImage(String filename) {
try {
File imgFile = new File( filename );
BufferedImage img = ImageIO.read(imgFile);
DataBuffer db = img.getData().getDataBuffer();
int i = 0;
int[][] result = new int[img.getWidth()][img.getHeight()];
for (int y = 0; y < img.getHeight(); y++)
for (int x = 0; x < img.getWidth(); x++) {
result[x][y] = db.getElem(i++);
}
return result;
} catch (IOException e) {
return null;
}
}
3.2 - Korrektur des SampleModels (Code aus dem Sun Developer Network - Bug Database, Reihenfolge row,col):
if(image.getType() == BufferedImage.TYPE_BYTE_GRAY) {
byte cmap[] = new byte[256];
for (int i = 0; i < 256; i++)
{
cmap[i] = (byte) i;
}
IndexColorModel gray = new IndexColorModel(8, cmap.length, cmap, cmap, cmap);
BufferedImage bg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_INDEXED, gray);
((Graphics2D) bg.getGraphics()).drawImage(image, 0, 0, null);
image.flush();
image = bg;
}
Abgabefrist für Wettbewerb verlängert!
Die Abgabefrist für den viadee Java-Wettbewerb wurde auf den 04.Mai 2009 verlängert. Aufgrund einiger Unklarheiten in Bezug auf die Interpretation des Classifier-Interfaces und andere technische Hürden gab, haben wir uns entschlossen, die Deadline für Einreichungen zu verlängern. Neuer Abgabetermin ist nun Montag, der 04. Mai um 23:59 Uhr (MEZ).
Eine neu dokumentierte Version des Interfaces finden sie hier zum Download.
WICHTIG: Hieraus ergibt sich kein Änderungsbedarf für bereits eingereichte Lösungen.
Wir arbeiten außerdem an einem Testprogramm, welches auch die Lerndaten verwenden kann und eine Trefferquote errechnet. Sobald möglich stellen wir das Programm für alle Teilnehmer zur Verfügung.
Gemeinsam mit Professor Xiaoyi Jiang und Dr. Steffen Wachenfeld vom Lehrstuhl "Computer Vision and Pattern Recognition" des Instituts für Informatik an der Universität Münster organisiert viadee in diesem Jahr erstmals den "viadee Java-Wettbewerb".
Der Wettbewerb verbindet Theorie und Praxis und richtet sich an Studierende im Grund- und Hauptstudium.
viadee hat bereits seit vielen Jahren enge Kontakte zum Informatiklehrstuhl. Die Ausschreibung des Java-Wettbewerbs ist ein weiterer Baustein in der gezielten Nachwuchsförderung. "Wir wollen den Studenten die Möglichkeit geben, schon frühzeitig mit den Anforderungen der Praxis in Berührung zu kommen." beschreibt Dr. Frank Köhne, Betreuer der Studenten bei viadee, die Gründe für das Engagement.
Zeitplanung und Organisatorisches
Der Wettbewerb ist gestartet mit einer Kick-Off-Veranstaltung am Mittwoch den 25. Februar, 15:00 Uhr in Hörsaal M3 (Teilnahme empfohlen) und läuft bis zum 15. April 2009. Die Wettbewerbsunterlagen sind hier bereitgestellt. Teilnehmer können ihre Lösung per e-Mail einreichen. Eine Abschlussveranstaltung mit Preisübergabe folgt nach der Bewertung.
- Bei Fragen zu Ablauf und Inhalt wenden Sie sich bitte an das Wettbewerbsteam unter der Adresse java-wettbewerb (at) viadee.de.
- Für die inhaltliche Diskussion miteinander steht den Teilnehmern freundlicherweise das OSUM Münster zur Verfügung, eine Initiative von Sun Microsystems Inc.
Aufgabenstellung
Die genaue Aufgabenstellung wurde zum Wettbewerbsbeginn für alle Teilnehmer gleichzeitig bekannt gegeben. Die Aufgabe ist die Implementierung eines Algorithmus' für ein einfaches Mustererkennungsproblem in Java. Sie ist so konzipiert, dass bereits mit sehr geringem Aufwand eine Lösung möglich ist. Konkret geht es um die Erkennung von Buchstaben.
Für die Entwicklungsphase stellen wir ein Set von Trainingsdaten (Zip-Datei, ca. 9MB) bereit - die Entscheidung wird später auf einem zweiten, ähnlichen Datensatz getroffen.
Als Bewertungsmaßstab wird die Erkennungsrate dienen, bei gleicher Erkennungsrate gewinnte das performantere Programm.
Teilnahmebedingungen
Teilnahmeberechtigt sind alle Studierende der Westfälischen Wilhelms-Universität Münster, die noch keinen Master- oder Diplomabschluss haben. Die Teilnahme in Klein-Gruppen ist zulässig.
Bitte reichen Sie Ihre Lösung als ZIP-Datei mit allen benötigten Komponenten sowie dem kompilierbaren Java-Code (Java 5+) ein und realisieren Sie die Funktionalität durch Implementieren des folgenden Interfaces:
Preise für die besten Lösungen.
1. Platz Samsung Netbook NC 10
2. Platz Apple ipod Nano 8 GB
3. Platz Amazon Gutschein in Höhe von 50 Euro



