Clip Display for DL

Added a clip display for the deep learning classifier. Could do with more decoration.
This commit is contained in:
Douglas Gillespie 2025-03-10 13:47:21 +00:00
parent 0941b3ab7f
commit 545e2b010a
9 changed files with 210 additions and 15 deletions

View File

@ -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();

View File

@ -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
}

View File

@ -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

View File

@ -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];
}

View File

@ -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.

View File

@ -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

View File

@ -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;
}

View 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);
}
}
}

View File

@ -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
}
}