diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 09edd87..ae3ad18 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,6 @@ - @@ -26,8 +25,8 @@ - - + + @@ -35,11 +34,11 @@ - + - - + + @@ -48,10 +47,19 @@ + + + + + + + + + - - + + @@ -71,6 +79,7 @@ checkExist Basic ArrayUtils + img @@ -182,7 +191,7 @@ - + @@ -207,7 +216,7 @@ - + - + @@ -311,42 +320,42 @@ - + - + - + - + - + - + - + - + - + - - + + - + @@ -355,7 +364,7 @@ - + @@ -374,6 +383,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -390,16 +428,9 @@ - - - - - - - - + @@ -415,33 +446,40 @@ - + - - + + - + - - + + - + - - + + + + + + + + + diff --git a/nifi-mxnetinference-nar/target/nifi-mxnetinference-nar-1.0.nar b/nifi-mxnetinference-nar/target/nifi-mxnetinference-nar-1.0.nar index dc27402..7642e1e 100644 Binary files a/nifi-mxnetinference-nar/target/nifi-mxnetinference-nar-1.0.nar and b/nifi-mxnetinference-nar/target/nifi-mxnetinference-nar-1.0.nar differ diff --git a/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/InferenceProcessor.java b/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/InferenceProcessor.java index 6d1e9f6..b8a43db 100644 --- a/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/InferenceProcessor.java +++ b/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/InferenceProcessor.java @@ -1,6 +1,7 @@ package com.dataflowdeveloper.mxnet; import java.awt.*; +import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; @@ -156,13 +157,39 @@ public void process(final InputStream input, final java.io.OutputStream out) thr Graphics2D g2d = (Graphics2D) img.createGraphics(); + float x, y, x0, y0 = 0.0f; + float width, height = 0.0f; + try { // Draw on the buffered image with our rectangles - g2d.setStroke(new BasicStroke(3)); - g2d.setColor(Color.BLUE); - g2d.drawRect((int)(result.getXmin()), (int)(result.getYmin()), - (int)(result.getXmax()), - (int)(result.getYmax())); + g2d.setStroke(new BasicStroke(2)); + + switch (i) + { + case(1): g2d.setColor(Color.BLUE); break; + case(2): g2d.setColor(Color.GREEN); break; + case(3): g2d.setColor(Color.CYAN); break; + case(4): g2d.setColor(Color.RED); break; + case(5): g2d.setColor(Color.YELLOW); break; + default: g2d.setColor(Color.BLACK); break; + } + + x = Math.min( result.getXmax(), result.getXmin()); + y = Math.min( result.getYmax(), result.getYmin()); + y0 = Math.max( result.getYmax(), result.getYmin()); + x0 = Math.max( result.getXmax(), result.getXmin()); + + width = Math.abs( x - x0 ); + height = Math.abs( y - y0 ); + + g2d.draw(new Rectangle2D.Double(x, y, width, height)); + +// System.out.println("X y w h:" + x + "," +y +","+ width +","+ height); +// System.out.println("X + width:" + (x+width)); +// System.out.println("Y + Height:" + (y + height)); + // In rectangles, the X and Y coordinates represent the top left corner. + // xmin, ymax + g2d.dispose(); } catch (Exception e) { @@ -173,8 +200,6 @@ public void process(final InputStream input, final java.io.OutputStream out) thr g2d.dispose(); } - - i++; } ImageIO.write(img, "jpg", out); diff --git a/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/SSDClassifierService.java b/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/SSDClassifierService.java index c9e1f13..2b794b8 100644 --- a/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/SSDClassifierService.java +++ b/nifi-mxnetinference-processors/src/main/java/com/dataflowdeveloper/mxnet/SSDClassifierService.java @@ -1,56 +1,25 @@ package com.dataflowdeveloper.mxnet; +import org.apache.mxnet.infer.javaapi.ObjectDetector; +import org.apache.mxnet.infer.javaapi.ObjectDetectorOutput; +import org.apache.mxnet.javaapi.Context; +import org.apache.mxnet.javaapi.DType; +import org.apache.mxnet.javaapi.DataDesc; +import org.apache.mxnet.javaapi.Shape; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.mxnet.infer.javaapi.ObjectDetectorOutput; -import org.apache.mxnet.javaapi.*; -import org.apache.mxnet.infer.javaapi.ObjectDetector; - -import java.io.InputStream; -import java.io.ByteArrayInputStream; - -import java.awt.geom.Rectangle2D; -import java.awt.Graphics2D; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.BasicStroke; - -// scalastyle:off +import javax.imageio.ImageIO; import java.awt.image.BufferedImage; -// scalastyle:on - -import java.nio.Buffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import java.io.File; - +import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.PrintStream; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.io.InputStream; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; -import java.util.Map.Entry; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.imageio.ImageIO; +// scalastyle:off +// scalastyle:on /** * https://mxnet.incubator.apache.org/tutorials/java/ssd_inference.html @@ -70,6 +39,7 @@ public class SSDClassifierService { private final static Logger logger = LoggerFactory.getLogger(SSDClassifierService.class); /** + * See: https://mxnet.incubator.apache.org/tutorials/java/ssd_inference.html * run object detection single * String inputImagePath * @param modelPathPrefix @@ -93,7 +63,7 @@ public class SSDClassifierService { } if ( img != null ) { ObjectDetector objDet = new ObjectDetector(modelPathPrefix, inputDescriptors, context, 0); - return objDet.imageObjectDetect(img, 3); + return objDet.imageObjectDetect(img, 5); } else { return null; @@ -122,6 +92,7 @@ public List ssdClassify(String modelPath, byte[] imageBytes) { } try { + // TODO: make shape an input attribute Shape inputShape = new Shape(new int[]{1, 3, 512, 512}); Shape outputShape = new Shape(new int[]{1, 6132, 6}); @@ -137,7 +108,7 @@ public List ssdClassify(String modelPath, byte[] imageBytes) { for (ObjectDetectorOutput i : ele) { if ( i != null ) { Result result = new Result(); - + result.setLabel(i.getClassName()); result.setProbability(i.getProbability()); result.setXmin(i.getXMin() * width ); // diff --git a/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor$1.class b/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor$1.class index f0b5bc6..6644606 100644 Binary files a/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor$1.class and b/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor$1.class differ diff --git a/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor.class b/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor.class index 8bd5d65..1295c6b 100644 Binary files a/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor.class and b/nifi-mxnetinference-processors/target/classes/com/dataflowdeveloper/mxnet/InferenceProcessor.class differ diff --git a/nifi-mxnetinference-processors/target/nifi-mxnetinference-processors-1.0.jar b/nifi-mxnetinference-processors/target/nifi-mxnetinference-processors-1.0.jar index 6342d75..613ef63 100644 Binary files a/nifi-mxnetinference-processors/target/nifi-mxnetinference-processors-1.0.jar and b/nifi-mxnetinference-processors/target/nifi-mxnetinference-processors-1.0.jar differ