Caleydo / confusionflow-ui

Visualize learning dynamics in multi-class image classifiers (e.g., convolutional neural networks) 💬 @gfrogat @thinkh
https://confusionflow.org
BSD 3-Clause "New" or "Revised" License
1 stars 0 forks source link

Class changer visualization #84

Open mstreit opened 6 years ago

mstreit commented 6 years ago

ink-image

Class 1 and 2 will be defined by the user when selecting a cell in the confusion matrix (class 1=column, class 2=row).

Users should be able to select all bands in the parallel sets visualization, allowing them to specify union and intersections between classes. When selecting a band, the selected images should be retrieved from the server and displayed.

NMO13 commented 6 years ago

Looks nice.

mstreit commented 6 years ago

d3 lib that can possibly by used: https://github.com/jasondavies/d3-parsets

gfrogat commented 6 years ago

facetted browsing idea, we could create dynamic sets/groups of classes. Would be a little bit more flexible as users could build their own "contrasts"

image

NMO13 commented 6 years ago

According to our meeting notes:

Class changer images might be interesting as well This topic gets more and more important, because images representing the algorithm/solution the best can be used for publications Sepp hasn’t looked into that, but he finds it very interesting

NMO13 commented 6 years ago

One question: When we want to show the track of instances over time, we need to store each instance and its classification for each epoch. This sounds like a huge amount of data. Is my assumption correct? Alternatively, we just store the necessary data for selected sample images.

NMO13 commented 6 years ago

I was just told that we have the data available. So everything is alright.

gfrogat commented 6 years ago

We still need to come up with a design / layout for visualizing the class changers.

gfrogat commented 6 years ago

Also it should be general enough so we can track any type of data (not just images but also numeric vectors, graphs, etc...)

thinkh commented 6 years ago

User tasks and possible solutions

NMO13 commented 6 years ago

Some notes regarding our concept:

  1. When the user select a cell in the confusion matrix, the class changer vis should filter the images accordingly.
  2. Initially, when no cell is selected, the Misclassification and Stability charts should be visible. The class changer vis should should not be visible because it is just showing a giant hairball.
  3. We have to constrain the number of representative images below the class changer vis
  4. We could sort/group the representative images by some criteria
gfrogat commented 6 years ago

image

NMO13 commented 6 years ago

image

Each barchart represents the confusion of one class against all others. The vertical stacking of bar charts forms 1 epoch. For multiple epochs, the vertical stacking of bar charts is extended horizontally.

NMO13 commented 6 years ago
thinkh commented 6 years ago

Alternative approach if we can use relative numbers: Ternary (or Triaxial) Plots

grafik

Image from http://ethanfosse.blogspot.co.at/2012/03/triaxial-graphs.html

NMO13 commented 6 years ago

Next idea: image

Each column encodes 1 epoch. The pairs of black/red line segments at the top and bottom encode the predicted class and the rest classes. The red/black/red line segment in the middle encodes the actual class. The line segments are separated by 1 pixel.

The black lines are instances that don't change from epoch e_x to epoch e_x+1 The red lines are either outgoing or incoming (this depends on the definition) instances. That means these are instances that will change classes from e_x to e_x+1.

Multiple Runs:

Interleave the bars: img_0392

The nice thing here is that the we can use the color coding of the timelines because each timeline represents a run. Diverging/converging patterns are easily observable with this approach.

Possible "special" effects:

thinkh commented 6 years ago

Out of scope for the paper. Hence, moved to icebox.

gfrogat commented 6 years ago

Based on experiments with a Matplotlib Prototype this approach doesn't work.