mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2025-05-12 09:37:23 +00:00
Clip Display for DL
Added a clip display for the deep learning classifier. Could do with more decoration.
This commit is contained in:
parent
0941b3ab7f
commit
545e2b010a
src
PamguardMVC
rawDeepLearningClassifier
@ -303,6 +303,10 @@ abstract public class PamProcess implements PamObserver, ProcessAnnotator {
|
||||
* one. Otherwise Pamguard tends to get stuck in a loop of model change
|
||||
* notifications and setting of data blocks.
|
||||
*/
|
||||
boolean instant = (this instanceof PamInstantProcess);
|
||||
if (instant) {
|
||||
reThread = false;
|
||||
}
|
||||
if (parentDataBlock == newParentDataBlock) {
|
||||
return;
|
||||
}
|
||||
@ -312,7 +316,12 @@ abstract public class PamProcess implements PamObserver, ProcessAnnotator {
|
||||
}
|
||||
parentDataBlock = newParentDataBlock;
|
||||
if (parentDataBlock != null) {
|
||||
parentDataBlock.addObserver(this, PamModel.getPamModel().isMultiThread() & reThread);
|
||||
if (instant) {
|
||||
parentDataBlock.addInstantObserver(this);
|
||||
}
|
||||
else {
|
||||
parentDataBlock.addObserver(this, PamModel.getPamModel().isMultiThread() & reThread);
|
||||
}
|
||||
// acousticDataSource = AcousticDataUnit.class.isAssignableFrom(parentDataBlock.getUnitClass());
|
||||
// parentProcess = parentDataBlock.getParentProcess();
|
||||
PamProcess pp = parentDataBlock.getParentProcess();
|
||||
|
@ -26,6 +26,11 @@ import PamguardMVC.dataSelector.DataSelector;
|
||||
import ai.djl.engine.Engine;
|
||||
import annotation.handler.AnnotationHandler;
|
||||
import clickTrainDetector.layout.ClickTrainSymbolManager;
|
||||
import clipgenerator.ClipDataUnit;
|
||||
import clipgenerator.ClipDisplayDataBlock;
|
||||
import clipgenerator.clipDisplay.ClipDisplayDecorations;
|
||||
import clipgenerator.clipDisplay.ClipDisplayParent;
|
||||
import clipgenerator.clipDisplay.ClipDisplayUnit;
|
||||
import dataPlotsFX.data.TDDataProviderRegisterFX;
|
||||
import detectionPlotFX.data.DDPlotRegister;
|
||||
import generalDatabase.SQLLoggingAddon;
|
||||
@ -41,6 +46,7 @@ import rawDeepLearningClassifier.dlClassification.DLClassNameManager;
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassiferModel;
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassifierChooser;
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassifyProcess;
|
||||
import rawDeepLearningClassifier.dlClassification.DLDetectionDataBlock;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.SoundSpotClassifier;
|
||||
import rawDeepLearningClassifier.dlClassification.archiveModel.PamZipModelClassifier;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDClassifier;
|
||||
@ -63,6 +69,9 @@ import rawDeepLearningClassifier.logging.DLResultBinarySource;
|
||||
import rawDeepLearningClassifier.logging.DLResultLogging;
|
||||
import rawDeepLearningClassifier.offline.DLOfflineProcess;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterProcess;
|
||||
import rawDeepLearningClassifier.swing.DLClipDecorations;
|
||||
import rawDeepLearningClassifier.swing.DLClipDisplayProvider;
|
||||
import userDisplay.UserDisplayControl;
|
||||
|
||||
/**
|
||||
* Module which uses an external deep learning classifier to identify any data
|
||||
@ -107,7 +116,7 @@ import rawDeepLearningClassifier.segmenter.SegmenterProcess;
|
||||
* @author Jamie Macaulay
|
||||
*
|
||||
*/
|
||||
public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
public class DLControl extends PamControlledUnit implements PamSettings, ClipDisplayParent {
|
||||
|
||||
/**
|
||||
* PLUGIN_BUILD boolean is set to true so that the class loader isn't changed. When
|
||||
@ -367,6 +376,8 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
//create the classiifer chooser.
|
||||
dlClassifierChooser = new DLClassifierChooser(this);
|
||||
|
||||
UserDisplayControl.addUserDisplayProvider(new DLClipDisplayProvider(this));
|
||||
|
||||
// ensure everything is updated.
|
||||
updateParams(rawDLParmas);
|
||||
}
|
||||
@ -742,6 +753,34 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ClipDisplayDataBlock<ClipDataUnit> getClipDataBlock() {
|
||||
|
||||
Object dlBlock = dlClassifyProcess.getDLDetectionDatablock();
|
||||
ClipDisplayDataBlock<ClipDataUnit> clipBlock = (ClipDisplayDataBlock<ClipDataUnit>) dlBlock;
|
||||
return clipBlock;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return getUnitName() + " Clips";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ClipDisplayDecorations getClipDecorations(ClipDisplayUnit clipDisplayUnit) {
|
||||
return new DLClipDecorations(this, clipDisplayUnit);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void displaySettingChange() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -13,7 +13,9 @@ import PamguardMVC.DataUnitBaseData;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import PamguardMVC.PamInstantProcess;
|
||||
import PamguardMVC.PamObservable;
|
||||
import PamguardMVC.PamProcess;
|
||||
import binaryFileStorage.DataUnitFileInformation;
|
||||
import clipgenerator.ClipProcess;
|
||||
import pamScrollSystem.AbstractScrollManager;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.RawDLParams;
|
||||
@ -39,7 +41,7 @@ import rawDeepLearningClassifier.segmenter.SegmenterDetectionGroup;
|
||||
* @author Jamie Macaulay
|
||||
*
|
||||
*/
|
||||
public class DLClassifyProcess extends PamInstantProcess {
|
||||
public class DLClassifyProcess extends PamProcess {
|
||||
|
||||
|
||||
/**
|
||||
@ -95,7 +97,7 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
private DLGroupDataBlock dlGroupDetectionDataBlock;
|
||||
|
||||
public DLClassifyProcess(DLControl dlControl, SegmenterDataBlock parentDataBlock) {
|
||||
super(dlControl);
|
||||
super(dlControl, null);
|
||||
|
||||
this.setParentDataBlock(parentDataBlock);
|
||||
|
||||
@ -689,7 +691,7 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
basicData.setSampleDuration((long) (groupDataBuffer.size()*dlControl.getDLParams().rawSampleSize));
|
||||
|
||||
// System.out.println("Model result: " + modelResult.size());
|
||||
DLDetection dlDetection = new DLDetection(basicData, rawdata);
|
||||
DLDetection dlDetection = new DLDetection(basicData, rawdata, getSampleRate());
|
||||
addDLAnnotation(dlDetection,modelResult);
|
||||
|
||||
//create the data unit
|
||||
|
@ -12,6 +12,7 @@ import PamguardMVC.RawDataHolder;
|
||||
import PamguardMVC.RawDataTransforms;
|
||||
import annotation.DataAnnotation;
|
||||
import bearinglocaliser.annotation.BearingAnnotation;
|
||||
import clipgenerator.ClipDataUnit;
|
||||
import clipgenerator.ClipSpectrogram;
|
||||
import rawDeepLearningClassifier.logging.DLAnnotation;
|
||||
|
||||
@ -23,7 +24,7 @@ import rawDeepLearningClassifier.logging.DLAnnotation;
|
||||
* @author Jamie Macaulay
|
||||
*
|
||||
*/
|
||||
public class DLDetection extends PamDataUnit implements PamDetection, RawDataHolder {
|
||||
public class DLDetection extends ClipDataUnit implements PamDetection, RawDataHolder {
|
||||
|
||||
/**
|
||||
* The abstract localisation
|
||||
@ -51,8 +52,8 @@ public class DLDetection extends PamDataUnit implements PamDetection, RawDataHol
|
||||
*/
|
||||
@Deprecated
|
||||
public DLDetection(long timeMilliseconds, int channelBitmap, long startSample, long durationSamples,
|
||||
ArrayList<PredictionResult> modelResults, double[][] waveData) {
|
||||
super(timeMilliseconds, channelBitmap, startSample, durationSamples);
|
||||
ArrayList<PredictionResult> modelResults, double[][] waveData, float sampleRate) {
|
||||
super(timeMilliseconds, timeMilliseconds, startSample, (int) durationSamples, channelBitmap, null, null, waveData, sampleRate);
|
||||
DLAnnotation annotation = new DLAnnotation(null, modelResults);
|
||||
this.addDataAnnotation(annotation);
|
||||
this.waveData=waveData;
|
||||
@ -68,9 +69,17 @@ public class DLDetection extends PamDataUnit implements PamDetection, RawDataHol
|
||||
* @param probdata - the probability data.
|
||||
* @param waveData - the wave data.
|
||||
*/
|
||||
public DLDetection(DataUnitBaseData baseData, double[][] waveData) {
|
||||
super(baseData);
|
||||
//System.out.println("Load DL deteciton: " + this.getChannelBitmap());
|
||||
public DLDetection(DataUnitBaseData baseData, double[][] waveData, float sampleRate) {
|
||||
// super(baseData);
|
||||
/*
|
||||
* public ClipDataUnit(long timeMilliseconds, long triggerMilliseconds,
|
||||
long startSample, int durationSamples, int channelMap, String fileName,
|
||||
String triggerName, double[][] rawData, float sourceSampleRate) {
|
||||
super(timeMilliseconds, channelMap, startSample, durationSamples);
|
||||
*/
|
||||
super(baseData.getTimeMilliseconds(), baseData.getTimeMilliseconds(), baseData.getStartSample(), waveData == null ? 0 : waveData[0].length, baseData.getChannelBitmap(), null,
|
||||
null, waveData, sampleRate);
|
||||
//System.out.println("Load DL detection: " + this.getChannelBitmap());
|
||||
this.waveData=waveData;
|
||||
rawDataTransforms= new RawDataTransforms(this);
|
||||
setAmplitude();//must set amplitude as this is not stored in binary files.
|
||||
@ -139,7 +148,7 @@ public class DLDetection extends PamDataUnit implements PamDetection, RawDataHol
|
||||
* @param channel
|
||||
* @return
|
||||
*/
|
||||
private double[] getWaveData(int channel) {
|
||||
public double[] getWaveData(int channel) {
|
||||
if (waveData!=null) {
|
||||
return this.getWaveData()[channel];
|
||||
}
|
||||
|
@ -5,6 +5,8 @@ import PamView.GroupedSourceParameters;
|
||||
import PamguardMVC.AcousticDataBlock;
|
||||
import PamguardMVC.dataSelector.DataSelectorCreator;
|
||||
import clickTrainDetector.dataselector.CTDataSelectCreator;
|
||||
import clipgenerator.ClipDataBlock;
|
||||
import clipgenerator.ClipDisplayDataBlock;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dataSelector.DLDataSelectCreator;
|
||||
import rawDeepLearningClassifier.tethys.DLSpeciesManager;
|
||||
@ -19,7 +21,7 @@ import tethys.species.DataBlockSpeciesManager;
|
||||
* @author Jamie Macaulay
|
||||
*
|
||||
*/
|
||||
public class DLDetectionDataBlock extends AcousticDataBlock<DLDetection> implements GroupedDataSource {
|
||||
public class DLDetectionDataBlock extends ClipDisplayDataBlock<DLDetection> implements GroupedDataSource {
|
||||
|
||||
/**
|
||||
* Reference to the deep learning classifier process.
|
||||
|
@ -198,7 +198,7 @@ public class OrcaSpotClassifier implements DLClassiferModel, PamSettings {
|
||||
modelResults.add(modelResult);
|
||||
dlControl.getDLClassifyProcess().getDLDetectionDatablock().addPamData(new DLDetection(groupedRawData.getTimeMilliseconds(),
|
||||
groupedRawData.getChannelBitmap(), groupedRawData.getStartSample(),
|
||||
groupedRawData.getSampleDuration(), modelResults, null));
|
||||
groupedRawData.getSampleDuration(), modelResults, null, dlControl.getDLClassifyProcess().getSampleRate()));
|
||||
}
|
||||
|
||||
groupedRawData= null; //just in case
|
||||
|
@ -134,7 +134,7 @@ public class DLDetectionBinarySource extends BinaryDataSource {
|
||||
if (baseData.getChannelBitmap()==0) {
|
||||
baseData.setChannelBitmap(1);
|
||||
}
|
||||
DLDetection newUnit = new DLDetection(baseData, rawData);
|
||||
DLDetection newUnit = new DLDetection(baseData, rawData, clipDataBlock.getSampleRate());
|
||||
|
||||
return newUnit;
|
||||
}
|
||||
|
85
src/rawDeepLearningClassifier/swing/DLClipDecorations.java
Normal file
85
src/rawDeepLearningClassifier/swing/DLClipDecorations.java
Normal file
@ -0,0 +1,85 @@
|
||||
package rawDeepLearningClassifier.swing;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import PamView.dialog.PamGridBagContraints;
|
||||
import clipgenerator.clipDisplay.ClipDisplayDecorations;
|
||||
import clipgenerator.clipDisplay.ClipDisplayUnit;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dlClassification.DLDetection;
|
||||
import rawDeepLearningClassifier.dlClassification.PredictionResult;
|
||||
|
||||
public class DLClipDecorations extends ClipDisplayDecorations {
|
||||
|
||||
private Color normalGrey;
|
||||
|
||||
private DLDetection dlDetection;
|
||||
|
||||
private JPanel dataPanel;
|
||||
|
||||
private PredictionResult result;
|
||||
|
||||
public DLClipDecorations(DLControl dlControl, ClipDisplayUnit clipDisplayUnit) {
|
||||
super(clipDisplayUnit);
|
||||
JPanel panel = new JPanel();
|
||||
normalGrey = panel.getBackground();
|
||||
this.dlDetection = (DLDetection) clipDisplayUnit.getClipDataUnit();
|
||||
|
||||
|
||||
result = dlControl.getDLClassifyProcess().getBestModelResult(dlDetection);
|
||||
if (result != null) {
|
||||
dataPanel = new JPanel(new BorderLayout());
|
||||
// GridBagConstraints c = new PamGridBagContraints();
|
||||
// String res = result.getResultString();
|
||||
double best = 0;
|
||||
int bestInd = -1;
|
||||
float[] prediction = result.getPrediction();
|
||||
if (prediction != null) {
|
||||
for (int i = 0; i < prediction.length; i++) {
|
||||
if (prediction[i] > best) {
|
||||
best = prediction[i];
|
||||
bestInd = i;
|
||||
}
|
||||
}
|
||||
String p = String.format("Class %d, score %3.2f", bestInd, best);
|
||||
dataPanel.add(BorderLayout.WEST, new JLabel(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClipDisplayUnit getClipDisplayUnit() {
|
||||
return super.getClipDisplayUnit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Color getClipBackground() {
|
||||
return Color.darkGray;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawOnClipAxis(Graphics g) {
|
||||
super.drawOnClipAxis(g);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawOnClipBorder(Graphics g) {
|
||||
super.drawOnClipBorder(g);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decorateDisplay() {
|
||||
super.decorateDisplay();
|
||||
if (dataPanel != null) {
|
||||
getClipDisplayUnit().add(dataPanel, BorderLayout.NORTH);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package rawDeepLearningClassifier.swing;
|
||||
|
||||
import clipgenerator.clipDisplay.ClipDisplayPanel;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import userDisplay.UserDisplayComponent;
|
||||
import userDisplay.UserDisplayControl;
|
||||
import userDisplay.UserDisplayProvider;
|
||||
|
||||
public class DLClipDisplayProvider implements UserDisplayProvider {
|
||||
|
||||
private DLControl dlControl;
|
||||
|
||||
public DLClipDisplayProvider(DLControl dlControl) {
|
||||
super();
|
||||
this.dlControl = dlControl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return dlControl.getUnitName() + " clips";
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserDisplayComponent getComponent(UserDisplayControl userDisplayControl, String uniqueDisplayName) {
|
||||
return new ClipDisplayPanel(dlControl);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class getComponentClass() {
|
||||
return ClipDisplayPanel.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxDisplays() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canCreate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeDisplay(UserDisplayComponent component) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user