Skip to content

Commit

Permalink
GUI and default values
Browse files Browse the repository at this point in the history
  • Loading branch information
haesleinhuepf committed Sep 26, 2020
1 parent e7e0751 commit 78da704
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,32 @@
import net.haesleinhuepf.clijx.assistant.annotation.AnnotationTool;
import net.haesleinhuepf.clijx.assistant.optimize.OptimizationUtilities;
import net.haesleinhuepf.clijx.assistant.services.AssistantGUIPlugin;
import net.haesleinhuepf.clijx.assistant.utilities.AssistantUtilities;
import net.haesleinhuepf.clijx.assistant.utilities.IJLogger;
import net.haesleinhuepf.clijx.assistant.utilities.Logger;
import net.haesleinhuepf.clijx.weka.GenerateFeatureStack;
import net.haesleinhuepf.clijx.weka.GenerateLabelFeatureImage;
import net.haesleinhuepf.clijx.weka.TrainWekaModelWithOptions;
import net.haesleinhuepf.spimcat.io.CLIJxVirtualStack;
import org.scijava.plugin.Plugin;
import org.scijava.util.VersionUtils;

import java.awt.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;

import static net.haesleinhuepf.clijx.assistant.utilities.AssistantUtilities.addMenuAction;

@Plugin(type = AssistantGUIPlugin.class)
public class BinaryWekaPixelClassifier extends AbstractAssistantGUIPlugin {

String features = "";
String filename = "pixel_classification.model";

GenericDialog dialog;

public BinaryWekaPixelClassifier() {
Expand All @@ -34,10 +45,70 @@ public BinaryWekaPixelClassifier() {

@Override
protected GenericDialog buildNonModalDialog(Frame parent) {
GenericDialog gd = super.buildNonModalDialog(parent);
GenericDialog gd = new GenericDialog(AssistantUtilities.niceName(this.getName()));
dialog = gd;

gd.addToSameRow();
features = (String)((net.haesleinhuepf.clijx.weka.BinaryWekaPixelClassifier)(getCLIJMacroPlugin())).getDefaultValues()[2];
String temp = loadFeatures(filename + ".features.txt");
if (temp.length() > 0) {
features = temp;
}
gd.addStringField("Feature definition", features, 30);
TextField feature_field = ((TextField) gd.getStringFields().get(0));

//gd.addToSameRow();
{
Panel panel = new Panel();
Button button = new Button("Features...");
button.addActionListener((a) -> {
GenericDialog sub_dialog = new GenericDialog("Features");
sub_dialog.addMessage("Enter radii");
String[] allFeatures = GenerateFeatureStack.allFeatures();
for (String entry : allFeatures) {
if (entry.startsWith("*")) {
sub_dialog.addCheckbox(entry.substring(1), (" " + features + " ").toLowerCase().contains(" " + entry.substring(1).toLowerCase() + " "));
} else {
sub_dialog.addStringField(entry, extractRadii(features, entry), 30);
}
}
sub_dialog.showDialog();
if (sub_dialog.wasCanceled()) {
return;
}

String new_features = " ";
for (String entry : allFeatures) {
//if (sub_dialog.getNextBoolean()) {
// new_features = new_features + entry + " ";
//}
if (entry.startsWith("*")) {
if (sub_dialog.getNextBoolean()) {
new_features = new_features.trim() + " " + entry.substring(1) + " ";
}
//sub_dialog.addCheckbox(entry, (" " + features + " ").toLowerCase().contains(" " + entry.toLowerCase() + " "));
} else {
//sub_dialog.addStringField(entry, extractRadii(features, entry), 30);
new_features = new_features.trim() + " " + compressRadii(sub_dialog.getNextString(), entry);
}

}
if (new_features.length() > 1) {
feature_field.setText(new_features.trim());
}
});
panel.add(button);
//gd.add(new Panel());
//gd.addToSameRow();
gd.addPanel(panel);
}


gd.addStringField("Model file", filename, 30);

TextField filename_field = ((TextField) gd.getStringFields().get(1));
//gd.addToSameRow();

//gd.addToSameRow();
{
Panel panel = new Panel();
Button button = new Button("File...");
Expand Down Expand Up @@ -66,14 +137,39 @@ protected GenericDialog buildNonModalDialog(Frame parent) {
}*/
gd.addMessage("Note: This only works for 2D images for now.");

for (int i = 0; i < 2; i++) {
TextField t = ((TextField) gd.getStringFields().get(i));
t.setMinimumSize(new Dimension(200, t.getHeight()));
}
//for (int i = 0; i < 2; i++) {
// TextField t = ((TextField) gd.getStringFields().get(i));
// t.setMinimumSize(new Dimension(200, t.getHeight()));
//}

return gd;
}

private String extractRadii(String features, String searchfor) {
String result = "";
for (String entry : features.split(" ")) {
if (entry.startsWith(searchfor)) {
if (result.length() == 0) {
result = entry.split("=")[1];
} else {
result = result + ", " + entry.split("=")[1];
}
}
}
return result;
}

private String compressRadii(String input, String parameter) {
String result = "";
for (String entry : input.replace(" ", "").split(",")) {
if (entry.trim().length() > 0) {
result = result + parameter + "=" + entry.trim() + " ";
}
}
return result.trim();
}


private void train(Logger logger) {
logger.log("Train Weka");
logger.log("----------");
Expand All @@ -96,25 +192,25 @@ private void train(Logger logger) {
ClearCLBuffer[] pushed = CLIJxVirtualStack.imagePlusToBuffer(my_source);
ClearCLBuffer input = pushed[my_source.getC() - 1];

String feature_definitions = ((TextField) dialog.getStringFields().get(0)).getText();
String model_filename = ((TextField) dialog.getStringFields().get(1)).getText();
features = ((TextField) dialog.getStringFields().get(0)).getText();
filename = ((TextField) dialog.getStringFields().get(1)).getText();

int num_trees = (int) Double.parseDouble(((TextField) dialog.getNumericFields().get(0)).getText());
int num_features = (int) Double.parseDouble(((TextField) dialog.getNumericFields().get(1)).getText());
int max_depth = (int) Double.parseDouble(((TextField) dialog.getNumericFields().get(2)).getText());

ClearCLBuffer featureStack = GenerateFeatureStack.generateFeatureStack(clij2, input, feature_definitions);
ClearCLBuffer featureStack = GenerateFeatureStack.generateFeatureStack(clij2, input, features);

net.haesleinhuepf.clijx.weka.BinaryWekaPixelClassifier.invalidateCache();

TrainWekaModelWithOptions.trainWekaModelWithOptions(clij2, featureStack, ground_truth, model_filename, num_trees, num_features, max_depth);
TrainWekaModelWithOptions.trainWekaModelWithOptions(clij2, featureStack, ground_truth, filename, num_trees, num_features, max_depth);

cleanup(my_source, pushed);

ground_truth.close();
featureStack.close();

logger.log("Model saved to " + model_filename);
saveFeatures(filename + ".features.txt", features);
logger.log("Model saved to " + filename);
setTargetInvalid();
logger.log("Bye.");
}
Expand All @@ -126,4 +222,31 @@ protected void addMoreActions(Menu more_actions) {
});
}

static String loadFeatures(String filename) {
String features = "";
try {
if (new File(filename).exists()) {
features = new String(Files.readAllBytes(Paths.get(filename)));
} else {
System.out.println(filename + " doesn't exist.");
}
} catch (NoSuchFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return features;
}

static void saveFeatures(String filename, String features) {
File outputTarget = new File(filename);
try {
FileWriter writer = new FileWriter(outputTarget);
writer.write(features);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
import java.nio.file.Paths;
import java.util.HashMap;

import static net.haesleinhuepf.clijx.assistant.interactive.handcrafted.BinaryWekaPixelClassifier.loadFeatures;
import static net.haesleinhuepf.clijx.assistant.interactive.handcrafted.BinaryWekaPixelClassifier.saveFeatures;
import static net.haesleinhuepf.clijx.assistant.utilities.AssistantUtilities.addMenuAction;

@Plugin(type = AssistantGUIPlugin.class)
Expand Down Expand Up @@ -73,7 +75,10 @@ protected GenericDialog buildNonModalDialog(Frame parent) {
gd.addChoice("Intensity image", short_titles, short_titles[short_titles.length - 2]);
choice = (Choice) gd.getChoices().get(0);

loadFeatures(filename + ".features.txt");
String temp = loadFeatures(filename + ".features.txt");
if (temp.length() > 0) {
features = temp;
}
gd.addStringField("Feature definition", features, 30);
TextField feature_field = ((TextField) gd.getStringFields().get(0));

Expand Down Expand Up @@ -268,39 +273,12 @@ private void train(Logger logger) {


logger.log("Model saved to " + model_filename);
saveFeatures(model_filename + ".features.txt");
saveFeatures(model_filename + ".features.txt", features);
logger.log("Featurelist saved to " + model_filename + ".features.txt");
setTargetInvalid();
logger.log("Bye.");
}

private void saveFeatures(String filename) {
File outputTarget = new File(filename);
try {
FileWriter writer = new FileWriter(outputTarget);
writer.write(features);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}


private void loadFeatures(String filename) {
try {
if (new File(filename).exists()) {
features = new String(Files.readAllBytes(Paths.get(filename)));
} else {
System.out.println(filename + " doesn't exist.");
}
} catch (NoSuchFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


@Override
protected void addMoreActions(Menu more_actions) {
addMenuAction(more_actions, "Train classifier", (a) -> {
Expand Down

0 comments on commit 78da704

Please sign in to comment.