mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2025-05-08 07:37:22 +00:00
Merge branch 'macster110-main'
This commit is contained in:
commit
30dfd34b8a
.settings
pom.xmlsrc
Map/gridbaselayer
PamController
PamUtils
PamView
PamguardMVC
Resources/css
binaryFileStorage
clickDetector
clickTrainDetector/logging
dataPlotsFX
clickPlotFX
data/generic
overlaymark/popUpMenu
detectionPlotFX
export
MLExport
RExport
swing
generalDatabase/lookupTables
ltsa
pamViewFX
rawDeepLearningClassifier
DLControl.javaDLStatus.javaRawDLParams.java
dataPlotFX
DLGroupDetectionInfoFX.javaDLGroupSymbolManager.javaDLGroupSymbolModifier.javaDLSymbolOptionPane.javaDLSymbolOptionPanel.java
defaultModels
dlClassification
DLClassiferModel.javaDLClassifyProcess.javaDLGroupDataBlock.javaDLGroupDetection.javaStandardClassifierModel.java
animalSpot
archiveModel
delphinID
Clicks2Spectrum.javaDelphinIDClassifier.javaDelphinIDClickTest.javaDelphinIDPane.javaDelphinIDParams.javaDelphinIDTransform.javaDelphinIDUtils.javaDelphinIDWhistleTest.javaDelphinIDWorker.java
dummyClassifier
genericModel
ketos
orcaSpot
layoutFX
logging
DLAnnotationSQL.javaDLGroupDetectionLogging.javaDLGroupSubLogging.javaDLLogging.javaDLResultLogging.javaModelResultBinaryFactory.java
offline
segmenter
test
rawDeepLearningClassifier
resources/rawDeepLearningClassifier
DelphinID
Dde_415_s10_SI20120620_171333_d042_27.matDde_415_s10_SI20120620_171333_d042_50.matGgr242_s10_PAM_20200918_123234_366_1.matSI20120620_171333_whistle_contours.matclickClassifier_Jan25.zipclick_preds_PAM_20200918_123234_366.csvclick_preds_PAM_20200918_123234_366.matclicks_20200918_123234_classified.matwhistle_contours_20200918_123234.matwhistle_preds_PAM_20200918_123234_366.matwhistleclassifier.zip
Generic/multi-species-Google
@ -1,6 +1,7 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding//src/help/utilities/tethys/docs/connection.html=UTF-8
|
||||
encoding//src/rawDeepLearningClassifer/segmenter/SegmenterProcess.java=UTF-8
|
||||
encoding//src/test=UTF-8
|
||||
encoding//src/test/resources=UTF-8
|
||||
encoding/<project>=UTF-8
|
||||
encoding/src=UTF-8
|
||||
|
@ -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
|
||||
|
80
pom.xml
80
pom.xml
@ -14,7 +14,6 @@
|
||||
</organization>
|
||||
|
||||
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<javafx.version>21</javafx.version>
|
||||
@ -54,7 +53,7 @@
|
||||
<profiles>
|
||||
|
||||
<!-- The MacOS profile creates a DMG package for installing PAMGuard on MacOS-->
|
||||
<!--Note: Ther eis a Maven bug when using profiles when the plugin order is messed up and seemingly quite random.
|
||||
<!--Note: There is a Maven bug when using profiles when the plugin order is messed up and seemingly quite random.
|
||||
In PAMGuard it essential that the shade plugin is called before the macos plugin and so the phase of the
|
||||
macos bundling has been moved to deploy. To run the bundler we therefore need to put both the macossappbunlder
|
||||
and exec shell script into the deploy phase so they are never really called. We then explicatelyl call them after
|
||||
@ -102,11 +101,11 @@
|
||||
</dmg>
|
||||
<!--Very important or deep learning does not work-->
|
||||
<app>
|
||||
<includeDependencies>false</includeDependencies>
|
||||
<includeDependencies>true</includeDependencies>
|
||||
</app>
|
||||
<jdk>
|
||||
<include>true</include>
|
||||
<!--<location>/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk</location>-->
|
||||
<location>/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk</location>
|
||||
</jdk>
|
||||
<codesign>
|
||||
<enable>false</enable>
|
||||
@ -314,57 +313,6 @@
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
|
||||
<!-- Plugin which creates a .dmg file for MacOS. -->
|
||||
<plugin>
|
||||
<groupId>de.perdian.maven.plugins</groupId>
|
||||
<artifactId>macosappbundler-maven-plugin</artifactId>
|
||||
<version>1.21.1</version>
|
||||
<configuration>
|
||||
<plist>
|
||||
<JVMMainClassName>pamguard.Pamguard</JVMMainClassName>
|
||||
<CFBundleIconFile>
|
||||
src/Resources/PamguardIcon2.icns</CFBundleIconFile>
|
||||
<CFBundleDisplayName>PAMGuard</CFBundleDisplayName>
|
||||
<CFBundleDevelopmentRegion>English</CFBundleDevelopmentRegion>
|
||||
<CFBundleURLTypes>
|
||||
<string>msa</string>
|
||||
</CFBundleURLTypes>
|
||||
<JVMVersion>21+</JVMVersion>
|
||||
<JVMArguments>
|
||||
<string>-c</string>
|
||||
</JVMArguments>
|
||||
<NSAppSleepDisabled>true</NSAppSleepDisabled>
|
||||
</plist>
|
||||
<dmg>
|
||||
<generate>true</generate>
|
||||
<additionalResources>
|
||||
<additionalResource>
|
||||
<directory>
|
||||
${project.basedir}/target/bundle/</directory>
|
||||
</additionalResource>
|
||||
</additionalResources>
|
||||
<dmgFileName>${project.build.finalName}</dmgFileName>
|
||||
<appendVersion>false</appendVersion>
|
||||
</dmg>
|
||||
<jdk>
|
||||
<include>false</include>
|
||||
<location>/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk</location>
|
||||
</jdk>
|
||||
<codesign>
|
||||
<enable>false</enable>
|
||||
<identity>3rd Party Mac Developer Application: Jamie Macaulay (7365S9DZ34)</identity>
|
||||
</codesign>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>deploy</phase>
|
||||
<goals>
|
||||
<goal>bundle</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
|
||||
@ -494,13 +442,21 @@
|
||||
<groupId>io.github.macster110</groupId>
|
||||
<artifactId>jpamutils</artifactId>
|
||||
<version>0.0.59e</version>
|
||||
<!-- com.github.psambit9791:wavfile:jar:0.1 pulls in various junit dependencies which breaks our own testing -->
|
||||
<!--<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-surefire-provider</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>-->
|
||||
|
||||
</dependency>
|
||||
|
||||
<!--jpam project - Deep learning java library -->
|
||||
<dependency>
|
||||
<groupId>io.github.macster110</groupId>
|
||||
<artifactId>jdl4pam</artifactId>
|
||||
<version>0.0.99e</version>
|
||||
<version>0.0.99f</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/gov.nist.math/jama -->
|
||||
@ -810,11 +766,11 @@
|
||||
<version>2.12.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
||||
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.18</version>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<version>9.1.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
|
||||
@ -825,7 +781,7 @@
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
<version>3.17.0</version>
|
||||
<version>4.29.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://docs.unidata.ucar.edu/netcdf-java/5.2/userguide/using_netcdf_java_artifacts.html -->
|
||||
@ -833,7 +789,7 @@
|
||||
<dependency>
|
||||
<groupId>edu.ucar</groupId>
|
||||
<artifactId>netcdfAll</artifactId>
|
||||
<version>4.6.14</version>
|
||||
<version>5.4.1</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
|
@ -7,11 +7,11 @@ import java.io.IOException;
|
||||
import PamView.ColourArray;
|
||||
import PamView.PamColors;
|
||||
import PamView.PamColors.PamColor;
|
||||
import ucar.netcdf.Dimension;
|
||||
import ucar.netcdf.DimensionSet;
|
||||
import ucar.netcdf.NetcdfFile;
|
||||
import ucar.netcdf.Variable;
|
||||
import ucar.netcdf.VariableIterator;
|
||||
import ucar.ma2.Array;
|
||||
import ucar.ma2.Index;
|
||||
import ucar.nc2.Dimension;
|
||||
import ucar.nc2.NetcdfFile;
|
||||
import ucar.nc2.Variable;
|
||||
|
||||
public class GebcoNETCDF {
|
||||
|
||||
@ -37,18 +37,19 @@ public class GebcoNETCDF {
|
||||
return;
|
||||
}
|
||||
|
||||
DimensionSet dim = ncf.getDimensions();
|
||||
Dimension latDim = dim.get(latName);
|
||||
|
||||
ncf.findDimension(eleName);
|
||||
Dimension latDim = ncf.findDimension(latName);
|
||||
nLat = latDim.getLength();
|
||||
Dimension lonDim = dim.get(lonName);
|
||||
Dimension lonDim = ncf.findDimension(lonName);
|
||||
nLon = lonDim.getLength();
|
||||
|
||||
latRange = getRange(latName);
|
||||
lonRange = getRange(lonName);
|
||||
elevationRange = extractElevationRange();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public MapRasterImage getImage(double[] latRange, double[] lonRange, boolean forceRecreate) {
|
||||
if (mapImage == null || forceRecreate) {
|
||||
int[] latRangeBins = {0, nLat};
|
||||
@ -65,46 +66,57 @@ public class GebcoNETCDF {
|
||||
|
||||
private double[] getRange(String varName) {
|
||||
Variable var = findVariable(varName);
|
||||
Dimension dim = netcdfFile.getDimensions().get(varName);
|
||||
Dimension dim = netcdfFile.findDimension(varName);
|
||||
int n = dim.getLength();
|
||||
if (var == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
double[] range = new double[2];
|
||||
|
||||
int[] pos = new int[2];
|
||||
try {
|
||||
range[0] = var.getDouble(pos);
|
||||
Array varA = var.read();
|
||||
Index index = varA.getIndex();
|
||||
|
||||
range[0] = varA.getDouble(index.set(pos[0], pos[1]));
|
||||
pos[0] = n-1;
|
||||
range[1] = var.getDouble(pos);
|
||||
range[1] = varA.getDouble(index.set(pos[0], pos[1]));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return range;
|
||||
}
|
||||
|
||||
|
||||
private double[] extractElevationRange() {
|
||||
Variable ele = findVariable(eleName);
|
||||
double[] range = new double[2];
|
||||
double val;
|
||||
int iVal;
|
||||
int[] pos = new int[2];
|
||||
Variable eleV = findVariable(eleName);
|
||||
|
||||
try {
|
||||
Array ele = eleV.read();
|
||||
double[] range = new double[2];
|
||||
double val;
|
||||
// int iVal;
|
||||
// int[] pos = new int[2];
|
||||
|
||||
Index index = ele.getIndex();
|
||||
for (int i = 0; i < nLat; i++) {
|
||||
pos[0] = i;
|
||||
// pos[0] = i;
|
||||
for (int j = 0; j < nLon; j++) {
|
||||
pos[1] = j;
|
||||
val = ele.getDouble(pos);
|
||||
// pos[1] = j;
|
||||
val = ele.getDouble(index.set(i,j));
|
||||
range[0] = Math.min(range[0], val);
|
||||
range[1] = Math.max(range[1], val);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
return range;
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return range;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* work out a value from an evenly spaced range based on a bin number
|
||||
* @param valueRange
|
||||
@ -114,11 +126,11 @@ public class GebcoNETCDF {
|
||||
double binToValue(double[] valueRange, int nBin, double bin) {
|
||||
return valueRange[0] + (valueRange[1]-valueRange[0])*(double) bin / (double) (nBin);
|
||||
}
|
||||
|
||||
|
||||
double latBinToValue(double latBin) {
|
||||
return binToValue(latRange, nLat, latBin);
|
||||
}
|
||||
|
||||
|
||||
double lonBinToValue(double lonBin) {
|
||||
return binToValue(lonRange, nLon, lonBin);
|
||||
}
|
||||
@ -128,7 +140,7 @@ public class GebcoNETCDF {
|
||||
ColourArray depthArray = ColourArray.createMultiColouredArray(100, Color.WHITE, PamColors.getInstance().getColor(PamColor.MAP));
|
||||
return createImage(latRangeBins, lonRangeBins, heightArray, depthArray, hop);
|
||||
}
|
||||
|
||||
|
||||
public MapRasterImage createImage(int[] latRangeBins, int[] lonRangeBins, ColourArray heightColours, ColourArray depthColours, int hop) {
|
||||
latRangeBins[0] = Math.max(latRangeBins[0], 0);
|
||||
latRangeBins[1] = Math.min(latRangeBins[1], nLat);
|
||||
@ -144,12 +156,14 @@ public class GebcoNETCDF {
|
||||
/*
|
||||
* need to get the maxima and minima of the elevation data for scaling.
|
||||
*/
|
||||
Variable ele = findVariable(eleName);
|
||||
Variable eleV = findVariable(eleName);
|
||||
double maxDepth = -elevationRange[0], maxHeight = elevationRange[1];
|
||||
double val;
|
||||
int iVal;
|
||||
int[] pos = new int[2];
|
||||
try {
|
||||
Array ele = eleV.read();
|
||||
Index index = ele.getIndex();
|
||||
double hRat = 300;
|
||||
int nH = heightColours.getNumbColours();
|
||||
int nD = depthColours.getNumbColours();
|
||||
@ -161,15 +175,15 @@ public class GebcoNETCDF {
|
||||
pos[0] = i;
|
||||
for (int j = lonRangeBins[0], ji = 0; j < lonRangeBins[1] && ji < image.getWidth(); j+= hop, ji++) {
|
||||
pos[1] = j;
|
||||
val = ele.getDouble(pos);
|
||||
val = ele.getDouble(index.set(i,j));
|
||||
ColourArray colours;
|
||||
if (val >= 0) {
|
||||
// iVal = (int) (99*Math.log10(val+1)/Math.log10(maxHeight));
|
||||
// iVal = (int) (99*Math.log10(val+1)/Math.log10(maxHeight));
|
||||
iVal = (int) (ah*Math.log(val+1) + bh);
|
||||
colours = heightColours;
|
||||
}
|
||||
else {
|
||||
// iVal = (int) (99*Math.log10(-val)/Math.log10(maxDepth));
|
||||
// iVal = (int) (99*Math.log10(-val)/Math.log10(maxDepth));
|
||||
iVal = (int) (ad*Math.log(-val) + bd);
|
||||
colours = depthColours;
|
||||
}
|
||||
@ -181,7 +195,7 @@ public class GebcoNETCDF {
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
double[] latRange = new double[2];
|
||||
double[] lonRange = new double[2];
|
||||
double[] edges = {-.5, +.5};
|
||||
@ -199,21 +213,23 @@ public class GebcoNETCDF {
|
||||
* @return Variable or null
|
||||
*/
|
||||
private Variable findVariable(String varName) {
|
||||
VariableIterator varIter = netcdfFile.iterator();
|
||||
while (varIter.hasNext() ) {
|
||||
Variable var = varIter.next();
|
||||
if (var.getName().equalsIgnoreCase(varName)) {
|
||||
return var;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return netcdfFile.findVariable(varName);
|
||||
// VariableIterator varIter = netcdfFile.findVariable(varName);
|
||||
// while (varIter.hasNext() ) {
|
||||
// Variable var = varIter.next();
|
||||
// if (var.getName().equalsIgnoreCase(varName)) {
|
||||
// return var;
|
||||
// }
|
||||
// }
|
||||
// return null;
|
||||
}
|
||||
|
||||
private boolean hasField(String fieldName) {
|
||||
if (netcdfFile.contains(fieldName)) {
|
||||
|
||||
if (netcdfFile.findVariable(fieldName)!=null) {
|
||||
return true;
|
||||
}
|
||||
System.out.printf("Map file %s has no field \"%s\"\n", netcdfFile.getName(), fieldName);
|
||||
System.out.printf("Map file %s has no field \"%s\"\n", netcdfFile.getTitle(), fieldName);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -238,9 +254,10 @@ public class GebcoNETCDF {
|
||||
}
|
||||
NetcdfFile ncf;
|
||||
try {
|
||||
ncf = new NetcdfFile(ncFile, true);
|
||||
ncf = NetcdfFile.open(ncFile.getPath());
|
||||
|
||||
GebcoNETCDF gebcoRaster = new GebcoNETCDF(ncf);
|
||||
// ncf.close();
|
||||
// ncf.close();
|
||||
return gebcoRaster;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -3,7 +3,6 @@ package Map.gridbaselayer;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import ucar.multiarray.MultiArray;
|
||||
|
||||
@Deprecated
|
||||
public class GridDataUnit extends PamDataUnit {
|
||||
@ -11,15 +10,14 @@ public class GridDataUnit extends PamDataUnit {
|
||||
private double[] latArray;
|
||||
private double[] lonArray;
|
||||
private BufferedImage image;
|
||||
private MultiArray data;
|
||||
|
||||
public GridDataUnit(double[] latArray, double[] lonArray, BufferedImage image, MultiArray elevation) {
|
||||
public GridDataUnit(double[] latArray, double[] lonArray, BufferedImage image) {
|
||||
super(0);
|
||||
setDurationInMilliseconds(System.currentTimeMillis());
|
||||
this.latArray = latArray;
|
||||
this.lonArray = lonArray;
|
||||
this.image = image;
|
||||
this.data = elevation;
|
||||
//this.data = elevation;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -64,19 +62,19 @@ public class GridDataUnit extends PamDataUnit {
|
||||
this.image = image;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the data
|
||||
*/
|
||||
public MultiArray getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data the data to set
|
||||
*/
|
||||
public void setData(MultiArray data) {
|
||||
this.data = data;
|
||||
}
|
||||
// /**
|
||||
// * @return the data
|
||||
// */
|
||||
// public MultiArray getData() {
|
||||
// return data;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * @param data the data to set
|
||||
// */
|
||||
// public void setData(MultiArray data) {
|
||||
// this.data = data;
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
@ -3115,7 +3115,7 @@ public class PamController implements PamControllerInterface, PamSettings {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gt the main PAMGuard configuration (list of connected modules).
|
||||
* Get the main PAMGuard configuration (list of connected modules).
|
||||
*
|
||||
* @return the pamConfiguration
|
||||
*/
|
||||
|
@ -833,6 +833,21 @@ public class PamArrayUtils {
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sum the elements in an array
|
||||
* @param array - the array to sum.
|
||||
* @return the summation of all the elements in the array.
|
||||
*/
|
||||
public static double sum(float[] array) {
|
||||
double sum=0;
|
||||
for (double val:array) {
|
||||
sum+=val;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@ -920,14 +935,23 @@ public class PamArrayUtils {
|
||||
/**
|
||||
* Print an array to the console.
|
||||
* @param array to print
|
||||
* @param row - if true then prints all results in a single row
|
||||
*/
|
||||
public static void printArray(float[] array) {
|
||||
public static void printArray(float[] array, boolean row) {
|
||||
if (array==null) System.out.println("null");
|
||||
for (int i=0; i<array.length; i++) {
|
||||
System.out.println(i + ": " + array[i]);
|
||||
if (row) System.out.print(array[i] + " ");
|
||||
else System.out.println(i + ": " + array[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an array to the console.
|
||||
* @param array to print
|
||||
*/
|
||||
public static void printArray(float[] array) {
|
||||
printArray(array, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an array to the console with no index numbers
|
||||
|
@ -197,6 +197,7 @@ public class SelectFolder {
|
||||
if (!f.exists()) {
|
||||
if (JOptionPane.showConfirmDialog(folderPanel, "The directory " + folder + " does not exist " +
|
||||
"do you want to create it ?", "Select Directory", JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
|
||||
|
||||
if (!f.mkdirs()) {
|
||||
// print a warning message
|
||||
JOptionPane.showMessageDialog(folderPanel, "The folder " + folder + " could not be created",
|
||||
|
@ -172,7 +172,11 @@ public class PamGui extends PamView implements WindowListener, PamSettings {
|
||||
|
||||
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||
|
||||
String iconLoc = PamIcon.getPAMGuardIconPath(PamIcon.OLD);
|
||||
//<<<<<<< HEAD
|
||||
// String iconLoc = PamIcon.getPAMGuardIconPath(PamIcon.OLD);
|
||||
//=======
|
||||
String iconLoc = PamIcon.getPAMGuardIconPath(PamIcon.NORMAL);
|
||||
//>>>>>>> b88dbada951a64364503ec687b4babdc4df07183
|
||||
// switch (PamController.getInstance().getRunMode()){
|
||||
// case(PamController.RUN_NETWORKRECEIVER):iconLoc=PamIcon.getPAMGuardIconPath(PamIcon.NORMAL);break;
|
||||
// case(PamController.RUN_PAMVIEW):iconLoc=PamIcon.getPAMGuardIconPath(PamIcon.NORMAL);break;
|
||||
|
@ -96,7 +96,7 @@ public class WarnOnce implements PamSettings {
|
||||
}
|
||||
else if (PamGUIManager.isFX()) {
|
||||
return singleInstance.showWarningDialogFX(null,
|
||||
title, message, getAlertType(messageType), helpPoint, error, okButtonText, cancelButtonText);
|
||||
title, message, getAlertType(messageType), helpPoint, error, okButtonText, cancelButtonText, false);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -273,7 +273,21 @@ public class WarnOnce implements PamSettings {
|
||||
* otherwise OK_OPTION will always be returned.
|
||||
*/
|
||||
public static int showWarningFX(javafx.stage.Window parent, String title, String message, AlertType messageType) {
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, null, null, null, null);
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, null, null, null, null, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show a warning message in JavaFX dialog.
|
||||
* @param parent parent frame
|
||||
* @param title title of warning
|
||||
* @param message warning message (use html for multiline messages)
|
||||
* @param messageType message type OK_CANCEL_OPTION or WARNING_MESSAGE
|
||||
* @return if messageType is OK_CANCEN_OPTION this will return OK_OPTION or CANECL_OPTION,
|
||||
* otherwise OK_OPTION will always be returned.
|
||||
*/
|
||||
public static int showWarningFX(javafx.stage.Window parent, String title, String message, AlertType messageType, boolean disableCheckBoxes) {
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, null, null, null, null, disableCheckBoxes);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -289,7 +303,7 @@ public class WarnOnce implements PamSettings {
|
||||
* otherwise OK_OPTION will always be returned.
|
||||
*/
|
||||
public static int showWarningFX(javafx.stage.Window parent, String title, String message, AlertType messageType, String helpPoint) {
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, helpPoint, null, null, null);
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, helpPoint, null, null, null, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -304,7 +318,7 @@ public class WarnOnce implements PamSettings {
|
||||
*/
|
||||
public static int showWarningFX(javafx.stage.Window parent, String title, String message, AlertType messageType, String helpPoint, Throwable error) {
|
||||
if (! PamController.checkIfNetworkControlled()) {
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, helpPoint, error, null, null);
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, helpPoint, error, null, null, false);
|
||||
} else {
|
||||
System.out.println(" ");
|
||||
System.out.println("*** Warning: " + title);
|
||||
@ -327,7 +341,7 @@ public class WarnOnce implements PamSettings {
|
||||
* @return if messageType is OK_CANCEL_OPTION this will return OK_OPTION or CANCEL_OPTION, otherwise OK_OPTION will always be returned.
|
||||
*/
|
||||
public static int showWarningFX(javafx.stage.Window parent, String title, String message, AlertType messageType, String helpPoint, Throwable error, String okButtonText, String cancelButtonText) {
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, helpPoint, error, okButtonText, cancelButtonText);
|
||||
return singleInstance.showWarningDialogFX(parent, title, message, messageType, helpPoint, error, okButtonText, cancelButtonText, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -407,7 +421,8 @@ public class WarnOnce implements PamSettings {
|
||||
* @return if messageType is OK_CANCEN_OPTION this will return OK_OPTION or CANECL_OPTION,
|
||||
* otherwise OK_OPTION will always be returned.
|
||||
*/
|
||||
private int showWarningDialogFX(javafx.stage.Window parent, String title, String message, AlertType messageType, String helpPoint, Throwable error, String okButtonText, String cancelButtonText) {
|
||||
private int showWarningDialogFX(javafx.stage.Window parent, String title, String message, AlertType messageType, String helpPoint,
|
||||
Throwable error, String okButtonText, String cancelButtonText, boolean disableCheckBoxes) {
|
||||
|
||||
// check if we should show the warning again this session
|
||||
Boolean showAgain = showThisSess.get(title+message);
|
||||
@ -424,7 +439,7 @@ public class WarnOnce implements PamSettings {
|
||||
}
|
||||
|
||||
// show the warning
|
||||
WarnOnceDialogFX wo = new WarnOnceDialogFX(parent, title, message, messageType, helpPoint, error, okButtonText, cancelButtonText);
|
||||
WarnOnceDialogFX wo = new WarnOnceDialogFX(parent, title, message, messageType, helpPoint, error, okButtonText, cancelButtonText, disableCheckBoxes);
|
||||
wo.showDialog();
|
||||
warnOnceList.setShowWarning(title+message, wo.isShowAgain());
|
||||
showThisSess.put(title+message, wo.isShowThisSess());
|
||||
|
@ -14,6 +14,8 @@ import javafx.scene.control.Alert.AlertType;
|
||||
import javafx.scene.control.ButtonType;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import javafx.scene.control.DialogPane;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.stage.Window;
|
||||
import pamViewFX.fxNodes.PamHBox;
|
||||
|
||||
@ -48,7 +50,7 @@ public class WarnOnceDialogFX {
|
||||
* The warning message
|
||||
*/
|
||||
private String message;
|
||||
|
||||
|
||||
/**
|
||||
* The opt out this session check box.
|
||||
*/
|
||||
@ -59,6 +61,8 @@ public class WarnOnceDialogFX {
|
||||
*/
|
||||
private CheckBox dontShowAgain;
|
||||
|
||||
private HBox checkBoxPane;
|
||||
|
||||
/**
|
||||
* Constructor the warn once dialog.
|
||||
* @param parentStage - the parent window
|
||||
@ -74,12 +78,12 @@ public class WarnOnceDialogFX {
|
||||
alert = createAlertWithOptOut(alertType, title, null, message, "Don't show this message again", ButtonType.YES, ButtonType.NO);
|
||||
// if (alert.showAndWait().filter(t -> t == ButtonType.YES).isPresent()) {
|
||||
// }
|
||||
|
||||
|
||||
// for now, this is not implemented so just make sure it's not checked. If we want to add it to the dialog, we'll need to rearrange everything
|
||||
// because the opt-out checkbox is added to the buttons bar in a sneaky way, and you can't do that twice.
|
||||
dontShowAgainThisSess.setSelected(false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructor the warn once dialog.
|
||||
* @param parentStage - the parent window
|
||||
@ -92,20 +96,34 @@ public class WarnOnceDialogFX {
|
||||
* @param canceltext
|
||||
*/
|
||||
public WarnOnceDialogFX(Window parentStage, String title, String message, AlertType alertType , String helpPoint, Throwable error, String oktext, String canceltext) {
|
||||
this(parentStage, title, message, alertType, helpPoint, error, oktext, canceltext, false);
|
||||
}
|
||||
|
||||
public WarnOnceDialogFX(Window parentStage, String title, String message, AlertType alertType , String helpPoint,
|
||||
Throwable error, String oktext, String canceltext, boolean disableCheckBoxes) {
|
||||
|
||||
this.error=error;
|
||||
this.message=message;
|
||||
|
||||
|
||||
ButtonType okButton;
|
||||
if (oktext==null) okButton = ButtonType.OK;
|
||||
else okButton = new ButtonType(oktext);
|
||||
|
||||
|
||||
ButtonType cancelButton;
|
||||
if (canceltext==null) cancelButton = ButtonType.OK;
|
||||
else cancelButton = new ButtonType(canceltext);
|
||||
|
||||
|
||||
//TODO help point.
|
||||
|
||||
|
||||
alert = createAlertWithOptOut(alertType, title, null, message, "Don't show this message again", okButton, cancelButton);
|
||||
|
||||
//System.out.println("CREATE ALERT: " + disableCheckBoxes);
|
||||
this.disableCheckBoxes(disableCheckBoxes);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Show the warning dialog.
|
||||
@ -142,7 +160,7 @@ public class WarnOnceDialogFX {
|
||||
clpbrd.setContents(stringSelection, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean isShowAgain() {
|
||||
return dontShowAgain.isSelected() == false;
|
||||
}
|
||||
@ -164,7 +182,7 @@ public class WarnOnceDialogFX {
|
||||
private Alert createAlertWithOptOut(AlertType type, String title, String headerText,
|
||||
String message, String optOutMessage,
|
||||
ButtonType... buttonTypes) {
|
||||
|
||||
|
||||
Alert alert = new Alert(type);
|
||||
// Need to force the alert to layout in order to grab the graphic,
|
||||
// as we are replacing the dialog pane with a custom pane
|
||||
@ -174,22 +192,22 @@ public class WarnOnceDialogFX {
|
||||
// Create a new dialog pane that has a checkbox instead of the hide/show details button
|
||||
// Use the supplied callback for the action of the checkbox
|
||||
alert.setDialogPane(new DialogPane() {
|
||||
|
||||
@Override
|
||||
protected Node createDetailsButton() {
|
||||
|
||||
|
||||
dontShowAgain = new CheckBox();
|
||||
dontShowAgain.setText(optOutMessage + " ever");
|
||||
|
||||
|
||||
dontShowAgainThisSess = new CheckBox();
|
||||
dontShowAgainThisSess.setText(" this session ");
|
||||
|
||||
PamHBox hBox = new PamHBox();
|
||||
hBox.getChildren().addAll(dontShowAgain, dontShowAgainThisSess);
|
||||
hBox.setSpacing(5);
|
||||
hBox.setAlignment(Pos.CENTER_LEFT);
|
||||
|
||||
return hBox;
|
||||
|
||||
checkBoxPane = new PamHBox();
|
||||
checkBoxPane.getChildren().addAll(dontShowAgain, dontShowAgainThisSess);
|
||||
checkBoxPane.setSpacing(5);
|
||||
checkBoxPane.setAlignment(Pos.CENTER_LEFT);
|
||||
|
||||
return checkBoxPane;
|
||||
}
|
||||
});
|
||||
alert.getDialogPane().getButtonTypes().addAll(buttonTypes[0]);
|
||||
@ -202,7 +220,7 @@ public class WarnOnceDialogFX {
|
||||
alert.getDialogPane().setGraphic(graphic);
|
||||
alert.setTitle(title);
|
||||
alert.setHeaderText(headerText);
|
||||
|
||||
|
||||
return alert;
|
||||
}
|
||||
|
||||
@ -215,5 +233,12 @@ public class WarnOnceDialogFX {
|
||||
}
|
||||
|
||||
|
||||
public void disableCheckBoxes(boolean disable) {
|
||||
checkBoxPane.setDisable(disable);
|
||||
dontShowAgain.setDisable(disable);
|
||||
dontShowAgainThisSess.setDisable(disable);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -170,8 +170,8 @@ public class RawDataTransforms {
|
||||
}
|
||||
|
||||
double[] waveformTrim = new double[maxBin-minBin];
|
||||
|
||||
// System.out.println("minBin: " +minBin + " maxBin: " + maxBin + " " + Math.min(this.getWaveData(channel).length, waveformTrim.length) + " " + this.getWaveData(channel).length + " " + this.getSampleDuration());
|
||||
|
||||
// System.out.println("minBin: " +minBin + " maxBin: " + maxBin + " " + Math.min(this.getWaveData(channel).length, waveformTrim.length) + " " + this.getWaveData(channel).length + " " + this.getSampleDuration());
|
||||
|
||||
System.arraycopy(this.getWaveData(channel), minBin, waveformTrim, 0, Math.min(this.getWaveData(channel).length-minBin-1, waveformTrim.length));
|
||||
|
||||
@ -187,9 +187,10 @@ public class RawDataTransforms {
|
||||
*
|
||||
* @param channel channel number
|
||||
* @param fftLength
|
||||
* @param Hann - true to use hanning window
|
||||
* @return Power spectrum
|
||||
*/
|
||||
public double[] getPowerSpectrum(int channel, int fftLength) {
|
||||
public double[] getPowerSpectrum(int channel, int fftLength, boolean Hann) {
|
||||
synchronized (synchObject) {
|
||||
if (powerSpectra == null) {
|
||||
powerSpectra = new double[PamUtils.getNumChannels(dataUnit.getChannelBitmap())][];
|
||||
@ -200,7 +201,13 @@ public class RawDataTransforms {
|
||||
|
||||
if (powerSpectra[channel] == null
|
||||
|| powerSpectra[channel].length != fftLength / 2) {
|
||||
ComplexArray cData = getComplexSpectrumHann(channel, fftLength);
|
||||
ComplexArray cData;
|
||||
if (Hann) {
|
||||
cData = getComplexSpectrumHann(channel, fftLength);
|
||||
}
|
||||
else {
|
||||
cData = getComplexSpectrum(channel, fftLength);
|
||||
}
|
||||
currentSpecLen = fftLength;
|
||||
powerSpectra[channel] = cData.magsq();
|
||||
if (powerSpectra==null){
|
||||
@ -216,6 +223,19 @@ public class RawDataTransforms {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the power spectrum for a given channel (square of magnitude of
|
||||
* complex spectrum)
|
||||
*
|
||||
* @param channel channel number
|
||||
* @param fftLength
|
||||
* @return Power spectrum
|
||||
*/
|
||||
public double[] getPowerSpectrum(int channel, int fftLength) {
|
||||
return getPowerSpectrum( channel, fftLength, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns the sum of the power spectra for all channels
|
||||
@ -410,7 +430,7 @@ public class RawDataTransforms {
|
||||
paddedRawData = new double[fftLength];
|
||||
rawData = getWaveData(channel);
|
||||
//double[] rotData = getRotationCorrection(channel);
|
||||
|
||||
|
||||
/**
|
||||
*FIXME
|
||||
* 11/07 Changed from getSampleDuration because an error sometimes occurs where the sample duration
|
||||
@ -418,7 +438,7 @@ public class RawDataTransforms {
|
||||
*/
|
||||
//mn = Math.min(fftLength, getSampleDuration().intValue());
|
||||
mn = Math.min(fftLength, rawData.length);
|
||||
// System.out.println("fftLength: " + rawData.length + " " + getSampleDuration().intValue() + " mn " +mn);
|
||||
// System.out.println("fftLength: " + rawData.length + " " + getSampleDuration().intValue() + " mn " +mn);
|
||||
for (i = 0; i < mn; i++) {
|
||||
paddedRawData[i] = rawData[i];//-rotData[i];
|
||||
}
|
||||
|
237
src/Resources/css/pamCSS_flatlaf.css
Normal file
237
src/Resources/css/pamCSS_flatlaf.css
Normal file
@ -0,0 +1,237 @@
|
||||
/* General Styling for PAMGuard JavaFX controls which trys to replicate the Swing Flatlaf theme */
|
||||
.root {
|
||||
-fx-font-family: "Segoe UI", "Tahoma", "Arial", sans-serif;
|
||||
-fx-font-size: 13px;
|
||||
-fx-base: #f5f5f5;
|
||||
-fx-background: #ffffff;
|
||||
-fx-control-inner-background: #ffffff;
|
||||
-fx-control-inner-background-alt: #f0f0f0;
|
||||
-fx-focus-color: #3895EC;
|
||||
-fx-faint-focus-color: rgba(56, 149, 236, 0.2);
|
||||
-fx-accent: #3895EC;
|
||||
-fx-default-button: -fx-accent;
|
||||
}
|
||||
|
||||
/* Labels */
|
||||
.label {
|
||||
-fx-text-fill: #333333;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.button {
|
||||
-fx-background-color: #ffffff;
|
||||
-fx-border-color: #cccccc;
|
||||
-fx-border-width: 1px;
|
||||
-fx-padding: 6px 12px;
|
||||
-fx-text-fill: #333333;
|
||||
-fx-background-radius: 3px;
|
||||
-fx-border-radius: 3px;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
-fx-background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.button:pressed {
|
||||
-fx-background-color: #e6e6e6;
|
||||
}
|
||||
|
||||
.button:default {
|
||||
-fx-background-color: -fx-accent;
|
||||
-fx-text-fill: white;
|
||||
-fx-border-color: transparent;
|
||||
}
|
||||
|
||||
.button:default:hover {
|
||||
-fx-background-color: #2f7dbe;
|
||||
}
|
||||
|
||||
.button:default:pressed {
|
||||
-fx-background-color: #266591;
|
||||
}
|
||||
|
||||
/* Text Fields and Text Areas */
|
||||
.text-field,
|
||||
.text-area {
|
||||
-fx-background-color: #ffffff;
|
||||
-fx-border-color: #cccccc;
|
||||
-fx-border-width: 1px;
|
||||
-fx-padding: 4px;
|
||||
-fx-prompt-text-fill: #999999;
|
||||
-fx-background-radius: 3px;
|
||||
-fx-border-radius: 3px;
|
||||
}
|
||||
|
||||
.text-field:focused,
|
||||
.text-area:focused {
|
||||
-fx-border-color: -fx-focus-color;
|
||||
-fx-effect: null;
|
||||
}
|
||||
|
||||
/* Checkboxes */
|
||||
.check-box {
|
||||
-fx-padding: 2px;
|
||||
}
|
||||
|
||||
/* Combo Boxes */
|
||||
.combo-box {
|
||||
-fx-background-color: #ffffff;
|
||||
-fx-border-color: #cccccc;
|
||||
-fx-border-width: 1px;
|
||||
-fx-padding: 4px;
|
||||
-fx-background-radius: 3px;
|
||||
-fx-border-radius: 3px;
|
||||
}
|
||||
|
||||
.combo-box:focused {
|
||||
-fx-border-color: -fx-focus-color;
|
||||
-fx-effect: null;
|
||||
}
|
||||
|
||||
/* Toggle Switches (using a custom approach) */
|
||||
.toggle-switch {
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.toggle-switch .track {
|
||||
-fx-background-color: #cccccc;
|
||||
-fx-background-radius: 10px;
|
||||
-fx-pref-width: 40px; /* Adjust as needed */
|
||||
-fx-pref-height: 20px;
|
||||
}
|
||||
|
||||
.toggle-switch:selected .track {
|
||||
-fx-background-color: -fx-accent;
|
||||
}
|
||||
|
||||
.toggle-switch .thumb {
|
||||
-fx-background-color: white;
|
||||
-fx-background-radius: 50%;
|
||||
-fx-pref-width: 16px;
|
||||
-fx-pref-height: 16px;
|
||||
-fx-translate-x: -10px; /* Initial position */
|
||||
}
|
||||
|
||||
.toggle-switch:selected .thumb {
|
||||
-fx-translate-x: 10px; /* Shifted position */
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
|
||||
Spinner
|
||||
|
||||
****************************************************************/
|
||||
|
||||
.spinner {
|
||||
-fx-background-color: #ffffff;
|
||||
-fx-border-color: #cccccc;
|
||||
-fx-border-width: 1px;
|
||||
-fx-padding: 4px;
|
||||
-fx-background-radius: 3px;
|
||||
-fx-border-radius: 3px;
|
||||
}
|
||||
|
||||
.spinner:focused {
|
||||
-fx-border-color: -fx-focus-color;
|
||||
-fx-effect: null;
|
||||
}
|
||||
|
||||
|
||||
.spinner .text-field {
|
||||
-fx-background-color: inherit; /* Inherit from spinner background */
|
||||
-fx-border-color: inherit; /* Inherit from spinner border */
|
||||
-fx-border-width: 0; /* No separate border for the text field */
|
||||
-fx-padding: 5px 0; /* Consistent vertical padding */
|
||||
-fx-alignment: center; /* Center text */
|
||||
}
|
||||
|
||||
.spinner .increment-arrow-button,
|
||||
.spinner .decrement-arrow-button {
|
||||
-fx-background-color: #d2d2d2; /* Light gray background for buttons */
|
||||
-fx-border-color: inherit; /* Inherit border from spinner */
|
||||
-fx-border-width: 0; /* No separate border for buttons */
|
||||
-fx-padding: 5px 5px;
|
||||
}
|
||||
|
||||
.spinner .increment-arrow-button:hover,
|
||||
.spinner .decrement-arrow-button:hover {
|
||||
-fx-background-color: #3895EC; /* FlatLaf blue highlight on hover */
|
||||
-fx-text-fill: white; /* White arrow on hover */
|
||||
}
|
||||
|
||||
/* Split Arrows (Horizontal) */
|
||||
.spinner.split-arrows-horizontal {
|
||||
-fx-border-radius: 3px; /* Ensure rounded corners for the overall spinner */
|
||||
}
|
||||
|
||||
.spinner.split-arrows-horizontal .text-field {
|
||||
-fx-border-width: 0;
|
||||
-fx-border-color: inherit;
|
||||
}
|
||||
|
||||
.spinner.split-arrows-horizontal .increment-arrow-button {
|
||||
-fx-background-radius: 0 3px 3px 0; /* Right rounded corners */
|
||||
}
|
||||
|
||||
.spinner.split-arrows-horizontal .decrement-arrow-button {
|
||||
-fx-background-radius: 3px 0 0 3px; /* Left rounded corners */
|
||||
}
|
||||
|
||||
/* Fix for borders between elements*/
|
||||
.spinner.split-arrows-horizontal .increment-arrow-button {
|
||||
-fx-border-width: 0 1px 0 0;
|
||||
}
|
||||
|
||||
.spinner.split-arrows-horizontal .decrement-arrow-button {
|
||||
-fx-border-width: 0 0 0 1px;
|
||||
}
|
||||
|
||||
|
||||
/* Scroll Bars */
|
||||
.scroll-bar:vertical .increment-button,
|
||||
.scroll-bar:vertical .decrement-button,
|
||||
.scroll-bar:horizontal .increment-button,
|
||||
.scroll-bar:horizontal .decrement-button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-border-color: transparent;
|
||||
}
|
||||
|
||||
.scroll-bar:vertical .thumb,
|
||||
.scroll-bar:horizontal .thumb {
|
||||
-fx-background-color: rgba(0, 0, 0, 0.2);
|
||||
-fx-background-radius: 5px;
|
||||
}
|
||||
|
||||
.scroll-bar:vertical .thumb:hover,
|
||||
.scroll-bar:horizontal .thumb:hover {
|
||||
-fx-background-color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
.table-view {
|
||||
-fx-background-color: transparent;
|
||||
-fx-border-color: #cccccc;
|
||||
-fx-border-width: 1px;
|
||||
}
|
||||
|
||||
.table-view .column-header-background {
|
||||
-fx-background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.table-view .column-header {
|
||||
-fx-border-color: #cccccc;
|
||||
-fx-padding: 6px;
|
||||
}
|
||||
|
||||
.table-row-cell:even {
|
||||
-fx-background-color: -fx-control-inner-background;
|
||||
}
|
||||
|
||||
.table-row-cell:odd {
|
||||
-fx-background-color: -fx-control-inner-background-alt;
|
||||
}
|
||||
|
||||
.table-row-cell:selected {
|
||||
-fx-background-color: rgba(56, 149, 236, 0.3);
|
||||
}
|
@ -128,6 +128,10 @@ public class BinaryStorageDialogPanel {
|
||||
return false;
|
||||
}
|
||||
binaryStoreSettings.setStoreLocation(storageLocation.getFolderName(true));
|
||||
if (binaryStoreSettings.getStoreLocation()==null) {
|
||||
//cancel button pressed - return to dialog
|
||||
return false;
|
||||
}
|
||||
binaryStoreSettings.autoNewFiles = autoNewFiles.isSelected();
|
||||
binaryStoreSettings.datedSubFolders = dateSubFolders.isSelected();
|
||||
binaryStoreSettings.limitFileSize = limitfileSize.isSelected();
|
||||
|
@ -191,7 +191,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
public ClickSpectrum(STClickControl clickControl, ClickDisplayManager clickDisplayManager, ClickDisplayManager.ClickDisplayInfo clickDisplayInfo) {
|
||||
this((ClickControl) clickControl, clickDisplayManager, clickDisplayInfo);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PamObserver getObserverObject() {
|
||||
return this;
|
||||
@ -409,15 +409,22 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
eventLineData = eventSpectrum;
|
||||
}
|
||||
|
||||
if (!isEventClick(storedClick)) {
|
||||
eventLineData = null;
|
||||
}
|
||||
|
||||
// work out the scales, mins and max's, etc.
|
||||
maxVal = 0;
|
||||
|
||||
for (int iChan = 0; iChan < clickLineData.length; iChan++) {
|
||||
for (int i = 0; i < clickLineData[iChan].length; i++){
|
||||
maxVal = Math.max(maxVal, clickLineData[iChan][i]);
|
||||
if (eventLineData!=null && eventLineData[iChan]!=null && isViewer && clickSpectrumParams.showEventInfo ){
|
||||
if( i<eventLineData[iChan].length){
|
||||
maxVal = Math.max(maxVal, eventLineData[iChan][i]);
|
||||
// System.out.println(eventLineData == null ? "Event is null" : ("Event length is " + eventLineData.length));
|
||||
if (!clickSpectrumParams.plotCepstrum && eventLineData!=null) {
|
||||
if (eventLineData[iChan]!=null && isViewer && clickSpectrumParams.showEventInfo ){
|
||||
if( i<eventLineData[iChan].length){
|
||||
maxVal = Math.max(maxVal, eventLineData[iChan][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -446,7 +453,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
double scale = 1./(maxVal*1.1);
|
||||
if (isViewer ){
|
||||
|
||||
if (eventLineData!=null && clickSpectrumParams.showEventInfo){
|
||||
if (eventLineData!=null && clickSpectrumParams.showEventInfo && !clickSpectrumParams.plotCepstrum){
|
||||
|
||||
g2.setStroke(dashed);
|
||||
|
||||
@ -516,8 +523,8 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
*/
|
||||
private void paintLogSpectrum(Graphics g, Rectangle clipRect) {
|
||||
|
||||
double[][] clickLineData;
|
||||
double[][] eventLineData;
|
||||
double[][] clickLineData = null;
|
||||
double[][] eventLineData = null;
|
||||
synchronized (storedSpectrumLock) {
|
||||
if (storedSpectrum == null || storedSpectrum.length == 0 || storedSpectrum[0].length == 0) return;
|
||||
|
||||
@ -530,13 +537,17 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
eventLineData = eventSpectrum;
|
||||
}
|
||||
|
||||
if (!isEventClick(storedClick)) {
|
||||
eventLineData = null;
|
||||
}
|
||||
|
||||
//System.out.println("paintLogSpectrum.eventLineData: 1" + eventLineData[0].length);
|
||||
|
||||
|
||||
if (logSpectrum == null || clickSpectrumParams.plotCepstrum != lastCepChoice || eventSpectrumTemplatesLog!=null) {
|
||||
double temp;
|
||||
logSpectrum = new double[clickLineData.length][clickLineData[0].length];
|
||||
if (eventSpectrum!=null && isViewer ){
|
||||
if (eventLineData!=null && isViewer ){
|
||||
logEventSpectrum = new double[eventLineData.length][eventLineData[0].length];
|
||||
}
|
||||
if (eventSpectrumTemplatesLog!=null && isViewer ){
|
||||
@ -554,7 +565,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
}
|
||||
}
|
||||
|
||||
//sperated this out and the spectrums can be different lengths.
|
||||
//seperated this out and the spectrums can be different lengths.
|
||||
if (eventLineData!=null && isViewer &&clickSpectrumParams.showEventInfo){
|
||||
for (int i = 0; i < eventLineData[iChan].length; i++){
|
||||
if( i<eventLineData[iChan].length){
|
||||
@ -581,8 +592,8 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
logTemplateSpectrum[i]=logTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
lastCepChoice = clickSpectrumParams.plotCepstrum;
|
||||
drawLogSpectrum(g,clipRect,clickLineData, eventLineData);
|
||||
}
|
||||
@ -608,7 +619,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
|
||||
|
||||
//show an average log spectrum
|
||||
if (eventLineData!=null && isViewer && clickSpectrumParams.showEventInfo){
|
||||
if (eventLineData!=null && isViewer && clickSpectrumParams.showEventInfo && !clickSpectrumParams.plotCepstrum){
|
||||
|
||||
xScale = (double) r.width / (double) (eventLineData[0].length - 1);
|
||||
scaleLim = Math.abs(clickSpectrumParams.logRange);
|
||||
@ -629,7 +640,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
}
|
||||
|
||||
//show custim templates
|
||||
if (clickTemplateParams.clickTemplateArray.size()>0 && eventLineData !=null){
|
||||
if (clickTemplateParams.clickTemplateArray.size()>0 && logTemplateSpectrum !=null){
|
||||
g2.setStroke(dashedtmplate);
|
||||
for (int i = 0; i < logTemplateSpectrum.length; i++) {
|
||||
if (logTemplateSpectrum[i]!=null && clickTemplateParams.clickTempVisible.get(i)==true){
|
||||
@ -782,12 +793,12 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
menuItem.addActionListener(new EditTemplates());
|
||||
menu.add(menuItem);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
menuItem = new JMenuItem("Add template...");
|
||||
menuItem.addActionListener(new AddTemplate());
|
||||
menu.add(menuItem);
|
||||
|
||||
|
||||
menuItem = new JMenuItem("Clear templates");
|
||||
menuItem.addActionListener(new ClearTemplates());
|
||||
menu.add(menuItem);
|
||||
@ -807,15 +818,15 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
repaint(10);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private class AddTemplate implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
addTemnplateDialog();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private class ClearTemplates implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
@ -882,7 +893,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void clearTemplates(){
|
||||
clickTemplateParams.clickTemplateArray=new ArrayList<ClickTemplate>();
|
||||
clickTemplateParams.clickTempVisible=new ArrayList<Boolean>();
|
||||
@ -952,7 +963,8 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
storedSpectrum[i] = SmoothingFilter.smoothData(storedSpectrum[i], clickSpectrumParams.plotSmoothing);
|
||||
}
|
||||
}
|
||||
//calculating an event spectrum can take a very long time.
|
||||
//calculating an event spectrum can take a very long time so we don't delete the last event incase a user
|
||||
//is clicking between one event and un-annotated clicks so whether to draw an event is handled in the paint functions
|
||||
if (isViewer && this.clickSpectrumParams.showEventInfo){
|
||||
getEventClick(newClick);
|
||||
}
|
||||
@ -964,6 +976,16 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
spectrumAxisPanel.repaint(100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the click belong to an event.
|
||||
*/
|
||||
private boolean isEventClick(ClickDetection newClick) {
|
||||
if (newClick.getSuperDetection(0)==null || !newClick.getSuperDetection(0).equals(lastEvent) ) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Normalis so that the amplitude of the cepstrum is the same as that of the spectrum.
|
||||
@ -1323,7 +1345,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
@Override
|
||||
public void updateData(PamObservable observable, PamDataUnit pamDataUnit) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
|
||||
}
|
||||
|
||||
public ClickDetection getStoredClick(){
|
||||
@ -1375,7 +1397,7 @@ public class ClickSpectrum extends ClickDisplay implements PamObserver , PamSett
|
||||
clickSpectrumParams = ((ClickSpectrumParams) pamControlledUnitSettings.getSettings()).clone();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void receiveSourceNotification(int type, Object object) {
|
||||
// don't do anything by default
|
||||
|
@ -316,7 +316,7 @@ public class ClickSpectrumTemplateEditDialog extends PamDialog{
|
||||
ArrayList<double[]> fftAll=getEventFFTs(channel,true);
|
||||
//create standard average spectrum
|
||||
this.averageFFT=fftMean(fftAll);
|
||||
printFFT( averageFFT);
|
||||
//printFFT( averageFFT);
|
||||
this.stdFFT=fftstd(fftAll,averageFFT);
|
||||
//create log template
|
||||
this.averageFFTLog=fftMean(convertAllFFttoLog(fftAll));
|
||||
|
@ -485,19 +485,21 @@ public class ClickSelectPaneFX extends DynamicSettingsPane<Boolean> {
|
||||
});
|
||||
|
||||
|
||||
lutList = LookUpTables.getLookUpTables().getLookupList(ClicksOffline.ClickTypeLookupName);
|
||||
if (lutList == null) {
|
||||
return;
|
||||
}
|
||||
useType = new CheckBox[lutList.getList().size()];
|
||||
for (int i = 0; i < useType.length; i++) {
|
||||
this.getChildren().add(useType[i] = new CheckBox(lutList.getList().get(i).getText()));
|
||||
useType[i].setSelected(clickAlarmParameters.isUseEventType(lutList.getList().get(i).getCode()));
|
||||
useType[i].setOnAction((action)->{
|
||||
setUseAllCheckBox();
|
||||
notifySettingsListeners();
|
||||
});
|
||||
}
|
||||
//2024-12-18 This is causing an excpetion because lookup tabel does not exist.
|
||||
// lutList = LookUpTables.getLookUpTables().getLookupList(ClicksOffline.ClickTypeLookupName);
|
||||
// if (lutList == null) {
|
||||
// return;
|
||||
// }
|
||||
// useType = new CheckBox[lutList.getList().size()];
|
||||
// for (int i = 0; i < useType.length; i++) {
|
||||
// this.getChildren().add(useType[i] = new CheckBox(lutList.getList().get(i).getText()));
|
||||
// useType[i].setSelected(clickAlarmParameters.isUseEventType(lutList.getList().get(i).getCode()));
|
||||
// useType[i].setOnAction((action)->{
|
||||
// setUseAllCheckBox();
|
||||
// notifySettingsListeners();
|
||||
// });
|
||||
// }
|
||||
|
||||
setUseAllCheckBox();
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,6 @@ public class ClickTrainDetSubLogging extends SQLLogging {
|
||||
super(pamDataBlock);
|
||||
this.clickTrainLogging = clickTrainLogging;
|
||||
setTableDefinition(new PamSubtableDefinition(clickTrainLogging.getClickTrainControl().getUnitName()+"_Children"));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -99,7 +99,11 @@ public class ClickFFTPlotManager2 extends FFTPlotManager {
|
||||
}
|
||||
else {
|
||||
double[] spectrum=((ClickDetection) detection).getPowerSpectrum(chanClick, clickPlotInfoFX.isViewer() ? true : false);
|
||||
spectrum=((ClickDetection) detection).getPowerSpectrum(chanClick, clickPlotInfoFX.isViewer() ? true : false);
|
||||
|
||||
if (spectrum==null) spectrum=((ClickDetection) detection).getPowerSpectrum(chanClick, true);
|
||||
if (spectrum ==null) {
|
||||
System.err.println("ClickPlotFFTManager2: Spectrum for the click is null?");
|
||||
}
|
||||
drawClickFFT(Arrays.copyOf(spectrum, spectrum.length), pamDataUnit.getTimeMilliseconds(), writableImage.getScrollingPLot2DSegmenter().getMaxY(), writableImage);
|
||||
}
|
||||
}
|
||||
|
@ -4,11 +4,9 @@ import java.awt.geom.Path2D;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import IshmaelDetector.IshDetFnDataUnit;
|
||||
import PamDetection.AbstractLocalisation;
|
||||
import PamDetection.LocContents;
|
||||
import PamDetection.LocalisationInfo;
|
||||
import PamUtils.Coordinate3d;
|
||||
import PamUtils.PamUtils;
|
||||
import PamView.GeneralProjector;
|
||||
import PamView.HoverData;
|
||||
@ -104,23 +102,25 @@ public class GenericDataPlotInfo extends TDDataInfoFX {
|
||||
}
|
||||
else {
|
||||
return super.drawDataUnit(plotNumber, pamDataUnit, g, scrollStart, tdProjector, type);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Base class draws a simple frequency box. Easily overridden to draw something else, e.g. a contour.
|
||||
* @param plotNumber
|
||||
* @param pamDataUnit
|
||||
* @param g
|
||||
* @param scrollStart
|
||||
* @param tdProjector
|
||||
* @param type
|
||||
* @return
|
||||
* Draw a data unit as a box.
|
||||
* @param plotNumber - the pot number
|
||||
* @param pamDataUnit - the data unit that will be plotted
|
||||
* @param f - the y axis max and min values
|
||||
* @param g - the graphics context.
|
||||
* @param scrollStart - the scroll start in millis.
|
||||
* @param tdProjector - the graph projector.
|
||||
* @param type - the plot type.
|
||||
* @return a polygon of the data unit.
|
||||
*/
|
||||
public Polygon drawFrequencyData(int plotNumber, PamDataUnit pamDataUnit, GraphicsContext g, double scrollStart,
|
||||
public Polygon drawBoxData(int plotNumber, PamDataUnit pamDataUnit, double[] f, GraphicsContext g, double scrollStart,
|
||||
TDProjectorFX tdProjector, int type) {
|
||||
|
||||
|
||||
g.setLineDashes(null);
|
||||
g.setLineWidth(2);
|
||||
TDSymbolChooserFX symbolChooser = getSymbolChooser();
|
||||
@ -129,13 +129,13 @@ public class GenericDataPlotInfo extends TDDataInfoFX {
|
||||
symbol = symbolChooser.getPamSymbol(pamDataUnit, type);
|
||||
}
|
||||
|
||||
double[] f = pamDataUnit.getFrequency();
|
||||
if (f == null) {
|
||||
return null;
|
||||
}
|
||||
if (f.length == 1) {
|
||||
System.out.println("GenericDataPlotInfo: Single frequency measure in data unit " + pamDataUnit.toString());
|
||||
}
|
||||
|
||||
// draw a frequency box.
|
||||
double y0 = tdProjector.getYPix(f[0]);
|
||||
double y1 = tdProjector.getYPix(f[1]);
|
||||
@ -186,6 +186,22 @@ public class GenericDataPlotInfo extends TDDataInfoFX {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class draws a simple frequency box. Easily overridden to draw something else, e.g. a contour.
|
||||
* @param plotNumber
|
||||
* @param pamDataUnit
|
||||
* @param g
|
||||
* @param scrollStart
|
||||
* @param tdProjector
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
public Polygon drawFrequencyData(int plotNumber, PamDataUnit pamDataUnit, GraphicsContext g, double scrollStart,
|
||||
TDProjectorFX tdProjector, int type) {
|
||||
double[] f = pamDataUnit.getFrequency();
|
||||
return drawBoxData( plotNumber, pamDataUnit,f, g, scrollStart, tdProjector, type);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
|
@ -35,7 +35,7 @@ import whistlesAndMoans.WhistleMoanControl;
|
||||
|
||||
/**
|
||||
*
|
||||
* A detection display which can display groups data units and
|
||||
* A detection display which can display group data units and
|
||||
* their super detections in a tab pane if applicable.
|
||||
*
|
||||
* @author Jamie Macaulay
|
||||
@ -252,10 +252,10 @@ public class OverlayGroupDisplay extends PamBorderPane {
|
||||
|
||||
this.detectionsPane.setDetectionGroup(dataList);
|
||||
|
||||
|
||||
if (superDets!=null) {
|
||||
this.superDetectionsDisplay.setDetectionGroup(new ArrayList<PamDataUnit>(superDets));
|
||||
}
|
||||
|
||||
this.prepareDisplay();
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@ import pamViewFX.fxNodes.PamTilePane;
|
||||
import pamViewFX.fxNodes.PamVBox;
|
||||
import pamViewFX.fxNodes.flipPane.FlipPane;
|
||||
import pamViewFX.fxNodes.hidingPane.HidingPane;
|
||||
import pamViewFX.fxNodes.utilityPanes.PamToggleSwitch;
|
||||
import pamViewFX.fxNodes.utilsFX.PamUtilsFX;
|
||||
import pamViewFX.fxStyles.PamStylesManagerFX;
|
||||
|
||||
@ -220,8 +221,6 @@ public class TDMenuPane extends PamBorderPane {
|
||||
closeButtonLeft.setVisible(true);
|
||||
topHolder.setLeft(closeButtonLeft);
|
||||
|
||||
holder.setLeft(hidingPaneLeft);
|
||||
|
||||
holder.setCenter(groupDetectionDisplay);
|
||||
holder.setLeft(hidingPaneLeft);
|
||||
|
||||
@ -235,14 +234,19 @@ public class TDMenuPane extends PamBorderPane {
|
||||
* Set the summary text for the data unit in the menu.
|
||||
*/
|
||||
private void setSummaryText() {
|
||||
if (currentDataUnit==null || detectionSummary==null) return;
|
||||
if (currentDataUnit==null || detectionSummary==null) {
|
||||
this.infoTextLabel.setText("No data units selected");
|
||||
return;
|
||||
}
|
||||
|
||||
String text;
|
||||
if (detectionSummary.getDataList().size()>=1){
|
||||
// text= currentDataUnit.getSummaryString();
|
||||
|
||||
|
||||
text=currentDataUnit.getParentDataBlock().
|
||||
getHoverText(tdGraphFX.getGraphProjector(), currentDataUnit, 0);
|
||||
|
||||
|
||||
if (text==null) return; //do not clear as usually this is because a super unit has been set
|
||||
}
|
||||
else {
|
||||
@ -280,25 +284,27 @@ public class TDMenuPane extends PamBorderPane {
|
||||
infoButton.setGraphic(PamGlyphDude.createPamIcon("mdi2i-information", PamGuiManagerFX.iconSize));
|
||||
//infoButton.setStyle(" -fx-background-radius: 0 0 0 0;");
|
||||
|
||||
toggle= new ToggleSwitch();
|
||||
toggle= new ToggleSwitch();
|
||||
toggle.setGraphic(PamGlyphDude.createPamIcon("mdi2c-chart-bell-curve", PamGuiManagerFX.iconSize));
|
||||
toggle.setSelected(true);
|
||||
toggle.setAlignment(Pos.CENTER);
|
||||
toggle.setTooltip(new Tooltip("Show a preview of the detection"));
|
||||
toggle.setMaxWidth(20);
|
||||
toggle.setMaxWidth(30);
|
||||
toggle.selectedProperty().addListener((obsVal, oldVal, newVal)->{
|
||||
this.layoutPane(newVal);
|
||||
this.getParent().layout(); //make sure the pop up actually lays out properly.
|
||||
});
|
||||
|
||||
PamHBox toggleBox = new PamHBox();
|
||||
toggleBox.setPadding(new Insets(5,5,5,5));
|
||||
toggleBox.setSpacing(5);
|
||||
toggleBox.getChildren().addAll(new Label("",PamGlyphDude.createPamIcon("mdi2c-chart-bell-curve", PamGuiManagerFX.iconSize)), toggle);
|
||||
|
||||
PamBorderPane toggleHolder = new PamBorderPane(toggle);
|
||||
toggleHolder.getStyleClass().add("square-button-trans");
|
||||
|
||||
toggleHolder.setPadding(new Insets(0,10,0,0));
|
||||
toggleHolder.prefWidthProperty().bind(menuPane.widthProperty());
|
||||
|
||||
PamHBox topMenu = new PamHBox();
|
||||
topMenu.getChildren().addAll(infoButton, toggleHolder);
|
||||
topMenu.setAlignment(Pos.CENTER);
|
||||
|
||||
PamBorderPane topMenu = new PamBorderPane();
|
||||
topMenu.setLeft(infoButton);
|
||||
topMenu.setRight(toggleBox);
|
||||
//topMenu.setAlignment(Pos.CENTER);
|
||||
|
||||
menuPane.getChildren().add(topMenu);
|
||||
|
||||
@ -503,11 +509,19 @@ public class TDMenuPane extends PamBorderPane {
|
||||
*/
|
||||
public void prepareDisplay(){
|
||||
|
||||
if (detectionSummary==null || detectionSummary.getDataList()==null) {
|
||||
currentDataUnit=null;
|
||||
if (detectionSummary==null || detectionSummary.getDataList()==null || detectionSummary.getDataList().size()==0) {
|
||||
setCurrentDataUnit(null);
|
||||
}
|
||||
else{ //show the first data unit;
|
||||
setCurrentDataUnit(currentDataUnit);
|
||||
else{
|
||||
/**
|
||||
* It's important to set the data unit explicitly here. This is because the listener
|
||||
* in the group display will return both the super detection and currently selected click
|
||||
* which can confuse the display, especially if the super detection has no associated data information
|
||||
* So when a new data unit is selected set it here so that it's defintely the selected data unit which
|
||||
* is showing in the menu pane.
|
||||
*/
|
||||
//show the first data unit;
|
||||
setCurrentDataUnit(this.detectionSummary.getDataList().get(0));
|
||||
this.detectionSummary.setFocusedIndex(0); //set focused to highlight data unit.
|
||||
}
|
||||
|
||||
@ -521,8 +535,8 @@ public class TDMenuPane extends PamBorderPane {
|
||||
/**
|
||||
* Set the data unit list.
|
||||
*/
|
||||
public void setDataUnitList(DetectionGroupSummary detectionGroupSummary, OverlayMarker overlayMarker, MouseEvent e){
|
||||
|
||||
public void setDataUnitList(DetectionGroupSummary detectionGroupSummary, OverlayMarker overlayMarker, MouseEvent e){
|
||||
|
||||
this.detectionSummary=detectionGroupSummary;
|
||||
this.overlayMarker=overlayMarker;
|
||||
this.currentMouseEvent = e;
|
||||
|
@ -528,6 +528,7 @@ public class DetectionGroupDisplay extends PamBorderPane {
|
||||
for (GroupDisplayListener aListener : displayListeners) {
|
||||
aListener.newDataUnitSelected(oldDataUnit, newDataUnit);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -4,6 +4,7 @@ import org.jamdev.jdl4pam.utils.DLMatFile;
|
||||
|
||||
import PamUtils.PamCalendar;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import pamMaths.PamVector;
|
||||
import us.hebi.matlab.mat.format.Mat5;
|
||||
import us.hebi.matlab.mat.types.Array;
|
||||
import us.hebi.matlab.mat.types.Matrix;
|
||||
@ -150,5 +151,25 @@ public abstract class MLDataUnitExport<T extends PamDataUnit<?, ?>> {
|
||||
public abstract String getName();
|
||||
|
||||
|
||||
/**
|
||||
* Get the bearings from the data unit. Note these are the angles that are rotated to real workd vectors.
|
||||
* @param dataUnit- data unit.
|
||||
* @return the angles in RADIANS.
|
||||
*/
|
||||
public static double[] realWordlVec2Angles(PamDataUnit dataUnit) {
|
||||
//bearing
|
||||
PamVector[] vector = dataUnit.getLocalisation().getRealWorldVectors();
|
||||
double bearing = PamVector.vectorToSurfaceBearing(vector[0]);
|
||||
|
||||
|
||||
//pitch
|
||||
double x = vector[0].getElement(0);
|
||||
double y = vector[0].getElement(1);
|
||||
double z = vector[0].getElement(2);
|
||||
x = Math.sqrt(x*x+y*y);
|
||||
double pitch = Math.atan2(z,x);
|
||||
|
||||
return new double[] {bearing, pitch};
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import org.jamdev.jdl4pam.utils.DLMatFile;
|
||||
import PamUtils.PamUtils;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import PamguardMVC.RawDataHolder;
|
||||
import pamMaths.PamVector;
|
||||
import us.hebi.matlab.mat.format.Mat5;
|
||||
import us.hebi.matlab.mat.types.Matrix;
|
||||
import us.hebi.matlab.mat.types.Struct;
|
||||
@ -20,11 +21,11 @@ public class MLRawExport extends MLDataUnitExport<PamDataUnit<?,?>>{
|
||||
public Struct addDetectionSpecificFields(Struct mlStruct, int index, PamDataUnit dataUnit) {
|
||||
|
||||
RawDataHolder rawDataHolder = (RawDataHolder) dataUnit;
|
||||
|
||||
|
||||
//the waveform
|
||||
Matrix wave = DLMatFile.array2Matrix(rawDataHolder.getWaveData());
|
||||
|
||||
|
||||
|
||||
//the number of channels
|
||||
Matrix nChan = Mat5.newScalar(PamUtils.getNumChannels(dataUnit.getChannelBitmap()));
|
||||
|
||||
@ -67,4 +68,5 @@ public class MLRawExport extends MLDataUnitExport<PamDataUnit<?,?>>{
|
||||
return "raw_data_units";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -11,9 +11,12 @@ public class RClickEventExport extends RSuperDetectionExport{
|
||||
super(mlDetectionsManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NamedBuilder addDetectionSpecificFields(NamedBuilder rData, SuperDetection dataUnit, int index) {
|
||||
super.addDetectionSpecificFields(rData, dataUnit, index);
|
||||
|
||||
OfflineEventDataUnit clickEvent = (OfflineEventDataUnit) dataUnit;
|
||||
|
||||
|
||||
rData.add("event_id", clickEvent.getEventId());
|
||||
rData.add("event_type", clickEvent.getEventType());
|
||||
|
@ -94,6 +94,8 @@ public class RExportManager implements PamDataUnitExporter {
|
||||
private void writeRFile() {
|
||||
Context context = Context.newTopLevelContext();
|
||||
try {
|
||||
|
||||
if (allData!=null) {
|
||||
|
||||
FileOutputStream fos = new FileOutputStream(currentFileName);
|
||||
GZIPOutputStream zos = new GZIPOutputStream(fos);
|
||||
@ -103,6 +105,8 @@ public class RExportManager implements PamDataUnitExporter {
|
||||
writer.save(allData.build());
|
||||
writer.close();
|
||||
zos.close();
|
||||
allData=null; //prevents writing the file again and again if offline end export is called.
|
||||
}
|
||||
}
|
||||
catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
@ -190,6 +194,8 @@ public class RExportManager implements PamDataUnitExporter {
|
||||
//check whether the same.
|
||||
if (rDataExport.get(i).getUnitClass().isAssignableFrom(dataUnits.get(j).getClass()) && !alreadyStruct[j]) {
|
||||
dataList=rDataExport.get(i).detectionToStruct(dataUnits.get(j), n);
|
||||
|
||||
//System.out.println("Export data unit: " + rDataExport.get(i).getName());
|
||||
//dataListArray.add((rDataExport.get(i).getName() + "_" + dataUnits.get(j).getUID()), dataList);
|
||||
// format used in PAMBinaries
|
||||
dataListArray.add(String.valueOf(dataUnits.get(j).getUID()), dataList);
|
||||
|
@ -9,6 +9,8 @@ import PamguardMVC.RawDataHolder;
|
||||
import org.renjin.sexp.ListVector.NamedBuilder;
|
||||
|
||||
import clickDetector.ClickDetection;
|
||||
import export.MLExport.MLDataUnitExport;
|
||||
import pamMaths.PamVector;
|
||||
|
||||
public class RRawExport extends RDataUnitExport<PamDataUnit<?,?>> {
|
||||
|
||||
@ -39,7 +41,18 @@ public class RRawExport extends RDataUnitExport<PamDataUnit<?,?>> {
|
||||
//time delay stuff.
|
||||
if (dataUnit.getLocalisation()!=null) {
|
||||
//bearing angles
|
||||
rData.add("angles", dataUnit.getLocalisation().getAngles() == null ? new DoubleArrayVector(0.) : new DoubleArrayVector(dataUnit.getLocalisation().getAngles()));
|
||||
if (dataUnit.getLocalisation().getRealWorldVectors() != null) {
|
||||
|
||||
double[] angles = MLDataUnitExport.realWordlVec2Angles(dataUnit);
|
||||
|
||||
rData.add("angles", new DoubleArrayVector(angles));
|
||||
|
||||
}
|
||||
else {
|
||||
rData.add("angles", new DoubleArrayVector(0.));
|
||||
}
|
||||
//bearing angles
|
||||
rData.add("angles", dataUnit.getLocalisation().getRealWorldVectors() == null ? new DoubleArrayVector(0.) : new DoubleArrayVector(dataUnit.getLocalisation().getAngles()));
|
||||
//angle errors
|
||||
rData.add("angleErrors", dataUnit.getLocalisation().getAngleErrors() == null? new DoubleArrayVector(0.) : new DoubleArrayVector(dataUnit.getLocalisation().getAngleErrors()));
|
||||
}
|
||||
|
@ -24,11 +24,10 @@ public class RSuperDetectionExport extends RDataUnitExport<SuperDetection>{
|
||||
//We create a struct within a struct within a struct here...
|
||||
SuperDetection superDetection = (SuperDetection) dataUnit;
|
||||
|
||||
ListVector.NamedBuilder dataUnits = new ListVector.NamedBuilder(); ;
|
||||
|
||||
ListVector.NamedBuilder dataUnits = new ListVector.NamedBuilder();
|
||||
|
||||
//now iterate through the data units and add data units to the struct.
|
||||
|
||||
|
||||
//vital to clone this or we mess up all the data units in PAMGuard!
|
||||
ArrayList<PamDataUnit> subDataUnits = (ArrayList<PamDataUnit>) superDetection.getSubDetections().clone();
|
||||
|
||||
@ -51,8 +50,15 @@ public class RSuperDetectionExport extends RDataUnitExport<SuperDetection>{
|
||||
|
||||
//add to the struct.
|
||||
datasUnitsStruct= exporter.detectionToStruct(subDataUnits.get(i), n);
|
||||
dataUnits.add(exporter.getName(), datasUnitsStruct);
|
||||
|
||||
|
||||
System.out.println("Save sub det: " + subDataUnits.get(i).getUID());
|
||||
|
||||
//must be named differently
|
||||
dataUnits.add((exporter.getName() + "_" + subDataUnits.get(i).getUID()) , datasUnitsStruct);
|
||||
|
||||
savedUnits.add(subDataUnits.get(i));
|
||||
|
||||
n++;
|
||||
}
|
||||
}
|
||||
@ -65,6 +71,7 @@ public class RSuperDetectionExport extends RDataUnitExport<SuperDetection>{
|
||||
|
||||
}
|
||||
|
||||
|
||||
rData.add("subdetections", dataUnits);
|
||||
rData.add("nsubdet", superDetection.getSubDetectionsCount());
|
||||
|
||||
|
@ -44,6 +44,8 @@ public class ExportTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
*/
|
||||
@Override
|
||||
public void prepareTask() {
|
||||
//save all data before exporting!
|
||||
PamController.getInstance().saveViewerData();
|
||||
exporter.perpareExport();
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,9 @@ package generalDatabase.lookupTables;
|
||||
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.FocusEvent;
|
||||
@ -23,6 +26,10 @@ import javax.swing.JPopupMenu;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import PamView.dialog.PamDialog;
|
||||
import PamView.dialog.SettingsButton;
|
||||
import PamView.panel.PamPanel;
|
||||
|
||||
/**
|
||||
* Lookup component to go in dialogs, Logger forms, etc.
|
||||
* <p> Has the look and feel of Logger drop down boxes but
|
||||
@ -86,12 +93,33 @@ public class LookupComponent {
|
||||
|
||||
this.lookupTopic = lookupTopic;
|
||||
|
||||
mainPanel = new JPanel();
|
||||
mainPanel = new PamPanel();
|
||||
mainPanel.setLayout(new BorderLayout());
|
||||
|
||||
PamPanel eventPanel = new PamPanel(new GridBagLayout());
|
||||
GridBagConstraints c = new GridBagConstraints();
|
||||
c.gridy=0;
|
||||
c.gridx=0;
|
||||
c.insets = new Insets(0,0,0,5);
|
||||
|
||||
|
||||
westPanel = new JPanel(new BorderLayout());
|
||||
westPanel.add(BorderLayout.CENTER, codeField = new JTextField(5));
|
||||
mainPanel.add(BorderLayout.CENTER, comboBox = new JComboBox());
|
||||
mainPanel.add(BorderLayout.WEST, westPanel);
|
||||
c.gridx++;
|
||||
|
||||
PamDialog.addComponent(eventPanel, westPanel, c);
|
||||
c.gridx++;
|
||||
|
||||
PamDialog.addComponent(eventPanel, comboBox = new JComboBox(), c);
|
||||
c.gridx++;
|
||||
|
||||
SettingsButton editButton = new SettingsButton();
|
||||
editButton.addActionListener(new EditList());
|
||||
PamDialog.addComponent(eventPanel, editButton, c);
|
||||
|
||||
|
||||
|
||||
mainPanel.add(BorderLayout.CENTER, eventPanel);
|
||||
|
||||
|
||||
comboBox.addActionListener(new ListActionListener());
|
||||
|
@ -48,6 +48,7 @@ public class LtsaDataBlock extends FFTDataBlock {
|
||||
*As for getOfflineData, overrride this.
|
||||
*/
|
||||
loadViewerData(new OfflineDataLoadInfo(startMillis, endMillis), null);
|
||||
|
||||
// now send all the data to the observer (the spectrogram)
|
||||
// so that it redraws in the same way it does for real fft data.
|
||||
synchronized (getSynchLock()) {
|
||||
|
@ -77,7 +77,7 @@ public class GroupedSourcePaneFX extends SourcePaneFX {
|
||||
|
||||
//sourcePane.setStyle("-fx-background-color: green");
|
||||
|
||||
Label titleLabel = new Label(getBorderTitle());
|
||||
titleLabel = new Label(getBorderTitle());
|
||||
PamGuiManagerFX.titleFont2style(titleLabel);
|
||||
// titleLabel.setFont(PamGuiManagerFX.titleFontSize2);
|
||||
sourcePane.add(titleLabel,0,0);
|
||||
@ -430,5 +430,7 @@ public class GroupedSourcePaneFX extends SourcePaneFX {
|
||||
public Pane getChannelPane() {
|
||||
return channelPanel;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ public class SourcePaneFX extends PamBorderPane {
|
||||
/**
|
||||
* The title labe. Sits above the combo box.
|
||||
*/
|
||||
private Label titleLabel;
|
||||
protected Label titleLabel;
|
||||
|
||||
/**
|
||||
* Validator for channels
|
||||
@ -859,4 +859,20 @@ public class SourcePaneFX extends PamBorderPane {
|
||||
return channelValidator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the title.
|
||||
* @param titleString - the title text
|
||||
*/
|
||||
public void setTitleText(String titleString) {
|
||||
titleLabel.setText(titleString);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clear the source types.
|
||||
*/
|
||||
public void clearSourceTypeList() {
|
||||
this.sourceType.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,9 @@
|
||||
package pamViewFX.validator;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.synedra.validatorfx.ValidationMessage;
|
||||
import net.synedra.validatorfx.Validator;
|
||||
|
||||
/**
|
||||
@ -14,4 +18,25 @@ public class PamValidator extends Validator {
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
/**
|
||||
* Create one string from a list of error messages.
|
||||
* @param messages - the list of error messages
|
||||
* @return
|
||||
*/
|
||||
public static String list2String(List<ValidationMessage> messages) {
|
||||
String string = "";
|
||||
|
||||
//grab only unique messages
|
||||
List<ValidationMessage> uniqueMessages = messages.stream()
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
for (ValidationMessage msg:uniqueMessages) {
|
||||
System.out.println(msg);
|
||||
string += msg.getText() + "\n";
|
||||
}
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -25,13 +25,14 @@ import PamguardMVC.PamRawDataBlock;
|
||||
import PamguardMVC.dataSelector.DataSelector;
|
||||
import ai.djl.engine.Engine;
|
||||
import annotation.handler.AnnotationHandler;
|
||||
import clickTrainDetector.layout.ClickTrainSymbolManager;
|
||||
import dataPlotsFX.data.TDDataProviderRegisterFX;
|
||||
import dataPlotsFX.data.generic.GenericDataPlotProvider;
|
||||
import detectionPlotFX.data.DDPlotRegister;
|
||||
import generalDatabase.DBControlUnit;
|
||||
import generalDatabase.SQLLoggingAddon;
|
||||
import pamScrollSystem.AbstractScrollManager;
|
||||
import pamViewFX.fxNodes.pamDialogFX.PamDialogFX2AWT;
|
||||
import rawDeepLearningClassifier.dataPlotFX.DLDetectionPlotProvider;
|
||||
import rawDeepLearningClassifier.dataPlotFX.DLGroupSymbolManager;
|
||||
import rawDeepLearningClassifier.dataPlotFX.DLPredictionProvider;
|
||||
import rawDeepLearningClassifier.ddPlotFX.RawDLDDPlotProvider;
|
||||
import rawDeepLearningClassifier.defaultModels.DLDefaultModelManager;
|
||||
@ -59,6 +60,7 @@ import rawDeepLearningClassifier.logging.DLDetectionDatagram;
|
||||
import rawDeepLearningClassifier.logging.DLGroupDetectionLogging;
|
||||
import rawDeepLearningClassifier.logging.DLGroupSubLogging;
|
||||
import rawDeepLearningClassifier.logging.DLResultBinarySource;
|
||||
import rawDeepLearningClassifier.logging.DLResultLogging;
|
||||
import rawDeepLearningClassifier.offline.DLOfflineProcess;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterProcess;
|
||||
|
||||
@ -184,6 +186,18 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
* The binary data source for detection data
|
||||
*/
|
||||
private DLDetectionBinarySource dlDetectionBinarySource;
|
||||
|
||||
/**
|
||||
* DL Group detection logging to database
|
||||
*/
|
||||
private DLGroupDetectionLogging dlGroupDetLogging;
|
||||
|
||||
|
||||
/**
|
||||
* Logging for raw predictions to database
|
||||
*/
|
||||
private DLResultLogging dlResultLogging;
|
||||
|
||||
|
||||
/**
|
||||
* The DL offline process.
|
||||
@ -213,10 +227,13 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
*/
|
||||
private DLDefaultModelManager defaultModelManager;
|
||||
|
||||
|
||||
/**
|
||||
* DL Group detection logging.
|
||||
* If true then detections are saved to a group and all detections within a segment are then
|
||||
* passed to the deep learning classifier.
|
||||
*/
|
||||
private DLGroupDetectionLogging dlGroupDetLogging;
|
||||
private boolean groupDetections = false;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -245,7 +262,8 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
|
||||
// classify the raw data segments.
|
||||
addPamProcess(dlClassifyProcess = new DLClassifyProcess(this, segmenterProcess.getSegmenterDataBlock()));
|
||||
dlClassifyProcess.addMultiPlexDataBlock(segmenterProcess.getSegmenteGrouprDataBlock());
|
||||
//also add group data - rare to have to into datablocks but this will work.
|
||||
dlClassifyProcess.addMultiPlexDataBlock(segmenterProcess.getSegmenteGroupDataBlock());
|
||||
|
||||
//manages the names assigned to different output classes.
|
||||
dlClassNameManager = new DLClassNameManager(this);
|
||||
@ -260,6 +278,7 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
// add storage options etc.
|
||||
dlBinaryDataSource = new DLResultBinarySource(dlClassifyProcess);
|
||||
dlClassifyProcess.getDLPredictionDataBlock().setBinaryDataSource(dlBinaryDataSource);
|
||||
dlClassifyProcess.getDLPredictionDataBlock().SetLogging(dlResultLogging = new DLResultLogging(this, dlClassifyProcess.getDLPredictionDataBlock()));
|
||||
dlClassifyProcess.getDLPredictionDataBlock().setDatagramProvider(new DLDataUnitDatagram(this));
|
||||
|
||||
dlDetectionBinarySource = new DLDetectionBinarySource(this, dlClassifyProcess.getDLDetectionDatablock());
|
||||
@ -269,6 +288,9 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
// //set database logging for group detections
|
||||
dlClassifyProcess.getDLGroupDetectionDataBlock().SetLogging(dlGroupDetLogging = new DLGroupDetectionLogging(this, dlClassifyProcess.getDLGroupDetectionDataBlock()));
|
||||
dlGroupDetLogging.setSubLogging(new DLGroupSubLogging(dlGroupDetLogging, dlClassifyProcess.getDLGroupDetectionDataBlock()));
|
||||
// int maxndays = 1; //maximum days to load.
|
||||
// AbstractScrollManager.getScrollManager().addToSpecialDatablock(dlClassifyProcess.getDLGroupDetectionDataBlock(), maxndays*24*60*60*1000L , maxndays*24*60*60*1000L);
|
||||
|
||||
|
||||
//a little strange this is not automatic but seems you have to add SQL add ons explicitly.
|
||||
AnnotationHandler annotationHandler = dlClassifyProcess.getDLGroupDetectionDataBlock().getAnnotationHandler();
|
||||
@ -290,12 +312,14 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
overlayGraphics = new DLDetectionGraphics(dlClassifyProcess.getDLGroupDetectionDataBlock());
|
||||
overlayGraphics.setDetectionData(true);
|
||||
dlClassifyProcess.getDLGroupDetectionDataBlock().setOverlayDraw(overlayGraphics);
|
||||
|
||||
|
||||
//set the symbol managers.
|
||||
dlClassifyProcess.getDLDetectionDatablock()
|
||||
.setPamSymbolManager(new DLSymbolManager(this, dlClassifyProcess.getDLDetectionDatablock()));
|
||||
dlClassifyProcess.getDLGroupDetectionDataBlock()
|
||||
.setPamSymbolManager(new StandardSymbolManager( dlClassifyProcess.getDLGroupDetectionDataBlock(), new SymbolData()));
|
||||
|
||||
dlClassifyProcess.getDLGroupDetectionDataBlock().setPamSymbolManager(new DLGroupSymbolManager(dlClassifyProcess.getDLGroupDetectionDataBlock()));
|
||||
|
||||
dlClassifyProcess.getDLPredictionDataBlock()
|
||||
.setPamSymbolManager(new PredictionSymbolManager(this, dlClassifyProcess.getDLDetectionDatablock()));
|
||||
|
||||
@ -664,7 +688,7 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
//create the data selector
|
||||
//System.out.println("Data selector: " + dataSelector);
|
||||
if (source!=null) {
|
||||
dataSelector=source.getDataSelectCreator().getDataSelector(this.getUnitName() +"_clicks", false, null);
|
||||
dataSelector=source.getDataSelectCreator().getDataSelector(this.getUnitName() +"_" + source.getDataName(), false, null);
|
||||
//System.out.println("Data selector: " + dataSelector);
|
||||
}
|
||||
else {
|
||||
@ -698,6 +722,28 @@ public class DLControl extends PamControlledUnit implements PamSettings {
|
||||
return this.defaultModelManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether group detections are being used.
|
||||
* If true then detections are saved to a group and all detections within a segment are then
|
||||
* passed to the deep learning classifier.
|
||||
*/
|
||||
public boolean isGroupDetections() {
|
||||
return groupDetections;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether to use group detections.
|
||||
* If true then detections are saved to a group and all detections within a segment are then
|
||||
* passed to the deep learning classifier.
|
||||
* @param groupDetections - true to use group detections.
|
||||
*/
|
||||
public void setGroupDetections(boolean groupDetections) {
|
||||
this. groupDetections=groupDetections;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -8,7 +8,8 @@ public enum DLStatus {
|
||||
FILE_NULL("The input file is null",
|
||||
"The loaded file was null. If the file was download it may not have downloaded properly.", ErrorLevel.ERROR),
|
||||
|
||||
MODEL_LOAD_FAILED("The model failed to load",
|
||||
//generic error when something has gone wrong.
|
||||
MODEL_LOAD_FAIL("The model failed to load",
|
||||
" The model failed to load - this could be because it is incompatible with PAMGuard or an uknown file format.",
|
||||
ErrorLevel.ERROR),
|
||||
|
||||
@ -38,7 +39,11 @@ public enum DLStatus {
|
||||
|
||||
DECOMPRESSING_MODEL("Decompressing model", "Decompressing the model file", ErrorLevel.NO_ERROR),
|
||||
|
||||
INCOMPATIBLE_ZIP("Incorrect Zip format", "The zip format is incorrect. The zip file should have a *.pgdl file in the parent directory along with either a Tensorflow or PyTorch model.", ErrorLevel.ERROR), ;
|
||||
INCOMPATIBLE_ZIP("Incorrect Zip format", "The zip format is incorrect. The zip file should have a *.pgdl file in the parent directory along with either a Tensorflow or PyTorch model.", ErrorLevel.ERROR),
|
||||
|
||||
MODEL_ENGINE_FAIL("Deep learning engine failure", "The deep learning engine was not able to load. It is likely PAMGuard could not download the relevent libraries. Visit www.pamguard.org/deeplearning for a work around.", ErrorLevel.ERROR),
|
||||
|
||||
MODEL_META_FAIL("Model metadata failure", "PAMGuard could not locte the metadata within the model. if this is a custom model ensure the associated .pgdl file is present and JSON valid", ErrorLevel.ERROR);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -68,7 +68,7 @@ public class RawDLParams implements Serializable, Cloneable {
|
||||
* contain a raw data chunk e.g. raw data, clicks, clips etc. By default the
|
||||
* classifier saves new data units if the source is raw data. However, if the
|
||||
* data unit is an already processed data unit, e.g. a click detection, then the
|
||||
* results are saved as an annotation to that unit. If forceSave is st true then
|
||||
* results are saved as an annotation to that unit. If forceSave is set true then
|
||||
* new data units are created no matter what the source data is.
|
||||
*/
|
||||
public boolean forceSave = false;
|
||||
@ -95,7 +95,7 @@ public class RawDLParams implements Serializable, Cloneable {
|
||||
* data without messing up all the other classified detections which have used
|
||||
* that module. So store the data in binary files? That is super inefficient as
|
||||
* the same string is stored many times. So instead store a short which
|
||||
* identifies the string that sits in this table. Everytime a new model is added
|
||||
* identifies the string that sits in this table. Every time a new model is added
|
||||
* add new classnames. Note that this means we have a maximum of 32k names - we
|
||||
* will come to that issue when it arises...
|
||||
*/
|
||||
|
@ -4,15 +4,24 @@ import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
|
||||
import PamView.GeneralProjector.ParameterType;
|
||||
import PamguardMVC.PamDataBlock;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import dataPlotsFX.data.TDDataProviderFX;
|
||||
import dataPlotsFX.data.generic.GenericDataPlotInfo;
|
||||
import dataPlotsFX.data.generic.GenericSettingsPane;
|
||||
import dataPlotsFX.layout.TDGraphFX;
|
||||
import dataPlotsFX.projector.TDProjectorFX;
|
||||
import javafx.scene.Node;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.shape.Polygon;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dlClassification.DLGroupDetection;
|
||||
|
||||
|
||||
/**
|
||||
* Plot results from deep learning group detections.
|
||||
*/
|
||||
public class DLGroupDetectionInfoFX extends GenericDataPlotInfo {
|
||||
|
||||
|
||||
@ -28,7 +37,54 @@ public class DLGroupDetectionInfoFX extends GenericDataPlotInfo {
|
||||
}
|
||||
((GenericSettingsPane) this.getGraphSettingsPane()).setShowingName("Deep Learning Group Detections");
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see dataPlotsFX.data.TDDataInfoFX#drawDataUnit(int, PamguardMVC.PamDataUnit, javafx.scene.canvas.GraphicsContext, long, dataPlotsFX.projector.TDProjectorFX, int)
|
||||
*/
|
||||
@Override
|
||||
public Polygon drawDataUnit(int plotNumber, PamDataUnit pamDataUnit, GraphicsContext g, double scrollStart,
|
||||
TDProjectorFX tdProjector, int type) {
|
||||
|
||||
if (getCurrentScaleInfo().getDataType() == ParameterType.FREQUENCY) { // frequency data !
|
||||
// System.out.println("Draw frequency: " + pamDataUnit.getFrequency()[0] + " " + pamDataUnit.getFrequency()[1]);
|
||||
return drawFrequencyData(plotNumber, pamDataUnit, g, scrollStart, tdProjector, type);
|
||||
}
|
||||
else if (getCurrentScaleInfo().getDataType() == ParameterType.AMPLITUDE || getCurrentScaleInfo().getDataType() == ParameterType.AMPLITUDE_STEM) {
|
||||
// System.out.println("Draw amplitude: ");
|
||||
double[] amplitudes = getAmplitudes(pamDataUnit);
|
||||
return super.drawBoxData(plotNumber, pamDataUnit, amplitudes, g, scrollStart, tdProjector, type);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amplitude for a group data unit - this is the highest and lowest amplitude.
|
||||
* @param pamDataUnit - the data unit.
|
||||
* @return amplitude limits in dB.
|
||||
*/
|
||||
private double[] getAmplitudes(PamDataUnit pamDataUnit) {
|
||||
|
||||
double[] amplitudes = new double[2];
|
||||
amplitudes[0] = Double.POSITIVE_INFINITY;
|
||||
amplitudes[1] = Double.NEGATIVE_INFINITY;
|
||||
|
||||
DLGroupDetection groupDetection = (DLGroupDetection) pamDataUnit;
|
||||
|
||||
double amp;
|
||||
for (int i=0; i<groupDetection.getSubDetectionsCount(); i++) {
|
||||
amp = groupDetection.getSubDetection(i).getAmplitudeDB();
|
||||
|
||||
if (amp>amplitudes[1]) {
|
||||
amplitudes[1] = amp;
|
||||
}
|
||||
|
||||
if (amp<amplitudes[0]) {
|
||||
amplitudes[0] = amp;
|
||||
}
|
||||
}
|
||||
|
||||
return amplitudes;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,33 @@
|
||||
package rawDeepLearningClassifier.dataPlotFX;
|
||||
|
||||
import PamView.symbol.PamSymbolChooser;
|
||||
import PamView.symbol.StandardSymbolManager;
|
||||
import PamguardMVC.PamDataBlock;
|
||||
import detectiongrouplocaliser.DetectionGroupGraphics;
|
||||
|
||||
public class DLGroupSymbolManager extends StandardSymbolManager {
|
||||
|
||||
public DLGroupSymbolManager(PamDataBlock pamDataBlock2) {
|
||||
super(pamDataBlock2, DetectionGroupGraphics.defaultSymbol);
|
||||
setSpecialColourName("DL Detection Group");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void addSymbolModifiers(PamSymbolChooser psc) {
|
||||
super.addSymbolModifiers(psc);
|
||||
|
||||
//add the peak frequency modifier that allows clicks to be coloured by peak frequency.
|
||||
psc.addSymbolModifier(new DLGroupSymbolModifier(psc));
|
||||
|
||||
// we can also add some default behaviour here to match the old behaviour
|
||||
// these will get overridden once user options are set, but it's good to give defaults.
|
||||
// SymbolModifier eventMod = psc.hasSymbolModifier(SuperDetSymbolModifier.class);
|
||||
// if (eventMod != null) {
|
||||
// eventMod.getSymbolModifierParams().modBitMap = (SymbolModType.FILLCOLOUR | SymbolModType.LINECOLOUR);
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package rawDeepLearningClassifier.dataPlotFX;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import PamView.GeneralProjector;
|
||||
import PamView.PamColors;
|
||||
import PamView.PamSymbolType;
|
||||
import PamView.symbol.PamSymbolChooser;
|
||||
import PamView.symbol.SymbolData;
|
||||
import PamView.symbol.modifier.SymbolModType;
|
||||
import PamView.symbol.modifier.SymbolModifier;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
|
||||
/**
|
||||
* Symbol modifier for DL groups
|
||||
*/
|
||||
public class DLGroupSymbolModifier extends SymbolModifier {
|
||||
|
||||
public final static String CLICK_TRAIN_MODIFIER_NAME = "Colour by DL Group";
|
||||
|
||||
|
||||
public DLGroupSymbolModifier(PamSymbolChooser symbolChooser) {
|
||||
super(CLICK_TRAIN_MODIFIER_NAME, symbolChooser, SymbolModType.FILLCOLOUR | SymbolModType.LINECOLOUR );
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public SymbolData getSymbolData(GeneralProjector projector, PamDataUnit dataUnit) {
|
||||
|
||||
SymbolData symbolData=new SymbolData();
|
||||
symbolData.symbol=PamSymbolType.SYMBOL_CIRCLE;
|
||||
|
||||
Color col = PamColors.getInstance().getWhaleColor(dataUnit.getColourIndex());
|
||||
symbolData.setFillColor(col);
|
||||
symbolData.setLineColor(col);
|
||||
|
||||
return symbolData;
|
||||
}
|
||||
|
||||
}
|
@ -313,6 +313,7 @@ public class DLSymbolOptionPane extends StandardSymbolModifierPane {
|
||||
|
||||
private int checkClassNamesBox(DLSymbolModifierParams symbolOptions, ComboBox<String> classNameBox) {
|
||||
|
||||
if (dlSymbolModifier.getDLAnnotType().getDlControl().getDLModel()==null) return 0;
|
||||
DLClassName[] classNames = dlSymbolModifier.getDLAnnotType().getDlControl().getDLModel().getClassNames();
|
||||
|
||||
// for (int i =0; i<classNames.length; i++) {
|
||||
|
@ -206,11 +206,28 @@ public class DLSymbolOptionPanel implements PamDialogPanel, ActionListener {
|
||||
* @param symbolOptions - the symbol options
|
||||
*/
|
||||
private void setPredictionColParams(DLSymbolModifierParams symbolOptions) {
|
||||
|
||||
if (symbolOptions.clims[0]==symbolOptions.clims[1]) {
|
||||
|
||||
if (symbolOptions.clims[0]>0 && symbolOptions.clims[0]<1.) {
|
||||
symbolOptions.clims[0]=symbolOptions.clims[0]-0.1;
|
||||
symbolOptions.clims[0]=symbolOptions.clims[0]+0.1;
|
||||
}
|
||||
else {
|
||||
symbolOptions.clims[0] = 0.1;
|
||||
symbolOptions.clims[1] = 0.9;
|
||||
}
|
||||
}
|
||||
|
||||
//System.out.println("Set upper value: " + symbolOptions.clims[0] + " " + symbolOptions.clims[1]);
|
||||
|
||||
//now set frequency parameters
|
||||
colorRangeSlider.setValue((int) symbolOptions.clims[0]*100);
|
||||
colorRangeSlider.setUpperValue((int) symbolOptions.clims[1]*100);
|
||||
colorRangeSlider.setValue((int) (symbolOptions.clims[0]*100));
|
||||
colorRangeSlider.setUpperValue((int) (symbolOptions.clims[1]*100));
|
||||
// colorRangeSlider.setColourArrayType( symbolOptions.colArray);
|
||||
|
||||
//System.out.println("Set upper value: " + colorRangeSlider.getValue() + " " + colorRangeSlider.getUpperValue());
|
||||
|
||||
|
||||
colorRangeSlider.setColourMap(PamUtilsFX.fxColArray2Swing(symbolOptions.colArray));
|
||||
|
||||
|
@ -27,6 +27,7 @@ public class DLDefaultModelManager {
|
||||
defaultModels.add(new RightWhaleModel1());
|
||||
defaultModels.add(new HumpbackWhaleGoogle());
|
||||
defaultModels.add(new HumpbackWhaleAtlantic());
|
||||
defaultModels.add(new MultiSpeciesGoogle());
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
package rawDeepLearningClassifier.defaultModels;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.jamdev.jdl4pam.transforms.DLTransformsFactory;
|
||||
@ -13,7 +11,6 @@ import org.jamdev.jdl4pam.transforms.SimpleTransformParams;
|
||||
import org.jamdev.jdl4pam.transforms.DLTransform.DLTransformType;
|
||||
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassName;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.GenericModelParams;
|
||||
import rawDeepLearningClassifier.layoutFX.exampleSounds.ExampleSoundFactory.ExampleSoundType;
|
||||
|
||||
|
@ -0,0 +1,111 @@
|
||||
package rawDeepLearningClassifier.defaultModels;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.jamdev.jdl4pam.transforms.DLTransformsFactory;
|
||||
import org.jamdev.jdl4pam.transforms.DLTransfromParams;
|
||||
import org.jamdev.jdl4pam.transforms.SimpleTransformParams;
|
||||
import org.jamdev.jdl4pam.transforms.DLTransform.DLTransformType;
|
||||
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassName;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.GenericModelParams;
|
||||
import rawDeepLearningClassifier.layoutFX.exampleSounds.ExampleSoundFactory.ExampleSoundType;
|
||||
|
||||
/**
|
||||
* Atlantic version of Google's humpback whale network.
|
||||
*/
|
||||
public class MultiSpeciesGoogle implements DLModel {
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "A model developed by Google to detect multiple cetacean species including Humpback, Minke, Bryde's, Blue, Fin and Right whales alongside Orca whistle, calls and echolocation clicks.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Multi Species Google";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCitation() {
|
||||
return "Allen, A.N. et al. (2024) ‘Bryde’s whales produce Biotwang calls, which occur seasonally in long-term acoustic recordings from the central and western North Pacific’, Frontiers in Marine Science, 11, p. 1394695";
|
||||
}
|
||||
|
||||
@Override
|
||||
public URI getModelURI() {
|
||||
try {
|
||||
// return new URI("https://github.com/PAMGuard/deeplearningmodels/raw/master/humpback_whale_2/humpback_whale_2.zip");
|
||||
return new URI("https://github.com/PAMGuard/deeplearningmodels/releases/download/1.0/multispecies-whale-tensorflow2-default-v2.zip");
|
||||
} catch (URISyntaxException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getModelName() {
|
||||
return "saved_model.pb";
|
||||
}
|
||||
|
||||
@Override
|
||||
public URI getCitationLink() {
|
||||
try {
|
||||
return new URI("https://doi.org/10.3389/fmars.2024.1394695 ");
|
||||
} catch (URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParams(Serializable dlModelSettings) {
|
||||
GenericModelParams genericModelParams = (GenericModelParams) dlModelSettings;
|
||||
|
||||
//decimation value
|
||||
float sr = 24000;
|
||||
|
||||
//create the transforms.
|
||||
ArrayList<DLTransfromParams> dlTransformParamsArr = new ArrayList<DLTransfromParams>();
|
||||
|
||||
dlTransformParamsArr.add(new SimpleTransformParams(DLTransformType.DECIMATE_SCIPY, sr));
|
||||
|
||||
genericModelParams.dlTransfromParams = dlTransformParamsArr;
|
||||
|
||||
genericModelParams.defaultSegmentLen = 5. * 1000.;
|
||||
genericModelParams.binaryClassification = new boolean[] {true};
|
||||
genericModelParams.classNames= new DLClassName[] {
|
||||
new DLClassName("Oo", (short) 0),
|
||||
new DLClassName("Mn", (short) 1),
|
||||
new DLClassName("Eg", (short) 2),
|
||||
new DLClassName("Be", (short) 3),
|
||||
new DLClassName("Upcall", (short) 4),
|
||||
new DLClassName("Bp", (short) 5),
|
||||
new DLClassName("Call", (short) 6),
|
||||
new DLClassName("Gunshot", (short) 7),
|
||||
new DLClassName("Echolocation", (short) 8),
|
||||
new DLClassName("Bm", (short) 9),
|
||||
new DLClassName("Whistle", (short) 10),
|
||||
new DLClassName("Ba", (short) 12),
|
||||
};
|
||||
genericModelParams.numClasses = genericModelParams.classNames.length;
|
||||
|
||||
genericModelParams.defaultShape= new Long[] {-1L,-1L,-1L,1L};
|
||||
genericModelParams.shape= new Long[] {-1L,-1L,-1L,1L};
|
||||
genericModelParams.outputShape = new Long[] {-1L,12L};
|
||||
|
||||
|
||||
//create the transforms.
|
||||
genericModelParams.dlTransfroms = DLTransformsFactory.makeDLTransforms((ArrayList<DLTransfromParams>)genericModelParams.dlTransfromParams);
|
||||
|
||||
genericModelParams.setExampleSound(ExampleSoundType.HUMPBACK_WHALE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -36,14 +36,14 @@ public interface DLClassiferModel {
|
||||
public ArrayList<? extends PredictionResult> runModel(ArrayList<? extends PamDataUnit> rawDataUnit);
|
||||
|
||||
/**
|
||||
* Prepare the model. This is called on PAMGuard start up.
|
||||
* @param file
|
||||
* Prepare the model. This is called on PAMGuard start up and before processing in viewer mode.
|
||||
*/
|
||||
public void prepModel();
|
||||
|
||||
/**
|
||||
* Called whenever PAMGuard stops.
|
||||
* @return
|
||||
* Set and load the model.
|
||||
* @return the status of the model e.g. if there has been an error loading
|
||||
*
|
||||
*/
|
||||
public DLStatus setModel(URI model);
|
||||
|
||||
@ -99,6 +99,14 @@ public interface DLClassiferModel {
|
||||
* @return reference to the DL control.
|
||||
*/
|
||||
public DLControl getDLControl();
|
||||
|
||||
|
||||
/**
|
||||
* Get the allowed data types for the model.The can be null in which case only data units
|
||||
* with raw data are allowed.
|
||||
* @return a list of the allowed data types.
|
||||
*/
|
||||
public ArrayList<Class> getAllowedDataTypes();
|
||||
|
||||
/**
|
||||
* Check whether a model has been selected and can be loaded successfully.
|
||||
|
@ -14,6 +14,7 @@ import PamguardMVC.PamDataUnit;
|
||||
import PamguardMVC.PamInstantProcess;
|
||||
import PamguardMVC.PamObservable;
|
||||
import binaryFileStorage.DataUnitFileInformation;
|
||||
import pamScrollSystem.AbstractScrollManager;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.RawDLParams;
|
||||
import rawDeepLearningClassifier.layoutFX.DLDetectionGraphics;
|
||||
@ -127,6 +128,7 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
dlGroupDetectionDataBlock.setNaturalLifetimeMillis(600*1000); //keep this data for a while.
|
||||
dlGroupDetectionDataBlock.addDataAnnotationType(dlAnnotationType);
|
||||
dlGroupDetectionDataBlock.setCanClipGenerate(true);
|
||||
|
||||
|
||||
classificationBuffer = new ArrayList<PamDataUnit>();
|
||||
|
||||
@ -206,8 +208,9 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
*/
|
||||
@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) {
|
||||
if (classificationBuffer.size()>=1) {
|
||||
runDetectionGroupModel();
|
||||
@ -218,6 +221,8 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
}
|
||||
}
|
||||
|
||||
//if raw segmented data then add to a buffer so that we can pass chunks of data to a model which
|
||||
//is more computationally efficient
|
||||
if (pamRawData instanceof GroupedRawData) {
|
||||
//the raw data units should appear in sequential channel order
|
||||
GroupedRawData rawDataUnit = (GroupedRawData) pamRawData;
|
||||
@ -235,6 +240,8 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// System.out.println("New raw data in: chan: " + PamUtils.getSingleChannel(pamRawData.getChannelBitmap()) +
|
||||
// " Size: " + pamRawData.getSampleDuration() + " first sample: " + rawDataUnit.getRawData()[0][0]
|
||||
// + "Parent UID: " + rawDataUnit.getParentDataUnit().getUID());
|
||||
@ -249,6 +256,8 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
ArrayList<PamDataUnit> classificationBufferTemp = (ArrayList<PamDataUnit>) classificationBuffer.clone();
|
||||
|
||||
ArrayList<? extends PredictionResult> modelResults = this.dlControl.getDLModel().runModel(classificationBufferTemp);
|
||||
|
||||
//System.out.println("MODEL RESULTS: " + modelResults);
|
||||
|
||||
for (int i=0; i<classificationBufferTemp.size(); i++) {
|
||||
|
||||
@ -271,10 +280,11 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
|
||||
DLDataUnit dlDataUnit = predictionToDataUnit(detectionGroup, modelResult);
|
||||
|
||||
this.dlModelResultDataBlock.addPamData(dlDataUnit); //here
|
||||
|
||||
//System.out.println("Add predictions: " + dlDataUnit.getPredicitionResult().getPrediction());
|
||||
//add to the model result.
|
||||
this.dlModelResultDataBlock.addPamData(dlDataUnit);
|
||||
|
||||
// System.out.println("DELPHINID - we have a detection: " + detectionGroup.getUID() + " " + PamCalendar.formatDateTime(detectionGroup.getTimeMilliseconds()));
|
||||
|
||||
// //Now generate a detection of a decision threshold is reacheed.
|
||||
// if (dlDataUnit.getPredicitionResult().isBinaryClassification()) {
|
||||
// System.out.println("DELPHINID - we have a positive detection: " + detectionGroup.getUID() + " " + PamCalendar.formatDateTime(detectionGroup.getTimeMilliseconds()));
|
||||
@ -600,10 +610,13 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
* run the deep learning algorithm and save the detections as annotation to a
|
||||
* data unit.
|
||||
*
|
||||
* @param dataUnit - the data unit to add prediction annotations to
|
||||
* @param dataUnit - the data unit to add prediction annotations to. NOT the data unit to be classified - this is is defined by adding
|
||||
* new data to the process.
|
||||
*
|
||||
*/
|
||||
public void forceRunClassifier(PamDataUnit dataUnit) {
|
||||
|
||||
// System.out.println("CLASSIFICATION BUFFER: " + classificationBuffer.size());
|
||||
|
||||
if (this.classificationBuffer.size()>0) {
|
||||
if (classificationBuffer.get(0) instanceof GroupedRawData) {
|
||||
@ -743,7 +756,7 @@ public class DLClassifyProcess extends PamInstantProcess {
|
||||
private void addDLAnnotation(PamDataUnit parentDataUnit,
|
||||
ArrayList<PredictionResult> modelResult) {
|
||||
|
||||
//System.out.println("DLClassifyProces: Add annnotation to " + parentDataUnit);
|
||||
System.out.println("DLClassifyProces: Add annnotation to " + parentDataUnit);
|
||||
parentDataUnit.addDataAnnotation(new DLAnnotation(dlAnnotationType, modelResult));
|
||||
//parentDataUnit.updateDataUnit(System.currentTimeMillis());
|
||||
|
||||
|
@ -25,6 +25,15 @@ public class DLGroupDataBlock extends SuperDetDataBlock<DLGroupDetection, PamDat
|
||||
return super.getHoverText(generalProjector, dataUnit, iSide);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean shouldNotify() {
|
||||
/**
|
||||
* Segments are not saved by PAMGuard as it's a waste of storage space but this means that reprocessing data requires the
|
||||
* segments are remad with detections in viewer mode. There is
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -18,5 +18,34 @@ public class DLGroupDetection extends SegmenterDetectionGroup implements PamDete
|
||||
}
|
||||
|
||||
|
||||
public DLGroupDetection(long timeMilliseconds, int channelBitmap, long startSample, double duration) {
|
||||
super(timeMilliseconds, channelBitmap, startSample, duration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double[] getFrequency() {
|
||||
if ((super.getFrequency()==null || super.getFrequency()[0] == super.getFrequency()[1]) && this.getSubDetectionsCount()>0) {
|
||||
|
||||
double minFreq = Double.POSITIVE_INFINITY;
|
||||
double maxFreq = Double.NEGATIVE_INFINITY;
|
||||
|
||||
double[] freq;
|
||||
for (int j=0; j<getSubDetectionsCount(); j++) {
|
||||
|
||||
|
||||
freq = getSubDetection(j).getFrequency();
|
||||
if (freq[0]<minFreq) {
|
||||
minFreq = freq[0];
|
||||
}
|
||||
if (freq[1]>maxFreq) {
|
||||
maxFreq = freq[1];
|
||||
}
|
||||
|
||||
}
|
||||
this.setFrequency(new double[] {minFreq, maxFreq});
|
||||
}
|
||||
return super.getFrequency();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -60,6 +60,8 @@ public abstract class StandardClassifierModel implements DLClassiferModel, PamSe
|
||||
* Sound spot warning.
|
||||
*/
|
||||
PamWarning dlClassifierWarning = new PamWarning(getName(), "",2);
|
||||
|
||||
private DLStatus status = DLStatus.NO_MODEL_LOADED;
|
||||
|
||||
|
||||
@Override
|
||||
@ -115,6 +117,9 @@ public abstract class StandardClassifierModel implements DLClassiferModel, PamSe
|
||||
// System.out.println("STANDARD CLASSIFIER MODEL PREP MODEL! !!!: " + getDLParams().modelPath);
|
||||
// StandardModelParams oldParams = getDLParams().clone();
|
||||
|
||||
//just incase group detections has been enabled
|
||||
getDLControl().setGroupDetections(false);
|
||||
|
||||
getDLWorker().prepModel(getDLParams(), dlControl);
|
||||
|
||||
|
||||
@ -168,37 +173,56 @@ public abstract class StandardClassifierModel implements DLClassiferModel, PamSe
|
||||
|
||||
@Override
|
||||
public DLStatus getModelStatus() {
|
||||
if (getDLWorker().isModelNull()) {
|
||||
return DLStatus.MODEL_LOAD_FAILED;
|
||||
}
|
||||
|
||||
File file = new File(getDLParams().modelPath);
|
||||
if (getDLParams().modelPath == null || !file.isFile()) {
|
||||
return DLStatus.NO_MODEL_LOADED;
|
||||
}
|
||||
|
||||
// if continuous data is selected and all classes are false then this is a
|
||||
// potential mistake...
|
||||
if (dlControl.getSettingsPane().getSelectedParentDataBlock().getUnitClass() == RawDataUnit.class
|
||||
&& (getDLParams().binaryClassification==null || PamArrayUtils.isAllFalse(getDLParams().binaryClassification))){
|
||||
return DLStatus.NO_BINARY_CLASSIFICATION;
|
||||
// warnings.add(new PamWarning("Generic classifier",
|
||||
// "There are no prediction classes selected for classification. "
|
||||
// + "Predicitons for each segment will be saved but there will be no detections generated",
|
||||
// 1));
|
||||
}
|
||||
return DLStatus.MODEL_LOAD_SUCCESS;
|
||||
return status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DLStatus setModel(URI uri) {
|
||||
//will change the params if we do not clone.
|
||||
StandardModelParams.setModel(uri, this.getDLParams());
|
||||
this.getDLWorker().prepModel(getDLParams(), dlControl);
|
||||
return getModelStatus();
|
||||
status = this.getDLWorker().prepModel(getDLParams(), dlControl);
|
||||
|
||||
// System.out.println("----MODEL STATUS: " + status);
|
||||
|
||||
status = checkDLStatus(status);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* The model status is returned by the prep model function but there may be other issues which override the returned status.
|
||||
* This function chekcs those issues and returns a different status if necessary.
|
||||
* @param status2 - the current model status.
|
||||
* @return the current model status.
|
||||
*/
|
||||
private DLStatus checkDLStatus(DLStatus status2) {
|
||||
|
||||
|
||||
if (getDLWorker().isModelNull() && !status2.isError()) {
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
}
|
||||
|
||||
File file = new File(getDLParams().modelPath);
|
||||
if (getDLParams().modelPath == null || !file.isFile()) {
|
||||
return DLStatus.NO_MODEL_LOADED;
|
||||
}
|
||||
|
||||
// if continuous data is selected and all classes are false then this is a
|
||||
// potential mistake...
|
||||
if (dlControl.getSegmenter().getParentDataBlock()!=null) {
|
||||
if (dlControl.getSegmenter().getParentDataBlock().getUnitClass() == RawDataUnit.class
|
||||
&& (getDLParams().binaryClassification==null || PamArrayUtils.isAllFalse(getDLParams().binaryClassification))){
|
||||
return DLStatus.NO_BINARY_CLASSIFICATION;
|
||||
// warnings.add(new PamWarning("Generic classifier",
|
||||
// "There are no prediction classes selected for classification. "
|
||||
// + "Predicitons for each segment will be saved but there will be no detections generated",
|
||||
// 1));
|
||||
}
|
||||
}
|
||||
return status2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The task thread.
|
||||
@ -365,6 +389,13 @@ public abstract class StandardClassifierModel implements DLClassiferModel, PamSe
|
||||
return warnings;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<Class> getAllowedDataTypes(){
|
||||
//null means default data types which is anything with raw data.
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -4,6 +4,7 @@ import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javafx.stage.FileChooser.ExtensionFilter;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
|
||||
public class SoundSpotModelPane extends StandardModelPane {
|
||||
|
||||
@ -27,7 +28,7 @@ public class SoundSpotModelPane extends StandardModelPane {
|
||||
* @param file - the selected file.
|
||||
*/
|
||||
@Override
|
||||
public void newModelSelected(File file) {
|
||||
public DLStatus newModelSelected(File file) {
|
||||
|
||||
//System.out.println("New file model selected:");
|
||||
|
||||
@ -52,7 +53,7 @@ public class SoundSpotModelPane extends StandardModelPane {
|
||||
* Note that the model prep will determine whether new transforms need to be loaded from the
|
||||
* model or to use the existing transforms in the settings.
|
||||
*/
|
||||
soundSpotClassifier.getDLWorker().prepModel(params, soundSpotClassifier.getDLControl());
|
||||
DLStatus status = soundSpotClassifier.getDLWorker().prepModel(params, soundSpotClassifier.getDLControl());
|
||||
//get the model tansforms calculated from the model by SoundSpoyWorker and apply them to our temporary params clone.
|
||||
getParamsClone().dlTransfroms = this.soundSpotClassifier.getDLWorker().getModelTransforms();
|
||||
|
||||
@ -63,6 +64,9 @@ public class SoundSpotModelPane extends StandardModelPane {
|
||||
|
||||
///set the advanced pane parameters.
|
||||
getAdvSettingsPane().setParams(getParamsClone());
|
||||
|
||||
return status;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,9 @@ import java.nio.file.Paths;
|
||||
import org.jamdev.jdl4pam.animalSpot.AnimalSpotModel;
|
||||
import org.jamdev.jdl4pam.animalSpot.AnimalSpotParams;
|
||||
|
||||
import ai.djl.engine.EngineException;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.DLModelWorker;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.StandardPrediction;
|
||||
|
||||
@ -41,7 +43,7 @@ public class SoundSpotWorker extends DLModelWorker<StandardPrediction> {
|
||||
/**
|
||||
* Prepare the model
|
||||
*/
|
||||
public void prepModel(StandardModelParams soundSpotParams, DLControl dlControl) {
|
||||
public DLStatus prepModel(StandardModelParams soundSpotParams, DLControl dlControl) {
|
||||
//ClassLoader origCL = Thread.currentThread().getContextClassLoader();
|
||||
|
||||
//System.out.println("prepModel: " + soundSpotParams.useDefaultTransfroms);
|
||||
@ -64,8 +66,12 @@ public class SoundSpotWorker extends DLModelWorker<StandardPrediction> {
|
||||
|
||||
}
|
||||
}
|
||||
catch (EngineException e) {
|
||||
return DLStatus.MODEL_ENGINE_FAIL;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
//WarnOnce.showWarning(null, "Model Load Error", "There was an error loading the model file.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
|
||||
@ -114,9 +120,13 @@ public class SoundSpotWorker extends DLModelWorker<StandardPrediction> {
|
||||
catch (Exception e) {
|
||||
soundSpotModel=null;
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_META_FAIL;
|
||||
|
||||
//WarnOnce.showWarning(null, "Model Metadata Error", "There was an error extracting the metadata from the model.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
|
||||
return DLStatus.MODEL_LOAD_SUCCESS;
|
||||
|
||||
//Thread.currentThread().setContextClassLoader(origCL);
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,7 @@ import pamViewFX.fxNodes.PamHBox;
|
||||
import pamViewFX.fxNodes.PamSpinner;
|
||||
import pamViewFX.fxNodes.PamVBox;
|
||||
import pamViewFX.validator.PamValidator;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassiferModel;
|
||||
import rawDeepLearningClassifier.dlClassification.StandardClassifierModel;
|
||||
|
||||
@ -292,8 +293,9 @@ public abstract class StandardModelPane extends SettingsPane<StandardModelParams
|
||||
/**
|
||||
* Called whenever a new model has been selected
|
||||
* @param file - the file.
|
||||
* @return
|
||||
*/
|
||||
public abstract void newModelSelected(File file);
|
||||
public abstract DLStatus newModelSelected(File file);
|
||||
|
||||
/**
|
||||
* Sho0w the advanced settings.
|
||||
@ -403,11 +405,10 @@ public abstract class StandardModelPane extends SettingsPane<StandardModelParams
|
||||
this.getAdvSettingsPane().setParams(paramsClone);
|
||||
|
||||
if (paramsClone.modelPath!=null) {
|
||||
//this might
|
||||
currentSelectedFile = new File(paramsClone.modelPath);
|
||||
|
||||
//this might change the paramsClone values if the model contains pamguard compatible metadata
|
||||
newModelSelected(currentSelectedFile);
|
||||
DLStatus status = newModelSelected(currentSelectedFile);
|
||||
}
|
||||
|
||||
setClassNames(paramsClone);
|
||||
|
@ -2,6 +2,7 @@ package rawDeepLearningClassifier.dlClassification.archiveModel;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelPane;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.ketos.KetosDLParams;
|
||||
@ -17,7 +18,7 @@ public class ArchiveModelPane extends StandardModelPane {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void newModelSelected(File file) {
|
||||
public DLStatus newModelSelected(File file) {
|
||||
|
||||
//the model has to set some of the parameters for the UI .
|
||||
|
||||
@ -45,7 +46,7 @@ public class ArchiveModelPane extends StandardModelPane {
|
||||
* Note that the model prep will determine whether new transforms need to be loaded from the
|
||||
* model or to use the existing transforms in the settings.
|
||||
*/
|
||||
archiveModelClassifier.getDLWorker().prepModel(params, archiveModelClassifier.getDLControl());
|
||||
DLStatus status = archiveModelClassifier.getDLWorker().prepModel(params, archiveModelClassifier.getDLControl());
|
||||
|
||||
//get the model transforms calculated from the model by the worker and apply them to our temporary params clone.
|
||||
getParamsClone().dlTransfroms = this.archiveModelClassifier.getDLWorker().getModelTransforms();
|
||||
@ -57,6 +58,8 @@ public class ArchiveModelPane extends StandardModelPane {
|
||||
///set the advanced pane parameters.
|
||||
getAdvSettingsPane().setParams(getParamsClone());
|
||||
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,7 +22,9 @@ import org.json.JSONObject;
|
||||
import PamUtils.PamArrayUtils;
|
||||
import PamView.dialog.warn.WarnOnce;
|
||||
import ai.djl.MalformedModelException;
|
||||
import ai.djl.engine.EngineException;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.DLModelWorker;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.GenericModelWorker;
|
||||
@ -62,7 +64,7 @@ public class ArchiveModelWorker extends GenericModelWorker {
|
||||
* Note it is important to put a synchonized here or the model loading can fail.
|
||||
*/
|
||||
@Override
|
||||
public synchronized void prepModel(StandardModelParams dlParams, DLControl dlControl) {
|
||||
public synchronized DLStatus prepModel(StandardModelParams dlParams, DLControl dlControl) {
|
||||
//ClassLoader origCL = Thread.currentThread().getContextClassLoader();
|
||||
try {
|
||||
|
||||
@ -92,8 +94,13 @@ public class ArchiveModelWorker extends GenericModelWorker {
|
||||
//System.out.println(genericModel.getModel().getModelPath().getFileName());
|
||||
}
|
||||
}
|
||||
catch (EngineException e) {
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_ENGINE_FAIL;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
//WarnOnce.showWarning(null, "Model Load Error", "There was an error loading the model file.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
|
||||
@ -188,8 +195,11 @@ public class ArchiveModelWorker extends GenericModelWorker {
|
||||
catch (Exception e) {
|
||||
dlModel=null;
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_META_FAIL;
|
||||
//WarnOnce.showWarning(null, "Model Metadata Error", "There was an error extracting the metadata from the model.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
|
||||
return DLStatus.MODEL_LOAD_SUCCESS;
|
||||
//Thread.currentThread().setContextClassLoader(origCL);
|
||||
}
|
||||
|
||||
@ -200,7 +210,7 @@ public class ArchiveModelWorker extends GenericModelWorker {
|
||||
* @throws MalformedModelException
|
||||
* @throws IOException
|
||||
*/
|
||||
public ArchiveModel loadModel(String currentPath2) throws MalformedModelException, IOException {
|
||||
public ArchiveModel loadModel(String currentPath2) throws MalformedModelException, IOException, EngineException {
|
||||
|
||||
return new SimpleArchiveModel(new File(currentPath2));
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import java.util.stream.Stream;
|
||||
import org.jamdev.jdl4pam.ArchiveModel;
|
||||
|
||||
import ai.djl.MalformedModelException;
|
||||
import ai.djl.engine.EngineException;
|
||||
|
||||
/**
|
||||
* A Tensorflow model packaged with a jar file.
|
||||
@ -21,7 +22,7 @@ import ai.djl.MalformedModelException;
|
||||
public class SimpleArchiveModel extends ArchiveModel {
|
||||
|
||||
|
||||
public SimpleArchiveModel(File file) throws MalformedModelException, IOException {
|
||||
public SimpleArchiveModel(File file) throws MalformedModelException, IOException, EngineException {
|
||||
super(file);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,9 @@
|
||||
package rawDeepLearningClassifier.dlClassification.delphinID;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.jamdev.jpamutils.JamArr;
|
||||
import org.jamdev.jpamutils.spectrum.Spectrum;
|
||||
|
||||
import PamUtils.PamArrayUtils;
|
||||
@ -18,14 +20,14 @@ public class Clicks2Spectrum {
|
||||
private Spectrum spectrum;
|
||||
|
||||
|
||||
public Clicks2Spectrum(SegmenterDetectionGroup clickGroup, int fftLen) {
|
||||
this.spectrum = clicks2Spectrum(clickGroup.getSubDetections(), clickGroup.getSampleRate(), fftLen);
|
||||
public Clicks2Spectrum(SegmenterDetectionGroup clickGroup, int fftLen, boolean spectradB, boolean hann) {
|
||||
this.spectrum = clicks2Spectrum(clickGroup.getSubDetections(), clickGroup.getSampleRate(), fftLen, spectradB, hann);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Clicks2Spectrum(SegmenterDetectionGroup clickGroup, Clks2SpectrumParams transformParams) {
|
||||
this(clickGroup, transformParams.fftLength);
|
||||
this(clickGroup, transformParams.fftLength, transformParams.spectrumdB, transformParams.hann);
|
||||
}
|
||||
|
||||
|
||||
@ -37,9 +39,10 @@ public class Clicks2Spectrum {
|
||||
* @param seglen - the segment length in seconds.
|
||||
* @param freqLimits - the frequency limits for the spectrum.
|
||||
* @param minFragSize - the minimum fragment length in seconds.
|
||||
* @param spectrumdB - true to average the log spectra instead of linear spectra
|
||||
* @return the average spectrum.
|
||||
*/
|
||||
public static Spectrum clicks2Spectrum(ArrayList<? extends PamDataUnit> arrayList, float sampleRate, int fftLen) {
|
||||
public static Spectrum clicks2Spectrum(ArrayList<? extends PamDataUnit> arrayList, float sampleRate, int fftLen, boolean spectrumdB, boolean hann) {
|
||||
|
||||
|
||||
//create an average spectrum
|
||||
@ -47,19 +50,46 @@ public class Clicks2Spectrum {
|
||||
double[] fftClk;
|
||||
for (int i=0;i<arrayList.size(); i++) {
|
||||
|
||||
fftClk = ((RawDataHolder) arrayList.get(i)).getDataTransforms().getPowerSpectrum(0, fftLen);
|
||||
fftClk = ((RawDataHolder) arrayList.get(i)).getDataTransforms().getPowerSpectrum(0, fftLen, hann);
|
||||
|
||||
// ComplexArray arr = RawDataTransforms.getComplexSpectrumHann(((RawDataHolder) arrayList.get(i)).getWaveData()[0], fftLen);
|
||||
|
||||
// PamArrayUtils.printArray(arr.getReal());
|
||||
// PamArrayUtils.printArray(arr.getReal());
|
||||
// System.out.println("fft len: " + i + " " + fftAverage.length + " " + fftClk.length);
|
||||
|
||||
if (spectrumdB) {
|
||||
double fftClkdB = 0 ;
|
||||
|
||||
//important otherwise we alter the power spectrum stored within the click
|
||||
fftClk = Arrays.copyOf(fftClk, fftClk.length);
|
||||
|
||||
//convert to log
|
||||
for (int j=0; j<fftClk.length; j++) {
|
||||
if (spectrumdB) {
|
||||
fftClkdB=20*Math.log10(fftClk[j]);
|
||||
}
|
||||
else {
|
||||
fftClkdB=fftClk[j];
|
||||
}
|
||||
// if (Double.isNaN(fftClkdB)) {
|
||||
// System.out.println("Point is NaN: " + i + " " + j + " " + fftClk[j]);
|
||||
// }
|
||||
fftClk[j] = fftClkdB;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fftAverage = PamArrayUtils.sum(fftAverage, fftClk);
|
||||
}
|
||||
|
||||
// System.out.println(fftAverage + " " + arrayList.size());
|
||||
|
||||
fftAverage = PamArrayUtils.divide(fftAverage, arrayList.size());
|
||||
|
||||
Spectrum spectrum = new Spectrum(fftAverage, null, sampleRate);
|
||||
fftAverage = JamArr.subtract(fftAverage, JamArr.min(fftAverage));
|
||||
|
||||
|
||||
Spectrum spectrum = new Spectrum(fftAverage, null, sampleRate);
|
||||
|
||||
return spectrum;
|
||||
}
|
||||
@ -72,8 +102,21 @@ public class Clicks2Spectrum {
|
||||
|
||||
public static class Clks2SpectrumParams extends DetectionGroupTransformParams {
|
||||
|
||||
|
||||
/**
|
||||
* The FFT length in samples.
|
||||
*/
|
||||
private int fftLength;
|
||||
|
||||
/**
|
||||
* True to average log spectra instead of linear spectra
|
||||
*/
|
||||
public boolean spectrumdB = true;
|
||||
|
||||
/**
|
||||
* True to apply a hanning window to click wave before FFT.
|
||||
*/
|
||||
public boolean hann = false;
|
||||
|
||||
/**
|
||||
* Set the FFT length in samples
|
||||
* @param fftLength
|
||||
|
@ -10,16 +10,19 @@ import org.jamdev.jdl4pam.transforms.DLTransfromParams;
|
||||
import PamController.PamControlledUnitSettings;
|
||||
import PamController.PamSettingManager;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import clickDetector.ClickDetection;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassiferModel;
|
||||
import rawDeepLearningClassifier.dlClassification.PredictionResult;
|
||||
import rawDeepLearningClassifier.dlClassification.StandardClassifierModel;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDParams.DelphinIDDataType;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.DLModelWorker;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.StandardPrediction;
|
||||
import rawDeepLearningClassifier.layoutFX.DLCLassiferModelUI;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterDetectionGroup;
|
||||
import whistlesAndMoans.ConnectedRegionDataBlock;
|
||||
import whistlesAndMoans.ConnectedRegionDataUnit;
|
||||
|
||||
/**
|
||||
* A classifier based on the delphinID method which uses whistle contours to predict
|
||||
@ -39,10 +42,12 @@ public class DelphinIDClassifier extends StandardClassifierModel {
|
||||
|
||||
private DelphinIDWorker delphinIDWorker;
|
||||
|
||||
private ArrayList<Class> allowedDataTypes;
|
||||
|
||||
public DelphinIDClassifier(DLControl dlControl) {
|
||||
super(dlControl);
|
||||
|
||||
allowedDataTypes = new ArrayList<Class>();
|
||||
//load the previous settings
|
||||
PamSettingManager.getInstance().registerSettings(this);
|
||||
}
|
||||
@ -52,6 +57,13 @@ public class DelphinIDClassifier extends StandardClassifierModel {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prepModel() {
|
||||
super.prepModel();
|
||||
//set group detections to true.
|
||||
getDLControl().setGroupDetections(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "delphinID";
|
||||
@ -99,6 +111,8 @@ public class DelphinIDClassifier extends StandardClassifierModel {
|
||||
public ArrayList<? extends PredictionResult> runModel(ArrayList<? extends PamDataUnit> groupedRawData) {
|
||||
|
||||
//add an extra test to see if the detection pre count has passed.
|
||||
|
||||
//System.out.println("Run delphinID model: " + (((SegmenterDetectionGroup) groupedRawData.get(0)).getSubDetectionsCount()) + " min clicks: " + delphinIDParams.minDetectionValue);
|
||||
|
||||
if (detectionPreFilter(groupedRawData)) {
|
||||
return super.runModel(groupedRawData);
|
||||
@ -122,38 +136,41 @@ public class DelphinIDClassifier extends StandardClassifierModel {
|
||||
|
||||
|
||||
private boolean clickPreFilter(ArrayList<? extends PamDataUnit> groupedRawData) {
|
||||
//TODO
|
||||
// System.out.println("Check CLICK fragment density");
|
||||
return true;
|
||||
|
||||
if (((SegmenterDetectionGroup) groupedRawData.get(0)).getSubDetectionsCount()>=delphinIDParams.minDetectionValue) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean whistlePreFilter(ArrayList<? extends PamDataUnit> groupedRawData) {
|
||||
//TODO
|
||||
// System.out.println("Check WHISTLE fragment density");
|
||||
//
|
||||
// 3. Within each time frame, the density of detection is calculated and used as a filter.
|
||||
// - Density 2
|
||||
// - where the length of frame = frame duration / mean time step across contour
|
||||
// (time steps between time-frequency points in contour saved by ROCCA depend on FFT resolution but can vary slightly within contour)
|
||||
//
|
||||
// 4. If a detection frame has less than 0.30 detection density, it is not used for classification
|
||||
// double density = DelphinIDUtils.getDensity(null);
|
||||
|
||||
// System.out.println("Check WHISTLE fragment density");
|
||||
//
|
||||
// 3. Within each time frame, the density of detection is calculated and used as a filter.
|
||||
// - Density 2
|
||||
// - where the length of frame = frame duration / mean time step across contour
|
||||
// (time steps between time-frequency points in contour saved by ROCCA depend on FFT resolution but can vary slightly within contour)
|
||||
//
|
||||
// 4. If a detection frame has less than 0.30 detection density, it is not used for classification
|
||||
// double density = DelphinIDUtils.getDensity(null);
|
||||
|
||||
|
||||
if (groupedRawData==null || groupedRawData.size()<1) {
|
||||
System.err.println("DelphinIDClassifier: + the grouped raw data is null or zero size:");
|
||||
return false;
|
||||
}
|
||||
|
||||
System.out.println("Run DelphinID model: " + groupedRawData.size() + " min density: " + delphinIDParams.minDetectionDensity);
|
||||
|
||||
|
||||
//System.out.println("Run DelphinID model: " + groupedRawData.size() + " min density: " + delphinIDParams.minDetectionValue);
|
||||
|
||||
double density = DelphinIDUtils.getDensity((SegmenterDetectionGroup) groupedRawData.get(0));
|
||||
|
||||
if (density>=delphinIDParams.minDetectionDensity) {
|
||||
|
||||
if (density>=delphinIDParams.minDetectionValue) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -206,4 +223,21 @@ public class DelphinIDClassifier extends StandardClassifierModel {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ArrayList<Class> getAllowedDataTypes(){
|
||||
allowedDataTypes.clear();
|
||||
|
||||
if (delphinIDParams.getDataType()==DelphinIDDataType.CLICKS) {
|
||||
allowedDataTypes.add(ClickDetection.class);
|
||||
}
|
||||
|
||||
if (delphinIDParams.getDataType()==DelphinIDDataType.WHISTLES) {
|
||||
allowedDataTypes.add(ConnectedRegionDataUnit.class);
|
||||
}
|
||||
|
||||
return allowedDataTypes;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -10,32 +10,49 @@ import org.jamdev.jdl4pam.utils.DLMatFile;
|
||||
import org.jamdev.jpamutils.spectrum.Spectrum;
|
||||
|
||||
import PamUtils.PamArrayUtils;
|
||||
import PamUtils.PamCalendar;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import ai.djl.MalformedModelException;
|
||||
import rawDeepLearningClassifier.dlClassification.archiveModel.SimpleArchiveModel;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDUtils.ClickDetectionMAT;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDUtils.DetectionGroupMAT;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDWhistleTest.DelphinIDWorkerTest;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.StandardPrediction;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterDetectionGroup;
|
||||
import us.hebi.matlab.mat.format.Mat5;
|
||||
import us.hebi.matlab.mat.types.MatFile;
|
||||
import us.hebi.matlab.mat.types.Matrix;
|
||||
import us.hebi.matlab.mat.types.Struct;
|
||||
|
||||
public class DelphinIDClickTest {
|
||||
|
||||
public static void main(String args[]) {
|
||||
|
||||
//test a single segment.
|
||||
// String clicksMatPath = "/Users/au671271/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clicks_20200918_123234.mat";
|
||||
// String modelFile = "/Users/au671271/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clickclassifier.zip";
|
||||
|
||||
String clicksMatPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clicks_20200918_123234_classified.mat";
|
||||
String modelFile = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clickClassifier_Jan25.zip";
|
||||
String matclickSave = "/Users/jdjm/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/click1D/click_spectrums.mat";
|
||||
|
||||
DetectionGroupMAT<ClickDetectionMAT> clicks = DelphinIDUtils.getClicksMAT(clicksMatPath);
|
||||
|
||||
// -----basic tests to check transforms----
|
||||
// test a single segment.
|
||||
String matFileout = "/Users/jdjm/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/click1D/clickspectrum.mat";
|
||||
float[][] output = testDelphinIDClickSegment(matFileout, clicks);
|
||||
|
||||
//
|
||||
float[][] output = testDelphinIDClickSegment(matFileout);
|
||||
// //produce a set of sequntial transforms
|
||||
// String matFileout3 = "/Users/jdjm/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/click1D/click_transform_example.mat";
|
||||
// exportDelphinIDClickTransforms( matFileout3, clicks, 37);
|
||||
|
||||
//run the model
|
||||
String modelFile = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clickclassifier.zip";
|
||||
// //run the model
|
||||
String matFileout2 = "/Users/jdjm/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/click1D/clickspectrum_results_predictions.mat";
|
||||
float[][] predictions = testDelphinIDClickModel(modelFile, clicks, matFileout2);
|
||||
|
||||
String matFileout2 = "/Users/jdjm/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/click1D/clickspectrum_results.mat";
|
||||
|
||||
testDelphinIDModelRaw(modelFile, output, matFileout2);
|
||||
//---complete test on the model and transforms------
|
||||
// float[][] results = testDelphinIDClickModel( modelFile, clicks, matclickSave );
|
||||
|
||||
}
|
||||
|
||||
@ -46,15 +63,138 @@ public class DelphinIDClickTest {
|
||||
/*
|
||||
/****------------------------------------------------------------------****/
|
||||
|
||||
public static float[][] testDelphinIDClickModel(String modelPath, DetectionGroupMAT<ClickDetectionMAT> clicks, String matClickSave) {
|
||||
return testDelphinIDClickModel( modelPath, clicks, matClickSave, true);
|
||||
}
|
||||
|
||||
|
||||
private static void testDelphinIDModelRaw(String modelPath, float[][] rawModelInput, String matFileout) {
|
||||
|
||||
public static float[][] testDelphinIDClickModel(String modelPath, DetectionGroupMAT<ClickDetectionMAT> clicks, String matClickSave, boolean verbose) {
|
||||
|
||||
Path path = Paths.get(modelPath);
|
||||
|
||||
|
||||
double segLen = 4000.;
|
||||
double segHop = 1000.0;
|
||||
int minclicks = 3;
|
||||
|
||||
//load the model
|
||||
try {
|
||||
|
||||
//now feed segments directly into model to test.
|
||||
|
||||
float sampleRate = (float) clicks.getSampleRate();
|
||||
long dataStartMillis = clicks.getFileDataStart();
|
||||
|
||||
|
||||
Float hardSampleRate = Float.valueOf((float) clicks.sampleRate);
|
||||
//segment the whistle detections
|
||||
//Note, delphinID starts from the first whistle and NOT the first file.
|
||||
ArrayList<SegmenterDetectionGroup> segments = DelphinIDUtils.segmentDetectionData(clicks.getDetections(), dataStartMillis, segLen, segHop, hardSampleRate);
|
||||
|
||||
if (verbose) {
|
||||
for (int i=0; i<segments.size(); i++) {
|
||||
System.out.println("Segment " + i + " contains " + segments.get(i).getSubDetectionsCount() + " clicks");
|
||||
}
|
||||
}
|
||||
|
||||
//prepare the model - this loads the zip file and loads the correct transforms.
|
||||
DelphinIDWorkerTest model = DelphinIDUtils.prepDelphinIDModel(path.toAbsolutePath().toString());
|
||||
model.setEnableSoftMax(false);
|
||||
|
||||
|
||||
//initialise strcuture for image data
|
||||
Struct imageStruct = Mat5.newStruct(segments.size(), 1);
|
||||
|
||||
float[][] outputs = new float[segments.size()][];
|
||||
|
||||
for (int i=0; i<segments.size(); i++) {
|
||||
|
||||
//remember that the input is a stack of detections to be run by the model at once - Here we want to do each one individually.
|
||||
ArrayList<SegmenterDetectionGroup> aSegment = new ArrayList<SegmenterDetectionGroup>();
|
||||
|
||||
aSegment.add(segments.get(i));
|
||||
|
||||
if (segments.get(i).getSubDetectionsCount()>=minclicks) {
|
||||
//the prediction.
|
||||
ArrayList<StandardPrediction> predicition = model.runModel(aSegment, sampleRate, 1);
|
||||
|
||||
float[] output = predicition.get(0).getPrediction();
|
||||
|
||||
if (verbose) {
|
||||
System.out.print(String.format("Segment: %d no. clicks %d %.4f s" , i , segments.get(i).getSubDetectionsCount() ,((aSegment.get(0).getSegmentStartMillis()-dataStartMillis)/1000.)));
|
||||
for (int j=0; j<output.length; j++) {
|
||||
System.out.print(String.format( " %.4f" , output[j]));
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
|
||||
outputs[i]=output;
|
||||
|
||||
|
||||
Matrix modelinput = DLMatFile.array2Matrix(PamArrayUtils.float2Double(model.getLastModelInput()[0]));
|
||||
imageStruct.set("modelinput", i, modelinput);
|
||||
imageStruct.set("startmillis", i, Mat5.newScalar(aSegment.get(0).getSegmentStartMillis()));
|
||||
imageStruct.set("startseconds", i, Mat5.newScalar((aSegment.get(0).getSegmentStartMillis()-dataStartMillis)/1000.));
|
||||
imageStruct.set("prediction", i, DLMatFile.array2Matrix(PamArrayUtils.float2Double(output)));
|
||||
}
|
||||
else {
|
||||
if (verbose) {
|
||||
System.out.println(String.format("Segment: %d no. clicks %d %s" , i , segments.get(i).getSubDetectionsCount(), "-------------------------"));
|
||||
}
|
||||
}
|
||||
|
||||
imageStruct.set("nclicks", i, Mat5.newScalar(segments.get(i).getSubDetectionsCount()));
|
||||
|
||||
|
||||
}
|
||||
|
||||
//create MatFile for saving the image data to.
|
||||
MatFile matFile = Mat5.newMatFile();
|
||||
matFile.addArray("click_model_inputs", imageStruct);
|
||||
|
||||
if (matClickSave!=null) {
|
||||
// Serialize to disk using default configurations
|
||||
try {
|
||||
Mat5.writeToFile(matFile,matClickSave);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
return outputs;
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Run the click classifier model on a set of predictions.
|
||||
* @param modelPath - the model path to load.
|
||||
* @param rawModelInput - the input into the model where each row is one input.
|
||||
* @return predictions with the same number of rows as the input.
|
||||
*/
|
||||
private static float[][] testDelphinIDModelRaw(String modelPath, float[][] rawModelInput) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
Path path = Paths.get(modelPath);
|
||||
|
||||
//load the model
|
||||
SimpleArchiveModel model;
|
||||
|
||||
float[][] predictions = new float[rawModelInput.length][];
|
||||
try {
|
||||
model = new SimpleArchiveModel(new File(path.toString()));
|
||||
|
||||
@ -63,14 +203,113 @@ public class DelphinIDClickTest {
|
||||
float[][] input = new float[1][];
|
||||
input[0] = rawModelInput[i];
|
||||
outputJava = model.runModel(input);
|
||||
|
||||
System.out.println("Click spectrum output Java: ");
|
||||
PamArrayUtils.printArray(outputJava);
|
||||
}
|
||||
|
||||
|
||||
predictions[i] = outputJava;
|
||||
|
||||
} catch (MalformedModelException | IOException e) {
|
||||
System.out.print(i+" :");
|
||||
|
||||
PamArrayUtils.printArray(outputJava, true);
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
return predictions;
|
||||
|
||||
}
|
||||
catch (MalformedModelException | IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void exportDelphinIDClickTransforms(String matFileout, DetectionGroupMAT<ClickDetectionMAT> clicks, int second ) {
|
||||
// String clicksMatPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clicks_20200918_123234.mat";
|
||||
|
||||
double segLen = 4000.;
|
||||
double segHop = 1000.;
|
||||
// double startSeconds = 1.50355; //seconds to start segments (so we can compare to Python)
|
||||
double startSeconds = 0; //seconds to start segments (so we can compare to Python)
|
||||
// double[] freqLimits = new double[] {10000., 40188};
|
||||
double[] freqLimits = new double[] {10000., 40000};
|
||||
int fftLen = 512;
|
||||
|
||||
// Create MAT file with a scalar in a nested struct
|
||||
MatFile matFile;
|
||||
int sum = 0;
|
||||
|
||||
System.out.println("Total clicks: " + clicks.getDetections().size() + " First click: " + (clicks.getDetections().get(0).getStartSample()/clicks.getSampleRate()) + "s");
|
||||
|
||||
|
||||
long dataStartMillis = clicks.getFileDataStart();
|
||||
|
||||
dataStartMillis = (long) (dataStartMillis+(startSeconds*1000.));
|
||||
|
||||
//split the clicks into segments
|
||||
ArrayList<SegmenterDetectionGroup> segments = DelphinIDUtils.segmentDetectionData(clicks.getDetections(), dataStartMillis, segLen, segHop);
|
||||
|
||||
|
||||
Struct clkStruct = Mat5.newStruct(1, segments.size());
|
||||
|
||||
for (int i=0; i<segments.size(); i++) {
|
||||
|
||||
|
||||
sum += segments.get(i).getSubDetectionsCount() ;
|
||||
|
||||
ArrayList<PamDataUnit<?, ?>> clicksSeg = segments.get(i).getSubDetections();
|
||||
Spectrum spectrum = Clicks2Spectrum.clicks2Spectrum(clicksSeg, (float) clicks.getSampleRate(), fftLen, true, false);
|
||||
clkStruct.set("averagespectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
clkStruct.set("nclks", i, Mat5.newScalar(clicksSeg.size()));
|
||||
clkStruct.set("startseconds", i, Mat5.newScalar(segments.get(i).getStartSecond()));
|
||||
clkStruct.set("minfreq", i, Mat5.newScalar(freqLimits[0]));
|
||||
clkStruct.set("maxfreq", i, Mat5.newScalar(freqLimits[1]));
|
||||
|
||||
|
||||
|
||||
|
||||
//System.out.println("Segment average" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//convert to dB
|
||||
//spectrum = spectrum.spectrumdB(true);
|
||||
|
||||
//System.out.println("Segment dB" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//smooth spectrum
|
||||
spectrum = spectrum.smoothSpectrum(3);
|
||||
clkStruct.set("smoothspectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
|
||||
|
||||
//System.out.println("Segment smooth" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//trim spectrum
|
||||
spectrum = spectrum.trimSpectrum(freqLimits);
|
||||
clkStruct.set("trimspectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
|
||||
//System.out.println("Segment trim" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
|
||||
//down sample the spectrum.
|
||||
spectrum.downSampleSpectrumMean(2);
|
||||
clkStruct.set("downsamplespectrum", i,DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
|
||||
|
||||
//normalise spectrum row sum
|
||||
spectrum = spectrum.normaliseSpectrumSum();
|
||||
clkStruct.set("normalisespectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
|
||||
|
||||
System.out.println("Segment " + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
clkStruct.set("transformedspectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
|
||||
}
|
||||
|
||||
MatFile matFileWrite = Mat5.newMatFile()
|
||||
.addArray("spectrumJava",clkStruct)
|
||||
.addArray("filedate", Mat5.newScalar(PamCalendar.millistoDateNum(clicks.getFileDataStart())));
|
||||
|
||||
try {
|
||||
Mat5.writeToFile(matFileWrite, matFileout);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -79,21 +318,22 @@ public class DelphinIDClickTest {
|
||||
|
||||
|
||||
/**
|
||||
* This test runs delphinID on one 4 second window from whistle contours saved
|
||||
* This test runs delphinID on one 4 second window from clicks saved
|
||||
* in a mat file.
|
||||
*
|
||||
* @return true if the test is passed.
|
||||
*/
|
||||
public static float[][] testDelphinIDClickSegment(String matFileout) {
|
||||
public static float[][] testDelphinIDClickSegment(String matFileout, DetectionGroupMAT<ClickDetectionMAT> clicks ) {
|
||||
|
||||
|
||||
// String clicksMatPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clicks_20200918_123234.mat";
|
||||
String clicksMatPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/clicks_20200918_123234.mat";
|
||||
|
||||
double segLen = 4000.;
|
||||
double segHop = 1000.0;
|
||||
double startSeconds = 1.50355; //seconds to start segments (so we can compare to Python)
|
||||
double[] freqLimits = new double[] {10000., 40188.};
|
||||
double segHop = 1000.;
|
||||
// double startSeconds = 1.50355; //seconds to start segments (so we can compare to Python)
|
||||
double startSeconds = 0; //seconds to start segments (so we can compare to Python)
|
||||
double[] freqLimits = new double[] {10000., 40000};
|
||||
// double[] freqLimits = new double[] {10000., 40000};
|
||||
int fftLen = 512;
|
||||
|
||||
// Create MAT file with a scalar in a nested struct
|
||||
@ -101,7 +341,6 @@ public class DelphinIDClickTest {
|
||||
int sum = 0;
|
||||
try {
|
||||
|
||||
DetectionGroupMAT<ClickDetectionMAT> clicks = DelphinIDUtils.getClicksMAT(clicksMatPath);
|
||||
System.out.println("Total clicks: " + clicks.getDetections().size() + " First click: " + (clicks.getDetections().get(0).getStartSample()/clicks.getSampleRate()) + "s");
|
||||
|
||||
|
||||
@ -110,7 +349,7 @@ public class DelphinIDClickTest {
|
||||
dataStartMillis = (long) (dataStartMillis+(startSeconds*1000.));
|
||||
|
||||
//split the clicks into segments
|
||||
ArrayList<SegmenterDetectionGroup> segments = DelphinIDUtils.segmentDetectionData(clicks.getDetections(), dataStartMillis, segLen, segHop);
|
||||
ArrayList<SegmenterDetectionGroup> segments = DelphinIDUtils.segmentDetectionData(clicks.getDetections(), dataStartMillis, segLen, segHop);
|
||||
|
||||
|
||||
Struct clkStruct = Mat5.newStruct(1, segments.size());
|
||||
@ -121,33 +360,36 @@ public class DelphinIDClickTest {
|
||||
sum += segments.get(i).getSubDetectionsCount() ;
|
||||
|
||||
ArrayList<PamDataUnit<?, ?>> clicksSeg = segments.get(i).getSubDetections();
|
||||
Spectrum spectrum = Clicks2Spectrum.clicks2Spectrum(clicksSeg, (float) clicks.getSampleRate(), fftLen);
|
||||
Spectrum spectrum = Clicks2Spectrum.clicks2Spectrum(clicksSeg, (float) clicks.getSampleRate(), fftLen, true, false);
|
||||
clkStruct.set("averagespectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
clkStruct.set("nclks", i, Mat5.newScalar(clicksSeg.size()));
|
||||
|
||||
clkStruct.set("nclks", i, Mat5.newScalar(clicksSeg.size()));
|
||||
clkStruct.set("startseconds", i, Mat5.newScalar(segments.get(i).getStartSecond()));
|
||||
|
||||
|
||||
//System.out.println("Segment average" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//convert to dB
|
||||
spectrum = spectrum.spectrumdB(true);
|
||||
|
||||
//spectrum = spectrum.spectrumdB(true);
|
||||
|
||||
//System.out.println("Segment dB" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//smooth spectrum
|
||||
spectrum = spectrum.smoothSpectrum(3);
|
||||
|
||||
|
||||
//System.out.println("Segment smooth" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//trim spectrum
|
||||
spectrum = spectrum.trimSpectrum(freqLimits);
|
||||
|
||||
|
||||
//System.out.println("Segment trim" + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
//normalise spectrum row sum
|
||||
spectrum = spectrum.normaliseSpectrumSum();
|
||||
|
||||
//down sample the spectrum.
|
||||
spectrum.downSampleSpectrumMean(2);
|
||||
|
||||
//normalise spectrum row sum
|
||||
spectrum = spectrum.normaliseSpectrumSum();
|
||||
|
||||
System.out.println("Segment " + i + " time: " + (double)(segments.get(i).getSegmentStartMillis()-dataStartMillis)/1000. + "s no. clicks " + segments.get(i).getSubDetectionsCount() + " total: " + sum + " spectrum " + spectrum.length() + " " + spectrum.getRealSpectrum()[0]);
|
||||
|
||||
clkStruct.set("transformedspectrum", i, DLMatFile.array2Matrix(spectrum.getRealSpectrum()));
|
||||
@ -164,7 +406,7 @@ public class DelphinIDClickTest {
|
||||
if (matFileout!=null){
|
||||
MatFile matFileWrite = Mat5.newMatFile()
|
||||
.addArray("spectrumJava",clkStruct)
|
||||
.addArray("file", Mat5.newString(clicksMatPath));
|
||||
.addArray("filedate", Mat5.newScalar(PamCalendar.millistoDateNum(clicks.getFileDataStart())));
|
||||
|
||||
Mat5.writeToFile(matFileWrite, matFileout);
|
||||
}
|
||||
|
@ -10,6 +10,8 @@ import javafx.scene.control.ContentDisplay;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.Slider;
|
||||
import javafx.scene.control.Spinner;
|
||||
import javafx.scene.control.SpinnerValueFactory;
|
||||
import javafx.scene.control.SpinnerValueFactory.DoubleSpinnerValueFactory;
|
||||
import javafx.scene.control.Tooltip;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.paint.Color;
|
||||
@ -21,6 +23,7 @@ import pamViewFX.fxNodes.PamHBox;
|
||||
import pamViewFX.fxNodes.PamSpinner;
|
||||
import pamViewFX.fxNodes.PamVBox;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelPane;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDParams.DelphinIDDataType;
|
||||
|
||||
/**
|
||||
* Settings pane for delphin ID.
|
||||
@ -48,6 +51,14 @@ public class DelphinIDPane extends SettingsPane<DelphinIDParams> {
|
||||
|
||||
private File currentSelectedFile;
|
||||
|
||||
private Label detectionDensity;
|
||||
|
||||
private DoubleSpinnerValueFactory whislteValueFactory;
|
||||
|
||||
private DoubleSpinnerValueFactory clickValueFactory;
|
||||
|
||||
private Label minDensityLabel;
|
||||
|
||||
public DelphinIDPane(DelphinIDClassifier delphinUIClassifier) {
|
||||
super(null);
|
||||
this.delphinUIClassifier = delphinUIClassifier;
|
||||
@ -75,13 +86,17 @@ public class DelphinIDPane extends SettingsPane<DelphinIDParams> {
|
||||
|
||||
PamVBox vBox = new PamVBox();
|
||||
vBox.setSpacing(5.);
|
||||
|
||||
clickValueFactory = new SpinnerValueFactory.DoubleSpinnerValueFactory(1., Double.MAX_VALUE, 5., 1.);
|
||||
whislteValueFactory = new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 1.0, 0.3, 0.1);
|
||||
|
||||
/**Classification thresholds etc to set.**/
|
||||
Label detectionDensity = new Label("Detection Density");
|
||||
detectionDensity = new Label("Detection Density");
|
||||
detectionDensity.setFont(font);
|
||||
String tooltip = "Set the minimum detection density to attempt to classify.";
|
||||
detectionDensity.setTooltip(new Tooltip(tooltip));
|
||||
detectionDensitySpinner = new PamSpinner<Double>(0.0, 1.0, 0.3, 0.1);
|
||||
detectionDensitySpinner = new PamSpinner<Double>();
|
||||
detectionDensitySpinner.setValueFactory(whislteValueFactory);
|
||||
detectionDensitySpinner.setPrefWidth(70);
|
||||
detectionDensitySpinner.setEditable(true);
|
||||
detectionDensitySpinner.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL);
|
||||
@ -89,8 +104,8 @@ public class DelphinIDPane extends SettingsPane<DelphinIDParams> {
|
||||
PamHBox minDensityHolder = new PamHBox();
|
||||
minDensityHolder.setAlignment(Pos.CENTER_RIGHT);
|
||||
minDensityHolder.setSpacing(5);
|
||||
Label minDensity = new Label("Min. detectection density");
|
||||
minDensityHolder.getChildren().addAll(minDensity, detectionDensitySpinner);
|
||||
minDensityLabel = new Label("Min. detectection density");
|
||||
minDensityHolder.getChildren().addAll(minDensityLabel, detectionDensitySpinner);
|
||||
|
||||
/**Classification thresholds etc to set.**/
|
||||
Label classiferInfoLabel2 = new Label("Decision Threshold");
|
||||
@ -117,7 +132,7 @@ public class DelphinIDPane extends SettingsPane<DelphinIDParams> {
|
||||
@Override
|
||||
public DelphinIDParams getParams(DelphinIDParams currParams) {
|
||||
currParams.threshold = decisionSlider.getValue();
|
||||
currParams.minDetectionDensity = detectionDensitySpinner.getValue();
|
||||
currParams.minDetectionValue = detectionDensitySpinner.getValue();
|
||||
return currParams;
|
||||
}
|
||||
|
||||
@ -125,7 +140,28 @@ public class DelphinIDPane extends SettingsPane<DelphinIDParams> {
|
||||
public void setParams(DelphinIDParams input) {
|
||||
this.currentParams = input;
|
||||
decisionSlider.setValue(input.threshold);
|
||||
detectionDensitySpinner.getValueFactory().setValue(input.minDetectionDensity);
|
||||
detectionDensitySpinner.getValueFactory().setValue(input.minDetectionValue);
|
||||
|
||||
if (input.getDataType()==null) {
|
||||
input.dataType = DelphinIDDataType.WHISTLES;
|
||||
}
|
||||
|
||||
//set the correct label and minimum detection value
|
||||
switch (input.getDataType()) {
|
||||
case CLICKS:
|
||||
this.minDensityLabel.setText("Minimum no. clicks");
|
||||
minDensityLabel.setTooltip(new Tooltip("Set the minimum number of clicks before a segment is classified"));
|
||||
detectionDensitySpinner.setValueFactory(clickValueFactory);
|
||||
break;
|
||||
case WHISTLES:
|
||||
minDensityLabel.setTooltip(new Tooltip("Set the minimum whistle density before a segment is classified"));
|
||||
this.minDensityLabel.setText("Minimum whistle density");
|
||||
detectionDensitySpinner.setValueFactory(whislteValueFactory);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (input.modelPath!=null) {
|
||||
//this might
|
||||
|
@ -3,16 +3,36 @@ package rawDeepLearningClassifier.dlClassification.delphinID;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
|
||||
public class DelphinIDParams extends StandardModelParams {
|
||||
|
||||
|
||||
/**
|
||||
* Allowed data input types for DelphinID.
|
||||
*/
|
||||
public static enum DelphinIDDataType {CLICKS, WHISTLES}
|
||||
|
||||
/**
|
||||
* The allowed input data type.
|
||||
*/
|
||||
public DelphinIDDataType dataType = DelphinIDDataType.WHISTLES;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* The minimum detection density.
|
||||
* The minimum detection density for whisltes and minimum number of clicks for clicks before
|
||||
* a classification is attempted.
|
||||
*/
|
||||
public double minDetectionDensity = 0.3;
|
||||
public double minDetectionValue = 0.3;
|
||||
|
||||
|
||||
/**
|
||||
* Get the allowed input data type for the delphinID classifier.
|
||||
* @return the allowed data type.
|
||||
*/
|
||||
public DelphinIDDataType getDataType() {
|
||||
return dataType;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.Clicks2Spectrum.Clks2SpectrumParams;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDParams.DelphinIDDataType;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.Whistles2Image.Whistle2ImageParams;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.Whsitle2Spectrum.Whistle2spectrumParams;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterDetectionGroup;
|
||||
@ -49,6 +50,11 @@ public class DelphinIDTransform {
|
||||
*/
|
||||
public Object transformParams = null;
|
||||
|
||||
/**
|
||||
* The data type.
|
||||
*/
|
||||
private DelphinIDDataType dataType;
|
||||
|
||||
|
||||
public DelphinIDTransform( ) {
|
||||
|
||||
@ -76,6 +82,7 @@ public class DelphinIDTransform {
|
||||
transformParams = readWhistleImageTransform( jsonObjectParams);
|
||||
|
||||
delphinIDTransformType = WHISTLE_IMAGE;
|
||||
dataType= DelphinIDDataType.WHISTLES;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -86,6 +93,7 @@ public class DelphinIDTransform {
|
||||
transformParams = readWhistleSpectrumTransform( jsonObjectParams);
|
||||
|
||||
delphinIDTransformType = WHISTLE_SPECTRUM;
|
||||
dataType= DelphinIDDataType.WHISTLES;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -96,7 +104,8 @@ public class DelphinIDTransform {
|
||||
|
||||
transformParams = readClickSpectrumTransform( jsonObjectParams);
|
||||
|
||||
delphinIDTransformType = WHISTLE_SPECTRUM;
|
||||
delphinIDTransformType = CLICK_SPECTRUM;
|
||||
dataType= DelphinIDDataType.CLICKS;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -110,14 +119,23 @@ public class DelphinIDTransform {
|
||||
private Clks2SpectrumParams readClickSpectrumTransform(JSONObject jsonObjectParams ) {
|
||||
Clks2SpectrumParams params = new Clks2SpectrumParams();
|
||||
|
||||
double[] freqLimits = new double[2];
|
||||
freqLimits[0] = jsonObjectParams.getFloat("minfreq");
|
||||
freqLimits[1] = jsonObjectParams.getFloat("maxfreq");
|
||||
// double[] freqLimits = new double[2];
|
||||
// freqLimits[0] = jsonObjectParams.getFloat("minfreq");
|
||||
// freqLimits[1] = jsonObjectParams.getFloat("maxfreq");
|
||||
|
||||
double minfragmillis = jsonObjectParams.getDouble("minclks");
|
||||
|
||||
params.freqLimits = freqLimits;
|
||||
int fftLen = jsonObjectParams.getInt("fft_len");
|
||||
boolean spectrumdB = jsonObjectParams.getInt("spectrum_dB") == 1 ? true : false;
|
||||
boolean hann = false;
|
||||
if (jsonObjectParams.has("hann")) {
|
||||
hann = jsonObjectParams.getInt("hann") == 1 ? true : false;
|
||||
}
|
||||
|
||||
// params.freqLimits = freqLimits;
|
||||
params.minFragSize = minfragmillis;
|
||||
params.spectrumdB = spectrumdB;
|
||||
params.hann = hann;
|
||||
params.setFftLength(fftLen);
|
||||
|
||||
return params;
|
||||
}
|
||||
@ -217,5 +235,9 @@ public class DelphinIDTransform {
|
||||
|
||||
}
|
||||
|
||||
public DelphinIDDataType getDataType() {
|
||||
return this.dataType;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ import whistlesAndMoans.AbstractWhistleDataUnit;
|
||||
/**
|
||||
* A bunch of utility functions that a re useful for testing and running
|
||||
* DelphinID models
|
||||
*
|
||||
*/
|
||||
public class DelphinIDUtils {
|
||||
|
||||
@ -42,7 +43,7 @@ public class DelphinIDUtils {
|
||||
//create the delphinID worker.
|
||||
DelphinIDWorkerTest delphinIDWorker = new DelphinIDWorkerTest();
|
||||
|
||||
StandardModelParams params = new StandardModelParams();
|
||||
StandardModelParams params = new DelphinIDParams();
|
||||
params.modelPath = modelPath;
|
||||
|
||||
//prepare the model
|
||||
@ -51,12 +52,8 @@ public class DelphinIDUtils {
|
||||
return delphinIDWorker;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//record WhistleGroup(ArrayList<AbstractWhistleDataUnit> whistle, double sampleRate, double fftLen, double fftHop, long fileDataStart) { }
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Holds a whistle group and some extra information on sample rate, fft length and hop and the start of the processed file.
|
||||
* Keep Java 11 compliant so do not use record.
|
||||
@ -166,7 +163,7 @@ public class DelphinIDUtils {
|
||||
|
||||
|
||||
/**
|
||||
* Load whistle contours from a MAT file. ()
|
||||
* Load whistle contours from a MAT file.
|
||||
*
|
||||
* @param filePath - the file path.
|
||||
*
|
||||
@ -199,7 +196,7 @@ public class DelphinIDUtils {
|
||||
|
||||
|
||||
/**
|
||||
* Load clicks from a MATLAB struct
|
||||
* Load clicks from a MATLAB struct.
|
||||
|
||||
* @param clicksStruct - a struct containing a list of whistle contours
|
||||
* @param fftLen- the fft length in samples
|
||||
@ -229,7 +226,7 @@ public class DelphinIDUtils {
|
||||
|
||||
|
||||
/**
|
||||
* Load whistle contours from a MAT file. ()
|
||||
* Load whistle contours from a MAT file.
|
||||
*
|
||||
* @param filePath - the file path.
|
||||
*
|
||||
@ -268,8 +265,8 @@ public class DelphinIDUtils {
|
||||
* Load whistle contours from a MATLAB struct
|
||||
|
||||
* @param whistlesStruct - a struct containing a list of whistle contours
|
||||
* @param fftLen- the fft length in samples
|
||||
* @param fftHop - the fft hop in samples.
|
||||
* @param fftLen- the FFT length in samples
|
||||
* @param fftHop - the FFT hop in samples.
|
||||
* @param sampleRate - the sample rate in samples per second.
|
||||
* @return a list of whistle contour objects from the struct.
|
||||
*/
|
||||
@ -316,14 +313,14 @@ public class DelphinIDUtils {
|
||||
|
||||
/**
|
||||
* Segment the detections into groups. Note that segments are overlaps so each whistle may belong to multiple segments.
|
||||
* @param whistles - a list of whistles - not necessarily sorted by time.
|
||||
* @param detections - a list of whistles - not necessarily sorted by time.
|
||||
* @param dataStartMillis - the start time of the data in millis i.e. where the first segment starts.
|
||||
* @param segLen - the segment size in milliseconds.
|
||||
* @param segHop - the segment hop in milliseconds.
|
||||
* @param sampleRate - the sample rate to set.
|
||||
* @return groups of data units within each segment.
|
||||
*/
|
||||
public static ArrayList<SegmenterDetectionGroup> segmentDetectionData(ArrayList<? extends PamDataUnit> whistles, long dataStartMillis,
|
||||
public static ArrayList<SegmenterDetectionGroup> segmentDetectionData(ArrayList<? extends PamDataUnit> detections, long dataStartMillis,
|
||||
double segLen, double segHop, Float sampleRate){
|
||||
|
||||
ArrayList<SegmenterDetectionGroup> group = new ArrayList<SegmenterDetectionGroup>();
|
||||
@ -331,33 +328,37 @@ public class DelphinIDUtils {
|
||||
//find the maximum whistle time
|
||||
long maxTime = Long.MIN_VALUE;
|
||||
long endTime = 0;
|
||||
for (PamDataUnit whislte: whistles) {
|
||||
endTime = (long) (whislte.getTimeMilliseconds()+whislte.getDurationInMilliseconds());
|
||||
for (PamDataUnit det: detections) {
|
||||
endTime = (long) (det.getTimeMilliseconds()+det.getDurationInMilliseconds());
|
||||
if (endTime>maxTime) maxTime=endTime;
|
||||
}
|
||||
|
||||
long segStart = dataStartMillis;
|
||||
long segEnd = (long) (segStart+segLen);
|
||||
|
||||
long whistleStart;
|
||||
long whistleEnd;
|
||||
long detStart;
|
||||
long detEnd;
|
||||
AcousticDetectionGroup whistleGroup;
|
||||
while (segStart<endTime){
|
||||
|
||||
whistleGroup = new AcousticDetectionGroup(segStart, 1, segEnd, segLen);
|
||||
whistleGroup.setHardSampleRate(sampleRate);
|
||||
whistleGroup.setStartSecond((segStart-dataStartMillis)/1000.);
|
||||
|
||||
for (PamDataUnit whislte: whistles) {
|
||||
whistleStart = whislte.getTimeMilliseconds();
|
||||
whistleEnd = (long) (whislte.getTimeMilliseconds() + whislte.getDurationInMilliseconds());
|
||||
for (PamDataUnit aDet: detections) {
|
||||
detStart = aDet.getTimeMilliseconds();
|
||||
detEnd = (long) (aDet.getTimeMilliseconds() + aDet.getDurationInMilliseconds());
|
||||
|
||||
if ((whistleStart>=segStart && whistleStart<segEnd) || ((whistleEnd>=segStart && whistleEnd<segEnd))){
|
||||
if ((detStart>=segStart && detStart<segEnd) || ((detEnd>=segStart && detEnd<segEnd))){
|
||||
//some part of the whistle is in the segment.
|
||||
whistleGroup.addSubDetection(whislte);
|
||||
whistleGroup.addSubDetection(aDet);
|
||||
//System.out.println("segStart: " + segStart + " Click UID: " + aDet.getUID() + " " + PamCalendar.formatDateTime2(aDet.getTimeMilliseconds(), "dd MMM yyyy HH:mm:ss.SSS", false) + " " + aDet.getDurationInMilliseconds());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//System.out.println("New click group: ----------------- " + whistleGroup.getSubDetectionsCount() + " " + (segStart-dataStartMillis)/1000. + "s" + " " + segEnd);
|
||||
|
||||
group.add(whistleGroup);
|
||||
|
||||
// System.out.println("SegStart: " + (segStart - dataStartMillis));
|
||||
@ -367,7 +368,6 @@ public class DelphinIDUtils {
|
||||
}
|
||||
|
||||
return group;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -384,7 +384,7 @@ public class DelphinIDUtils {
|
||||
@Override
|
||||
public float getSampleRate() {
|
||||
if (super.getParentDataBlock()==null) {
|
||||
return hardSampleRate;
|
||||
return hardSampleRate;
|
||||
}
|
||||
else {
|
||||
return super.getSampleRate();
|
||||
@ -574,11 +574,8 @@ public class DelphinIDUtils {
|
||||
if (listOfFiles[i].isDirectory()) {
|
||||
//get a list of csv files
|
||||
// ArrayList<File> csvFiles = filelist.getFileList(listOfFiles[i].getAbsolutePath(), ".mat" , true);
|
||||
|
||||
System.out.println("Directory " + listOfFiles[i].getName());
|
||||
|
||||
|
||||
|
||||
try {
|
||||
|
||||
File file = new File(listOfFiles[i].getPath() + File.separator + "whistles.mat");
|
||||
|
@ -50,7 +50,7 @@ public class DelphinIDWhistleTest {
|
||||
|
||||
|
||||
//0.21068583 0.28237167 0.07045266 0.1493272 0.041739468 0.04061936 0.2048038
|
||||
String matout = "/Users/au671271/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/whistle1D/whistle_spectrums.mat";
|
||||
String matout = "/Users/jdjm/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/whistle1D/whistle_spectrums.mat";
|
||||
testDelphinIDSpectrumModel(matout);
|
||||
|
||||
|
||||
@ -101,7 +101,7 @@ public class DelphinIDWhistleTest {
|
||||
* @param segHop - the segment hop in samples
|
||||
* @return true if everything worked without throwing an error.
|
||||
*/
|
||||
public static boolean runWhistleModel(String modelPath, String whistleContourPath, String matImageSave, double startSeconds, double segLen, double segHop) {
|
||||
public static float[][] runWhistleModel(String modelPath, String whistleContourPath, String matImageSave, double startSeconds, double segLen, double segHop) {
|
||||
|
||||
//create MatFile for saving the image data to.
|
||||
MatFile matFile = Mat5.newMatFile();
|
||||
@ -126,9 +126,10 @@ public class DelphinIDWhistleTest {
|
||||
DelphinIDWorkerTest model = DelphinIDUtils.prepDelphinIDModel(path.toAbsolutePath().toString());
|
||||
model.setEnableSoftMax(false);
|
||||
|
||||
|
||||
//initialise strcuture for image data
|
||||
Struct imageStruct = Mat5.newStruct(segments.size(), 1);
|
||||
|
||||
float[][] outputs = new float[segments.size()][];
|
||||
|
||||
for (int i=0; i<segments.size(); i++) {
|
||||
|
||||
@ -137,22 +138,24 @@ public class DelphinIDWhistleTest {
|
||||
aSegment.add(segments.get(i));
|
||||
|
||||
if (segments.get(i).getSubDetectionsCount()>0) {
|
||||
//the prediction.
|
||||
ArrayList<StandardPrediction> predicition = model.runModel(aSegment, sampleRate, 1);
|
||||
//the prediction.
|
||||
ArrayList<StandardPrediction> predicition = model.runModel(aSegment, sampleRate, 1);
|
||||
|
||||
float[] output = predicition.get(0).getPrediction();
|
||||
float[] output = predicition.get(0).getPrediction();
|
||||
|
||||
System.out.println();
|
||||
System.out.print(String.format("Segment: %d %.4f s" , i ,((aSegment.get(0).getSegmentStartMillis()-dataStartMillis)/1000.)));
|
||||
for (int j=0; j<output.length; j++) {
|
||||
System.out.print(String.format( " %.4f" , output[j]));
|
||||
}
|
||||
System.out.println();
|
||||
System.out.print(String.format("Segment: %d %.4f s" , i ,((aSegment.get(0).getSegmentStartMillis()-dataStartMillis)/1000.)));
|
||||
for (int j=0; j<output.length; j++) {
|
||||
System.out.print(String.format( " %.4f" , output[j]));
|
||||
}
|
||||
|
||||
Matrix modelinput = DLMatFile.array2Matrix(PamArrayUtils.float2Double(model.getLastModelInput()[0]));
|
||||
imageStruct.set("modelinput", i, modelinput);
|
||||
imageStruct.set("startmillis", i, Mat5.newScalar(aSegment.get(0).getSegmentStartMillis()));
|
||||
imageStruct.set("startseconds", i, Mat5.newScalar((aSegment.get(0).getSegmentStartMillis()-dataStartMillis)/1000.));
|
||||
imageStruct.set("prediction", i, DLMatFile.array2Matrix(PamArrayUtils.float2Double(output)));
|
||||
Matrix modelinput = DLMatFile.array2Matrix(PamArrayUtils.float2Double(model.getLastModelInput()[0]));
|
||||
imageStruct.set("modelinput", i, modelinput);
|
||||
imageStruct.set("startmillis", i, Mat5.newScalar(aSegment.get(0).getSegmentStartMillis()));
|
||||
imageStruct.set("startseconds", i, Mat5.newScalar((aSegment.get(0).getSegmentStartMillis()-dataStartMillis)/1000.));
|
||||
imageStruct.set("prediction", i, DLMatFile.array2Matrix(PamArrayUtils.float2Double(output)));
|
||||
|
||||
outputs[i] = output;
|
||||
}
|
||||
|
||||
}
|
||||
@ -172,7 +175,7 @@ public class DelphinIDWhistleTest {
|
||||
// System.out.println("Whislte: " + i);
|
||||
// PamArrayUtils.printArray(whistleContours.get(i).getFreqsHz());
|
||||
// }
|
||||
return true;
|
||||
return outputs;
|
||||
}
|
||||
|
||||
|
||||
@ -205,9 +208,9 @@ public class DelphinIDWhistleTest {
|
||||
String modelPath = "/Users/au671271/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Dde415/whistle_4s_415_model.zip";
|
||||
// String modelPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistle_4s_415_model.zip";
|
||||
|
||||
boolean whistleOK = runWhistleModel( modelPath, whistleContourPath, matImageSave, startSeconds, segLen, segHop);
|
||||
float[][] outputs = runWhistleModel( modelPath, whistleContourPath, matImageSave, startSeconds, segLen, segHop);
|
||||
|
||||
return whistleOK;
|
||||
return outputs!=null;
|
||||
}
|
||||
|
||||
|
||||
@ -387,16 +390,16 @@ public class DelphinIDWhistleTest {
|
||||
long dataStartMillis = 1340212413000L;
|
||||
|
||||
//path to the .mat containing whistle contours.
|
||||
String whistleContourPath = "/Users/au671271/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/whistle_contours_20200918_123234.mat";
|
||||
String whistleContourPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/whistle_contours_20200918_123234.mat";
|
||||
|
||||
//the path to the model
|
||||
//String modelPath = "D:/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/testencounter415/whistle_model_2/whistle_4s_415.zip";
|
||||
String modelPath = "/Users/au671271/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/whistleclassifier.zip";
|
||||
//String modelPath = "D:/Dropbox/jdjm/Deep_Learning/delphinID/testencounter415/whistle_model_2/whistle_4s_415.zip";
|
||||
String modelPath = "/Users/jdjm/Library/CloudStorage/Dropbox/PAMGuard_dev/Deep_Learning/delphinID/delphinIDmodels/Ggr242/whistleclassifier.zip";
|
||||
// String modelPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistle_4s_415_model.zip";
|
||||
|
||||
boolean whistleOK = runWhistleModel( modelPath, whistleContourPath, matImageSave, startSeconds, segLen, segHop);
|
||||
float[][] outputs = runWhistleModel( modelPath, whistleContourPath, matImageSave, startSeconds, segLen, segHop);
|
||||
|
||||
return whistleOK;
|
||||
return outputs!=null;
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,6 +22,7 @@ import PamUtils.PamArrayUtils;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import ai.djl.Model;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.archiveModel.ArchiveModelWorker;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.Whistles2Image.Whistle2ImageParams;
|
||||
@ -60,14 +61,17 @@ public class DelphinIDWorker extends ArchiveModelWorker {
|
||||
|
||||
|
||||
@Override
|
||||
public void prepModel(StandardModelParams dlParams, DLControl dlControl) {
|
||||
public DLStatus prepModel(StandardModelParams dlParams, DLControl dlControl) {
|
||||
//most of the model prep is done in the perent class.
|
||||
super.prepModel(dlParams, dlControl);
|
||||
DLStatus status = super.prepModel(dlParams, dlControl);
|
||||
|
||||
//now have to read the whsitle2image transform to get correct parameters for that.
|
||||
String jsonString = DLTransformsParser.readJSONString(new File(this.getModel().getAudioReprFile()));
|
||||
|
||||
boolean transformOK = groupDataTransform.setJSONData(new JSONObject(jsonString));
|
||||
JSONObject jsonObject = new JSONObject(jsonString);
|
||||
boolean transformOK = groupDataTransform.setJSONData(jsonObject);
|
||||
|
||||
((DelphinIDParams) dlParams).dataType = groupDataTransform.getDataType();
|
||||
|
||||
if (!transformOK) {
|
||||
System.err.println("Error: could not find whsitle or click group transform in DelphinID JSON file. Model will not work.");
|
||||
@ -78,6 +82,8 @@ public class DelphinIDWorker extends ArchiveModelWorker {
|
||||
for (int i=0; i<dlParams.numClasses; i++) {
|
||||
dlParams.binaryClassification[i]=true;
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
|
@ -98,4 +98,10 @@ public class DummyClassifier implements DLClassiferModel{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<Class> getAllowedDataTypes() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import org.jamdev.jpamutils.wavFiles.AudioData;
|
||||
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.segmenter.GroupedRawData;
|
||||
|
||||
@ -136,6 +137,7 @@ public abstract class DLModelWorker<T> {
|
||||
float[] prob;
|
||||
float[] classOut;
|
||||
for (int i=0; i<transformedDataStack.length; i++) {
|
||||
|
||||
/**
|
||||
* This is super weird. Reading the documentation for copyOfRange the index from and index to are inclusive. So
|
||||
* to copy the first two elements indexfrom =0 and indexto = 1. But actually it seems that this should be indexfrom =0 and indexto =2.
|
||||
@ -143,7 +145,7 @@ public abstract class DLModelWorker<T> {
|
||||
*/
|
||||
classOut = Arrays.copyOfRange(output, i*numclasses, (i+1)*numclasses);
|
||||
|
||||
// System.out.println("The copyOfRange is: " + i*numclasses + " to " + ((i+1)*numclasses-1) + " class out len: " + classOut.length);
|
||||
// System.out.println("The copyOfRange is: " + i*numclasses + " to " + ((i+1)*numclasses-1) + " class out len: " + classOut.length);
|
||||
|
||||
if (enableSoftMax) {
|
||||
prob = new float[classOut.length];
|
||||
@ -190,7 +192,7 @@ public abstract class DLModelWorker<T> {
|
||||
|
||||
public abstract T makeModelResult(float[] prob, double time);
|
||||
|
||||
public abstract void prepModel(StandardModelParams soundSpotParams, DLControl dlControl);
|
||||
public abstract DLStatus prepModel(StandardModelParams soundSpotParams, DLControl dlControl);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -2,6 +2,7 @@ package rawDeepLearningClassifier.dlClassification.genericModel;
|
||||
|
||||
import java.io.File;
|
||||
import pamViewFX.fxNodes.PamButton;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelPane;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
|
||||
@ -84,7 +85,7 @@ public class GenericModelPane extends StandardModelPane {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void newModelSelected(File file) {
|
||||
public DLStatus newModelSelected(File file) {
|
||||
this.setCurrentSelectedFile(file);
|
||||
|
||||
//this.setParamsClone(new GenericModelParams());
|
||||
@ -93,11 +94,14 @@ public class GenericModelPane extends StandardModelPane {
|
||||
|
||||
// genericDLClassifier.getGenericDLWorker().prepModel(getParams(getParamsClone()), genericDLClassifier.getDLControl());
|
||||
//do not have getParam here as it resets some of the setting before set params has been called.
|
||||
genericDLClassifier.getGenericDLWorker().prepModel(getParamsClone(), genericDLClassifier.getDLControl());
|
||||
DLStatus status = genericDLClassifier.getGenericDLWorker().prepModel(getParamsClone(), genericDLClassifier.getDLControl());
|
||||
|
||||
|
||||
//now new parameters have been set in the prepModel functions so need to set new params now.
|
||||
getAdvSettingsPane().setParams(getParamsClone());
|
||||
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
@ -11,7 +11,9 @@ import org.jamdev.jpamutils.JamArr;
|
||||
import PamModel.PamModel;
|
||||
import PamModel.PamModel.PluginClassloader;
|
||||
import PamUtils.PamArrayUtils;
|
||||
import ai.djl.engine.EngineException;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
|
||||
/**
|
||||
@ -47,7 +49,7 @@ public class GenericModelWorker extends DLModelWorker<StandardPrediction> {
|
||||
waveStack[i] = transformedDataStack[i][0];
|
||||
}
|
||||
|
||||
// System.out.println("RUN GENERIC MODEL WAVE: " + waveStack.length + " " + waveStack[0].length + " " + waveStack[0][0]);
|
||||
// System.out.println("RUN GENERIC MODEL WAVE: " + waveStack.length + " " + waveStack[0].length + " " + waveStack[0][0] + " " + PamArrayUtils.max( waveStack[0]));
|
||||
// PamArrayUtils.printArray(waveStack[0]);
|
||||
results = getModel().runModel(waveStack);
|
||||
}
|
||||
@ -64,10 +66,10 @@ public class GenericModelWorker extends DLModelWorker<StandardPrediction> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prepModel(StandardModelParams genericParams, DLControl dlControl) {
|
||||
public DLStatus prepModel(StandardModelParams genericParams, DLControl dlControl) {
|
||||
//ClassLoader origCL = Thread.currentThread().getContextClassLoader();
|
||||
try {
|
||||
if (genericParams.modelPath==null) return;
|
||||
if (genericParams.modelPath==null) return DLStatus.NO_MODEL_LOADED;
|
||||
|
||||
// get the plugin class loader and set it as the context class loader
|
||||
// NOTE THAT THIS IS REQUIRED TO MAKE THIS MODULE RUN AS A PLUGIN WHEN THE CLASS FILES
|
||||
@ -108,6 +110,9 @@ public class GenericModelWorker extends DLModelWorker<StandardPrediction> {
|
||||
|
||||
//use softmax or not?
|
||||
String extension = FilenameUtils.getExtension(genericParams.modelPath);
|
||||
|
||||
|
||||
//TODO - need to add output transforms to models
|
||||
if (extension.equals("pb")) {
|
||||
//TensorFlow models don't need softmax?? Need to look into this more.
|
||||
this.setEnableSoftMax(false);
|
||||
@ -122,13 +127,22 @@ public class GenericModelWorker extends DLModelWorker<StandardPrediction> {
|
||||
((GenericModelParams) genericParams).defualtOuput = longArr2Long(genericModel.getOutShape().getShape());
|
||||
|
||||
|
||||
}
|
||||
catch (EngineException e) {
|
||||
return DLStatus.MODEL_ENGINE_FAIL;
|
||||
}
|
||||
catch (Exception e) {
|
||||
genericModel=null;
|
||||
e.printStackTrace();
|
||||
|
||||
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
|
||||
//WarnOnce.showWarning(null, "Model Load Error", "There was an error loading the model file.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
|
||||
return DLStatus.MODEL_LOAD_SUCCESS;
|
||||
|
||||
//Thread.currentThread().setContextClassLoader(origCL);
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javafx.stage.FileChooser.ExtensionFilter;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelPane;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
|
||||
@ -29,7 +30,7 @@ public class KetosModelPane extends StandardModelPane {
|
||||
|
||||
|
||||
@Override
|
||||
public void newModelSelected(File file) {
|
||||
public DLStatus newModelSelected(File file) {
|
||||
|
||||
//A ketos model contains information on the transforms, duration and the class names.
|
||||
this.setCurrentSelectedFile(file);
|
||||
@ -55,7 +56,7 @@ public class KetosModelPane extends StandardModelPane {
|
||||
* Note that the model prep will determine whether new transforms need to be loaded from the
|
||||
* model or to use the existing transforms in the settings.
|
||||
*/
|
||||
ketosClassifier.getKetosWorker().prepModel(params, ketosClassifier.getDLControl());
|
||||
DLStatus status = ketosClassifier.getKetosWorker().prepModel(params, ketosClassifier.getDLControl());
|
||||
//get the model transforms calculated from the model by SoundSpoyWorker and apply them to our temporary params clone.
|
||||
// System.out.println("Ketos transforms 1: " + this.ketosClassifier.getKetosWorker().getModelTransforms());
|
||||
getParamsClone().dlTransfroms = this.ketosClassifier.getKetosWorker().getModelTransforms();
|
||||
@ -70,6 +71,8 @@ public class KetosModelPane extends StandardModelPane {
|
||||
///set the advanced pane parameters.
|
||||
getAdvSettingsPane().setParams(getParamsClone());
|
||||
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -12,7 +12,9 @@ import org.jamdev.jdl4pam.transforms.DLTransformsFactory;
|
||||
import org.jamdev.jdl4pam.transforms.jsonfile.DLTransformsParser;
|
||||
|
||||
import PamView.dialog.warn.WarnOnce;
|
||||
import ai.djl.engine.EngineException;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.dlClassification.animalSpot.StandardModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.DLModelWorker;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.StandardPrediction;
|
||||
@ -48,8 +50,9 @@ public class KetosWorker extends DLModelWorker<StandardPrediction> {
|
||||
|
||||
/**
|
||||
* Prepare the model
|
||||
* @return
|
||||
*/
|
||||
public void prepModel(StandardModelParams ketosDLParams, DLControl dlControl) {
|
||||
public DLStatus prepModel(StandardModelParams ketosDLParams, DLControl dlControl) {
|
||||
//ClassLoader origCL = Thread.currentThread().getContextClassLoader();
|
||||
try {
|
||||
|
||||
@ -79,8 +82,13 @@ public class KetosWorker extends DLModelWorker<StandardPrediction> {
|
||||
//System.out.println(genericModel.getModel().getModelPath().getFileName());
|
||||
}
|
||||
}
|
||||
catch (EngineException e) {
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_ENGINE_FAIL;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
//WarnOnce.showWarning(null, "Model Load Error", "There was an error loading the model file.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
|
||||
@ -176,9 +184,11 @@ public class KetosWorker extends DLModelWorker<StandardPrediction> {
|
||||
catch (Exception e) {
|
||||
ketosModel=null;
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_META_FAIL;
|
||||
//WarnOnce.showWarning(null, "Model Metadata Error", "There was an error extracting the metadata from the model.", WarnOnce.OK_OPTION);
|
||||
}
|
||||
//Thread.currentThread().setContextClassLoader(origCL);
|
||||
return DLStatus.MODEL_LOAD_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
@ -364,6 +364,12 @@ public class OrcaSpotClassifier implements DLClassiferModel, PamSettings {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<Class> getAllowedDataTypes() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -374,12 +374,18 @@ public class DLModelSelectPane extends PamBorderPane {
|
||||
if (currentClassifierModel!=null) {
|
||||
|
||||
try {
|
||||
//we are loading model from a file - anything can happen so put in a try catch.
|
||||
DLStatus status = currentClassifierModel.setModel(file);
|
||||
|
||||
File fileChck = new File(file);
|
||||
|
||||
if (!fileChck.exists()) {
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
}
|
||||
|
||||
//we are loading model from a file - anything can happen so put in a try catch.
|
||||
DLStatus status = currentClassifierModel.setModel(file);
|
||||
|
||||
if (status.isError()) {
|
||||
System.err.println("Model load failed: " + currentClassifierModel.getModelStatus());
|
||||
System.err.println("Model load failed: " + status);
|
||||
currentClassifierModel=null;
|
||||
return status;
|
||||
}
|
||||
@ -389,17 +395,17 @@ public class DLModelSelectPane extends PamBorderPane {
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
currentClassifierModel=null;
|
||||
return DLStatus.MODEL_LOAD_FAILED;
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
currentClassifierModel=null;
|
||||
return DLStatus.MODEL_LOAD_FAILED;
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
private void showWarningDialog(DLStatus status) {
|
||||
this.rawDLSettingsPane.showWarning(status);
|
||||
this.rawDLSettingsPane.showWarningDialog(status);
|
||||
// PamDialogFX.showError(status.getName(), status.getDescription());
|
||||
}
|
||||
|
||||
@ -568,16 +574,17 @@ public class DLModelSelectPane extends PamBorderPane {
|
||||
return result;
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("UNABLE TO LOAD MODEL");
|
||||
System.out.println("-----UNABLE TO LOAD MODEL-----");
|
||||
currentClassifierModel=null; //this will reset the pane
|
||||
e.printStackTrace();
|
||||
return DLStatus.MODEL_LOAD_FAILED;
|
||||
return DLStatus.MODEL_LOAD_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
private void finishedLoading() {
|
||||
|
||||
if (this.getValue().isError()) {
|
||||
//show a warnign dialog
|
||||
showWarningDialog(this.getValue());
|
||||
}
|
||||
|
||||
|
@ -3,8 +3,6 @@ package rawDeepLearningClassifier.layoutFX;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.controlsfx.control.PopOver;
|
||||
import org.controlsfx.control.ToggleSwitch;
|
||||
|
||||
import PamController.PamGUIManager;
|
||||
import PamController.SettingsPane;
|
||||
import PamDetection.RawDataUnit;
|
||||
@ -37,11 +35,12 @@ import pamViewFX.fxNodes.PamVBox;
|
||||
import pamViewFX.fxNodes.pamDialogFX.PamDialogFX;
|
||||
import pamViewFX.fxNodes.utilityPanes.GroupedSourcePaneFX;
|
||||
import pamViewFX.fxNodes.utilityPanes.PamToggleSwitch;
|
||||
import pamViewFX.validator.PamValidator;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import rawDeepLearningClassifier.RawDLParams;
|
||||
import rawDeepLearningClassifier.dlClassification.DLClassiferModel;
|
||||
import warnings.PamWarning;
|
||||
import whistlesAndMoans.ConnectedRegionDataUnit;
|
||||
|
||||
/**
|
||||
* The settings pane.
|
||||
@ -123,6 +122,10 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
private PamGridPane segmenterGridPane;
|
||||
|
||||
|
||||
private ArrayList<Class> currentAllowedDataTypes;
|
||||
|
||||
private DLWarningDialog dlWarningDialog ;
|
||||
|
||||
|
||||
public DLSettingsPane(DLControl dlControl){
|
||||
super(null);
|
||||
@ -147,7 +150,7 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
mainPane.setPrefWidth(MAX_WIDTH);
|
||||
}
|
||||
//this.getAdvPane().setMaxWidth(MAX_WIDTH);
|
||||
|
||||
dlWarningDialog = new DLWarningDialog(this);
|
||||
|
||||
//mainPane.getStylesheets().add(PamStylesManagerFX.getPamStylesManagerFX().getCurStyle().getDialogCSS());
|
||||
|
||||
@ -163,11 +166,13 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
PamVBox vBox=new PamVBox();
|
||||
vBox.setSpacing(5);
|
||||
|
||||
sourcePane = new GroupedSourcePaneFX("Raw Sound Data", RawDataUnit.class, true, false, true);
|
||||
sourcePane.addSourceType(ClickDetection.class, false);
|
||||
sourcePane.addSourceType(ClipDataUnit.class, false);
|
||||
sourcePane.addSourceType(ConnectedRegionDataUnit.class, false);
|
||||
|
||||
sourcePane = new GroupedSourcePaneFX("Raw Sound Data", null, true, false, true);
|
||||
setDefaultSourceList();
|
||||
|
||||
// sourcePane.addSourceType(ClickDetection.class, false);
|
||||
// sourcePane.addSourceType(ClipDataUnit.class, false);
|
||||
// sourcePane.addSourceType(ConnectedRegionDataUnit.class, false);
|
||||
|
||||
|
||||
vBox.getChildren().add(sourcePane);
|
||||
sourcePane.prefWidthProperty().bind(vBox.widthProperty());
|
||||
@ -396,27 +401,94 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
* Set the classifier pane.
|
||||
*/
|
||||
protected void setClassifierPane() {
|
||||
|
||||
|
||||
//set the classifier Pane.class
|
||||
|
||||
//System.out.println("SET CLASSIFIER PANE");
|
||||
|
||||
if (modelSelectPane.currentClassifierModel!=null && modelSelectPane.currentClassifierModel.getModelUI()!=null) {
|
||||
|
||||
classifierPane.setCenter(modelSelectPane.currentClassifierModel.getModelUI().getSettingsPane().getContentNode());
|
||||
|
||||
if (modelSelectPane.currentClassifierModel!=null) {
|
||||
modelSelectPane.currentClassifierModel.getModelUI().setParams();
|
||||
setSourceList(modelSelectPane.currentClassifierModel);
|
||||
}
|
||||
else {
|
||||
classifierPane.setCenter(null);
|
||||
setDefaultSourceList();
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
classifierPane.setCenter(null);
|
||||
setDefaultSourceList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the allowed sources for this type of model.
|
||||
* @param currentClassifierModel - the allowed sources.
|
||||
*/
|
||||
private void setSourceList(DLClassiferModel currentClassifierModel) {
|
||||
|
||||
//we don't want to set the source list again and gain if the model has changed.
|
||||
if (currentClassifierModel==null) {
|
||||
setDefaultSourceList();
|
||||
currentAllowedDataTypes=null;
|
||||
return;
|
||||
}
|
||||
|
||||
//System.out.println("SET SOURCE LIST: " + currentClassifierModel.getAllowedDataTypes());
|
||||
|
||||
if (isNewDataType(currentAllowedDataTypes, currentClassifierModel.getAllowedDataTypes())) {
|
||||
//set the source list for a given classifier model.
|
||||
if (currentClassifierModel.getAllowedDataTypes()==null) {
|
||||
//default is for models to require raw sound data
|
||||
setDefaultSourceList() ;
|
||||
}
|
||||
else {
|
||||
sourcePane.setTitleText("Detection data");
|
||||
sourcePane.clearSourceTypeList();
|
||||
sourcePane.setSourceIndex(-1);
|
||||
for (@SuppressWarnings("rawtypes") Class type: currentClassifierModel.getAllowedDataTypes()) {
|
||||
sourcePane.addSourceType(type, false);
|
||||
}
|
||||
}
|
||||
currentAllowedDataTypes = currentClassifierModel.getAllowedDataTypes();
|
||||
}
|
||||
//System.out.println("SET SOURCE LIST: " + sourcePane.getSourceCount());
|
||||
|
||||
//something has gone wrong but at least have sound acquisition for sample rate.
|
||||
if (sourcePane.getSourceCount()<=0) {
|
||||
setDefaultSourceList();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isNewDataType(ArrayList<Class> currentAllowedDataTypes1, ArrayList<Class> currentAllowedDataTypes2) {
|
||||
|
||||
if (currentAllowedDataTypes1==null && currentAllowedDataTypes2!=null) return true;
|
||||
if (currentAllowedDataTypes2==null && currentAllowedDataTypes1!=null) return true;
|
||||
if (currentAllowedDataTypes2==null && currentAllowedDataTypes1==null) return false;
|
||||
if (!currentAllowedDataTypes2.equals(currentAllowedDataTypes2)) return true;
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the default data sources which are anything that contains raw acoustic data.
|
||||
*/
|
||||
private void setDefaultSourceList() {
|
||||
sourcePane.setTitleText("Raw Sound Data");
|
||||
sourcePane.clearSourceTypeList();
|
||||
sourcePane.addSourceType(RawDataUnit.class, false);
|
||||
sourcePane.addSourceType(ClickDetection.class, false);
|
||||
sourcePane.addSourceType(ClipDataUnit.class, false);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RawDLParams getParams(RawDLParams currParams) {
|
||||
|
||||
@ -426,7 +498,15 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
PamDataBlock rawDataBlock = sourcePane.getSource();
|
||||
if (rawDataBlock == null){
|
||||
Platform.runLater(()->{
|
||||
PamDialogFX.showWarning("There is no datablock set. The segmenter must have a datablock set.");
|
||||
dlWarningDialog.showWarning("There is no datablock set. The segmenter must have a datablock set.");
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
if (sourcePane.getChannelValidator().containsErrors()) {
|
||||
Platform.runLater(()->{
|
||||
String content = PamValidator.list2String(sourcePane.getChannelValidator().getValidationResult().getMessages());
|
||||
dlWarningDialog.showWarning(content);
|
||||
});
|
||||
return null;
|
||||
}
|
||||
@ -437,7 +517,7 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
|
||||
if (windowLength.getValue() == 0 || hopLength.getValue()==0){
|
||||
Platform.runLater(()->{
|
||||
PamDialogFX.showWarning("Neither the hop nor window length can be zero");
|
||||
dlWarningDialog.showWarning("Neither the hop nor window length can be zero");
|
||||
});
|
||||
return null;
|
||||
}
|
||||
@ -498,55 +578,6 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
return pamWarning;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a warning dialog for the status
|
||||
* @param the status to show
|
||||
*/
|
||||
public void showWarning(DLStatus dlWarning) {
|
||||
ArrayList<PamWarning> dlWarnings = new ArrayList<PamWarning>();
|
||||
dlWarnings.add(statusToWarnings(dlWarning));
|
||||
showWarning(dlWarnings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a warning dialog.
|
||||
* @param the warning to show.
|
||||
*/
|
||||
public void showWarning(PamWarning dlWarning) {
|
||||
ArrayList<PamWarning> dlWarnings = new ArrayList<PamWarning>();
|
||||
dlWarnings.add(dlWarning);
|
||||
showWarning(dlWarnings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show a warning dialog.
|
||||
* @param dlWarnings - list of warnings - the most important will be shown.
|
||||
*/
|
||||
public void showWarning(ArrayList<PamWarning> dlWarnings) {
|
||||
|
||||
if (dlWarnings==null || dlWarnings.size()<1) return;
|
||||
|
||||
String warnings ="";
|
||||
|
||||
|
||||
boolean error = false;
|
||||
for (int i=0; i<dlWarnings.size(); i++) {
|
||||
warnings += dlWarnings.get(i).getWarningMessage() + "\n\n";
|
||||
if (dlWarnings.get(i).getWarnignLevel()>1) {
|
||||
error=true;
|
||||
}
|
||||
}
|
||||
|
||||
final String warningsF = warnings;
|
||||
final boolean errorF = error;
|
||||
Platform.runLater(()->{
|
||||
WarnOnce.showWarningFX(null, "Deep Learning Settings Warning", warningsF , errorF ? AlertType.ERROR : AlertType.WARNING);
|
||||
// WarnOnce.showWarning( "Deep Learning Settings Warning", warningsF , WarnOnce.WARNING_MESSAGE);
|
||||
});
|
||||
|
||||
//user presses OK - these warnings are just a message - they do not prevent running the module.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParams(RawDLParams currParams) {
|
||||
@ -577,12 +608,13 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
|
||||
segEnableSwitch.setSelected(currParams.enableSegmentation);
|
||||
|
||||
enableControls();
|
||||
|
||||
// //set up the model and the custom pane if necessary.
|
||||
this.modelSelectPane.loadNewModel(currParams.modelURI);
|
||||
//this.modelSelectPane.updatePathLabel();
|
||||
this.setClassifierPane();
|
||||
|
||||
|
||||
enableControls();
|
||||
|
||||
//For some reason, in the FX GUI, this causes a root used in multiple scenes exceptions...not sure why.
|
||||
Platform.runLater(()->{
|
||||
@ -658,5 +690,11 @@ public class DLSettingsPane extends SettingsPane<RawDLParams>{
|
||||
}
|
||||
|
||||
|
||||
public void showWarningDialog(DLStatus status) {
|
||||
dlWarningDialog.showWarningDialog(status);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
107
src/rawDeepLearningClassifier/layoutFX/DLWarningDialog.java
Normal file
107
src/rawDeepLearningClassifier/layoutFX/DLWarningDialog.java
Normal file
@ -0,0 +1,107 @@
|
||||
package rawDeepLearningClassifier.layoutFX;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import PamView.dialog.warn.WarnOnce;
|
||||
import PamView.dialog.warn.WarnOnceDialogFX;
|
||||
import javafx.application.Platform;
|
||||
import javafx.scene.control.Alert.AlertType;
|
||||
import rawDeepLearningClassifier.DLStatus;
|
||||
import warnings.PamWarning;
|
||||
|
||||
public class DLWarningDialog {
|
||||
|
||||
private boolean warningShow;
|
||||
|
||||
public DLWarningDialog(DLSettingsPane rawDLSettingsPane) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a warning dialog for the status
|
||||
* @param the status to show
|
||||
*/
|
||||
public void showWarningDialog(DLStatus dlWarning) {
|
||||
|
||||
switch(dlWarning) {
|
||||
case MODEL_ENGINE_FAIL ->{
|
||||
//special warning dialog
|
||||
// show the warning
|
||||
WarnOnceDialogFX wo = new WarnOnceDialogFX(null, dlWarning.getName(), dlWarning.getDescription(), AlertType.ERROR, null, null, "Ok", "Cancel", true);
|
||||
wo.showDialog();
|
||||
}
|
||||
default -> {
|
||||
//default for most warnings.
|
||||
ArrayList<PamWarning> dlWarnings = new ArrayList<PamWarning>();
|
||||
dlWarnings.add(DLSettingsPane.statusToWarnings(dlWarning));
|
||||
showWarning(dlWarnings);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show a warning dialog.
|
||||
* @param the warning to show.
|
||||
*/
|
||||
public void showWarning(String dlWarning) {
|
||||
this.warningShow = true;
|
||||
Platform.runLater(()->{
|
||||
WarnOnce.showWarningFX(null, "Deep Learning Settings Warning", dlWarning , AlertType.WARNING, true);
|
||||
warningShow = false;
|
||||
// WarnOnce.showWarning( "Deep Learning Settings Warning", warningsF , WarnOnce.WARNING_MESSAGE);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a warning dialog.
|
||||
* @param the warning to show.
|
||||
*/
|
||||
public void showWarning(PamWarning dlWarning) {
|
||||
ArrayList<PamWarning> dlWarnings = new ArrayList<PamWarning>();
|
||||
dlWarnings.add(dlWarning);
|
||||
showWarning(dlWarnings);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show a warning dialog.
|
||||
* @param dlWarnings - list of warnings - the most important will be shown.
|
||||
*/
|
||||
private void showWarning(ArrayList<PamWarning> dlWarnings) {
|
||||
|
||||
System.out.println("Show warning: " + dlWarnings);
|
||||
|
||||
if (warningShow) return; //not the best but don't show multiple dialogs on top of each other.
|
||||
|
||||
if (dlWarnings==null || dlWarnings.size()<1) return;
|
||||
|
||||
String warnings ="";
|
||||
|
||||
|
||||
boolean error = false;
|
||||
for (int i=0; i<dlWarnings.size(); i++) {
|
||||
warnings += dlWarnings.get(i).getWarningMessage() + "\n\n";
|
||||
if (dlWarnings.get(i).getWarnignLevel()>1) {
|
||||
error=true;
|
||||
}
|
||||
}
|
||||
|
||||
this.warningShow = true;
|
||||
final String warningsF = warnings;
|
||||
final boolean errorF = error;
|
||||
|
||||
|
||||
Platform.runLater(()->{
|
||||
WarnOnce.showWarningFX(null, "Deep Learning Settings Warning", warningsF , errorF ? AlertType.ERROR : AlertType.WARNING, true);
|
||||
warningShow = false;
|
||||
// WarnOnce.showWarning( "Deep Learning Settings Warning", warningsF , WarnOnce.WARNING_MESSAGE);
|
||||
});
|
||||
|
||||
//user presses OK - these warnings are just a message - they do not prevent running the module.
|
||||
}
|
||||
|
||||
}
|
@ -69,7 +69,7 @@ public class DLAnnotationSQL implements SQLLoggingAddon {
|
||||
public boolean loadData(SQLTypes sqlTypes, EmptyTableDefinition pamTableDefinition, PamDataUnit pamDataUnit) {
|
||||
|
||||
String predictionsString = (String) predictionsItem.getValue();
|
||||
Integer predicitonType = (Integer) predictionsItem.getValue();
|
||||
Integer predicitonType = (Integer) typeTableItem.getValue();
|
||||
|
||||
if (predictionsString!=null) {
|
||||
|
||||
@ -95,7 +95,7 @@ public class DLAnnotationSQL implements SQLLoggingAddon {
|
||||
* @param predicitonType - the prediction object type e.g.ModelResultBinaryFactory.GENERIC
|
||||
* @return a list of prediction objects.
|
||||
*/
|
||||
private ArrayList<PredictionResult> string2Predictions(String predictionsString, int predicitonType) {
|
||||
public static ArrayList<PredictionResult> string2Predictions(String predictionsString, int predicitonType) {
|
||||
ArrayList<PredictionResult> modelResults = new ArrayList<PredictionResult>();
|
||||
|
||||
JSONObject jsonObject = new JSONObject(predictionsString);
|
||||
@ -116,13 +116,15 @@ public class DLAnnotationSQL implements SQLLoggingAddon {
|
||||
predictions= new float[array.getJSONArray(i).length()];
|
||||
|
||||
for(int j=0; j< array.getJSONArray(i).length(); j++) {
|
||||
predictions[j] = array.getJSONArray(i).getFloat(j);
|
||||
predictions[j] = array.getJSONArray(i).getBigDecimal(j).floatValue();
|
||||
}
|
||||
|
||||
predicitonResult= ModelResultBinaryFactory.makePredictionResult(predicitonType, predictions, classIDs, true);
|
||||
modelResults.add(predicitonResult);
|
||||
}
|
||||
|
||||
|
||||
|
||||
return modelResults;
|
||||
}
|
||||
|
||||
@ -132,7 +134,7 @@ public class DLAnnotationSQL implements SQLLoggingAddon {
|
||||
* @param predictions - the spectrum.
|
||||
* @return string representation for the predictions in JSON format
|
||||
*/
|
||||
private String prediction2String(ArrayList<PredictionResult> arrayList) {
|
||||
public static String prediction2String(ArrayList<PredictionResult> arrayList) {
|
||||
|
||||
if (arrayList == null) {
|
||||
return "null";
|
||||
@ -145,7 +147,13 @@ public class DLAnnotationSQL implements SQLLoggingAddon {
|
||||
for (PredictionResult result : arrayList) {
|
||||
JSONArray rowArray = new JSONArray();
|
||||
for (float element : result.getPrediction()) {
|
||||
rowArray.put(element);
|
||||
//JSON does not allow non finite numbers
|
||||
if (Float.isFinite(element)) {
|
||||
rowArray.put(element);
|
||||
}
|
||||
else {
|
||||
rowArray.put(-1.0);
|
||||
}
|
||||
}
|
||||
matrixArray.put(rowArray);
|
||||
}
|
||||
|
@ -1,13 +1,21 @@
|
||||
package rawDeepLearningClassifier.logging;
|
||||
|
||||
|
||||
import java.sql.Types;
|
||||
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import PamguardMVC.superdet.SuperDetDataBlock;
|
||||
import PamguardMVC.superdet.SuperDetection;
|
||||
import cpod.CPODClassification;
|
||||
import cpod.CPODClickTrainDataUnit;
|
||||
import cpod.CPODUtils;
|
||||
import cpod.CPODClassification.CPODSpeciesType;
|
||||
import generalDatabase.PamTableDefinition;
|
||||
import generalDatabase.PamTableItem;
|
||||
import generalDatabase.SQLTypes;
|
||||
import generalDatabase.SuperDetLogging;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dlClassification.DLGroupDetection;
|
||||
|
||||
|
||||
/**
|
||||
@ -16,6 +24,10 @@ import rawDeepLearningClassifier.DLControl;
|
||||
public class DLGroupDetectionLogging extends SuperDetLogging {
|
||||
|
||||
private DLControl dlControl;
|
||||
|
||||
private PamTableItem duration, startsample, nSubDet;
|
||||
|
||||
|
||||
|
||||
public DLGroupDetectionLogging(DLControl dlControl, SuperDetDataBlock pamDataBlock) {
|
||||
super(pamDataBlock);
|
||||
@ -26,6 +38,10 @@ public class DLGroupDetectionLogging extends SuperDetLogging {
|
||||
@Override
|
||||
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
||||
// System.out.println("Save deep learning group: " + ((SuperDetection) pamDataUnit).getSubDetectionsCount());
|
||||
duration.setValue(pamDataUnit.getDurationInMilliseconds());
|
||||
startsample.setValue(pamDataUnit.getStartSample());
|
||||
nSubDet.setValue(((SuperDetection) pamDataUnit).getSubDetectionsCount());
|
||||
|
||||
}
|
||||
|
||||
public DLControl getDLControl() {
|
||||
@ -38,8 +54,30 @@ public class DLGroupDetectionLogging extends SuperDetLogging {
|
||||
* @return basic table - annotations will be added shortly !
|
||||
*/
|
||||
public PamTableDefinition createBaseTable() {
|
||||
PamTableDefinition tableDef = new PamTableDefinition(dlControl.getUnitName(), UPDATE_POLICY_OVERWRITE);
|
||||
PamTableDefinition tableDef = new PamTableDefinition(dlControl.getUnitName()+"_Group_Detections", UPDATE_POLICY_OVERWRITE);
|
||||
tableDef.addTableItem(duration = new PamTableItem("Duration_millis", Types.DOUBLE));
|
||||
tableDef.addTableItem(startsample = new PamTableItem("Start_sample", Types.LONGNVARCHAR));
|
||||
tableDef.addTableItem(nSubDet = new PamTableItem("n_subdetections", Types.LONGNVARCHAR));
|
||||
|
||||
return tableDef;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected DLGroupDetection createDataUnit(SQLTypes sqlTypes, long timeMilliseconds, int databaseIndex) {
|
||||
|
||||
|
||||
int chan = this.getTableDefinition().getChannelBitmap().getIntegerValue();
|
||||
|
||||
double durationD = duration.getDoubleValue();
|
||||
long startsampleL = startsample.getLongValue();
|
||||
|
||||
|
||||
DLGroupDetection dlGroupDet = new DLGroupDetection(timeMilliseconds, chan, startsampleL, durationD);
|
||||
|
||||
return dlGroupDet;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ public class DLGroupSubLogging extends SQLLogging {
|
||||
public DLGroupSubLogging(DLGroupDetectionLogging dlGroupDetLogging, PamDataBlock pamDataBlock) {
|
||||
super(pamDataBlock);
|
||||
this.dlGroupLogging = dlGroupDetLogging;
|
||||
setTableDefinition(new PamSubtableDefinition(dlGroupDetLogging.getDLControl().getUnitName()+"_Children"));
|
||||
setTableDefinition(new PamSubtableDefinition(dlGroupDetLogging.getDLControl().getUnitName()+"Group_Detections_Children"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,62 +0,0 @@
|
||||
package rawDeepLearningClassifier.logging;
|
||||
|
||||
import java.sql.Types;
|
||||
|
||||
import PamguardMVC.PamDataBlock;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import generalDatabase.PamTableDefinition;
|
||||
import generalDatabase.PamTableItem;
|
||||
import generalDatabase.SQLLogging;
|
||||
import generalDatabase.SQLTypes;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dlClassification.DLDataUnit;
|
||||
|
||||
/**
|
||||
* Saves the classified DL data units to a database.
|
||||
*
|
||||
*
|
||||
* @author Jamie Macaulay
|
||||
*
|
||||
*/
|
||||
public class DLLogging extends SQLLogging {
|
||||
|
||||
|
||||
/**
|
||||
* The PAM items for saving.
|
||||
*/
|
||||
private PamTableItem analysisTime, predicition;
|
||||
|
||||
/**
|
||||
* Reference to the DLControl.
|
||||
*/
|
||||
private DLControl dlControl;
|
||||
|
||||
|
||||
|
||||
public DLLogging(DLControl dlControl, PamDataBlock pamDataBlock) {
|
||||
super(pamDataBlock);
|
||||
this.dlControl=dlControl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
||||
DLDataUnit dgdu = (DLDataUnit) pamDataUnit;
|
||||
analysisTime.setValue(dgdu.getPredicitionResult().getAnalysisTime());
|
||||
predicition.setValue(dgdu.getPredicitionResult().getPrediction());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create the basic table definition for the group detection.
|
||||
* @return basic table - annotations will be added shortly !
|
||||
*/
|
||||
public PamTableDefinition createBaseTable() {
|
||||
PamTableDefinition tableDef = new PamTableDefinition(dlControl.getUnitName(), UPDATE_POLICY_OVERWRITE);
|
||||
tableDef.addTableItem(analysisTime = new PamTableItem("Analysis_Time", Types.DOUBLE));
|
||||
tableDef.addTableItem(predicition = new PamTableItem("Predicition", Types.DOUBLE));
|
||||
return tableDef;
|
||||
}
|
||||
|
||||
//TODO viewer mode.
|
||||
|
||||
}
|
102
src/rawDeepLearningClassifier/logging/DLResultLogging.java
Normal file
102
src/rawDeepLearningClassifier/logging/DLResultLogging.java
Normal file
@ -0,0 +1,102 @@
|
||||
package rawDeepLearningClassifier.logging;
|
||||
|
||||
import java.sql.Types;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import PamguardMVC.PamDataBlock;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import generalDatabase.PamTableDefinition;
|
||||
import generalDatabase.PamTableItem;
|
||||
import generalDatabase.SQLLogging;
|
||||
import generalDatabase.SQLTypes;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.dlClassification.DLDataUnit;
|
||||
import rawDeepLearningClassifier.dlClassification.DLGroupDetection;
|
||||
import rawDeepLearningClassifier.dlClassification.PredictionResult;
|
||||
|
||||
/**
|
||||
* Saves the classified DL data units to a database.
|
||||
* TODO
|
||||
*
|
||||
* @author Jamie Macaulay
|
||||
*
|
||||
*/
|
||||
public class DLResultLogging extends SQLLogging {
|
||||
|
||||
|
||||
/**
|
||||
* The PAM items for saving.
|
||||
*/
|
||||
private PamTableItem analysisTime, predicition, startSample, typeTableItem;
|
||||
|
||||
/**
|
||||
* Reference to the DLControl.
|
||||
*/
|
||||
private DLControl dlControl;
|
||||
|
||||
|
||||
|
||||
public DLResultLogging(DLControl dlControl, PamDataBlock pamDataBlock) {
|
||||
super(pamDataBlock);
|
||||
this.dlControl=dlControl;
|
||||
setTableDefinition(createBaseTable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) {
|
||||
|
||||
DLDataUnit dgdu = (DLDataUnit) pamDataUnit;
|
||||
startSample.setValue(pamDataUnit.getStartSample());
|
||||
analysisTime.setValue(dgdu.getPredicitionResult().getAnalysisTime());
|
||||
typeTableItem.setValue(ModelResultBinaryFactory.getType(dgdu.getPredicitionResult()));
|
||||
|
||||
ArrayList<PredictionResult> predictionResult = new ArrayList<PredictionResult>();
|
||||
predictionResult.add(dgdu.getPredicitionResult());
|
||||
|
||||
predicition.setValue(
|
||||
DLAnnotationSQL.prediction2String(predictionResult));
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the basic table definition for the group detection.
|
||||
* @return basic table - annotations will be added shortly !
|
||||
*/
|
||||
public PamTableDefinition createBaseTable() {
|
||||
PamTableDefinition tableDef = new PamTableDefinition(dlControl.getUnitName()+"_Predictions", UPDATE_POLICY_OVERWRITE);
|
||||
tableDef.addTableItem(analysisTime = new PamTableItem("Processing_time", Types.DOUBLE));
|
||||
tableDef.addTableItem(startSample = new PamTableItem("Start_sample", Types.LONGNVARCHAR));
|
||||
tableDef.addTableItem(predicition = new PamTableItem("Predicition", Types.CHAR, 8128));
|
||||
tableDef.addTableItem(typeTableItem = new PamTableItem("Prediction_Type", Types.INTEGER, "The type flag for the predictions"));
|
||||
|
||||
return tableDef;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected DLDataUnit createDataUnit(SQLTypes sqlTypes, long timeMilliseconds, int databaseIndex) {
|
||||
|
||||
int chan = this.getTableDefinition().getChannelBitmap().getIntegerValue();
|
||||
|
||||
long startsampleL = startSample.getLongValue();
|
||||
|
||||
String predictionsString = (String) predicition.getValue();
|
||||
Integer predicitonType = (Integer) typeTableItem.getValue();
|
||||
|
||||
if (predictionsString!=null) {
|
||||
|
||||
ArrayList<PredictionResult> modelResults = DLAnnotationSQL.string2Predictions( predictionsString, predicitonType);
|
||||
DLDataUnit dlDataUnit = new DLDataUnit(timeMilliseconds, chan, startsampleL, dlControl.getDLParams().rawSampleSize, modelResults.get(0));
|
||||
|
||||
return dlDataUnit;
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -184,7 +184,7 @@ public class ModelResultBinaryFactory {
|
||||
break;
|
||||
default:
|
||||
//ideally should never be used.
|
||||
result = new StandardPrediction(data, isBinary);
|
||||
result = new StandardPrediction(data, classID, isBinary);
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
|
@ -2,10 +2,13 @@ package rawDeepLearningClassifier.offline;
|
||||
|
||||
import PamController.PamController;
|
||||
import PamguardMVC.PamDataUnit;
|
||||
import PamguardMVC.PamObservable;
|
||||
import PamguardMVC.PamObserverAdapter;
|
||||
import dataMap.OfflineDataMapPoint;
|
||||
import matchedTemplateClassifer.MTClassifierControl;
|
||||
import offlineProcessing.OfflineTask;
|
||||
import rawDeepLearningClassifier.DLControl;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterDetectionGroup;
|
||||
import rawDeepLearningClassifier.segmenter.SegmenterProcess;
|
||||
|
||||
public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
@ -26,9 +29,16 @@ public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
this.dlControl.getDLClassifyProcess().clearOldData();
|
||||
|
||||
super.addAffectedDataBlock(this.dlControl.getDLClassifyProcess().getDLDetectionDatablock());
|
||||
super.addAffectedDataBlock(this.dlControl.getDLClassifyProcess().getDLGroupDetectionDataBlock()); //important so data are deleted.
|
||||
|
||||
//prediction data block may also be affected.
|
||||
super.addAffectedDataBlock(this.dlControl.getDLClassifyProcess().getDLPredictionDataBlock());
|
||||
|
||||
// //group detections are a little difficult because they only appear after
|
||||
// dlControl.getDLClassifyProcess().getDLGroupDetectionDataBlock().addInstantObserver(new GroupObserver(this));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
@ -37,28 +47,66 @@ public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
|
||||
@Override
|
||||
public boolean processDataUnit(PamDataUnit<?, ?> dataUnit) {
|
||||
|
||||
|
||||
// System.out.println("--------------");
|
||||
// System.out.println("Offline task start: " + dataUnit.getUpdateCount() + " UID " + dataUnit.getUID());
|
||||
// System.out.println("--------------");
|
||||
// System.out.println("Offline task start: " + dataUnit.getUpdateCount() + " UID " + dataUnit.getUID());
|
||||
boolean saveBinary = false;
|
||||
try {
|
||||
|
||||
//Process a data unit
|
||||
dlControl.getSegmenter().newData(dataUnit);
|
||||
|
||||
if (dlControl.isGroupDetections()) {
|
||||
//once a segment is created we need to process it but this is handled by the GroupObserver and not here....
|
||||
//Group segment data is saved to the database.
|
||||
boolean newGroup = dlControl.getSegmenter().newGroupData(dataUnit);
|
||||
|
||||
//force click data save
|
||||
dlControl.getDLClassifyProcess().forceRunClassifier(dataUnit);
|
||||
|
||||
//must be called or can result in memory leak.
|
||||
dlControl.getSegmenter().getSegmenterDataBlock().clearAll();
|
||||
// System.out.println("Added data to group: " + dataUnit.getUID());
|
||||
|
||||
if (newGroup) {
|
||||
|
||||
//must be called or can result in memory leak.
|
||||
dlControl.getDLClassifyProcess().getDLPredictionDataBlock().clearAll();
|
||||
//have to manually add this as the group data is a multiplex data block.
|
||||
dlControl.getDLClassifyProcess().newData(null, dlControl.getSegmenter().getSegmenteGroupDataBlock().getFirstUnit());
|
||||
|
||||
//run the classifier - if group detection data is present the classifier will run
|
||||
dlControl.getDLClassifyProcess().forceRunClassifier( dlControl.getSegmenter().getSegmenteGroupDataBlock().getFirstUnit());
|
||||
|
||||
// //clear the data block
|
||||
dlControl.getSegmenter().getSegmenteGroupDataBlock().clearAll();
|
||||
}
|
||||
|
||||
saveBinary = false; //very important or binary files become messed up and clicks/whistles are deleted.
|
||||
}
|
||||
else {
|
||||
//Classifying one detection - there may be multiple segments in one detection but once a
|
||||
//detection has been added we force the classifier to run on all the segments generated from
|
||||
//the raw data.
|
||||
|
||||
//Process a data unit
|
||||
dlControl.getSegmenter().newData(dataUnit);
|
||||
|
||||
/**
|
||||
* So the issue here is that the classification is not on the same thread...
|
||||
*/
|
||||
// System.out.println("Offline task complete: " + dataUnit.getUpdateCount() + " data " + dataUnit + " no. annotations: " + dataUnit.getNumDataAnnotations() );
|
||||
return true;
|
||||
//force click data save
|
||||
dlControl.getDLClassifyProcess().forceRunClassifier(dataUnit);
|
||||
|
||||
//must be called or can result in memory leak.
|
||||
dlControl.getSegmenter().getSegmenterDataBlock().clearAll();
|
||||
|
||||
//must be called or can result in memory leak.
|
||||
dlControl.getDLClassifyProcess().getDLPredictionDataBlock().clearAll();
|
||||
|
||||
saveBinary = true;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
// /**
|
||||
// * So the issue here is that the classification is not on the same thread...
|
||||
// */
|
||||
// System.out.println("Offline task complete: " + dataUnit.getUpdateCount() + " data " + dataUnit + " no. annotations: " + dataUnit.getNumDataAnnotations() );
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return saveBinary;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -69,10 +117,11 @@ public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
count=0;
|
||||
prepProcess();
|
||||
|
||||
//this is important so that the offline taks knows that the
|
||||
//this is important so that the offline tasks knows that the
|
||||
//parent datablock (e.g. if clicks or clips) needs to be saved because
|
||||
// an annotation has been added to it.
|
||||
super.addAffectedDataBlock(dlControl.getParentDataBlock());
|
||||
|
||||
super.getOfflineTaskGroup().setSummaryLists();
|
||||
|
||||
// for (int i=0; i<super.getNumAffectedDataBlocks(); i++) {
|
||||
@ -80,13 +129,16 @@ public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
// }
|
||||
|
||||
this.setParentDataBlock(dlControl.getParentDataBlock());
|
||||
|
||||
//dlControl.setNotifyProcesses(true);
|
||||
this.dlControl.getDLModel().prepModel();
|
||||
|
||||
dlControl.update(MTClassifierControl.PROCESSING_START);
|
||||
|
||||
// System.out.println("Waveform match: " + mtClassifierControl.getMTParams().classifiers.get(0).waveformMatch.toString());
|
||||
// System.out.println("Waveform reject: " + mtClassifierControl.getMTParams().classifiers.get(0).waveformReject.toString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Called at the end of the thread which executes this task.
|
||||
@ -100,6 +152,7 @@ public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
|
||||
@Override
|
||||
public void newDataLoad(long startTime, long endTime, OfflineDataMapPoint mapPoint) {
|
||||
|
||||
prepProcess();
|
||||
dlControl.update(MTClassifierControl.PROCESSING_START);
|
||||
// called whenever new data is loaded.
|
||||
@ -149,6 +202,38 @@ public class DLOfflineTask extends OfflineTask<PamDataUnit<?,?>>{
|
||||
boolean can = getDataBlock() != null;
|
||||
return can;
|
||||
}
|
||||
|
||||
|
||||
// /**
|
||||
// * An observer which waits until all detections within a segment have been added before passing the
|
||||
// * segment to a deep learning classifier.
|
||||
// */
|
||||
// public class GroupObserver extends PamObserverAdapter{
|
||||
//
|
||||
// private DLOfflineTask dlOfflinetask;
|
||||
//
|
||||
// public GroupObserver( DLOfflineTask dlOfflinetask) {
|
||||
// this.dlOfflinetask=dlOfflinetask;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @Override
|
||||
// public void addData(PamObservable observable, PamDataUnit pamDataUnit) {
|
||||
// SegmenterDetectionGroup segmenterDetectionGroup = (SegmenterDetectionGroup) pamDataUnit;
|
||||
//
|
||||
// System.out.println("HELLO NEW GROUP DATA!!" + segmenterDetectionGroup.getSubDetectionsCount());
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @Override
|
||||
// public String getObserverName() {
|
||||
// return "Deep Learning Offline Group Process";
|
||||
// }
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ public class SegmenterProcess extends PamProcess {
|
||||
*/
|
||||
private static final double MAX_MILLIS_DRIFT = 2;
|
||||
|
||||
private static final long MAX_SEGMENT_GAP_MILLIS = 3600*1000L;
|
||||
|
||||
/**
|
||||
* Reference to the deep learning control.
|
||||
*/
|
||||
@ -201,6 +203,8 @@ public class SegmenterProcess extends PamProcess {
|
||||
|
||||
setParentDataBlock(rawDataBlock);
|
||||
|
||||
this.dlControl.createDataSelector(rawDataBlock);
|
||||
|
||||
this.firstClockUpdate = -1;
|
||||
|
||||
}
|
||||
@ -228,21 +232,23 @@ public class SegmenterProcess extends PamProcess {
|
||||
*/
|
||||
public void newData(PamDataUnit pamRawData) {
|
||||
|
||||
// System.out.println("New data for segmenter: " + pamRawData);
|
||||
// System.out.println("New data for segmenter: " + pamRawData + " isGroup: " + dlControl.isGroupDetections());
|
||||
|
||||
if (!dlControl.getDLParams().useDataSelector || dlControl.getDataSelector().scoreData(pamRawData)>0) {
|
||||
|
||||
if (pamRawData instanceof RawDataUnit) {
|
||||
newRawDataUnit(pamRawData);
|
||||
if (!dlControl.isGroupDetections()){
|
||||
if (pamRawData instanceof RawDataUnit) {
|
||||
newRawDataUnit(pamRawData);
|
||||
}
|
||||
else if (pamRawData instanceof ClickDetection) {
|
||||
newClickData( pamRawData);
|
||||
}
|
||||
else if (pamRawData instanceof ClipDataUnit) {
|
||||
newClipData(pamRawData);
|
||||
}
|
||||
}
|
||||
else if (pamRawData instanceof ClickDetection) {
|
||||
newClickData( pamRawData);
|
||||
}
|
||||
else if (pamRawData instanceof ClipDataUnit) {
|
||||
newClipData(pamRawData);
|
||||
}
|
||||
else if (pamRawData instanceof ConnectedRegionDataUnit) {
|
||||
newWhistleData(pamRawData);
|
||||
else {
|
||||
newGroupData(pamRawData);
|
||||
}
|
||||
}
|
||||
|
||||
@ -251,12 +257,11 @@ public class SegmenterProcess extends PamProcess {
|
||||
|
||||
/**
|
||||
* A new detection data unit i.e. this is only if we have detection data which is being grouped into segments.
|
||||
* @param dataUnit - the whistle data unit.
|
||||
* @param detection - the whistle data unit.
|
||||
*/
|
||||
private synchronized void newWhistleData(PamDataUnit dataUnit) {
|
||||
public synchronized boolean newGroupData(PamDataUnit detection) {
|
||||
|
||||
|
||||
ConnectedRegionDataUnit whistle = (ConnectedRegionDataUnit) dataUnit;
|
||||
// PamDataUnit detection = dataUnit;
|
||||
|
||||
//TODO
|
||||
//this contains no raw data so we are branching off on a completely different processing path here.
|
||||
@ -265,8 +270,8 @@ public class SegmenterProcess extends PamProcess {
|
||||
int[] chanGroups = dlControl.getDLParams().groupedSourceParams.getChannelGroups();
|
||||
|
||||
int index = -1;
|
||||
for (int i=0; i<chanGroups.length; i++) {
|
||||
if (dlControl.getDLParams().groupedSourceParams.getGroupChannels(chanGroups[i])==dataUnit.getChannelBitmap()) {
|
||||
for (int i=0; i<chanGroups.length; i++) {
|
||||
if (PamUtils.hasChannelMap(dlControl.getDLParams().groupedSourceParams.getGroupChannels(chanGroups[i]), detection.getChannelBitmap())) {
|
||||
index=i;
|
||||
break;
|
||||
}
|
||||
@ -275,45 +280,80 @@ public class SegmenterProcess extends PamProcess {
|
||||
// //FIXME - TWEMP
|
||||
// index =0;
|
||||
|
||||
// System.out.println("Whistle data: " + ((dataUnit.getTimeMilliseconds()-firstClockUpdate)/1000.) + "s " + chanGroups.length + " " + index + " " + dataUnit.getChannelBitmap());
|
||||
// PamArrayUtils.printArray(chanGroups);
|
||||
// System.out.println("Group data: " + ((detection.getTimeMilliseconds()-firstClockUpdate)/1000.) + "s " + chanGroups.length + " " + index + " " + detection.getChannelBitmap());
|
||||
//PamArrayUtils.printArray(chanGroups);
|
||||
|
||||
if (index<0) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean segSaved = false;
|
||||
|
||||
if (segmenterDetectionGroup[index] == null || !detectionInSegment(dataUnit, segmenterDetectionGroup[index])) {
|
||||
if (segmenterDetectionGroup[index] == null || !detectionInSegment(detection, segmenterDetectionGroup[index])) {
|
||||
|
||||
//System.out.println("Whiste not in segment");
|
||||
//iterate until we find the correct time for this detection. This keeps the segments consist no matter
|
||||
//the data units. What we do not want is the first data unit defining the start of the first segment.
|
||||
if (segmentStart <0) {
|
||||
segmentStart= firstClockUpdate;
|
||||
if (segmentStart < 0) {
|
||||
//FIXME - seems like the master clock update is slightly after the start of a file - this needs sorted but for now
|
||||
//this is a fix that will work - just means segments miss being completely lined up with the start of files but
|
||||
//will always include all data units.
|
||||
segmentStart= detection.getTimeMilliseconds()< firstClockUpdate ? detection.getTimeMilliseconds() : firstClockUpdate;
|
||||
segmenterEnd = (long) (segmentStart + getSegmentLenMillis());
|
||||
newGroupSegment(index);
|
||||
}
|
||||
|
||||
while(!detectionInSegment(dataUnit, segmentStart, segmenterEnd)) {
|
||||
//System.out.println("Detection in segment: " + segmentStart);
|
||||
nextGroupSegment(index);
|
||||
//sometimes if a detection is a long time after the previous then we don't want to iterate through new segments so start again
|
||||
if ((detection.getTimeMilliseconds() - segmentStart)>MAX_SEGMENT_GAP_MILLIS) {
|
||||
segmentStart = detection.getTimeMilliseconds();
|
||||
segmenterEnd = (long) (segmentStart + getSegmentLenMillis());
|
||||
newGroupSegment(index);
|
||||
}
|
||||
|
||||
while(!detectionInSegment(detection, segmentStart, segmenterEnd)) {
|
||||
//System.out.println("Detection in segment: " + segmentStart + " det millis: " + detection.getTimeMilliseconds());
|
||||
|
||||
if (detection.getTimeMilliseconds()<segmentStart) {
|
||||
//something has gone quite wrong
|
||||
System.err.println("rawdeepLearningClassifier.segmenterProcess: Detection: " + detection.getUID() +
|
||||
" was detected before the segment? " + "seg start: " + segmentStart + " det start: " +detection.getTimeMilliseconds() );
|
||||
return false;
|
||||
}
|
||||
|
||||
segSaved = nextGroupSegment(index);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
segmenterDetectionGroup[index].addSubDetection(whistle);
|
||||
// System.out.println("Segment sub detection count: " + segmenterDetectionGroup[index].getSubDetectionsCount());
|
||||
segmenterDetectionGroup[index].addSubDetection(detection);
|
||||
//System.out.println("Segment sub detection count: " + segmenterDetectionGroup[index].getSubDetectionsCount());
|
||||
|
||||
return segSaved;
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterate to the next group segment
|
||||
* @param index - the group index;
|
||||
*/
|
||||
private void nextGroupSegment(int index) {
|
||||
private boolean nextGroupSegment(int index) {
|
||||
|
||||
// System.out.println("----------------------------------");
|
||||
|
||||
segmentStart = (long) (segmentStart+ getSegmentHopMillis());
|
||||
segmenterEnd = (long) (segmentStart + getSegmentLenMillis());
|
||||
|
||||
return newGroupSegment(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new group segment based on the current segmentStart and segmentEnd fields. Will saved the previous segment if
|
||||
* it exists and contains more than one sub detection.
|
||||
* @param index - the segment group index (i.e. channel group index)
|
||||
* @return true of a segment has completed and saved to the segment group data block.
|
||||
*/
|
||||
private boolean newGroupSegment(int index) {
|
||||
boolean segSaved = false;
|
||||
|
||||
int[] chanGroups = dlControl.getDLParams().groupedSourceParams.getChannelGroups();
|
||||
|
||||
long startSample = this.absMillisecondsToSamples(segmentStart);
|
||||
@ -333,18 +373,20 @@ public class SegmenterProcess extends PamProcess {
|
||||
}
|
||||
}
|
||||
|
||||
// System.out.println("SAVE WHISTLE SEGMENT!: " + ((segmenterDetectionGroup[index].getSegmentStartMillis()-firstClockUpdate)/1000.) + "s" + " " + " no. whistles: "
|
||||
// System.out.println("SAVE GROUP SEGMENT!: " + ((segmenterDetectionGroup[index].getSegmentStartMillis()-firstClockUpdate)/1000.) + "s" + " " + " no. whistles: "
|
||||
// + segmenterDetectionGroup[index].getSubDetectionsCount() + " " + PamCalendar.formatDateTime(segmenterDetectionGroup[index].getSegmentStartMillis()) + " "
|
||||
// + segmenterDetectionGroup[index]);
|
||||
//save the data unit to the data block
|
||||
|
||||
if (segmenterDetectionGroup[index].getSubDetectionsCount()>0) {
|
||||
this.segmenterGroupDataBlock.addPamData(segmenterDetectionGroup[index]);
|
||||
segSaved=true;
|
||||
}
|
||||
}
|
||||
|
||||
segmenterDetectionGroup[index] = aSegment;
|
||||
// System.out.println("NEW SEGMENT START!: " + (segmentStart-firstClockUpdate)/1000. + "s" + " " + segmenterDetectionGroup[index].getSegmentStartMillis()+ " " +segmenterDetectionGroup[index]);
|
||||
|
||||
|
||||
return segSaved;
|
||||
}
|
||||
|
||||
private boolean detectionInSegment(PamDataUnit dataUnit, SegmenterDetectionGroup segmenterDetectionGroup2) {
|
||||
@ -381,6 +423,7 @@ public class SegmenterProcess extends PamProcess {
|
||||
int count=0;
|
||||
public void masterClockUpdate(long milliSeconds, long sampleNumber) {
|
||||
super.masterClockUpdate(milliSeconds, sampleNumber);
|
||||
|
||||
if (firstClockUpdate<0) {
|
||||
firstClockUpdate = milliSeconds;
|
||||
}
|
||||
@ -870,8 +913,17 @@ public class SegmenterProcess extends PamProcess {
|
||||
}
|
||||
|
||||
|
||||
public SegmenterGroupDataBlock getSegmenteGrouprDataBlock() {
|
||||
public SegmenterGroupDataBlock getSegmenteGroupDataBlock() {
|
||||
return this.segmenterGroupDataBlock;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the first clock update which helps the segmenter work out where to start segmenting from.
|
||||
* @param startTime - the start time in millis.
|
||||
*/
|
||||
public void setFirstClockUpdate(long startTime) {
|
||||
this.firstClockUpdate = startTime;
|
||||
}
|
||||
|
||||
}
|
@ -3,148 +3,308 @@ package test.rawDeepLearningClassifier;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.Raster;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.jamdev.jdl4pam.transforms.DLTransform;
|
||||
import org.jamdev.jdl4pam.transforms.FreqTransform;
|
||||
import org.jamdev.jdl4pam.transforms.DLTransform.DLTransformType;
|
||||
import org.jamdev.jdl4pam.utils.DLMatFile;
|
||||
import org.jamdev.jdl4pam.utils.DLUtils;
|
||||
import org.jamdev.jpamutils.JamArr;
|
||||
import org.jamdev.jpamutils.interpolation.Bicubic;
|
||||
import org.jamdev.jpamutils.interpolation.Bilinear;
|
||||
import org.jamdev.jpamutils.interpolation.NearestNeighbor;
|
||||
import org.jamdev.jpamutils.spectrogram.SpecTransform;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import PamUtils.PamArrayUtils;
|
||||
import ai.djl.MalformedModelException;
|
||||
import rawDeepLearningClassifier.dlClassification.archiveModel.SimpleArchiveModel;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.Whistles2Image;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDClickTest;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDUtils;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDUtils.ClickDetectionMAT;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDUtils.DetectionGroupMAT;
|
||||
import rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDWhistleTest;
|
||||
import us.hebi.matlab.mat.format.Mat5;
|
||||
import us.hebi.matlab.mat.types.MatFile;
|
||||
import us.hebi.matlab.mat.format.Mat5File;
|
||||
import us.hebi.matlab.mat.types.Matrix;
|
||||
|
||||
|
||||
public class DelphinIDTest {
|
||||
|
||||
// @Test
|
||||
// public void whistle2ImageTest() {
|
||||
//
|
||||
// System.out.println("Whislte2Image test started");
|
||||
//
|
||||
// /**
|
||||
// * Test whether the Whistles2Image transform works properly
|
||||
// */
|
||||
// String relMatPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistle_image_example.mat";
|
||||
//
|
||||
// Path path = Paths.get(relMatPath);
|
||||
//
|
||||
// // Create MAT file with a scalar in a nested struct
|
||||
// try {
|
||||
// MatFile matFile = Mat5.readFromFile(path.toString());
|
||||
// Matrix array = matFile.getArray("tfvalues");
|
||||
//
|
||||
// //the values for the whistle detector.
|
||||
// double[][] whistleValues = DLMatFile.matrix2array(array);
|
||||
//
|
||||
//// //the image after compression
|
||||
//// array = matFile.getArray("image1compressedgrayscale");
|
||||
//// double[][] compressedWhistleImage = DLMatFile.matrix2array(array);
|
||||
////
|
||||
//// //the whistle2Image transform image
|
||||
//// array = matFile.getArray("image1originalgrayscalenorm");
|
||||
//// double[][] whislteImage = DLMatFile.matrix2array(array);
|
||||
//
|
||||
// //now perform the image transform in Java
|
||||
// double[] freqLimits = new double[] {2000., 20000.};
|
||||
// double[] size = new double[] {680., 480.};
|
||||
//
|
||||
// ArrayList<double[][]> whistleImageArr = new ArrayList<double[][]>();
|
||||
// whistleImageArr.add(whistleValues);
|
||||
//
|
||||
// BufferedImage canvas = Whistles2Image.makeScatterImage(whistleImageArr, size, new double[]{50, 50. + 4.}, freqLimits, 10.);
|
||||
//
|
||||
// double[][] imaged = new double[(int) size[0]][(int) size[1]];
|
||||
//
|
||||
// float[] color = new float[3];
|
||||
// Raster raster = canvas.getData();
|
||||
// for (int i=0; i<imaged.length; i++) {
|
||||
// for (int j=0; j<imaged[0].length; j++) {
|
||||
// color = raster.getPixel(i,j, color);
|
||||
// imaged[i][imaged[0].length-j-1] = (255-color[0])/255.; //normalize
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// //imaged = PamArrayUtils.transposeMatrix(imaged);
|
||||
//
|
||||
// //create the model transforms
|
||||
// ArrayList<DLTransform> modelTransforms = new ArrayList<DLTransform>();
|
||||
//// modelTransforms.add(new FreqTransform(DLTransformType.SPECFLIP));
|
||||
//// modelTransforms.add(new FreqTransform(DLTransformType.SPECNORMALISE_MINIMAX));
|
||||
// modelTransforms.add(new FreqTransform(DLTransformType.SPECRESIZE, new Number[] {Integer.valueOf(60), Integer.valueOf(80), SpecTransform.RESIZE_BICUBIC}));
|
||||
// modelTransforms.add(new FreqTransform(DLTransformType.GAUSSIAN_FILTER, new Number[] {Double.valueOf(0.5)}));
|
||||
//
|
||||
//
|
||||
// SpecTransform specTransform = new SpecTransform();
|
||||
// specTransform.setSpecData(imaged);
|
||||
// specTransform.setSampleRate((float) (freqLimits[1]*2));
|
||||
//
|
||||
//
|
||||
// //set the spec transform
|
||||
// ((FreqTransform) modelTransforms.get(0)).setSpecTransfrom(specTransform);
|
||||
//
|
||||
// //process all the transforms.
|
||||
// DLTransform transform = modelTransforms.get(0);
|
||||
// for (int i =0; i<modelTransforms.size(); i++) {
|
||||
// transform = modelTransforms.get(i).transformData(transform);
|
||||
// }
|
||||
//
|
||||
// double[][] transformedData2 = ((FreqTransform) transform).getSpecTransfrom().getTransformedData();
|
||||
//
|
||||
//// Bilinear interpolation1 = new Bilinear(JamArr.doubleToFloat(transformedData2));
|
||||
//// Bicubic interpolation2 = new Bicubic(JamArr.doubleToFloat(imaged));
|
||||
////
|
||||
//// System.out.println("Len input: " + imaged.length);
|
||||
////
|
||||
//// float[][] resizeArr = interpolation2.resize(Integer.valueOf(80), Integer.valueOf(60));
|
||||
////
|
||||
//// System.out.println("Len resize: " + resizeArr.length);
|
||||
//
|
||||
// System.out.println("Size Java: " + transformedData2.length + " x " + transformedData2[0].length);
|
||||
//
|
||||
// //now save this image to a MATFILE
|
||||
// // Create MAT file with a scalar in a nested struct
|
||||
// MatFile matFileWrite = Mat5.newMatFile()
|
||||
// .addArray("image1originalgrayscalenorm",DLMatFile.array2Matrix(imaged))
|
||||
// .addArray("imagecompressedgrayscalenorm",DLMatFile.array2Matrix(transformedData2));
|
||||
//// .addArray("imagecompressedgrayscalenorm_nearest",DLMatFile.array2Matrix(JamArr.floatToDouble(resizeArr)));
|
||||
//
|
||||
// // Serialize to disk using default configurations
|
||||
// Mat5.writeToFile(matFileWrite, "/Users/au671271/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/whistle_image_example_java.mat");
|
||||
//
|
||||
// System.out.println("Whislte2Image test finished");
|
||||
//
|
||||
// } catch (IOException e) {
|
||||
// // TODO Auto-generated catch block
|
||||
// e.printStackTrace();
|
||||
// assertEquals(false, false);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
/**
|
||||
* The slop allowed when comparing prediction values
|
||||
*/
|
||||
public static double predSlop = 0.05;
|
||||
|
||||
|
||||
@Test
|
||||
public static void modelInputTest() {
|
||||
|
||||
//test whether a single segment gives the correct answer.
|
||||
// boolean result = rawDeepLearningClassifier.dlClassification.delphinID.DelphinIDTest.testDelphinIDImage(null);
|
||||
|
||||
// assertTrue(result);
|
||||
public void clickModelTest() {
|
||||
System.out.println("DelphinID: click2Spectrum test");
|
||||
|
||||
String relModelPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/clickClassifier_Jan25.zip";
|
||||
Path modelPath = Paths.get(relModelPath);
|
||||
|
||||
|
||||
String clicksMatPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/clicks_20200918_123234_classified.mat";
|
||||
Path clickPath = Paths.get(clicksMatPath);
|
||||
|
||||
//load the clicks
|
||||
DetectionGroupMAT<ClickDetectionMAT> clicks = DelphinIDUtils.getClicksMAT(clicksMatPath);
|
||||
|
||||
//run the model
|
||||
float[][] predictions = DelphinIDClickTest.testDelphinIDClickModel(modelPath.toString(), clicks, null, false);
|
||||
|
||||
String predRelPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/click_preds_PAM_20200918_123234_366.mat";
|
||||
Path predPath = Paths.get(predRelPath);
|
||||
|
||||
|
||||
Mat5File matFile;
|
||||
try {
|
||||
matFile = Mat5.readFromFile(predPath.toString());
|
||||
|
||||
Matrix clickPredsMAT = matFile.getArray("predspython");
|
||||
double[][] clickPreds = DLMatFile.matrix2array(clickPredsMAT);
|
||||
|
||||
//now iterate through and check against true predictions.
|
||||
int classIndex = 1; //the class to use as the test.
|
||||
double calcPred;
|
||||
double truePred;
|
||||
for (int i=0; i<predictions.length; i++) {
|
||||
|
||||
if (predictions[i]==null || clickPreds[i]==null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
System.out.print(String.format("Click segment: %d" , i));
|
||||
for (int j=0; j<predictions[i].length; j++) {
|
||||
System.out.print(String.format( " %.4f" , predictions[i][j]));
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
calcPred = predictions[i][classIndex];
|
||||
|
||||
truePred = clickPreds[i][classIndex];
|
||||
|
||||
boolean passed = (calcPred - predSlop) < truePred && (calcPred + predSlop) > truePred;
|
||||
|
||||
if (!passed) {
|
||||
|
||||
System.out.print(String.format("SEGMENT FAIL: %d - true predictions" , i));
|
||||
for (int j=0; j<predictions[i].length; j++) {
|
||||
System.out.print(String.format( " %.4f" , clickPreds[i][j]));
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
}
|
||||
assertTrue(passed);
|
||||
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
assertTrue(false);
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// @Test
|
||||
// public void whistle2SpectrumTest() {
|
||||
// System.out.println("DelphinID: whistle2Spectrum test");
|
||||
//
|
||||
// assertEquals(false, false);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @Test
|
||||
// public void click2SpectrumTest() {
|
||||
// System.out.println("DelphinID: click model test");
|
||||
//
|
||||
// assertEquals(false, false);
|
||||
// }
|
||||
|
||||
@Test
|
||||
public void whistleModelTest() {
|
||||
System.out.println("DelphinID: whistle model test");
|
||||
|
||||
double segLen = 4000.;
|
||||
double segHop = 1000.0;
|
||||
double startSeconds = 9.898656 + 0.1; //seconds to start segments (so we can compare to Python) - note if this is wrong predicitons are slightly off...
|
||||
|
||||
String relModelPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistleclassifier.zip";
|
||||
Path modelPath = Paths.get(relModelPath);
|
||||
|
||||
|
||||
String whistlesMatPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistle_contours_20200918_123234.mat";
|
||||
Path whisltePath = Paths.get(whistlesMatPath);
|
||||
|
||||
|
||||
float[][] predictions = DelphinIDWhistleTest.runWhistleModel(modelPath.toString(), whisltePath.toString(), null, startSeconds, segLen, segHop);
|
||||
|
||||
|
||||
//the true whistle values
|
||||
String predRelPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistle_preds_PAM_20200918_123234_366.mat";
|
||||
Path predPath = Paths.get(predRelPath);
|
||||
|
||||
|
||||
Mat5File matFile;
|
||||
try {
|
||||
matFile = Mat5.readFromFile(predPath.toString());
|
||||
|
||||
|
||||
Matrix whistlesPredsMAT = matFile.getArray("predspython");
|
||||
double[][] whistlePreds = DLMatFile.matrix2array(whistlesPredsMAT);
|
||||
|
||||
Matrix startTimesMAT = matFile.getArray("starttimes");
|
||||
double[] startTimes = DelphinIDWhistleTest.matrix2array1D(startTimesMAT);
|
||||
|
||||
System.out.println("");
|
||||
|
||||
//now iterate through and check against true predictions.
|
||||
int classIndex = 1; //the class to use as the test.
|
||||
double calcPred;
|
||||
double truePred;
|
||||
for (int i=0; i<startTimes.length; i++) {
|
||||
|
||||
int index = (int) startTimes[i];
|
||||
|
||||
if (predictions[index]==null || whistlePreds[i]==null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
System.out.print(String.format("Whistle segment: %d" , index));
|
||||
for (int j=0; j<predictions[index].length; j++) {
|
||||
System.out.print(String.format( " %.4f" , predictions[index][j]));
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
calcPred = predictions[index][classIndex];
|
||||
|
||||
truePred = whistlePreds[i][classIndex];
|
||||
|
||||
boolean passed = (calcPred - predSlop) < truePred && (calcPred + predSlop) > truePred;
|
||||
|
||||
if (!passed) {
|
||||
|
||||
System.out.print(String.format("SEGMENT FAIL: %.0f s index %d- true predictions" , startTimes[i], index));
|
||||
for (int j=0; j<predictions[index].length; j++) {
|
||||
System.out.print(String.format( " %.4f" , whistlePreds[i][j]));
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
}
|
||||
|
||||
assertTrue(passed);
|
||||
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
assertTrue(false);
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
assertEquals(false, false);
|
||||
}
|
||||
|
||||
|
||||
// @Test
|
||||
// public void whistle2ImageTest() {
|
||||
//
|
||||
// System.out.println("Whislte2Image test started");
|
||||
//
|
||||
// /**
|
||||
// * Test whether the Whistles2Image transform works properly
|
||||
// */
|
||||
// String relMatPath = "./src/test/resources/rawDeepLearningClassifier/DelphinID/whistle_image_example.mat";
|
||||
//
|
||||
// Path path = Paths.get(relMatPath);
|
||||
//
|
||||
// // Create MAT file with a scalar in a nested struct
|
||||
// try {
|
||||
// MatFile matFile = Mat5.readFromFile(path.toString());
|
||||
// Matrix array = matFile.getArray("tfvalues");
|
||||
//
|
||||
// //the values for the whistle detector.
|
||||
// double[][] whistleValues = DLMatFile.matrix2array(array);
|
||||
//
|
||||
//// //the image after compression
|
||||
//// array = matFile.getArray("image1compressedgrayscale");
|
||||
//// double[][] compressedWhistleImage = DLMatFile.matrix2array(array);
|
||||
////
|
||||
//// //the whistle2Image transform image
|
||||
//// array = matFile.getArray("image1originalgrayscalenorm");
|
||||
//// double[][] whislteImage = DLMatFile.matrix2array(array);
|
||||
//
|
||||
// //now perform the image transform in Java
|
||||
// double[] freqLimits = new double[] {2000., 20000.};
|
||||
// double[] size = new double[] {680., 480.};
|
||||
//
|
||||
// ArrayList<double[][]> whistleImageArr = new ArrayList<double[][]>();
|
||||
// whistleImageArr.add(whistleValues);
|
||||
//
|
||||
// BufferedImage canvas = Whistles2Image.makeScatterImage(whistleImageArr, size, new double[]{50, 50. + 4.}, freqLimits, 10.);
|
||||
//
|
||||
// double[][] imaged = new double[(int) size[0]][(int) size[1]];
|
||||
//
|
||||
// float[] color = new float[3];
|
||||
// Raster raster = canvas.getData();
|
||||
// for (int i=0; i<imaged.length; i++) {
|
||||
// for (int j=0; j<imaged[0].length; j++) {
|
||||
// color = raster.getPixel(i,j, color);
|
||||
// imaged[i][imaged[0].length-j-1] = (255-color[0])/255.; //normalize
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// //imaged = PamArrayUtils.transposeMatrix(imaged);
|
||||
//
|
||||
// //create the model transforms
|
||||
// ArrayList<DLTransform> modelTransforms = new ArrayList<DLTransform>();
|
||||
//// modelTransforms.add(new FreqTransform(DLTransformType.SPECFLIP));
|
||||
//// modelTransforms.add(new FreqTransform(DLTransformType.SPECNORMALISE_MINIMAX));
|
||||
// modelTransforms.add(new FreqTransform(DLTransformType.SPECRESIZE, new Number[] {Integer.valueOf(60), Integer.valueOf(80), SpecTransform.RESIZE_BICUBIC}));
|
||||
// modelTransforms.add(new FreqTransform(DLTransformType.GAUSSIAN_FILTER, new Number[] {Double.valueOf(0.5)}));
|
||||
//
|
||||
//
|
||||
// SpecTransform specTransform = new SpecTransform();
|
||||
// specTransform.setSpecData(imaged);
|
||||
// specTransform.setSampleRate((float) (freqLimits[1]*2));
|
||||
//
|
||||
//
|
||||
// //set the spec transform
|
||||
// ((FreqTransform) modelTransforms.get(0)).setSpecTransfrom(specTransform);
|
||||
//
|
||||
// //process all the transforms.
|
||||
// DLTransform transform = modelTransforms.get(0);
|
||||
// for (int i =0; i<modelTransforms.size(); i++) {
|
||||
// transform = modelTransforms.get(i).transformData(transform);
|
||||
// }
|
||||
//
|
||||
// double[][] transformedData2 = ((FreqTransform) transform).getSpecTransfrom().getTransformedData();
|
||||
//
|
||||
//// Bilinear interpolation1 = new Bilinear(JamArr.doubleToFloat(transformedData2));
|
||||
//// Bicubic interpolation2 = new Bicubic(JamArr.doubleToFloat(imaged));
|
||||
////
|
||||
//// System.out.println("Len input: " + imaged.length);
|
||||
////
|
||||
//// float[][] resizeArr = interpolation2.resize(Integer.valueOf(80), Integer.valueOf(60));
|
||||
////
|
||||
//// System.out.println("Len resize: " + resizeArr.length);
|
||||
//
|
||||
// System.out.println("Size Java: " + transformedData2.length + " x " + transformedData2[0].length);
|
||||
//
|
||||
// //now save this image to a MATFILE
|
||||
// // Create MAT file with a scalar in a nested struct
|
||||
// MatFile matFileWrite = Mat5.newMatFile()
|
||||
// .addArray("image1originalgrayscalenorm",DLMatFile.array2Matrix(imaged))
|
||||
// .addArray("imagecompressedgrayscalenorm",DLMatFile.array2Matrix(transformedData2));
|
||||
//// .addArray("imagecompressedgrayscalenorm_nearest",DLMatFile.array2Matrix(JamArr.floatToDouble(resizeArr)));
|
||||
//
|
||||
// // Serialize to disk using default configurations
|
||||
// Mat5.writeToFile(matFileWrite, "/Users/au671271/MATLAB-Drive/MATLAB/PAMGUARD/deep_learning/delphinID/whistle_image_example_java.mat");
|
||||
//
|
||||
// System.out.println("Whislte2Image test finished");
|
||||
//
|
||||
// } catch (IOException e) {
|
||||
// // TODO Auto-generated catch block
|
||||
// e.printStackTrace();
|
||||
// assertEquals(false, false);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,27 +1,169 @@
|
||||
package test.rawDeepLearningClassifier;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.jamdev.jdl4pam.genericmodel.GenericModel;
|
||||
import org.jamdev.jdl4pam.utils.DLUtils;
|
||||
import org.jamdev.jpamutils.wavFiles.AudioData;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import PamUtils.PamArrayUtils;
|
||||
import rawDeepLearningClassifier.defaultModels.HumpbackWhaleAtlantic;
|
||||
import rawDeepLearningClassifier.defaultModels.MultiSpeciesGoogle;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.GenericModelParams;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.GenericModelWorker;
|
||||
import rawDeepLearningClassifier.dlClassification.genericModel.StandardPrediction;
|
||||
import rawDeepLearningClassifier.segmenter.GroupedRawData;
|
||||
|
||||
|
||||
/**
|
||||
* Test models that are zipped with a PMAGuard pgdl settings file.
|
||||
*/
|
||||
public class PamZipDLClassifierTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test the koogu classifier and tests are working properly for a PAMGuard zip model - i.e. this is a very similar model to Koogu but zipped with a .zip
|
||||
* filename instead of .kgu.
|
||||
*/
|
||||
// @Test
|
||||
// public void blueWhaleKooguTest() {
|
||||
// //relative paths to the resource folders.
|
||||
// String relModelPath = "./src/test/resources/rawDeepLearningClassifier/PamZip/blue_whale_24.zip";
|
||||
//
|
||||
// //the zip classifier is the same as the
|
||||
// String relWavPath = "./src/test/resources/rawDeepLearningClassifier/Koogu/blue_whale_24/20190527_190000.wav";
|
||||
// String relMatPath = "./src/test/resources/rawDeepLearningClassifier/Koogu/blue_whale_24/rawScores_20190527_190000.mat";
|
||||
//
|
||||
// //metadata says it should be used with Koogu classifier.
|
||||
// KooguDLClassifierTest.runKooguClassifier( relModelPath, relWavPath, relMatPath);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Test Google's humpback whale model.
|
||||
*/
|
||||
@Test
|
||||
public void zipClassifierTest() {
|
||||
public void multiSpeciesGoogleTest() {
|
||||
|
||||
System.out.println("*****Generic DL: Humpback whale test*****");
|
||||
|
||||
//relative paths to the resource folders.
|
||||
String relModelPath = "./src/test/resources/rawDeepLearningClassifier/PamZip/blue_whale_24.zip";
|
||||
|
||||
//the zip classifier is the same as the
|
||||
String relWavPath = "./src/test/resources/rawDeepLearningClassifier/Koogu/blue_whale_24/20190527_190000.wav";
|
||||
String relMatPath = "./src/test/resources/rawDeepLearningClassifier/Koogu/blue_whale_24/rawScores_20190527_190000.mat";
|
||||
|
||||
//metadata says it should be used with Koogu classifier.
|
||||
KooguDLClassifierTest.runKooguClassifier( relModelPath, relWavPath, relMatPath);
|
||||
String relModelPath = "./src/test/resources/rawDeepLearningClassifier/Generic/multi-species-Google/multispecies-whale-tensorflow2-default-v2/saved_model.pb";
|
||||
String relWavPath = "./src/test/resources/rawDeepLearningClassifier/Generic/multi-species-Google/Cross_24kHz.wav";
|
||||
String resultsPath = "./src/test/resources/rawDeepLearningClassifier/Generic/multi-species-Google/Cross_24kHz_scores.csv";
|
||||
|
||||
Path path = Paths.get(relModelPath);
|
||||
|
||||
GenericModelWorker genericModelWorker = new GenericModelWorker();
|
||||
|
||||
GenericModelParams genericModelParams = new GenericModelParams();
|
||||
|
||||
genericModelParams.modelPath = path.toAbsolutePath().normalize().toString();
|
||||
|
||||
path = Paths.get(relWavPath);
|
||||
String wavFilePath = path.toAbsolutePath().normalize().toString();
|
||||
|
||||
MultiSpeciesGoogle multiSpeciesGoogle = new MultiSpeciesGoogle();
|
||||
multiSpeciesGoogle.setParams(genericModelParams);
|
||||
|
||||
System.out.println(genericModelParams);
|
||||
|
||||
|
||||
//TEMP
|
||||
|
||||
|
||||
|
||||
try {
|
||||
//load audio
|
||||
AudioData soundData = DLUtils.loadWavFile(wavFilePath);
|
||||
|
||||
// double[] amplitudes = soundData.getScaledSampleAmplitudes();
|
||||
//
|
||||
//
|
||||
// float[] ampltiudesf = PamArrayUtils.double2Float(amplitudes);
|
||||
// float[] ampltiudesfchunk = new float[120000];
|
||||
// int offset = 24000;
|
||||
// System.arraycopy(ampltiudesf, 0+offset, ampltiudesfchunk, 0, 120000);
|
||||
//
|
||||
// // System.out.println("MAX AMPLITUDE: " + PamArrayUtils.max(amplitudes));
|
||||
//
|
||||
// GenericModel genericModel = new GenericModel( genericModelParams.modelPath) ;
|
||||
// float[][] input = new float[][]{ampltiudesfchunk};
|
||||
// float[] output2 = genericModel.runModel(input);
|
||||
//
|
||||
// System.out.println("----TEST OUT----");
|
||||
// PamArrayUtils.printArray(output2);
|
||||
|
||||
//prep the model
|
||||
genericModelWorker.prepModel(genericModelParams, null);
|
||||
|
||||
|
||||
//load true predictions file.
|
||||
File file = new File(resultsPath);
|
||||
FileReader fr = new FileReader(file);
|
||||
BufferedReader br = new BufferedReader(fr);
|
||||
String line;
|
||||
int ind=0;
|
||||
|
||||
int startChunk=0;
|
||||
|
||||
int classIndex = 1;
|
||||
while((line = br.readLine()) != null){
|
||||
if (ind>0) {
|
||||
//read the data from the text file
|
||||
String[] data = line.split(",");
|
||||
|
||||
double[] predictions = new double[data.length];
|
||||
for (int i=0; i<data.length; i++) {
|
||||
predictions[i] = Double.valueOf(data[i]);
|
||||
}
|
||||
|
||||
//each line is a list of prediction for each class;
|
||||
int chunkSize=120000;
|
||||
|
||||
GroupedRawData groupedRawData = new GroupedRawData(0, 1, 0, chunkSize, chunkSize);
|
||||
groupedRawData.copyRawData(soundData.getScaledSampleAmplitudes(), startChunk, chunkSize, 0);
|
||||
|
||||
// System.out.println("MAX AMPLITUDE: " + PamArrayUtils.max(groupedRawData.getRawData()[0]));
|
||||
|
||||
ArrayList<GroupedRawData> groupedData = new ArrayList<GroupedRawData>();
|
||||
|
||||
groupedData.add(groupedRawData);
|
||||
|
||||
ArrayList<StandardPrediction> genericPrediction = genericModelWorker.runModel(groupedData, soundData.sampleRate, 0);
|
||||
|
||||
float[] output = genericPrediction.get(0).getPrediction();
|
||||
|
||||
boolean passed = (output[classIndex]>predictions[classIndex]-0.05 && output[classIndex]<predictions[classIndex]+0.05);
|
||||
|
||||
System.out.println(String.format("Chunk %d %d Predicted output: %.5f true output: %.5f passed: %b -- sum %.2f ", ind, startChunk,
|
||||
output[classIndex], predictions[classIndex], passed, PamArrayUtils.sum(output)));
|
||||
|
||||
//PamArrayUtils.printArray(output);
|
||||
|
||||
//allow 10% scrumph to take account of slight differences in Java input.
|
||||
//assertTrue(passed); //humpback whale detection
|
||||
|
||||
startChunk+=24000; //one second step
|
||||
|
||||
}
|
||||
ind++;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,206 @@
|
||||
site,startrec,endrec,starttime,dur,n,SNR,Dde,Ggr,Gme,Lal,Ttr,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,0,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,1,4,4,16.35191824,0.000098,0.979193,0.000081,0.000007,0.020621,0.005069907,0.005253806,0.007566674,0.006775802,0.006469298,0.008056406,0.009046132,0.008351148,0.007888746,0.007958923,0.008388212,0.00716322,0.004672727,0.006759528,0.006305709,0.00606099,0.00786046,0.008258889,0.007057891,0.006424046,0.00569706,0.004693258,0.003695848,0.003726392,0.005251941,0.006311158,0.007569007,0.006503552,0.008916757,0.007104804,0.006489193,0.009254214,0.012101181,0.016200699,0.022042349,0.023739434,0.018740897,0.016529624,0.016330001,0.016388903,0.019278994,0.023902546,0.025794335,0.020241379,0.015466004,0.014523507,0.011985581,0.01232651,0.012130101,0.011962963,0.014117556,0.016544259,0.020772552,0.021042292,0.016748615,0.014304275,0.014328061,0.014487608,0.01599805,0.019139254,0.02240908,0.022361794,0.020080502,0.019292127,0.016792161,0.01724846,0.018088945,0.014976816,0.012119271,0.011949564,0.012609539,0.013334557,0.014558869,0.014790457,0.013790207,0.01115628,0.012455085,0.014204374,0.013275988,0.010736697
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,2,4,3,16.42040253,0.000060,0.968242,0.000070,0.000013,0.031615,0.00461354,0.004839571,0.007963229,0.007735814,0.008065378,0.00870563,0.010598393,0.008974944,0.007974109,0.008773356,0.008292091,0.007492244,0.005067324,0.006003788,0.005872915,0.005647414,0.007393435,0.008356517,0.006517856,0.00672012,0.005572206,0.003836513,0.003705629,0.003469967,0.006125255,0.005931975,0.007062724,0.005765261,0.007456384,0.006347531,0.004737318,0.00759338,0.010694536,0.013419816,0.020060793,0.022606224,0.018031503,0.016022755,0.015241598,0.016109766,0.018564858,0.023371941,0.026047799,0.020737061,0.016662863,0.015175734,0.014487548,0.014184351,0.013629966,0.014054705,0.015139668,0.017003807,0.02138977,0.021129371,0.015776871,0.013356169,0.013081114,0.012785746,0.014254148,0.017349184,0.021210928,0.021780295,0.020178048,0.019564947,0.016131944,0.016821427,0.018278012,0.015657175,0.013342433,0.01293362,0.014253077,0.01522274,0.016494672,0.016916564,0.015215598,0.01105458,0.012424849,0.014673272,0.013465771,0.010798573
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,3,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,4,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,5,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,6,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,7,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,8,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,9,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,10,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,11,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,12,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,13,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,14,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,15,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,16,4,3,17.14642945,0.000001,0.991651,0.000000,0.006282,0.002067,0.006254464,0.006973831,0.008302591,0.008981867,0.007787682,0.006028867,0.008094193,0.009424763,0.00675093,0.003609533,0.004082085,0.002038438,0.00432704,0.005341576,0.004324454,0.003255474,0.003048022,0.002455053,0.003423101,0.003838201,0.003976668,0.004611721,0.002585313,0.003309128,0.005994985,0.004917635,0.002527967,0.003187736,0.005301933,0.005759768,0.007187649,0.007470951,0.012934011,0.018283386,0.01915246,0.014661615,0.010055649,0.01104746,0.010709789,0.011922671,0.015621124,0.021153991,0.024198887,0.022686242,0.018475853,0.017352482,0.017373532,0.015068478,0.014519027,0.015087669,0.015344192,0.016455945,0.017127583,0.015810439,0.011424716,0.008970738,0.011003949,0.010329376,0.010419146,0.013412983,0.015006414,0.014445576,0.016123123,0.019747913,0.023069106,0.025318105,0.025989398,0.025477323,0.024575862,0.023805229,0.023095641,0.02237303,0.021458067,0.020222545,0.019356942,0.01951785,0.019424556,0.018907127,0.018511806,0.017797378
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,17,4,3,17.14642945,0.000001,0.991651,0.000000,0.006282,0.002067,0.006254464,0.006973831,0.008302591,0.008981867,0.007787682,0.006028867,0.008094193,0.009424763,0.00675093,0.003609533,0.004082085,0.002038438,0.00432704,0.005341576,0.004324454,0.003255474,0.003048022,0.002455053,0.003423101,0.003838201,0.003976668,0.004611721,0.002585313,0.003309128,0.005994985,0.004917635,0.002527967,0.003187736,0.005301933,0.005759768,0.007187649,0.007470951,0.012934011,0.018283386,0.01915246,0.014661615,0.010055649,0.01104746,0.010709789,0.011922671,0.015621124,0.021153991,0.024198887,0.022686242,0.018475853,0.017352482,0.017373532,0.015068478,0.014519027,0.015087669,0.015344192,0.016455945,0.017127583,0.015810439,0.011424716,0.008970738,0.011003949,0.010329376,0.010419146,0.013412983,0.015006414,0.014445576,0.016123123,0.019747913,0.023069106,0.025318105,0.025989398,0.025477323,0.024575862,0.023805229,0.023095641,0.02237303,0.021458067,0.020222545,0.019356942,0.01951785,0.019424556,0.018907127,0.018511806,0.017797378
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,18,4,3,17.14642945,0.000001,0.991651,0.000000,0.006282,0.002067,0.006254464,0.006973831,0.008302591,0.008981867,0.007787682,0.006028867,0.008094193,0.009424763,0.00675093,0.003609533,0.004082085,0.002038438,0.00432704,0.005341576,0.004324454,0.003255474,0.003048022,0.002455053,0.003423101,0.003838201,0.003976668,0.004611721,0.002585313,0.003309128,0.005994985,0.004917635,0.002527967,0.003187736,0.005301933,0.005759768,0.007187649,0.007470951,0.012934011,0.018283386,0.01915246,0.014661615,0.010055649,0.01104746,0.010709789,0.011922671,0.015621124,0.021153991,0.024198887,0.022686242,0.018475853,0.017352482,0.017373532,0.015068478,0.014519027,0.015087669,0.015344192,0.016455945,0.017127583,0.015810439,0.011424716,0.008970738,0.011003949,0.010329376,0.010419146,0.013412983,0.015006414,0.014445576,0.016123123,0.019747913,0.023069106,0.025318105,0.025989398,0.025477323,0.024575862,0.023805229,0.023095641,0.02237303,0.021458067,0.020222545,0.019356942,0.01951785,0.019424556,0.018907127,0.018511806,0.017797378
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,19,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,20,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,21,4,4,14.48926457,0.002943,0.952999,0.001842,0.000019,0.042197,0.008995515,0.006224511,0.003694226,0.006764536,0.006779819,0.006043542,0.006929517,0.007949187,0.007117731,0.004610915,0.004293066,0.003046989,0.003620354,0.006833153,0.007233188,0.006815353,0.005580232,0.006724579,0.006356895,0.007128611,0.007656273,0.006328766,0.00726717,0.005587808,0.00385193,0.004455619,0.006800247,0.004364007,0.006232757,0.008818397,0.009126974,0.013443046,0.017844088,0.018368381,0.01758243,0.016677352,0.019628254,0.021794266,0.02107961,0.019511865,0.020618371,0.019295005,0.014493981,0.010923532,0.014300725,0.019042622,0.019864602,0.019563724,0.015112743,0.012246552,0.013264873,0.015932287,0.014864063,0.015418942,0.014500764,0.013240811,0.015089065,0.015510152,0.018011815,0.0186561,0.018394939,0.01895621,0.019988005,0.020537215,0.017649954,0.015644875,0.016629864,0.015597734,0.016336405,0.017969998,0.017500957,0.014741244,0.011531836,0.011405649,0.01238476,0.014628601,0.016529484,0.01675526,0.01490423,0.012800892
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,22,4,5,12.37550011,0.000191,0.981966,0.000035,0.001756,0.016052,0.00868842,0.005281273,0.002701143,0.00691129,0.007338648,0.006088033,0.006366143,0.007532272,0.006782003,0.004559064,0.004381249,0.002405907,0.003040075,0.007195978,0.007573596,0.005993723,0.003847721,0.005237627,0.004399379,0.003684683,0.00400771,0.003928739,0.005393435,0.004156725,0.002414723,0.002750131,0.00555258,0.003142615,0.004043881,0.007280601,0.007723566,0.010627638,0.015749249,0.0167375,0.015180955,0.013836491,0.017338571,0.021317416,0.021447483,0.019642144,0.01999247,0.01888787,0.014261481,0.010701252,0.0149466,0.020428863,0.021593187,0.021106909,0.015851858,0.012129406,0.013429549,0.01572639,0.013391099,0.01363575,0.013064868,0.012236879,0.015135068,0.016551017,0.019256104,0.019217605,0.018084043,0.019525943,0.021566946,0.022690314,0.020163166,0.017801651,0.017184809,0.016960826,0.019481911,0.021771586,0.021489526,0.018522304,0.014622405,0.013770223,0.014788942,0.017002425,0.018659149,0.019053726,0.017580649,0.015454851
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,23,4,5,12.37550011,0.000191,0.981966,0.000035,0.001756,0.016052,0.00868842,0.005281273,0.002701143,0.00691129,0.007338648,0.006088033,0.006366143,0.007532272,0.006782003,0.004559064,0.004381249,0.002405907,0.003040075,0.007195978,0.007573596,0.005993723,0.003847721,0.005237627,0.004399379,0.003684683,0.00400771,0.003928739,0.005393435,0.004156725,0.002414723,0.002750131,0.00555258,0.003142615,0.004043881,0.007280601,0.007723566,0.010627638,0.015749249,0.0167375,0.015180955,0.013836491,0.017338571,0.021317416,0.021447483,0.019642144,0.01999247,0.01888787,0.014261481,0.010701252,0.0149466,0.020428863,0.021593187,0.021106909,0.015851858,0.012129406,0.013429549,0.01572639,0.013391099,0.01363575,0.013064868,0.012236879,0.015135068,0.016551017,0.019256104,0.019217605,0.018084043,0.019525943,0.021566946,0.022690314,0.020163166,0.017801651,0.017184809,0.016960826,0.019481911,0.021771586,0.021489526,0.018522304,0.014622405,0.013770223,0.014788942,0.017002425,0.018659149,0.019053726,0.017580649,0.015454851
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,24,4,4,13.16246135,0.000005,0.480398,0.000000,0.517373,0.002225,0.009736343,0.00569875,0.001728656,0.005924739,0.007306504,0.006601084,0.006690848,0.008888172,0.007926465,0.005169132,0.005493003,0.003733136,0.004888699,0.007641291,0.006404964,0.00495465,0.003489149,0.003859148,0.002344967,0.002479208,0.004002718,0.003831346,0.004469526,0.002510586,0.001931812,0.002348618,0.004133439,0.002568361,0.002795439,0.005494492,0.006645507,0.007749106,0.011851604,0.012490056,0.01108735,0.011224208,0.01632321,0.020326098,0.021179306,0.018566485,0.01767993,0.016290638,0.011953011,0.010692523,0.016308482,0.022635362,0.024543182,0.022836179,0.016109488,0.012126116,0.013686513,0.014966883,0.011155683,0.011234159,0.010650009,0.009539853,0.012787568,0.014347753,0.017346896,0.017219265,0.01618702,0.018337404,0.02088863,0.022591596,0.020903702,0.019354428,0.019388178,0.021466447,0.024017251,0.026419799,0.025906515,0.02198673,0.01751309,0.016338807,0.018137886,0.02132899,0.021812441,0.022087364,0.020934665,0.017801393
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,25,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,26,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,27,4,3,14.15976347,0.000127,0.911919,0.000002,0.005452,0.082500,0.002477536,0.003146347,0.005618222,0.0055397,0.00466911,0.005354523,0.005963641,0.004869122,0.005981674,0.00819237,0.007560925,0.007329113,0.008565153,0.007421479,0.006260325,0.006458239,0.008267589,0.008989363,0.009012259,0.009579529,0.007094095,0.003624003,0.00248972,0.004093904,0.006591455,0.008022546,0.008982551,0.005616866,0.006015763,0.008425525,0.007802484,0.005983743,0.006463827,0.008847224,0.012672583,0.015985242,0.014158529,0.012510124,0.014443863,0.016039008,0.014282082,0.013271155,0.014328306,0.016154036,0.018921383,0.018457322,0.012355999,0.009976158,0.013014937,0.01352464,0.011772966,0.010821647,0.009318597,0.009500524,0.012649915,0.013925521,0.013440822,0.012334752,0.013809409,0.017096358,0.016684464,0.018632372,0.019388146,0.02042668,0.022667237,0.023480155,0.023946937,0.023791635,0.022357977,0.020035894,0.019548862,0.021624569,0.023057667,0.023044401,0.022426743,0.021348004,0.019307313,0.019698617,0.021000509,0.021456015
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,28,4,6,14.94354917,0.000000,0.580585,0.000000,0.019459,0.399956,0.003035254,0.003935339,0.005629617,0.005944196,0.006115236,0.007522775,0.007415606,0.006686289,0.005893753,0.006433873,0.007446015,0.006793143,0.008456043,0.007660992,0.005773271,0.006366888,0.008146861,0.008428084,0.006706278,0.007275682,0.008031357,0.00600324,0.002849871,0.002580821,0.005089588,0.005928256,0.006001028,0.003759515,0.004066959,0.004949076,0.003572264,0.003862083,0.005361699,0.007291431,0.008611334,0.011062571,0.011163303,0.012191655,0.014559895,0.015788196,0.014125445,0.011751001,0.011394688,0.011650672,0.014196125,0.015395301,0.013452659,0.014520583,0.017073161,0.018356154,0.017993758,0.016824173,0.013354307,0.011801163,0.012745848,0.01291605,0.012976287,0.012317279,0.014466132,0.016667097,0.01783768,0.019824931,0.020196483,0.019792345,0.020222297,0.02156908,0.022165462,0.021152774,0.019421186,0.017755868,0.018101536,0.019784049,0.021817247,0.024042485,0.026221821,0.027594434,0.027186722,0.026885828,0.02606328,0.023997272
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,29,4,9,14.33696824,0.000000,0.855185,0.000000,0.002465,0.142349,0.003900571,0.004663966,0.00509245,0.004847855,0.005864747,0.007270676,0.007239503,0.006751786,0.006003114,0.006983995,0.0076549,0.00641154,0.007789749,0.007033156,0.004634649,0.005341314,0.00654879,0.007262856,0.006664895,0.006763143,0.006642945,0.00515685,0.002399017,0.002778235,0.004310125,0.005986688,0.006544962,0.003763062,0.00314506,0.004025846,0.003673342,0.003787976,0.005618906,0.007911132,0.008725291,0.013780483,0.015830748,0.016465097,0.016058296,0.015129066,0.01315263,0.011026096,0.01041768,0.010617641,0.012705312,0.015826501,0.015218219,0.015263931,0.015103381,0.016168013,0.015739921,0.013453863,0.011554413,0.009848781,0.009620486,0.010639166,0.011701292,0.012533712,0.013986541,0.013974149,0.015758351,0.018461594,0.020702798,0.022199485,0.023309573,0.024257002,0.024279968,0.023417395,0.022706488,0.021918238,0.021496249,0.020902825,0.021522488,0.023524253,0.025612185,0.026999656,0.027341445,0.027549693,0.027276307,0.025755496
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,30,4,10,13.66869782,0.000000,0.861443,0.000000,0.000715,0.137842,0.002936,0.004031963,0.004253501,0.004447095,0.005339625,0.006312469,0.005827992,0.005882215,0.005352051,0.006255983,0.00687816,0.005726398,0.007168422,0.006525703,0.004612415,0.004643604,0.00590469,0.006393716,0.00572341,0.00613994,0.006185078,0.005169545,0.002355165,0.002376871,0.003957946,0.005120743,0.005716209,0.003327534,0.00319712,0.003714165,0.003800708,0.003781969,0.005266913,0.008035118,0.008862372,0.01420134,0.017050083,0.017639052,0.01660086,0.015483902,0.013144919,0.011033863,0.010564193,0.010907839,0.012625974,0.01572053,0.015212934,0.014456105,0.014301306,0.015275878,0.014940008,0.012319079,0.010529844,0.008965642,0.009476061,0.010452709,0.011712221,0.013093,0.014602451,0.014304379,0.015967753,0.018709241,0.021280863,0.023280365,0.024500559,0.025363193,0.025469933,0.024823228,0.024478229,0.023953924,0.023379945,0.022361983,0.022610158,0.024224499,0.026133373,0.027406772,0.027816676,0.028090583,0.027849335,0.02646241
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,31,4,7,13.55065335,0.000000,0.818793,0.000000,0.000981,0.180226,0.003231437,0.004529395,0.00364288,0.00396885,0.005721723,0.006828767,0.005810145,0.006428777,0.005094815,0.005349629,0.006583622,0.004987978,0.006520721,0.006129014,0.00385993,0.003808917,0.004791203,0.005162213,0.004155986,0.004495351,0.005784372,0.005983117,0.002363283,0.001606768,0.00272566,0.003748031,0.004159904,0.002269086,0.00187938,0.00146204,0.001896833,0.002763245,0.004731379,0.007668517,0.007015627,0.013311787,0.01843847,0.020123183,0.017631373,0.015189125,0.012581084,0.009944581,0.008727653,0.008340081,0.009529768,0.014351344,0.016597749,0.016644454,0.014920591,0.016116591,0.016479293,0.013056651,0.011139805,0.008728531,0.007937702,0.00876021,0.010868083,0.013461469,0.014976975,0.012918428,0.015589976,0.018701575,0.022147173,0.024604518,0.025314092,0.026194855,0.026123791,0.02524021,0.025433002,0.025796455,0.025183929,0.022652346,0.022316109,0.024718881,0.027856008,0.030276567,0.031888361,0.032102542,0.03110434,0.028821696
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,32,4,5,14.85503212,0.000001,0.933641,0.000000,0.000530,0.065828,0.004514242,0.005730502,0.003287131,0.002029472,0.003583453,0.004045851,0.004802421,0.006559843,0.00668401,0.007794879,0.007521578,0.005613224,0.005632983,0.004673896,0.003486706,0.002836533,0.003099328,0.004422088,0.006042313,0.006189122,0.005267257,0.005973525,0.004787166,0.004941928,0.003930266,0.005118005,0.006184132,0.004393041,0.004055847,0.003792571,0.005184539,0.005186504,0.007672759,0.01200074,0.012021945,0.017680773,0.02245716,0.022068641,0.016991908,0.014010692,0.012048338,0.013090151,0.013148204,0.012913647,0.012219129,0.016579732,0.018026353,0.015245472,0.011786735,0.012054014,0.011999034,0.008905219,0.010109241,0.008521868,0.006413629,0.007116449,0.010324888,0.01459262,0.014930482,0.011346164,0.012557061,0.014978397,0.019199731,0.022812502,0.024411928,0.024549958,0.024585289,0.025133289,0.027199397,0.02876486,0.027619315,0.023959346,0.02216923,0.022695517,0.023698075,0.024521768,0.026037652,0.026940509,0.027326195,0.027199637
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,33,4,4,17.72752031,0.000004,0.841744,0.000006,0.000795,0.157451,0.005443343,0.006502129,0.004935689,0.004058425,0.004673477,0.002712087,0.002063671,0.005951006,0.007335072,0.006721563,0.005492617,0.004088793,0.004057366,0.004197816,0.00582051,0.004957641,0.005925936,0.006119121,0.006956456,0.00775248,0.008049962,0.00781243,0.007182568,0.007383427,0.006208853,0.005577807,0.004536596,0.004266412,0.006095141,0.006192357,0.006439728,0.007747272,0.011495325,0.018156576,0.019323989,0.017272533,0.018084476,0.017792795,0.016691602,0.017732289,0.018967671,0.02295009,0.022926445,0.020246522,0.017834519,0.017292768,0.017159401,0.015253661,0.01500182,0.015179108,0.016320501,0.016741721,0.016983366,0.014277495,0.012836409,0.011219835,0.011661441,0.01343592,0.013764609,0.012268394,0.011142135,0.011404292,0.01257975,0.013116157,0.013312083,0.014239149,0.016217265,0.017680096,0.019026994,0.020485405,0.020990103,0.020898882,0.02097742,0.020957569,0.020975812,0.021026898,0.021249483,0.021108211,0.020578024,0.019905243
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,34,4,7,12.41665751,0.000002,0.935240,0.000002,0.038913,0.025844,0.00707238,0.006036227,0.005478332,0.003878331,0.003192864,0.001535105,0.002238122,0.004212266,0.005133528,0.005010244,0.003773665,0.003688224,0.002096244,0.001926892,0.004053168,0.004057029,0.003117498,0.005794289,0.007644912,0.006302139,0.006524828,0.005037631,0.004531195,0.005132518,0.003351852,0.005224674,0.004015317,0.002884958,0.002366522,0.002644626,0.002904333,0.005090637,0.008846787,0.015113114,0.016711318,0.015979014,0.015973886,0.016362602,0.016755342,0.017923501,0.019965682,0.024012157,0.024021164,0.022656188,0.021291909,0.021138806,0.021065906,0.02285029,0.024445927,0.024514202,0.023923374,0.023281851,0.022853786,0.020628592,0.018358704,0.017332123,0.017415257,0.018486982,0.018874398,0.017268893,0.014495481,0.011646352,0.010986281,0.008428584,0.007849167,0.009141633,0.011178991,0.012913213,0.01521362,0.017114577,0.016672214,0.016089691,0.016784854,0.018475045,0.019334038,0.020636961,0.021874087,0.022394688,0.022550065,0.02221815
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,35,4,11,11.66687305,0.000002,0.974577,0.000003,0.001003,0.024415,0.005705324,0.004425374,0.004828356,0.004610666,0.002999734,0.001995331,0.004386742,0.004475098,0.003731847,0.005184754,0.005683513,0.006180584,0.004629844,0.004151098,0.005010473,0.005234681,0.005283705,0.00667147,0.006682078,0.005222765,0.005492122,0.00402054,0.004117499,0.005206414,0.002711036,0.003952539,0.005141288,0.004387325,0.00328802,0.003643947,0.00403721,0.006236678,0.010077589,0.016542344,0.019219222,0.018723025,0.017493466,0.016601467,0.017493472,0.018669776,0.02083521,0.025642668,0.026686815,0.025496253,0.023115106,0.020729392,0.019529553,0.020477764,0.021819685,0.022004673,0.021916009,0.021448985,0.021446701,0.020184602,0.018205481,0.016695821,0.016286388,0.017015211,0.017413806,0.016618233,0.015162137,0.012815848,0.011926807,0.0093661,0.008916915,0.010111711,0.012250959,0.014140064,0.015110601,0.015937846,0.015629015,0.015311959,0.015911798,0.017332424,0.017564841,0.018091366,0.019151398,0.019403688,0.018936476,0.01921128
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,36,4,11,12.40862144,0.000006,0.969607,0.000016,0.000261,0.030110,0.006433066,0.005166207,0.006089975,0.006420673,0.004122789,0.002338375,0.004545353,0.004359175,0.003407905,0.004739549,0.005415949,0.006148601,0.004770517,0.004151168,0.005382066,0.006144775,0.006123077,0.007029073,0.007017956,0.005817167,0.005978327,0.004426908,0.004573255,0.005742944,0.003576634,0.004641251,0.006109734,0.005791606,0.004785622,0.004982323,0.005155476,0.007830516,0.01141263,0.017018114,0.019603188,0.019809039,0.018712273,0.01761947,0.018339031,0.019356053,0.021429909,0.024919498,0.025520175,0.024393584,0.021993435,0.019250569,0.018275924,0.019337879,0.020720513,0.021182616,0.021316416,0.020814258,0.020669903,0.019608015,0.018436087,0.017317645,0.016474424,0.016678897,0.016782613,0.016069424,0.014987229,0.012898525,0.011895854,0.009183843,0.008326593,0.009765962,0.011576439,0.012515979,0.013192033,0.014675256,0.014706305,0.014585305,0.015301955,0.016725044,0.017017522,0.017479796,0.018297195,0.018406176,0.01795605,0.018227346
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,37,4,12,11.31361904,0.000001,0.987274,0.000002,0.000430,0.012293,0.006566867,0.004734812,0.005697657,0.00652867,0.004612874,0.003404893,0.00638479,0.005385316,0.003653006,0.005058099,0.006585135,0.007649759,0.004916143,0.003644358,0.005002611,0.005694305,0.004917755,0.00641662,0.006805521,0.004925947,0.004099626,0.002929515,0.004007987,0.004464129,0.001895792,0.003419676,0.006703751,0.007033285,0.004871091,0.003556991,0.003820167,0.006607655,0.01079287,0.016078993,0.01896057,0.020255839,0.01907647,0.017073124,0.017446691,0.019554744,0.021887625,0.025047592,0.026329912,0.026298162,0.023851474,0.020417384,0.018758585,0.019785652,0.020628377,0.021295268,0.021430524,0.020593813,0.020446155,0.020191784,0.018943262,0.017672394,0.016848415,0.016016719,0.015514437,0.015840394,0.015494894,0.013409678,0.012196519,0.009661655,0.00875592,0.009430877,0.010972011,0.012029018,0.013546632,0.01514648,0.015019204,0.014819337,0.015368332,0.016120722,0.016738662,0.017986,0.01903813,0.019011467,0.018086216,0.018136213
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,38,4,11,11.22125228,0.000001,0.997220,0.000000,0.000005,0.002774,0.005002798,0.004348398,0.004685281,0.006168839,0.004491526,0.003695139,0.006682982,0.00600214,0.005354873,0.005911868,0.006730472,0.006496906,0.004303985,0.002633665,0.003373895,0.006103217,0.006555791,0.00603619,0.005695873,0.004437268,0.002086636,0.002662704,0.004066515,0.00436359,0.002047785,0.002541992,0.00729535,0.008189151,0.00714937,0.006670837,0.00646129,0.008843878,0.014912051,0.021766506,0.025554209,0.025838935,0.02321931,0.019642881,0.019800475,0.021875594,0.023526083,0.026209351,0.027859343,0.026625632,0.022648618,0.0178794,0.01607444,0.016950803,0.017837038,0.019186235,0.020535877,0.020996535,0.021106634,0.019911572,0.017210689,0.014414312,0.011907416,0.010086638,0.0091811,0.009705957,0.009207163,0.009673494,0.00945107,0.006915453,0.00723649,0.010330004,0.014111942,0.01581996,0.016607751,0.017616686,0.018254223,0.018797619,0.019152039,0.018982752,0.018791304,0.018381487,0.01710286,0.015198774,0.014441347,0.014373742
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,39,4,7,13.37060723,0.000005,0.997152,0.000000,0.000013,0.002829,0.0068099,0.006728894,0.006146003,0.00698426,0.006299385,0.00511478,0.006512322,0.007239011,0.008184554,0.006881857,0.006209242,0.005164023,0.002915434,0.001191435,0.002908626,0.006226096,0.005929342,0.005763705,0.006935182,0.006021875,0.002749912,0.004153269,0.005434548,0.004912152,0.00358952,0.004249235,0.007891023,0.009076633,0.008703203,0.007842739,0.007272375,0.009435224,0.015681969,0.021701318,0.024569377,0.024958253,0.023120902,0.019916863,0.019287172,0.021502811,0.022614616,0.023353884,0.024157841,0.022900695,0.019595876,0.016319394,0.015460776,0.016937835,0.017737883,0.019337943,0.020719612,0.021382799,0.021153132,0.019281769,0.016330962,0.013728972,0.011028924,0.008598116,0.007212477,0.00754509,0.006368365,0.007584992,0.007888624,0.005675012,0.006184618,0.009833326,0.013796454,0.015079388,0.016865724,0.018782039,0.019645137,0.020270677,0.020557087,0.019939233,0.020136349,0.020046049,0.018038785,0.015643823,0.015399691,0.014651606
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,40,4,6,13.22034625,0.000003,0.999382,0.000000,0.000042,0.000573,0.006956479,0.00674567,0.005786171,0.006918724,0.007363705,0.007053998,0.007419925,0.008081919,0.009495817,0.007953531,0.006973938,0.005784066,0.003575663,0.002486615,0.003727295,0.006638388,0.006306839,0.006121681,0.006903707,0.005510038,0.001905677,0.003763474,0.005017162,0.004347082,0.00325668,0.004142389,0.007755286,0.008575337,0.00785698,0.007193411,0.00727456,0.00842216,0.014366259,0.020787458,0.023883051,0.024366991,0.022547986,0.019430662,0.01900966,0.021153741,0.02205066,0.022829446,0.023961846,0.023001024,0.020080971,0.017102952,0.015891122,0.017326942,0.018012253,0.019361988,0.02050456,0.021057425,0.020832832,0.01895868,0.016008326,0.013287151,0.010141955,0.007396425,0.006073026,0.006630631,0.005193221,0.006658176,0.00743759,0.005960982,0.007416833,0.010954359,0.015378362,0.017812066,0.019808257,0.020465969,0.020625765,0.020747229,0.02057334,0.019465927,0.019456828,0.019279984,0.017036606,0.014454861,0.014355777,0.01354748
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,41,4,3,18.96515322,0.000407,0.999097,0.000001,0.000143,0.000352,0.007367413,0.008285896,0.007426953,0.008379004,0.007337183,0.007544017,0.007849129,0.008100927,0.010779818,0.0092404,0.007134879,0.005763302,0.005420114,0.004518209,0.004904916,0.008756243,0.009299409,0.007935666,0.007744064,0.00723432,0.004425274,0.007357255,0.007430646,0.006895322,0.006965248,0.007006001,0.009281543,0.009667524,0.010530648,0.012105715,0.012068174,0.012079596,0.015893579,0.020925724,0.023463235,0.023715634,0.021891949,0.01971332,0.019588223,0.01910784,0.017705115,0.017084067,0.017944819,0.016910436,0.014329191,0.012751304,0.012896724,0.015415181,0.017944588,0.019122336,0.01967044,0.020136446,0.019825296,0.017943775,0.015090431,0.012483886,0.009185464,0.007976635,0.007667505,0.006862867,0.003897764,0.005722838,0.006725064,0.004139946,0.006230328,0.011988779,0.017326455,0.019692931,0.020331757,0.020317239,0.020359431,0.020236468,0.019886825,0.019623562,0.018863529,0.016845775,0.013398188,0.010467967,0.011850757,0.012013583
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,42,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,43,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,44,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,45,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,46,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,47,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,48,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,49,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,50,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,51,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,52,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,53,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,54,4,3,20.41886963,0.000002,0.815750,0.000000,0.168870,0.015377,0.009640026,0.010028871,0.006559854,0.004835385,0.007136989,0.008242652,0.008743466,0.007948083,0.007632809,0.006964622,0.007358792,0.006970867,0.005075107,0.005534198,0.006026174,0.007043847,0.006827318,0.007125413,0.00855641,0.007333937,0.003298602,0.004179954,0.007605955,0.006163751,0.006475189,0.007803252,0.007828014,0.007307689,0.00664528,0.004930173,0.002603108,0.004494046,0.007086686,0.009092001,0.01385937,0.017064513,0.014801921,0.012508941,0.012747087,0.012097618,0.011817185,0.012609031,0.014158298,0.019052418,0.020208262,0.016183382,0.013568098,0.010773257,0.009794452,0.008578965,0.009201883,0.010334784,0.012843371,0.017030231,0.019746514,0.016477438,0.013798021,0.012140485,0.013428253,0.01719254,0.018158698,0.014013981,0.010565079,0.011792379,0.016160411,0.020585583,0.025084391,0.025622322,0.022535382,0.019602261,0.018178557,0.019292642,0.021334853,0.024137256,0.026550723,0.026854408,0.024869542,0.02298796,0.020750278,0.017808457
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,55,4,7,15.13832213,0.000000,0.309261,0.000000,0.688674,0.002065,0.008143789,0.008335313,0.005046197,0.005085569,0.00525128,0.005733515,0.006582163,0.005286886,0.005059785,0.003786028,0.003404703,0.003291815,0.002546534,0.00372906,0.004009611,0.00471625,0.004959901,0.003887915,0.005732753,0.004701651,0.003557004,0.0027196,0.003306702,0.002628947,0.00259881,0.0021187,0.00393146,0.003372566,0.002280653,0.002324287,0.001504455,0.001963881,0.003491851,0.00642363,0.013368043,0.016565731,0.011904221,0.008570723,0.008877767,0.010576899,0.012292894,0.01344411,0.015764644,0.021272365,0.021501727,0.015954057,0.012891,0.009819473,0.00980823,0.010865054,0.012847662,0.013857598,0.015680792,0.018593806,0.020072839,0.0163945,0.013492248,0.013526796,0.016931269,0.022799261,0.024011263,0.018404669,0.012569091,0.011012586,0.013170549,0.018052228,0.024911483,0.028105879,0.028508725,0.026645068,0.024282076,0.022838759,0.022917417,0.026083159,0.029614159,0.032787546,0.032600251,0.030716336,0.028022466,0.025559317
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,56,4,15,14.94141042,0.000000,0.728111,0.000000,0.237778,0.034111,0.007417245,0.007600104,0.004983696,0.004930824,0.005729231,0.006200322,0.005587819,0.00491164,0.004951933,0.004737824,0.002776822,0.001834901,0.002345782,0.003732255,0.003933094,0.003819786,0.004410177,0.004337478,0.00555623,0.004935983,0.004237881,0.003578686,0.004584022,0.004043643,0.002699226,0.002031586,0.00353915,0.003012243,0.001686731,0.002877597,0.002744253,0.002957571,0.003543207,0.005348651,0.009241244,0.011475968,0.011407285,0.010770429,0.011747574,0.013654942,0.013910587,0.012510569,0.012036535,0.015614553,0.017273123,0.016660872,0.016543241,0.015902449,0.015613772,0.015511432,0.016080256,0.015897942,0.016688766,0.019060423,0.020810265,0.019769679,0.018613164,0.017466226,0.018706455,0.022147291,0.023587399,0.019606427,0.01567004,0.014368376,0.013766023,0.014502904,0.017702891,0.019877512,0.0223684,0.023401817,0.023964432,0.024518679,0.023821921,0.025598549,0.028455984,0.030918609,0.030938368,0.029072611,0.026303006,0.024823418
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,57,4,35,12.20465881,0.000000,0.004123,0.000000,0.995877,0.000000,0.005349264,0.005900284,0.003936938,0.00410848,0.004926589,0.004844476,0.003944635,0.003149142,0.003901333,0.003837164,0.002685888,0.002382394,0.002361785,0.003734776,0.003524048,0.003251751,0.003256207,0.003187834,0.004643659,0.004331364,0.003351122,0.002278533,0.003017651,0.002576642,0.001410503,0.001064459,0.001512154,0.001895655,0.001739974,0.001860041,0.002774446,0.002392858,0.000884661,0.002528072,0.004735456,0.00652963,0.011220786,0.015018794,0.016957145,0.018244383,0.01747447,0.013471758,0.012176445,0.014165353,0.015858391,0.020362746,0.024001345,0.025785504,0.025025685,0.023548602,0.021518989,0.020130896,0.018198793,0.016775696,0.016344218,0.017786867,0.022607399,0.025182879,0.027346237,0.027929503,0.025920184,0.018436714,0.012482404,0.011521356,0.009998563,0.010031233,0.013571917,0.018029285,0.022166615,0.024109318,0.023342331,0.021361517,0.022282825,0.02449649,0.024401301,0.026065664,0.028811099,0.027759758,0.025334376,0.024934299
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,58,4,36,12.43211873,0.000000,0.002559,0.000000,0.997441,0.000000,0.005685713,0.006329454,0.004547783,0.004476202,0.005063568,0.005219862,0.004302875,0.003482302,0.0040649,0.004198406,0.003289826,0.003069035,0.00304433,0.004419114,0.004104038,0.003618347,0.003561632,0.003337715,0.004675464,0.00445888,0.004127198,0.003265468,0.003036381,0.002654591,0.002147485,0.001953514,0.002219724,0.002284184,0.002186793,0.002054916,0.003059499,0.002944284,0.001116121,0.00246357,0.004603081,0.005941182,0.010302881,0.014442175,0.016719994,0.018073111,0.017160556,0.01329163,0.011931726,0.013399445,0.014846878,0.019128759,0.022693653,0.025150421,0.02521411,0.024701996,0.023052805,0.021461563,0.018895233,0.016732988,0.015788131,0.017070915,0.021708914,0.024960678,0.027202764,0.027771577,0.025957036,0.018825426,0.012519375,0.011297907,0.009861928,0.009409593,0.012446678,0.017021315,0.021282698,0.023434017,0.023124554,0.021247997,0.022094859,0.02412303,0.023648579,0.025279538,0.028262081,0.027422448,0.025165928,0.024864674
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,59,4,37,11.53052199,0.000000,0.001372,0.000000,0.998628,0.000000,0.005013177,0.005451666,0.003924331,0.00356726,0.004382997,0.004768867,0.003803445,0.002863863,0.003470969,0.003582486,0.00268148,0.002426054,0.002371932,0.003239405,0.003357359,0.003133115,0.003252546,0.003078406,0.004135557,0.003673739,0.003069276,0.002995255,0.002749294,0.002168035,0.001535097,0.001742074,0.001851454,0.001701879,0.00164823,0.001473467,0.002293687,0.00253527,0.000947469,0.001965294,0.003645923,0.004486689,0.009637306,0.014594488,0.017569179,0.018793587,0.017228601,0.012703784,0.010908883,0.011288811,0.013005787,0.018665353,0.023088488,0.026402865,0.027150309,0.026611245,0.024605023,0.022683718,0.019297574,0.016840999,0.015762689,0.017269956,0.022494976,0.026156661,0.028722061,0.029072677,0.02729957,0.020118921,0.01378053,0.012683506,0.010873319,0.009441312,0.0114265,0.015506351,0.019621692,0.0221795,0.022596079,0.0217434,0.0237594,0.025874472,0.025236607,0.026337921,0.029266213,0.028812809,0.027012972,0.026886857
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,60,4,33,10.70381013,0.000000,0.001267,0.000000,0.998733,0.000000,0.004492723,0.004529178,0.00321062,0.002338499,0.003220309,0.003584347,0.003032761,0.002058009,0.002346754,0.001782542,0.002325362,0.003024209,0.00233996,0.002931346,0.002718796,0.003187114,0.003393105,0.00242816,0.004065726,0.003559295,0.00296826,0.002648959,0.001636779,0.001268263,0.001379765,0.00205533,0.001521163,0.001471555,0.001946573,0.00074097,0.001981885,0.002606342,0.001278703,0.003033134,0.005344417,0.005584979,0.01017997,0.015540892,0.018702664,0.019275124,0.017717454,0.013611782,0.012605854,0.01223021,0.013267382,0.018998505,0.023575084,0.026817611,0.027171877,0.026953017,0.024739745,0.022784926,0.019333353,0.016267216,0.014385834,0.016007903,0.022650477,0.028087075,0.031387249,0.0309893,0.028253182,0.020235859,0.012991541,0.011553181,0.010380937,0.009754808,0.011830971,0.01621582,0.019707106,0.021669243,0.021409617,0.020246201,0.023590635,0.026371616,0.024959138,0.025708573,0.029115903,0.028938667,0.027804013,0.027946593
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,61,4,12,13.30393541,0.000000,0.193783,0.000000,0.727709,0.078508,0.00674965,0.006088774,0.005506483,0.003318694,0.003548404,0.004672032,0.005092688,0.004231705,0.002733643,0.001256341,0.003055571,0.004260633,0.003772771,0.003610013,0.004072239,0.005254889,0.006441812,0.004780212,0.006084425,0.004666841,0.004862153,0.005998371,0.003493353,0.003120946,0.004405926,0.005861693,0.00526368,0.003513515,0.003420081,0.002287634,0.002623375,0.005256785,0.006808681,0.008372074,0.012021396,0.010464212,0.008703545,0.010456565,0.013631957,0.014018245,0.012995923,0.012070795,0.012254287,0.010392793,0.010695678,0.011509625,0.012343474,0.014476278,0.01672863,0.019677229,0.02056351,0.01954206,0.017913341,0.017935264,0.01743169,0.016327776,0.016497211,0.020128777,0.023232765,0.025086776,0.02621985,0.023605103,0.018901715,0.016309255,0.016257935,0.014893155,0.013548395,0.014245208,0.014847075,0.016114647,0.018850008,0.022053359,0.025739778,0.028004998,0.028731379,0.029335175,0.029890651,0.030025829,0.030525952,0.030314642
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,62,4,9,14.73836895,0.000000,0.541751,0.000000,0.083076,0.375172,0.007049878,0.005120085,0.004920378,0.003567622,0.004173096,0.0048676,0.005229928,0.004651621,0.003689314,0.001714587,0.002802083,0.004035434,0.004020743,0.003051741,0.003635231,0.005832899,0.007628106,0.005562034,0.00675986,0.005700926,0.005985101,0.006525115,0.0046473,0.004735567,0.004386617,0.005115666,0.005256318,0.004295861,0.004029987,0.00401384,0.004822362,0.006324673,0.008639633,0.010801205,0.013908482,0.012233194,0.01082163,0.011267687,0.013534054,0.013950851,0.013411443,0.012774494,0.013145052,0.010805262,0.010892393,0.012690774,0.013967168,0.014633213,0.015345482,0.016870497,0.017135949,0.016433266,0.015955944,0.016943306,0.016688669,0.016543407,0.018056946,0.020531501,0.02322201,0.024118281,0.024807365,0.022777501,0.019794405,0.017363403,0.016024846,0.015009724,0.013505844,0.013173315,0.013721516,0.014802635,0.016723867,0.02027244,0.024221648,0.026416593,0.02778015,0.028199711,0.028249089,0.028416414,0.02946102,0.029805147
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,63,4,4,17.54566663,0.000073,0.716818,0.000080,0.001763,0.281266,0.008078267,0.006004943,0.005283565,0.002930851,0.004610219,0.004864237,0.00477538,0.005292442,0.003622925,0.001403207,0.003931537,0.006135862,0.005701034,0.006011126,0.004513624,0.006740539,0.00845155,0.006085176,0.008921505,0.008741017,0.008901866,0.007005915,0.005707714,0.006623332,0.006868793,0.007621452,0.006360409,0.006201088,0.006393463,0.005058585,0.00705453,0.008661424,0.011018582,0.014867918,0.018178164,0.016661823,0.01540686,0.015425198,0.015983598,0.014970979,0.014853006,0.015396324,0.0162587,0.015191181,0.014886823,0.015794042,0.016270935,0.015173933,0.011739468,0.012017315,0.011839376,0.011546988,0.014229325,0.016576935,0.016848072,0.018013901,0.020522206,0.022171369,0.022224883,0.020312486,0.019924275,0.01868753,0.016773533,0.014479382,0.014475937,0.01509916,0.013595913,0.013208431,0.013131223,0.013498881,0.014799428,0.017752436,0.020074503,0.022138942,0.022555431,0.022695973,0.022559043,0.021416444,0.021867994,0.022327574
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,64,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,65,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,66,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,67,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,68,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,69,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,70,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,71,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,72,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,73,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,74,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,75,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,76,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,77,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,78,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,79,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,80,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,81,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,82,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,83,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,84,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,85,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,86,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,87,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,88,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,89,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,90,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,91,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,92,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,93,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,94,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,95,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,96,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,97,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,98,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,99,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,100,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,101,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,102,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,103,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,104,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,105,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,106,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,107,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,108,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,109,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,110,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,111,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,112,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,113,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,114,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,115,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,116,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,117,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,118,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,119,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,120,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,121,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,122,4,3,20.28114831,0.000000,0.968107,0.000001,0.000073,0.031819,0.008481208,0.007267937,0.008093628,0.010995826,0.009578554,0.009477686,0.010079606,0.009601551,0.009133557,0.006199112,0.006449285,0.00832631,0.008205877,0.008944182,0.008559578,0.007674549,0.006355588,0.007851341,0.007209153,0.005631625,0.002819511,0.002346299,0.002241918,0.003620184,0.005191686,0.00363431,0.004249042,0.00499322,0.0062713,0.009057567,0.008405222,0.009462508,0.013597954,0.01692631,0.018648795,0.017833592,0.015833619,0.012579136,0.010394578,0.014757516,0.018624479,0.021346005,0.021463406,0.019069665,0.014927856,0.011337968,0.008979191,0.007751702,0.009086079,0.012583392,0.01726251,0.018440354,0.016553639,0.015138281,0.014839827,0.013155538,0.01065084,0.009740008,0.00962161,0.010387995,0.014109942,0.017356798,0.019667836,0.02075813,0.020347978,0.019328914,0.019224582,0.019196906,0.01865697,0.018101235,0.017625276,0.017443961,0.018378273,0.019547852,0.019750869,0.019393042,0.018701927,0.017859762,0.018156053,0.018452935
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,123,4,3,20.28114831,0.000000,0.968107,0.000001,0.000073,0.031819,0.008481208,0.007267937,0.008093628,0.010995826,0.009578554,0.009477686,0.010079606,0.009601551,0.009133557,0.006199112,0.006449285,0.00832631,0.008205877,0.008944182,0.008559578,0.007674549,0.006355588,0.007851341,0.007209153,0.005631625,0.002819511,0.002346299,0.002241918,0.003620184,0.005191686,0.00363431,0.004249042,0.00499322,0.0062713,0.009057567,0.008405222,0.009462508,0.013597954,0.01692631,0.018648795,0.017833592,0.015833619,0.012579136,0.010394578,0.014757516,0.018624479,0.021346005,0.021463406,0.019069665,0.014927856,0.011337968,0.008979191,0.007751702,0.009086079,0.012583392,0.01726251,0.018440354,0.016553639,0.015138281,0.014839827,0.013155538,0.01065084,0.009740008,0.00962161,0.010387995,0.014109942,0.017356798,0.019667836,0.02075813,0.020347978,0.019328914,0.019224582,0.019196906,0.01865697,0.018101235,0.017625276,0.017443961,0.018378273,0.019547852,0.019750869,0.019393042,0.018701927,0.017859762,0.018156053,0.018452935
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,124,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,125,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,126,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,127,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,128,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,129,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,130,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,131,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,132,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,133,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,134,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,135,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,136,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,137,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,138,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,139,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,140,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,141,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,142,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,143,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,144,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,145,4,3,23.5818428,0.000070,0.972885,0.000270,0.000133,0.026642,0.009222771,0.009660355,0.008995888,0.010426419,0.011368754,0.011118309,0.00936622,0.008138199,0.010272534,0.01011709,0.008144321,0.004540743,0.004814015,0.007280157,0.009042908,0.01074764,0.011652335,0.011902921,0.01073633,0.008964895,0.010351931,0.009714063,0.007937948,0.008877708,0.008477063,0.005698715,0.005247471,0.006246599,0.005879262,0.003589238,0.004752403,0.006540576,0.008643738,0.012090186,0.01530966,0.016016589,0.013898216,0.010819653,0.010672886,0.012362962,0.014541818,0.015962594,0.017236092,0.017984324,0.017511096,0.015872769,0.015084758,0.014166619,0.013288672,0.013329849,0.013525986,0.013268583,0.012597044,0.013359798,0.01253662,0.011532479,0.011510583,0.009864743,0.008287869,0.01152445,0.014388948,0.014634189,0.014470753,0.016771823,0.019145186,0.019641895,0.018859358,0.017048211,0.017823247,0.017598811,0.016869254,0.017319808,0.01787883,0.019798117,0.020381421,0.019642228,0.018222741,0.017937224,0.018758897,0.020182637
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,146,4,3,23.5818428,0.000070,0.972885,0.000270,0.000133,0.026642,0.009222771,0.009660355,0.008995888,0.010426419,0.011368754,0.011118309,0.00936622,0.008138199,0.010272534,0.01011709,0.008144321,0.004540743,0.004814015,0.007280157,0.009042908,0.01074764,0.011652335,0.011902921,0.01073633,0.008964895,0.010351931,0.009714063,0.007937948,0.008877708,0.008477063,0.005698715,0.005247471,0.006246599,0.005879262,0.003589238,0.004752403,0.006540576,0.008643738,0.012090186,0.01530966,0.016016589,0.013898216,0.010819653,0.010672886,0.012362962,0.014541818,0.015962594,0.017236092,0.017984324,0.017511096,0.015872769,0.015084758,0.014166619,0.013288672,0.013329849,0.013525986,0.013268583,0.012597044,0.013359798,0.01253662,0.011532479,0.011510583,0.009864743,0.008287869,0.01152445,0.014388948,0.014634189,0.014470753,0.016771823,0.019145186,0.019641895,0.018859358,0.017048211,0.017823247,0.017598811,0.016869254,0.017319808,0.01787883,0.019798117,0.020381421,0.019642228,0.018222741,0.017937224,0.018758897,0.020182637
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,147,4,4,19.0951844,0.000016,0.975064,0.000112,0.000028,0.024780,0.007439882,0.008640393,0.007968963,0.009094201,0.009299037,0.009810438,0.008775744,0.00719943,0.008866134,0.008429907,0.006698506,0.004071012,0.003228212,0.006025383,0.007346537,0.009414155,0.009905567,0.010126756,0.009326965,0.007694084,0.009338718,0.008959429,0.006905136,0.007802083,0.006925079,0.004805227,0.005135805,0.006179794,0.004845614,0.002195137,0.004442394,0.007255148,0.009782102,0.013118365,0.016451826,0.017587148,0.015531518,0.012222019,0.01084239,0.01203778,0.015554049,0.018794261,0.020022308,0.018782225,0.015613813,0.015410767,0.0156474,0.01444474,0.012292526,0.011516996,0.013043064,0.014302905,0.014378678,0.014004851,0.012614376,0.012746383,0.013649849,0.012201485,0.009818387,0.012939303,0.017517067,0.018086415,0.017609226,0.018669714,0.019983531,0.02149732,0.020933217,0.018688466,0.017563466,0.015878379,0.016652283,0.017378343,0.016753777,0.017698485,0.019901051,0.020532158,0.019404617,0.017572033,0.017578145,0.020599925
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,148,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,149,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,150,4,2,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,151,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,152,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,153,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,154,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,155,4,5,12.92686969,0.233149,0.608310,0.053102,0.003719,0.101721,0.006220691,0.008026336,0.0057538,0.006200504,0.007578411,0.006992004,0.008412528,0.009994639,0.01112147,0.011897951,0.011321909,0.011116582,0.010481965,0.007938792,0.007170713,0.009770436,0.010175086,0.00813417,0.007792453,0.010287847,0.010588479,0.009331093,0.009429877,0.010510992,0.011424843,0.011882782,0.011533866,0.010916774,0.011800584,0.013563498,0.014719346,0.015144342,0.015143082,0.015199692,0.015629012,0.016350086,0.017212367,0.018042215,0.01863368,0.018900402,0.018834657,0.018570918,0.018404041,0.018543224,0.018846103,0.019111302,0.019303463,0.019401038,0.01935058,0.019163961,0.018962789,0.018864725,0.018849222,0.018812273,0.01866458,0.018412632,0.018068886,0.01759337,0.017026668,0.016325905,0.015377017,0.014187394,0.012717519,0.011078197,0.009745229,0.008864025,0.008015423,0.00691937,0.006030884,0.006392346,0.007496279,0.007995911,0.008132989,0.00857258,0.008961416,0.008531174,0.006389399,0.004814942,0.007217524,0.009104742
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,156,4,5,12.92686969,0.233149,0.608310,0.053102,0.003719,0.101721,0.006220691,0.008026336,0.0057538,0.006200504,0.007578411,0.006992004,0.008412528,0.009994639,0.01112147,0.011897951,0.011321909,0.011116582,0.010481965,0.007938792,0.007170713,0.009770436,0.010175086,0.00813417,0.007792453,0.010287847,0.010588479,0.009331093,0.009429877,0.010510992,0.011424843,0.011882782,0.011533866,0.010916774,0.011800584,0.013563498,0.014719346,0.015144342,0.015143082,0.015199692,0.015629012,0.016350086,0.017212367,0.018042215,0.01863368,0.018900402,0.018834657,0.018570918,0.018404041,0.018543224,0.018846103,0.019111302,0.019303463,0.019401038,0.01935058,0.019163961,0.018962789,0.018864725,0.018849222,0.018812273,0.01866458,0.018412632,0.018068886,0.01759337,0.017026668,0.016325905,0.015377017,0.014187394,0.012717519,0.011078197,0.009745229,0.008864025,0.008015423,0.00691937,0.006030884,0.006392346,0.007496279,0.007995911,0.008132989,0.00857258,0.008961416,0.008531174,0.006389399,0.004814942,0.007217524,0.009104742
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,157,4,5,12.92686969,0.233149,0.608310,0.053102,0.003719,0.101721,0.006220691,0.008026336,0.0057538,0.006200504,0.007578411,0.006992004,0.008412528,0.009994639,0.01112147,0.011897951,0.011321909,0.011116582,0.010481965,0.007938792,0.007170713,0.009770436,0.010175086,0.00813417,0.007792453,0.010287847,0.010588479,0.009331093,0.009429877,0.010510992,0.011424843,0.011882782,0.011533866,0.010916774,0.011800584,0.013563498,0.014719346,0.015144342,0.015143082,0.015199692,0.015629012,0.016350086,0.017212367,0.018042215,0.01863368,0.018900402,0.018834657,0.018570918,0.018404041,0.018543224,0.018846103,0.019111302,0.019303463,0.019401038,0.01935058,0.019163961,0.018962789,0.018864725,0.018849222,0.018812273,0.01866458,0.018412632,0.018068886,0.01759337,0.017026668,0.016325905,0.015377017,0.014187394,0.012717519,0.011078197,0.009745229,0.008864025,0.008015423,0.00691937,0.006030884,0.006392346,0.007496279,0.007995911,0.008132989,0.00857258,0.008961416,0.008531174,0.006389399,0.004814942,0.007217524,0.009104742
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,158,4,5,12.92686969,0.233149,0.608310,0.053102,0.003719,0.101721,0.006220691,0.008026336,0.0057538,0.006200504,0.007578411,0.006992004,0.008412528,0.009994639,0.01112147,0.011897951,0.011321909,0.011116582,0.010481965,0.007938792,0.007170713,0.009770436,0.010175086,0.00813417,0.007792453,0.010287847,0.010588479,0.009331093,0.009429877,0.010510992,0.011424843,0.011882782,0.011533866,0.010916774,0.011800584,0.013563498,0.014719346,0.015144342,0.015143082,0.015199692,0.015629012,0.016350086,0.017212367,0.018042215,0.01863368,0.018900402,0.018834657,0.018570918,0.018404041,0.018543224,0.018846103,0.019111302,0.019303463,0.019401038,0.01935058,0.019163961,0.018962789,0.018864725,0.018849222,0.018812273,0.01866458,0.018412632,0.018068886,0.01759337,0.017026668,0.016325905,0.015377017,0.014187394,0.012717519,0.011078197,0.009745229,0.008864025,0.008015423,0.00691937,0.006030884,0.006392346,0.007496279,0.007995911,0.008132989,0.00857258,0.008961416,0.008531174,0.006389399,0.004814942,0.007217524,0.009104742
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,159,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,160,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,161,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,162,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,163,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,164,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,165,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,166,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,167,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,168,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,169,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,170,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,171,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,172,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,173,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,174,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,175,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,176,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,177,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,178,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,179,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,180,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,181,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,182,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,183,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,184,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,185,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,186,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,187,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,188,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,189,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,190,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,191,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,192,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,193,4,0,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,194,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,195,4,4,12.51956428,0.057946,0.748460,0.021853,0.010191,0.161550,0.002911719,0.00350914,0.006307069,0.008078172,0.007304614,0.004237207,0.0023327,0.003877557,0.003384699,0.004979839,0.005300322,0.004853516,0.005693305,0.006859038,0.008249482,0.007089815,0.003468407,0.004508834,0.006829655,0.007518427,0.006992411,0.006683763,0.008605091,0.009490363,0.009986735,0.01044832,0.010863435,0.011169697,0.011170199,0.011605864,0.013104292,0.014652028,0.015924393,0.016899735,0.017459301,0.01743421,0.016163855,0.015281896,0.017901121,0.019718813,0.020713738,0.021184977,0.021220441,0.02083616,0.020011665,0.018939693,0.018534953,0.018847118,0.019136185,0.019608794,0.020287897,0.020755617,0.020780315,0.020312114,0.019298474,0.017714265,0.017125622,0.017702781,0.01776941,0.017547023,0.017711003,0.018039682,0.017894462,0.01724126,0.016346657,0.015498661,0.014703241,0.013627473,0.011998201,0.010162345,0.009340609,0.009335968,0.008978209,0.008141558,0.007737223,0.00829487,0.00888277,0.009049035,0.009561671,0.010278825
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,196,4,8,13.44523815,0.159350,0.428536,0.091355,0.011010,0.309749,0.004184995,0.004848172,0.005809845,0.006163274,0.006162725,0.004480667,0.003104188,0.003092449,0.003118428,0.004698191,0.005065976,0.004948582,0.005602707,0.006468994,0.00721142,0.006620544,0.005096566,0.006039817,0.007661242,0.008537441,0.009025107,0.009502476,0.010597248,0.010991752,0.011216999,0.011561,0.011967717,0.012321568,0.012555381,0.01304223,0.014064742,0.01510645,0.015950395,0.016558,0.016905394,0.017002767,0.016607251,0.016407662,0.01772766,0.018624015,0.019167014,0.019532819,0.019712379,0.019660883,0.019376638,0.018978913,0.018872718,0.019040036,0.01913644,0.019288855,0.019547254,0.019734092,0.019729882,0.019489921,0.018957681,0.018096034,0.01763329,0.017694831,0.017551587,0.017283126,0.017146578,0.017027104,0.016654209,0.016010087,0.015173063,0.014233786,0.013220512,0.012082318,0.010791337,0.009568848,0.008900725,0.008688293,0.00847748,0.008196964,0.008281309,0.009035783,0.009804024,0.010176877,0.010510592,0.010883677
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,197,4,11,12.16072966,0.209185,0.423218,0.099278,0.005254,0.263065,0.005428691,0.005765205,0.006143651,0.005498495,0.005712526,0.00457687,0.003684677,0.004067112,0.004273399,0.005826421,0.006559571,0.006773341,0.007328996,0.007882817,0.00833611,0.007690928,0.006247271,0.006925009,0.008433219,0.009523116,0.010229682,0.01079228,0.011768814,0.012085258,0.011971,0.0119085,0.012752473,0.013544191,0.013941583,0.014369474,0.015135222,0.015960268,0.016748409,0.017361942,0.017654542,0.017606473,0.017053209,0.016515611,0.016935655,0.017660799,0.018596507,0.019010296,0.019107664,0.019085275,0.018851962,0.018372555,0.018057729,0.018163113,0.018484079,0.018901029,0.019324406,0.019586558,0.019604574,0.019359756,0.018815114,0.017956854,0.017414278,0.017349002,0.017169863,0.016840802,0.016399237,0.01557759,0.015100762,0.014895477,0.014186583,0.013121381,0.011660053,0.010629476,0.009975641,0.008707782,0.007751805,0.00808303,0.007721608,0.006850688,0.007363713,0.008377074,0.008579395,0.008092426,0.008730458,0.009471593
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,198,4,12,12.82361209,0.200629,0.404911,0.117348,0.005881,0.271231,0.006821248,0.006602415,0.006006835,0.005246423,0.005135832,0.00467021,0.004530257,0.004834942,0.004884781,0.006529,0.007328202,0.006818032,0.007013962,0.00731501,0.007764565,0.007763536,0.007116437,0.007930992,0.009344708,0.010388797,0.010786292,0.011016704,0.011771027,0.011946851,0.011754899,0.011869526,0.012930876,0.013787113,0.014082385,0.014320469,0.014908947,0.015660677,0.016448099,0.017044446,0.017292728,0.017247244,0.016839321,0.016496043,0.016934178,0.017552107,0.018321149,0.018669465,0.018802666,0.018856798,0.018690231,0.018242306,0.017897582,0.017948716,0.018264576,0.018710582,0.019139907,0.019365032,0.019321812,0.019032927,0.018497823,0.017706376,0.017190518,0.017080594,0.016863956,0.016507696,0.016029464,0.015197514,0.014688387,0.014484578,0.013865882,0.012836543,0.011309536,0.010141024,0.009530414,0.008695165,0.007988474,0.008053437,0.007683072,0.00717296,0.0077768,0.00870067,0.008861766,0.008443256,0.009037183,0.009657048
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,199,4,10,12.59106734,0.247869,0.376117,0.107388,0.006517,0.262108,0.006963875,0.006365118,0.005013171,0.003413472,0.003604771,0.004634732,0.005219561,0.005318094,0.005983289,0.00735776,0.007718757,0.006431731,0.006958255,0.00764143,0.007746289,0.008209173,0.00871867,0.009139486,0.009648402,0.01042636,0.011486464,0.012433758,0.012982043,0.013004178,0.012616746,0.012640224,0.013845338,0.01483927,0.015256193,0.015426364,0.015668166,0.016123369,0.016694382,0.017099172,0.017204985,0.0171735,0.01718454,0.017133351,0.016743473,0.016907336,0.017580271,0.017931246,0.018145012,0.018375928,0.018489347,0.01837183,0.01815186,0.018143587,0.018440464,0.018795922,0.019032859,0.019089144,0.018973396,0.018729491,0.01837998,0.017931928,0.017458104,0.017063153,0.016741857,0.01633665,0.015590548,0.014317815,0.013601866,0.013458856,0.012935164,0.011926959,0.010308932,0.009187456,0.008818691,0.008076012,0.007077878,0.007059678,0.006976531,0.006868748,0.007814885,0.008793449,0.008933452,0.008517115,0.00908076,0.009517929
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,200,4,11,14.46336438,0.293794,0.429502,0.044550,0.002297,0.229858,0.007748423,0.006531708,0.004801583,0.004815026,0.005468745,0.006585047,0.007825317,0.008812327,0.009189457,0.008895095,0.008575404,0.008057586,0.008963806,0.009671919,0.009794234,0.010435313,0.010720554,0.010859806,0.011117082,0.011584577,0.012391788,0.012883551,0.013021339,0.012981986,0.01287727,0.013122636,0.014170897,0.015010985,0.015475751,0.015759833,0.015962565,0.016197712,0.01652785,0.016852926,0.017068197,0.017183407,0.017242405,0.017184999,0.01688077,0.017077805,0.017691246,0.018004348,0.01814917,0.018258435,0.018258184,0.018107775,0.017932647,0.017949092,0.0181826,0.018421668,0.018544966,0.018513329,0.018296323,0.017898471,0.01738332,0.016851143,0.01640249,0.016053198,0.015711839,0.01524174,0.014490123,0.013326841,0.012529043,0.012048573,0.011149739,0.009882093,0.008396689,0.007504502,0.007602277,0.007579381,0.007058792,0.006798635,0.00640137,0.006111153,0.006705933,0.006950413,0.006465608,0.005960927,0.007013671,0.007844571
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,201,4,9,15.18346638,0.328008,0.325078,0.040291,0.001883,0.304741,0.007222363,0.005734932,0.00405511,0.005379398,0.005811243,0.006492441,0.007578124,0.008172049,0.008317944,0.00774439,0.007347283,0.006170913,0.007454505,0.008771029,0.00897963,0.009687699,0.010333693,0.010600419,0.010438293,0.010944182,0.011656629,0.011479994,0.011527697,0.011690996,0.01146486,0.012193014,0.01298283,0.013615112,0.014015729,0.01394218,0.014420903,0.014226677,0.014918934,0.016016342,0.016767514,0.017182421,0.017106779,0.017133578,0.017314122,0.01754259,0.017994647,0.018275638,0.018908799,0.019005308,0.018182778,0.01782387,0.017875957,0.018151969,0.018329385,0.018649635,0.018482066,0.018384384,0.018281087,0.018321563,0.018182489,0.017627153,0.016676701,0.016169281,0.015569044,0.015707443,0.015590248,0.014898319,0.014299651,0.013581783,0.012925084,0.012044722,0.0108525,0.009494545,0.008919495,0.00896607,0.008470233,0.007477759,0.006889405,0.00721044,0.007720571,0.007708518,0.00742459,0.007560465,0.008230401,0.008701462
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,202,4,7,16.77507435,0.385612,0.286998,0.047583,0.001358,0.278448,0.007284997,0.005929768,0.004367721,0.005901951,0.006811247,0.007167136,0.00778807,0.00840718,0.008713674,0.007862691,0.00748274,0.007008375,0.008548653,0.01004074,0.010140788,0.010397247,0.01064021,0.010823525,0.010627734,0.011130173,0.011929982,0.011710185,0.011647953,0.011814502,0.011607521,0.012263551,0.012806438,0.013311383,0.01375977,0.013758643,0.014370953,0.014067996,0.014707326,0.015849875,0.016677864,0.017143284,0.016973108,0.016862058,0.016943708,0.017133092,0.017626063,0.017921489,0.018604699,0.018648264,0.017644829,0.017241208,0.017353295,0.017697071,0.017848581,0.018129507,0.017874452,0.017788357,0.017775737,0.017962459,0.017920496,0.017364659,0.016335994,0.015825785,0.01519848,0.015451768,0.015460632,0.014861708,0.014370726,0.013650591,0.012944498,0.0120677,0.011013944,0.009824306,0.009326795,0.009216471,0.008622951,0.007776148,0.00711309,0.007135104,0.00753368,0.007481683,0.007156268,0.007269621,0.007978563,0.008568515
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,203,4,6,17.9366666,0.405886,0.282383,0.084636,0.000895,0.226200,0.007764617,0.006726204,0.005415314,0.007458969,0.008406369,0.007976782,0.008396936,0.008833352,0.008696432,0.007531009,0.007363539,0.007882479,0.009228833,0.010277303,0.010366995,0.010424078,0.010442242,0.010665468,0.010702477,0.011482596,0.012248358,0.01171954,0.011485361,0.011671677,0.011481575,0.012107573,0.012546013,0.013020671,0.013535815,0.013579901,0.014200508,0.013742977,0.01436946,0.015635398,0.016597666,0.017123413,0.016883344,0.01669609,0.016754759,0.016950515,0.017454696,0.017703433,0.018370245,0.018359026,0.017232282,0.016786338,0.016904802,0.017264976,0.017409969,0.017707461,0.017432727,0.017359325,0.017378372,0.01762858,0.017640682,0.01709347,0.016017266,0.01549791,0.014854737,0.015210156,0.015332576,0.014795467,0.014352812,0.013632215,0.012924044,0.012043057,0.010974499,0.009760206,0.009370907,0.00955531,0.009286705,0.008446961,0.007489217,0.007307924,0.007649815,0.007477041,0.006930208,0.006919691,0.007678921,0.008373363
|
||||
test,PAM_20200918_123234_366.wav,PAM_20200918_123234_366.wav,204,4,1,0,0.000000,0.000000,0.000000,0.000000,0.000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,72 @@
|
||||
0,1,2,3,4,5,6,7,8,9,10,11
|
||||
0.17577599,0.06939087,4.0765575e-05,0.0002881006,0.00018309923,0.0037399624,0.00484566,5.8907076e-06,0.00020740317,0.0005475284,0.003910678,1.8796809e-05
|
||||
0.12134998,0.0452549,9.203215e-05,6.106747e-05,0.00011356388,0.007522046,0.0019039916,2.6653722e-06,0.0001205435,0.0023370755,0.0010755587,1.410594e-05
|
||||
4.9778093e-05,0.48127228,0.00067260134,1.1338762e-05,6.6813986e-06,0.013890178,4.4261105e-06,7.161947e-07,1.2533595e-06,0.0061409,2.0035611e-06,8.8392454e-07
|
||||
5.47298e-07,0.22382887,0.0003612544,2.3930239e-05,2.5705365e-06,0.011263198,3.6400306e-07,2.6399513e-07,1.219394e-07,0.0046477295,2.2039742e-07,2.09958e-07
|
||||
4.288036e-05,0.31589574,0.00023784858,0.00025497508,3.077997e-05,0.012559328,2.962434e-05,7.5721664e-07,2.3117693e-06,0.0010935054,4.7344365e-06,1.6327084e-06
|
||||
0.020145541,0.03074267,0.0028023466,0.00073693745,0.00028266342,0.005045984,0.00013074338,6.0220685e-07,1.0367147e-05,0.0015687827,4.1986943e-05,1.6945913e-05
|
||||
0.009552513,0.0030180695,8.824046e-05,4.650866e-05,8.299547e-06,0.0016920523,2.9329853e-05,4.3706373e-07,5.621946e-06,0.0004396474,8.066213e-06,1.2293907e-06
|
||||
0.00044141975,0.20943537,0.0030042513,0.00013729495,6.616487e-05,0.0020272348,0.000113031914,7.188758e-06,1.0763081e-05,0.0006483929,2.710338e-05,4.3990444e-06
|
||||
0.00069717836,0.10983792,0.0007054794,0.0020053294,0.00018470333,0.0018362027,0.00035991776,4.432294e-06,1.6566473e-05,0.00013971668,4.423122e-05,1.2555861e-06
|
||||
0.0050139767,0.29272327,0.0004998942,0.00036060016,7.281238e-05,0.0029723274,0.0013773341,1.3075941e-05,6.867808e-05,0.00036174082,0.00019994803,1.409486e-05
|
||||
0.0017596433,0.25337175,0.000103463186,3.442073e-05,3.355492e-05,0.007654757,0.000107356136,7.714922e-06,3.2462587e-05,0.002449178,1.7112177e-05,6.2273225e-06
|
||||
8.988725e-06,0.59267575,0.00018885538,5.1856246e-06,4.881175e-06,0.015215663,1.4397422e-06,1.5563406e-06,8.6111065e-08,0.0006478191,2.1160392e-07,3.8976935e-07
|
||||
2.7352002e-07,0.44767833,2.2463077e-05,2.6857402e-05,1.1074902e-06,0.029194066,2.2991392e-07,2.1500671e-07,1.2196339e-08,0.00062920095,4.7683937e-08,5.773021e-07
|
||||
3.5449877e-05,0.1907422,5.3209675e-05,0.00015418744,4.018717e-05,0.08104086,1.3004113e-05,2.5809513e-06,1.1955262e-06,0.0011627469,3.5274911e-06,2.4211628e-05
|
||||
0.0021694184,0.40491036,9.338964e-05,0.00018201704,0.00026156235,0.048863955,0.0005687415,5.5441375e-05,7.1669056e-05,0.0043333652,9.684925e-05,6.226602e-05
|
||||
0.0006335464,0.3359909,0.00037379484,0.00088786747,9.250568e-05,0.031195106,0.00014324662,1.722812e-05,3.0285883e-05,0.0028994258,2.27597e-05,3.3219458e-05
|
||||
0.00014453182,0.6839848,0.0004741817,8.523672e-06,8.906555e-05,0.005643163,1.9025234e-05,1.5286753e-06,4.573082e-06,0.0036089919,1.1729753e-06,6.925799e-07
|
||||
1.4089174e-05,0.79771835,0.0018127938,3.6665476e-06,4.286948e-05,0.010763819,1.1884295e-06,1.0042011e-06,6.615374e-08,0.0013166448,7.300864e-08,6.917899e-08
|
||||
8.8483794e-05,0.56834227,5.8748028e-05,2.1050637e-05,2.3188226e-05,0.019722067,5.814333e-06,2.2946674e-06,4.6233612e-07,0.0006220055,6.636307e-07,8.9003777e-07
|
||||
0.017391194,0.57917744,8.369133e-05,8.913632e-05,9.752393e-05,0.012386402,0.00016493106,1.9780211e-05,2.3030743e-05,0.00051371136,0.00011011217,3.253886e-05
|
||||
0.0062785842,0.13769141,0.001743125,1.2185119e-05,0.00017068045,0.004754985,0.0002688594,3.1589884e-06,1.8877507e-05,0.0022611273,3.9709605e-05,9.727585e-06
|
||||
3.335644e-05,0.34319195,0.00018843701,8.7069793e-07,8.516928e-06,0.0058070365,3.6556264e-06,2.3076667e-07,1.463309e-07,0.00048413855,2.9394914e-07,1.0016057e-07
|
||||
2.7598245e-08,0.71729684,2.1495255e-06,1.2138136e-06,9.157232e-08,0.02594131,4.9092947e-09,5.1478743e-08,2.434345e-10,0.00093547354,4.089916e-10,6.905019e-09
|
||||
8.673179e-06,0.5651511,3.3687338e-06,1.8361585e-05,1.7100099e-06,0.018923532,2.021362e-07,2.1672487e-07,1.5572724e-08,0.00023248923,1.5759085e-08,1.5963591e-08
|
||||
0.0006819258,0.79936177,1.9983901e-05,6.7489964e-05,1.8786935e-05,0.0026585748,1.945028e-05,3.091401e-06,2.672494e-06,0.0001374258,4.931991e-06,1.3976714e-06
|
||||
0.00016227354,0.7289602,0.00011640962,2.6306365e-05,5.504931e-05,0.020159643,4.0718947e-05,6.56836e-06,3.3905508e-06,0.002157479,1.6543283e-05,1.3760472e-06
|
||||
1.9469524e-05,0.776153,0.002854284,6.50028e-06,2.462434e-05,0.010021779,5.2028386e-06,2.4023468e-06,2.4731176e-07,0.0003689484,6.4354674e-07,1.9555088e-07
|
||||
6.0379157e-06,0.891646,0.0011463211,2.9813857e-05,9.033136e-06,0.005687247,3.996265e-06,1.0447734e-06,1.9478404e-07,0.000997302,5.129792e-07,4.895105e-07
|
||||
0.00066666945,0.38497317,0.000327523,0.0015100732,0.0001482992,0.0030872056,7.169503e-05,6.2907006e-06,5.3814592e-06,0.0007899641,1.5226983e-05,1.934541e-05
|
||||
0.001517156,0.10020319,7.100856e-05,5.175042e-05,1.439992e-05,0.008214117,6.399485e-05,6.4281976e-06,8.467307e-06,0.0012375154,1.34898155e-05,3.4099015e-05
|
||||
6.195241e-05,0.45361155,0.00011185612,1.272702e-05,1.7560022e-05,0.014166645,4.806677e-06,1.228255e-06,2.6536827e-07,0.0016344256,4.016004e-07,5.374191e-07
|
||||
1.6371848e-07,0.1747091,1.7991993e-05,5.208662e-06,1.2182946e-06,0.020926258,4.8648353e-08,1.2519452e-07,1.4686861e-09,0.00148135,5.054844e-09,5.4048133e-08
|
||||
9.087821e-09,0.13886137,5.5594105e-06,8.545174e-06,1.05196655e-07,0.03809376,1.0566997e-08,1.2856449e-08,3.9731052e-10,9.6103344e-05,2.1998403e-09,7.432107e-08
|
||||
8.179886e-06,0.4955629,4.5628535e-06,0.00015468517,1.0014027e-05,0.008238238,2.9689993e-06,5.58282e-07,5.0182723e-07,0.00010325257,5.652486e-07,3.1147894e-07
|
||||
0.00015601357,0.03689768,5.2684216e-05,0.00022993557,9.870855e-06,0.0031463304,1.1348379e-05,2.568777e-07,1.8572352e-06,0.0008612714,2.4646579e-06,5.3215945e-07
|
||||
0.00062411267,0.7375373,0.0012276277,3.7191956e-05,5.0330895e-05,0.011613357,1.900886e-05,2.3045711e-06,2.531913e-06,0.0010202706,8.8967645e-06,1.5277177e-06
|
||||
0.00034310055,0.8034205,0.0008709528,0.00011021426,0.00016985618,0.0046230205,5.2749224e-06,7.2337747e-07,7.233306e-07,0.0019488796,2.3278083e-06,3.7971338e-07
|
||||
0.0030299767,0.564029,0.00020218997,0.00050834235,6.528403e-05,0.00357279,8.316438e-06,4.707665e-07,7.5085126e-07,0.001211637,8.139127e-07,1.8590215e-06
|
||||
0.016430598,0.260464,6.673995e-05,8.26663e-05,4.1097475e-05,0.00390321,0.00048708738,2.3679545e-06,1.6745185e-05,0.00041038985,3.486261e-05,6.8871254e-06
|
||||
0.0034231204,0.2467563,0.0007192856,2.9893274e-06,9.176304e-06,0.0038868738,2.5519308e-05,7.766853e-07,2.811172e-06,0.00065538887,3.9840397e-06,2.088092e-06
|
||||
4.6644423e-06,0.6746519,0.002378825,3.1858963e-06,1.4669812e-06,0.0006923369,1.7428092e-06,4.9207495e-07,7.133414e-08,0.00015848925,3.8554543e-08,1.8472215e-07
|
||||
4.025913e-07,0.07405859,0.0026503906,6.193203e-05,5.7060083e-07,0.004681185,1.2890305e-07,6.4071095e-08,1.0678657e-08,0.00074449583,9.595429e-09,3.207071e-06
|
||||
1.5834895e-07,0.27261728,0.0012426871,0.00015186626,2.0747293e-06,0.0073613725,8.1475605e-07,5.8062954e-09,1.8146311e-08,9.7854914e-05,3.8686178e-08,1.1429735e-06
|
||||
0.00011900487,0.1357508,0.0074050264,0.0016564731,8.266913e-05,0.019860057,5.1897896e-05,8.4100094e-07,5.9661897e-06,0.0027308636,2.0539079e-05,3.306737e-05
|
||||
0.00013929048,0.077199414,0.0018817156,0.00022644213,2.4973138e-05,0.020461094,6.313834e-05,2.7674384e-06,8.666142e-06,0.007912762,1.8890452e-05,1.9462026e-05
|
||||
0.0017591835,0.26169106,0.008810699,7.374904e-05,8.532419e-05,0.022266181,0.00017233359,1.9170078e-05,3.5879464e-05,0.02105717,0.00015649723,2.2087888e-05
|
||||
0.0006948613,0.5702558,0.0042178724,0.00012821674,6.357128e-05,0.015376499,8.4764375e-05,3.6126446e-06,4.997995e-06,0.001590069,2.1643911e-05,5.1321763e-06
|
||||
0.00028662255,0.6015283,0.00063866586,0.00011794866,2.8462466e-05,0.0030768772,8.31749e-05,1.5488706e-05,1.8909253e-05,0.001386963,1.3627991e-05,9.000784e-06
|
||||
0.0012443978,0.2464135,0.0005627789,4.4343473e-05,1.3085959e-05,0.0051072,4.2748645e-05,9.2358205e-06,2.328782e-05,0.0020071361,8.526419e-06,5.6215968e-06
|
||||
0.0023246128,0.67543083,0.002677279,7.3809686e-05,5.0589202e-05,0.0042211046,2.2117418e-05,1.7687742e-06,1.796384e-05,0.009677429,7.5620383e-06,3.6224195e-05
|
||||
2.4141234e-05,0.6530479,0.00048561677,0.000149909,4.9959026e-06,0.012700983,1.6229764e-06,1.259696e-06,4.1232764e-07,0.011251882,3.3164542e-07,1.3413297e-06
|
||||
2.8481045e-07,0.756934,1.5635016e-05,7.0437876e-05,1.9774902e-07,0.013885954,3.515015e-08,2.1299199e-07,4.5614748e-09,0.0031635282,5.2874483e-09,1.3713891e-08
|
||||
3.1481734e-06,0.59144396,1.0858301e-05,3.1711275e-05,3.1551194e-06,0.008727435,1.7318606e-06,5.4061816e-06,1.89266e-07,0.0008336721,7.803813e-07,1.858022e-07
|
||||
0.0006521682,0.15055217,0.0005959595,0.00045696262,3.3729833e-05,0.017323263,0.00012108124,2.4464824e-05,1.5345207e-05,0.002089023,4.7696834e-05,5.8882583e-06
|
||||
0.00068137416,0.60419613,0.00806375,7.5360884e-05,6.596553e-05,0.004378758,1.7899423e-05,2.178996e-05,3.2394635e-06,0.00037622126,7.465761e-06,6.919477e-06
|
||||
3.6199675e-05,0.7511591,0.000712229,0.0003553234,3.8558745e-05,0.036236793,2.4336962e-06,6.5986483e-06,1.4783924e-06,0.0010109893,1.2337739e-06,4.1176972e-06
|
||||
1.5187739e-05,0.65192324,0.0009791763,0.0007681369,1.2886759e-05,0.0032672517,6.6723696e-06,4.310435e-06,2.1143464e-06,0.00073100696,5.3043073e-06,1.0640143e-05
|
||||
2.2962515e-05,0.21694599,0.00018304738,7.238323e-05,1.4976154e-05,0.012731089,1.730705e-05,7.251395e-06,3.8867233e-06,0.003344151,5.5895275e-06,6.7470805e-06
|
||||
0.00020507941,0.5401167,0.00048882567,5.0320865e-05,4.304034e-05,0.0108627565,2.7524222e-05,3.8708284e-05,8.567842e-06,0.0053218296,1.4509261e-05,2.6525613e-06
|
||||
7.566493e-07,0.584689,5.4627915e-05,0.0004652954,1.1395005e-06,0.015062643,1.4429904e-07,3.3632364e-07,5.320208e-08,0.002181108,5.7332382e-08,2.4920814e-07
|
||||
5.649889e-06,0.6404879,0.00023549638,0.00038246595,3.9890915e-06,0.024792697,2.5240581e-06,1.5147046e-07,6.403931e-07,0.0015972962,5.253265e-07,1.4419244e-06
|
||||
6.0010614e-05,0.81722015,0.00012455546,6.141238e-05,2.4246076e-05,0.008644608,2.0608715e-05,6.290942e-07,3.9214015e-06,0.00068868534,3.082031e-06,8.702288e-07
|
||||
2.1709237e-05,0.54693127,8.166146e-05,8.626133e-05,4.0849563e-06,0.02420306,9.812627e-06,2.0188363e-06,2.3619957e-06,0.0033924016,5.433642e-06,1.0196975e-06
|
||||
5.2920195e-06,0.50160635,0.00254506,1.8723546e-05,4.1029584e-06,0.014586123,2.7632557e-06,1.3539902e-06,5.1664375e-07,0.00532491,7.2773395e-07,1.1196528e-06
|
||||
4.826802e-06,0.6000666,0.0033851678,7.521388e-06,3.8796834e-06,0.03862062,1.6187392e-06,8.608067e-07,3.751017e-07,0.0028895433,4.482253e-07,8.9079697e-07
|
||||
3.9219253e-06,0.6900702,0.0011904631,4.1594314e-05,3.016439e-05,0.006129761,2.2342062e-06,1.3396525e-06,6.1242446e-07,0.0021204043,9.947836e-07,3.2273832e-07
|
||||
0.0050234795,0.48052213,0.0006477987,0.00016532217,0.0005695884,0.013440274,0.00026325864,9.319689e-06,3.3497694e-05,0.0032552083,5.709763e-05,3.9514154e-05
|
||||
0.009926768,0.35068285,0.00026277165,0.0005224699,0.00011402145,0.010900033,0.0005328492,9.764466e-06,7.158211e-05,0.0011159758,9.557291e-05,4.3749293e-05
|
||||
6.101281e-06,0.6653127,6.731141e-05,2.5789748e-05,2.4885505e-06,0.0035001289,4.889528e-06,1.1407442e-06,3.969879e-07,0.0003278927,8.7886605e-07,8.2221436e-07
|
||||
2.2242143e-06,0.69842005,0.000120197314,0.00044051962,2.1138744e-06,0.011991097,9.827477e-07,3.3675573e-08,1.3316698e-07,0.0006891328,2.446208e-07,2.1849071e-07
|
||||
3.8870377e-05,0.674022,0.00029916878,0.00026114276,7.772191e-06,0.017075207,8.899336e-06,5.3932445e-07,1.6343162e-06,0.000820524,7.741157e-07,2.0777447e-06
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user