From 05dcc2d4457c52bb438e92fc2008c4eebb2dd7d4 Mon Sep 17 00:00:00 2001 From: Jamie Mac Date: Sun, 6 Apr 2025 10:19:50 +0100 Subject: [PATCH] Deep learning and group localiser bug fixes (#205) * Getting dolphin deep learning click detector working * Thomas click deep learning unit test * Add deb installer to Maven build * Updates to deep learning click classifier Fixed bug for classifying clicks in viewer mode where the classification buffer was not being filled. Implemented Risso's classifier and checked it's working. Required changes to jpam Fixed bug in source data blocks in deep learning classifier Updated deb build * Getting dolphin deep learning click detector working * Thomas click deep learning unit test * Add deb installer to Maven build * Updates to deep learning click classifier Fixed bug for classifying clicks in viewer mode where the classification buffer was not being filled. Implemented Risso's classifier and checked it's working. Required changes to jpam Fixed bug in source data blocks in deep learning classifier Updated deb build * Fixes to group localiser Group localiser was failing with linear arrays - now sorted. Also minor bug fixes * Chnage version number and rename segmenter group data * Change version number to 16b * Squashed commit of the following: commit c3b58ab3e20ccb1b3f45e5755d38c0589d726709 Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> Date: Wed Apr 2 09:34:45 2025 +0100 Update D3Control.java don't actually enable the FX for d3 since it doesn't work commit 7665c1257fe08f99341b3785fcc700e62114e9a3 Merge: 56375bd4 2dda6791 Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> Date: Wed Apr 2 09:29:43 2025 +0100 Merge branch 'main' of https://github.com/PAMGuard/PAMGuard commit 56375bd4c0db85622ab6c65b12f2d7dd829994f4 Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> Date: Wed Apr 2 09:29:38 2025 +0100 null traps in TD display commit 2dda67918c2118da83589add4398aaac9af0718f Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> Date: Wed Apr 2 09:05:06 2025 +0100 Updates to Raven data plotting Also reading HARP header Also adding a second to data keep in Click Detector --------- Co-authored-by: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> --- .classpath | 2 +- .settings/org.eclipse.jdt.core.prefs | 6 +- build/deb/PAMGuardIcon2.png | Bin 0 -> 101089 bytes build/deb/control | 13 + build/deb/pamguard.desktop | 8 + build/deb/set-java-propery.sh | 8 + data.mat | Bin 0 -> 310 bytes dependency-reduced-pom.xml | 103 ++++-- pom.xml | 162 ++++++++- .../GroupLocResult.java | 4 - src/PamUtils/PamArrayUtils.java | 20 +- src/dataModelFX/DataModelConnectPane.java | 14 +- .../ConnectionNodeFactory.java | 3 +- .../data/generic/GenericDataPlotInfo.java | 2 + src/export/MLExport/MLDetectionsManager.java | 3 + src/group3dlocaliser/Group3DProcess.java | 2 +- .../hyperbolic/HyperbolicLocaliser.java | 5 +- .../algorithm/toadbase/TOADBaseAlgorithm.java | 5 +- .../toadmimplex/LinearGroupLocResult.java | 17 + .../toadmimplex/ToadMimplexLocaliser.java | 28 +- .../grouper/DetectionGrouper.java | 1 + .../localisation/LinearLocalisation.java | 13 +- .../offline/Group3DOfflineTask.java | 6 + .../dlClassification/DLClassifyProcess.java | 7 +- .../archiveModel/ArchiveModelWorker.java | 3 +- .../genericModel/DLModelWorker.java | 8 + .../genericModel/GenericModelWorker.java | 1 + .../layoutFX/DLSettingsPane.java | 5 +- .../dlTransfroms/PeakTrimTransformPane.java | 2 +- .../offline/DLOfflineTask.java | 16 +- .../segmenter/SegmenterProcess.java | 21 +- .../ClickDLTest.java | 329 +++++++++++++++--- 32 files changed, 678 insertions(+), 139 deletions(-) create mode 100644 build/deb/PAMGuardIcon2.png create mode 100644 build/deb/control create mode 100755 build/deb/pamguard.desktop create mode 100644 build/deb/set-java-propery.sh create mode 100644 data.mat create mode 100644 src/group3dlocaliser/algorithm/toadmimplex/LinearGroupLocResult.java diff --git a/.classpath b/.classpath index 6086187c..6b05441f 100644 --- a/.classpath +++ b/.classpath @@ -6,7 +6,7 @@ - + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 7b5e9ffa..3a3537cd 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -11,9 +11,9 @@ org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.compliance=21 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -23,4 +23,4 @@ org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.compiler.source=21 diff --git a/build/deb/PAMGuardIcon2.png b/build/deb/PAMGuardIcon2.png new file mode 100644 index 0000000000000000000000000000000000000000..ede35fda4d8b1c2e82cf67f410f8e191eecd432a GIT binary patch literal 101089 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
#4HyX=0&D1(pRHw(Vj7waUQg+7LI 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μFYfv1 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

BZRvY#Z?44|d7v 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 +Description: Process passive acoustic data for whales, dolphins and other species. +Icon: pamguard_icon.png +Depends: openjdk-21-jre +postinst script: + #!/bin/bash + # Set JVM options for the application + export JAVA_OPTS="-Xmx4g -Xms512m -Dsun.java2d.uiScale=2 -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true" diff --git a/build/deb/pamguard.desktop b/build/deb/pamguard.desktop new file mode 100755 index 00000000..74832481 --- /dev/null +++ b/build/deb/pamguard.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=PAMGuard +Comment=Application for passive acoustic monitoring v1 +Exec=java -jar /usr/share/pamguard/Pamguard -c +Icon=/usr/share/pamguard/PAMGuardIcon2.png +Terminal=true +Type=Application +Categories=Application; diff --git a/build/deb/set-java-propery.sh b/build/deb/set-java-propery.sh new file mode 100644 index 00000000..1fc57653 --- /dev/null +++ b/build/deb/set-java-propery.sh @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=PAMGuard +Comment=Application for passive acoustic monitoring +Exec=java -jar /usr/share/pamguard/Pamguard-2.02.14a.jar -c +Icon=/path/to/your/icon.png +Terminal=true +Type=Application +Categories=Application; diff --git a/data.mat b/data.mat new file mode 100644 index 0000000000000000000000000000000000000000..08763ca72ee3856476be2824c19b012b139ebca8 GIT binary patch literal 310 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQt-*lE3ME`a4t$sEJ;mK$j`G< za4X7G@J%dIFfvpyG`2D{v@$kV2zL!pFfuSQWgrbOdiwGMb*uy83dW~F-du+aL~6Q3 z?~2$o$~hKXj;)?7aGC4izl=W%)QiLWpZOT9D|u?fe0a~E>5b-!D?3s;Psr?ISgz1G z&E9`OqxO|$+n%lPYtH-r?gDSGbH7K5+MLht_|{m*YSrrHE}ygUukSCf%jwcQwoyAu zbKg(h^~yWLt4oXduwBTb+jejC9pC+R^ZPHRSof3rjI&(Ti~lWYvgV&69{>NEZ+8CT T{^%vYB(A%z`5E6<)c79&&&zJR literal 0 HcmV?d00001 diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index c616628a..41b66cde 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -26,6 +26,71 @@ + + linux-profile + + + + org.vafer + jdeb + 1.11 + + + package + + jdeb + + + ${basedir}/build/deb + + + ${project.build.directory}/${project.build.finalName}.jar + file + + perm + /usr/share/pamguard + + + + ${basedir}/liblinux + directory + *.txt + *.so + + perm + /usr/share/pamguard/liblinux + + + + ${basedir}/build/deb/PAMGuardIcon2.png + file + + perm + /usr/share/pamguard + + + + ${basedir}/build/deb/pamguard.desktop + file + + perm + /usr/share/applications + + + + link + /usr/share/pamguard/Pamguard + /usr/share/pamguard/${project.build.finalName}.jar + true + + + + + + + + + macos-profile @@ -145,36 +210,11 @@ maven-compiler-plugin 3.12.1 - - - default-compile - compile - - compile - - - 21 - jdt - - - - default-testCompile - test-compile - - testCompile - - - 21 - jdt - - - org.eclipse.tycho tycho-compiler-jdt 1.5.1 - compile @@ -207,17 +247,6 @@ - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - test/resources/** - - - @@ -254,7 +283,7 @@ copy-dependencies - C:\Users\dg50\source\repos\PAMGuardPAMGuard\target/tempDependencies + ${project.build.directory}/tempDependencies false false true diff --git a/pom.xml b/pom.xml index 1e597d64..d6642867 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,106 @@ earlier. Most OS specific profiles are for generating executables and code signing. Note use help:active-profiles to see which profiles are active --> - + + + + + linux-profile + + + linux + + + + + + + jdeb + org.vafer + 1.11 + + + package + + jdeb + + + ${basedir}/build/deb + + + + + ${project.build.directory}/${project.build.finalName}.jar + file + + perm + /usr/share/pamguard + + + + ${basedir}/liblinux + directory + *.txt + *.so + + perm + + /usr/share/pamguard/liblinux + + + + + ${basedir}/build/deb/PAMGuardIcon2.png + file + + perm + /usr/share/pamguard + + + + + + ${basedir}/build/deb/pamguard.desktop + file + + perm + /usr/share/applications + + + + + link + + /usr/share/pamguard/Pamguard + + /usr/share/pamguard/${project.build.finalName}.jar + true + + + + + + + + + + + - - + + - @@ -358,7 +456,52 @@ - + + + + + + @@ -442,7 +585,7 @@ io.github.macster110 jpamutils 0.0.59f - + + io.github.furstenheim copy_down @@ -997,7 +1140,7 @@ 2.1.1 - org.pamguard - x3 + X3 2.2.8 @@ -1154,7 +1297,6 @@ - org.junit.jupiter diff --git a/src/Localiser/detectionGroupLocaliser/GroupLocResult.java b/src/Localiser/detectionGroupLocaliser/GroupLocResult.java index 4b361768..e45fe2bd 100644 --- a/src/Localiser/detectionGroupLocaliser/GroupLocResult.java +++ b/src/Localiser/detectionGroupLocaliser/GroupLocResult.java @@ -106,10 +106,6 @@ public class GroupLocResult implements Comparable, LocalisationC this.chi2 = chi2; } - public GroupLocResult(double[] result, double[] resultErrors, int side, double chi2) { - // TODO Auto-generated constructor stub - } - /** * @return the latLong */ diff --git a/src/PamUtils/PamArrayUtils.java b/src/PamUtils/PamArrayUtils.java index 89bc52a2..cb371645 100644 --- a/src/PamUtils/PamArrayUtils.java +++ b/src/PamUtils/PamArrayUtils.java @@ -1381,7 +1381,25 @@ public class PamArrayUtils { } - + /** + * Convert a matrix to a + * @param matrix - the MAT file matrix + * @return double[][] array of results + */ + public static float[][] matrix2arrayF(Matrix matrix) { + if (matrix==null) return null; + + float[][] arrayOut = new float[matrix.getNumRows()][]; + float[] arrayRow; + for (int i=0; i dataUnits) { //first need to figure out how many data units there are. for (int j=0; j{ @Override public boolean processDataUnit(PamDataUnit dataUnit) { + try { group3DProcess.newData(null, dataUnit); + } + catch (Exception e) { + e.printStackTrace(); + } + //System.out.println("New data unit added: " +dataUnit); return false; } diff --git a/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java b/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java index a65666a1..c6d1f4e9 100644 --- a/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java +++ b/src/rawDeepLearningClassifier/dlClassification/DLClassifyProcess.java @@ -210,7 +210,7 @@ public class DLClassifyProcess extends PamProcess { */ @Override public void newData(PamObservable obs, PamDataUnit pamRawData) { - //System.out.println("NEW SEGMENTER DATA: " + PamCalendar.formatDateTime2(pamRawData.getTimeMilliseconds(), "dd MMM yyyy HH:mm:ss.SSS", false) + " " + pamRawData.getUID() + " " + pamRawData.getChannelBitmap() + " " + pamRawData); + //System.out.println("NEW SEGMENTER DATA: " + PamCalendar.formatDateTime2(pamRawData.getTimeMilliseconds(), "dd MMM yyyy HH:mm:ss.SSS", false) + " " + pamRawData.getUID() + " " + pamRawData.getChannelBitmap() + " " + pamRawData); //if grouped data then just run the classifier on the group - do not try and create a buffer. if (pamRawData instanceof SegmenterDetectionGroup) { @@ -618,10 +618,11 @@ public class DLClassifyProcess extends PamProcess { */ public void forceRunClassifier(PamDataUnit dataUnit) { -// System.out.println("CLASSIFICATION BUFFER: " + classificationBuffer.size()); + //System.out.println("CLASSIFICATION BUFFER: " + classificationBuffer.size()); if (this.classificationBuffer.size()>0) { if (classificationBuffer.get(0) instanceof GroupedRawData) { + //System.out.println("Run raw model on: " + classificationBuffer.get(0) + " " + classificationBuffer.get(1)); runRawModel(); //raw data or raw data units } if (classificationBuffer.get(0) instanceof SegmenterDetectionGroup) { @@ -689,10 +690,12 @@ public class DLClassifyProcess extends PamProcess { DataUnitBaseData basicData = groupDataBuffer.get(0).getBasicData().clone(); basicData.setMillisecondDuration(1000.*rawdata[0].length/this.sampleRate); basicData.setSampleDuration((long) (groupDataBuffer.size()*dlControl.getDLParams().rawSampleSize)); + // System.out.println("Model result: " + modelResult.size()); DLDetection dlDetection = new DLDetection(basicData, rawdata, getSampleRate()); addDLAnnotation(dlDetection,modelResult); + dlDetection.setFrequency(new double[] {0, this.getSampleRate()/2}); //create the data unit return dlDetection; diff --git a/src/rawDeepLearningClassifier/dlClassification/archiveModel/ArchiveModelWorker.java b/src/rawDeepLearningClassifier/dlClassification/archiveModel/ArchiveModelWorker.java index bf24655f..81619f8c 100644 --- a/src/rawDeepLearningClassifier/dlClassification/archiveModel/ArchiveModelWorker.java +++ b/src/rawDeepLearningClassifier/dlClassification/archiveModel/ArchiveModelWorker.java @@ -139,9 +139,8 @@ public class ArchiveModelWorker extends GenericModelWorker { System.out.println(modelParams.dlTransforms); ArrayList transforms = DLTransformsFactory.makeDLTransforms(modelParams.dlTransforms); -// ///HACK here for now to fix an issue with dB and Ketos transforms having zero length somehow... // for (int i=0; i { DLTransform transform = modelTransforms.get(0); for (int i =0; i { } setModelTransforms(genericParams.dlTransfroms); + //is this a waveform or a spectrogram model? setWaveFreqModel(genericParams); diff --git a/src/rawDeepLearningClassifier/layoutFX/DLSettingsPane.java b/src/rawDeepLearningClassifier/layoutFX/DLSettingsPane.java index 4bcc7618..57d03d98 100644 --- a/src/rawDeepLearningClassifier/layoutFX/DLSettingsPane.java +++ b/src/rawDeepLearningClassifier/layoutFX/DLSettingsPane.java @@ -583,10 +583,11 @@ public class DLSettingsPane extends SettingsPane{ @Override public void setParams(RawDLParams currParams) { - - sourcePane.setParams(currParams.groupedSourceParams); + + sourcePane.sourceChanged(); sourcePane.setSourceList(); + sourcePane.setParams(currParams.groupedSourceParams); dlControl.createDataSelector(sourcePane.getSource()); diff --git a/src/rawDeepLearningClassifier/layoutFX/dlTransfroms/PeakTrimTransformPane.java b/src/rawDeepLearningClassifier/layoutFX/dlTransfroms/PeakTrimTransformPane.java index 5a7bdcef..e7cf805c 100644 --- a/src/rawDeepLearningClassifier/layoutFX/dlTransfroms/PeakTrimTransformPane.java +++ b/src/rawDeepLearningClassifier/layoutFX/dlTransfroms/PeakTrimTransformPane.java @@ -59,7 +59,7 @@ public class PeakTrimTransformPane extends DLTransformPane { }); //spinner for changing filter order. - targetLenSpinner = new Spinner(1,50,4,1); + targetLenSpinner = new Spinner(1,Integer.MAX_VALUE,4,1); targetLenSpinner.valueProperty().addListener((obsVal, oldVal, newVal)->{ this.notifySettingsListeners(); }); diff --git a/src/rawDeepLearningClassifier/offline/DLOfflineTask.java b/src/rawDeepLearningClassifier/offline/DLOfflineTask.java index 4d96db4e..61265df6 100644 --- a/src/rawDeepLearningClassifier/offline/DLOfflineTask.java +++ b/src/rawDeepLearningClassifier/offline/DLOfflineTask.java @@ -1,5 +1,7 @@ package rawDeepLearningClassifier.offline; +import java.util.ListIterator; + import PamController.PamController; import PamguardMVC.PamDataUnit; import PamguardMVC.PamObservable; @@ -8,6 +10,7 @@ import dataMap.OfflineDataMapPoint; import matchedTemplateClassifer.MTClassifierControl; import offlineProcessing.OfflineTask; import rawDeepLearningClassifier.DLControl; +import rawDeepLearningClassifier.segmenter.GroupedRawData; import rawDeepLearningClassifier.segmenter.SegmenterDetectionGroup; import rawDeepLearningClassifier.segmenter.SegmenterProcess; @@ -48,7 +51,7 @@ public class DLOfflineTask extends OfflineTask>{ @Override public boolean processDataUnit(PamDataUnit dataUnit) { // System.out.println("--------------"); - // System.out.println("Offline task start: " + dataUnit.getUpdateCount() + " UID " + dataUnit.getUID()); + //System.out.println("Offline task start: " + dataUnit.getUpdateCount() + " UID " + dataUnit.getUID() + " " + dlControl.getDLParams().enableSegmentation); boolean saveBinary = false; try { @@ -79,9 +82,16 @@ public class DLOfflineTask extends OfflineTask>{ //detection has been added we force the classifier to run on all the segments generated from //the raw data. - //Process a data unit + //Process a data unit within the segmenter dlControl.getSegmenter().newData(dataUnit); - + + //System.out.println("Segments: " + dlControl.getSegmenter().getSegmenterDataBlock().getUnitsCount()); + //need to add the segmenter data units into the classification buffer + ListIterator iterator = dlControl.getSegmenter().getSegmenterDataBlock().getListIterator(0); + while (iterator.hasNext()) { + dlControl.getDLClassifyProcess().newData(dlControl.getSegmenter().getSegmenteGroupDataBlock(), iterator.next()); + } + //force click data save dlControl.getDLClassifyProcess().forceRunClassifier(dataUnit); diff --git a/src/rawDeepLearningClassifier/segmenter/SegmenterProcess.java b/src/rawDeepLearningClassifier/segmenter/SegmenterProcess.java index 9f481cc1..87899d6b 100644 --- a/src/rawDeepLearningClassifier/segmenter/SegmenterProcess.java +++ b/src/rawDeepLearningClassifier/segmenter/SegmenterProcess.java @@ -96,7 +96,7 @@ public class SegmenterProcess extends PamProcess { segmenterDataBlock = new SegmenterDataBlock("Segmented Raw Data", this, dlControl.getDLParams().groupedSourceParams.getChanOrSeqBitmap()); - segmenterGroupDataBlock = new SegmenterGroupDataBlock("Segmented data units", this, + segmenterGroupDataBlock = new SegmenterGroupDataBlock("Segmented Group Data", this, dlControl.getDLParams().groupedSourceParams.getChanOrSeqBitmap()); addOutputDataBlock(segmenterDataBlock); @@ -241,7 +241,7 @@ public class SegmenterProcess extends PamProcess { newRawDataUnit(pamRawData); } else if (pamRawData instanceof ClickDetection) { - newClickData( pamRawData); + newClickData(pamRawData); } else if (pamRawData instanceof ClipDataUnit) { newClipData(pamRawData); @@ -491,7 +491,7 @@ public class SegmenterProcess extends PamProcess { public void newClickData(PamDataUnit pamRawData) { //the raw data units should appear in sequential channel order - // System.out.println("New raw data in: chan: " + PamUtils.getSingleChannel(pamRawData.getChannelBitmap()) + " Size: " + pamRawData.getSampleDuration()); + //System.out.println("New raw data in: chan: " + PamUtils.getSingleChannel(pamRawData.getChannelBitmap()) + " Size: " + pamRawData.getSampleDuration()); ClickDetection clickDataUnit = (ClickDetection) pamRawData; @@ -542,6 +542,12 @@ public class SegmenterProcess extends PamProcess { //segment the data unit into different chunks. newRawData(pamDataUnit, rawDataChunk[i], chans[i], dlControl.getDLParams().rawSampleSize, dlControl.getDLParams().sampleHop, true); + //the way that the newRawdata works is it waits for the next chunk and copies all relevant bits + //from previous chunks into segments. This is fine for continuous data but means that chunks of data + //don't get their last hop... + + //got to save the last chunk of raw data -even if the segment has not been filled. + saveRawGroupData(true); } else { // //send the whole data chunk to the deep learning unit @@ -551,13 +557,8 @@ public class SegmenterProcess extends PamProcess { // pamDataUnit.getStartSample(), rawDataChunk[i].length, rawDataChunk[i].length); } - //the way that the newRawdata works is it waits for the next chunk and copies all relevant bits - //from previous chunks into segments. This is fine for continuous data but means that chunks of data - //don't get their last hop... } - //got to save the last chunk of raw data -even if the segment has not been filled. - saveRawGroupData(true); } @@ -600,7 +601,7 @@ public class SegmenterProcess extends PamProcess { long timeMilliseconds = unit.getTimeMilliseconds(); long startSampleTime = unit.getStartSample(); - //System.out.println("Segmenter: RawDataIn: chan: 1 " + getSourceParams().countChannelGroups() + currentRawChunks); + //System.out.println("Segmenter: RawDataIn: chan: 1 " + getSourceParams().countChannelGroups() + currentRawChunks + " rawSampleSize " + rawSampleSize + " rawSampleHop: " +rawSampleHop); if (currentRawChunks==null) { System.err.println("Current raw chunk arrays are null"); @@ -753,6 +754,7 @@ public class SegmenterProcess extends PamProcess { * @param forceSave - true to also save the remaining unfilled segment. */ private void saveRawGroupData(boolean forceSave) { + //System.out.println("Segmenter process: saveRawGroupData(boolean forceSave)"); for (int i=0; i groupedData = new ArrayList(); + groupedData.add(clickData); + + System.out.println("Waveform input: " + groupedData.get(0).getRawData().length + " " + groupedData.get(0).getRawData()[0].length); + + ArrayList genericPrediction = genericModelWorker.runModel(groupedData,96000, 0); + + float[] outputPAMGuard = genericPrediction.get(0).getPrediction(); + + System.out.println("Model output PAMGuard: " + outputPAMGuard[0]); + assertEquals(outputPAMGuard[0], 0.99, 0.05); + + } + catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + assertTrue(false); //make sure the unit test fails + return; + } + } + + /** + * Test just one click + * @throws + */ + @Test + public void aclickDLTest() { + + System.out.println("*****CLickDLTest: Single click test*****"); + //relative paths to the resource folders. System.out.println("*****Click classification Deep Learning C*****"); +// //relative paths to the resource folders. +// String relModelPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/click_classifier_Thomas/model_v2/model_pb/saved_model.pb"; +// String clicksPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/click_classifier_Thomas/model_v2/example_2000021.mat"; + //relative paths to the resource folders. - String relModelPath = "./src/test/resources/rawDeepLearningClassifier/Generic/risso_click/uniform_model/saved_model.pb"; - String clicksPath = "./src/test/resources/rawDeepLearningClassifier/Generic/risso_click/clicks.mat"; + String relModelPath = "/home/jamiemac/Dropbox/PAMGuard_dev/Deep_Learning/click_classifier_Thomas/model_v2/model_pb/saved_model.pb"; + String clicksPath = "/home/jamiemac/Dropbox/PAMGuard_dev/Deep_Learning/click_classifier_Thomas/model_v2/example_2000021.mat"; + //load the click up + +// String matout = "/home/jamiemac/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/generic_classifier/example_2000021_transforms.mat"; + String matout=null; + // load the click data up. + Path clkPath = Paths.get(clicksPath); + PredGroupedRawData clickData = null; + + Struct matclkStruct = Mat5.newStruct(); + try { + Mat5File mfr = Mat5.readFromFile(clkPath.toAbsolutePath().normalize().toString()); + + // //get array of a name "my_array" from file + Struct mlArrayRetrived = mfr.getStruct( "newStruct" ); + + + Matrix clickWavM = mlArrayRetrived.get("wave", 0); + Matrix modelInputM= mlArrayRetrived.get("wave_pad", 0); + + double[][] clickWaveform= PamArrayUtils.matrix2array(clickWavM); + clickWaveform=PamArrayUtils.transposeMatrix(clickWaveform); + + //get the raw model input so we can test the model directly. + double[][] pythonModelInput= PamArrayUtils.matrix2array(modelInputM); + pythonModelInput = PamArrayUtils.transposeMatrix(pythonModelInput); + float[] pythonModelInputF = PamArrayUtils.double2Float(pythonModelInput[0]); + + Matrix clickUID= mlArrayRetrived.get("UID", 0); + Matrix pred= mlArrayRetrived.get("pred", 0); + + //create a click object whihc we can pass through transforms etc. + clickData = new PredGroupedRawData(0L, 1, 0, clickWaveform[0].length, clickWaveform[0].length); + clickData.setUID(clickUID.getLong(0)); + clickData.setRawData(clickWaveform); + clickData.setPrediction(new double[] {pred.getDouble(0)}); + + + // load the model up + Path path = Paths.get(relModelPath); + + GenericModelWorker genericModelWorker = new GenericModelWorker(); + + GenericModelParams genericModelParams = new GenericModelParams(); + genericModelParams.modelPath = path.toAbsolutePath().normalize().toString(); + + + //create the transforms. + ArrayList dlTransformParamsArr = new ArrayList(); + + //waveform transforms. + dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.DECIMATE_SCIPY, 96000.)); + dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.NORMALISE_WAV, 0., 1, AudioData.ZSCORE)); //needs to be here + dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.PEAK_TRIM, 64, 1)); + + genericModelParams.dlTransfromParams = dlTransformParamsArr; + genericModelParams.dlTransfroms = DLTransformsFactory.makeDLTransforms((ArrayList)genericModelParams.dlTransfromParams); + + //create the clicks. + path = Paths.get(clicksPath); + + //prep the model + genericModelWorker.prepModel(genericModelParams, null); + + ArrayList groupedData = new ArrayList(); + groupedData.add(clickData); + + System.out.println("Waveform input: " + groupedData.get(0).getRawData().length + " " + groupedData.get(0).getRawData()[0].length); + + ArrayList genericPrediction = genericModelWorker.runModel(groupedData,96000, 0); + +// System.out.println("PAMGuard input len: " + pythonModelInputF.length); + + float[] outputPAMGuard = genericPrediction.get(0).getPrediction(); + + System.out.println("Model output PAMGuard: " + outputPAMGuard[0]); + + //run the transforms so we can take a look at the inpout + ((WaveTransform) genericModelParams.dlTransfroms.get(0)).setWaveData(new AudioData(groupedData.get(0).getRawData()[0], 248000));; + //create the transformed wave + DLTransform transform = genericModelParams.dlTransfroms.get(0); + double[] audioOut = null; + for (int i=0; i dlTransformParamsArr = new ArrayList(); //waveform transforms. - dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.DECIMATE_SCIPY, 248000.)); - dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.PEAK_TRIM, 128, 1)); + dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.DECIMATE_SCIPY, 96000.)); dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.NORMALISE_WAV, 0., 1, AudioData.ZSCORE)); - + dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.PEAK_TRIM, 64, 1)); + genericModelParams.dlTransfromParams = dlTransformParamsArr; genericModelParams.dlTransfroms = DLTransformsFactory.makeDLTransforms((ArrayList)genericModelParams.dlTransfromParams); - + //create the clicks. path = Paths.get(clicksPath); - ArrayList clicks = importClicks(path.toAbsolutePath().normalize().toString(), SAMPLE_RATE); - + ArrayList clicks = importClicks(path.toAbsolutePath().normalize().toString(), SAMPLE_RATE); + //prep the model genericModelWorker.prepModel(genericModelParams, null); - - System.out.println("Model has loaded"); - ArrayList groupedData = new ArrayList(); - - for (int i=0; i<1; i++) { - + System.out.println("Model has loaded: n clicks " + clicks.size()); + + float count = 0; + long timeStart = System.currentTimeMillis(); + for (int i=0; i groupedData = new ArrayList(); groupedData.add(clicks.get(i)); //TODO for loop - - //System.out.println("Waveform input: " + groupedData.get(i).getRawData().length + " " + groupedData.get(i).getRawData()[0].length); - - ArrayList genericPrediction = genericModelWorker.runModel(groupedData,SAMPLE_RATE, 0); - - float[] output = genericPrediction.get(i).getPrediction(); - - System.out.println(String.format("Click %d Predicted output: %.2f true output: %.2f passed: %b", clicks.get(i).getUID(), - output[0], prediction, output[0]>prediction*0.9 && output[0] genericPrediction = genericModelWorker.runModel(groupedData,SAMPLE_RATE, 0); + + float[] output = genericPrediction.get(0).getPrediction(); + + System.out.println(String.format("Click %d Predicted output: %.4f true output: %.4f passed: %b delta %.2f", clicks.get(i).getUID(), + output[0], prediction, output[0]>prediction*0.9 && output[0]prediction*0.9 && output[0] importClicks(String filePath, float sR) { try { - Mat5File mfr = Mat5.readFromFile(filePath); + Mat5File mfr = Mat5.readFromFile(filePath); // //get array of a name "my_array" from file - Struct mlArrayRetrived = mfr.getStruct( "clickpreds" ); + Struct mlArrayRetrived = mfr.getStruct( "binarydata" ); int numClicks= mlArrayRetrived.getNumCols(); ArrayList clicks = new ArrayList(numClicks); @@ -106,12 +337,12 @@ public class ClickDLTest { PredGroupedRawData clickData; for (int i=0; i