This is an automated email from the ASF dual-hosted git repository.
lanking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new 6a93bda Fix scaladoc scalastyle violations in Infer package (#14671)
6a93bda is described below
commit 6a93bda8e9e92bc635f66e5a379566e52592b593
Author: Zach Kimberg <[email protected]>
AuthorDate: Thu Apr 11 15:57:49 2019 -0700
Fix scaladoc scalastyle violations in Infer package (#14671)
---
.../scala/org/apache/mxnet/infer/Classifier.scala | 17 +++++
.../org/apache/mxnet/infer/ImageClassifier.scala | 36 +++++++---
.../org/apache/mxnet/infer/MXNetHandler.scala | 14 ++++
.../org/apache/mxnet/infer/ObjectDetector.scala | 19 +++++
.../scala/org/apache/mxnet/infer/Predictor.scala | 38 +++++-----
.../mxnet/infer/javaapi/ObjectDetector.scala | 80 ++++++++++++++++++----
.../org/apache/mxnet/infer/javaapi/Predictor.scala | 52 +++++++-------
7 files changed, 187 insertions(+), 69 deletions(-)
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Classifier.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Classifier.scala
index bf65815..38fdc00 100644
--- a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Classifier.scala
+++ b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Classifier.scala
@@ -31,6 +31,7 @@ trait ClassifierBase {
/**
* Takes an array of floats and returns corresponding (Label, Score) tuples
+ * @tparam T The Scala equivalent of the DType used for the input array and
return value
* @param input Indexed sequence one-dimensional array of
floats/doubles
* @param topK (Optional) How many result (sorting based on the
last axis)
* elements to return. Default returns unsorted
output.
@@ -167,6 +168,12 @@ class Classifier(modelPathPrefix: String,
result.toIndexedSeq
}
+ /**
+ * Gives the path to the standard location of the synset.txt file
+ * @throws IllegalArgumentException Thrown when the file does not exist
+ * @param modelPathPrefix The path to the model directory
+ * @return The path to the synset.txt file
+ */
private[infer] def getSynsetFilePath(modelPathPrefix: String): String = {
val dirPath = modelPathPrefix.substring(0, 1 +
modelPathPrefix.lastIndexOf(File.separator))
val d = new File(dirPath)
@@ -179,6 +186,11 @@ class Classifier(modelPathPrefix: String,
s.getCanonicalPath
}
+ /**
+ * Parses the labels from a synset file
+ * @param synsetFilePath The path to the synset file. Can be gotten from
getSynsetFilePath
+ * @return A IndexedSeq of each element in the file
+ */
private[infer] def readSynsetFile(synsetFilePath: String):
IndexedSeq[String] = {
val f = io.Source.fromFile(synsetFilePath)
try {
@@ -188,6 +200,11 @@ class Classifier(modelPathPrefix: String,
}
}
+ /**
+ * Creates a predictor with the same modelPath, inputDescriptors, contexts,
+ * and epoch as the classifier
+ * @return The new Predictor
+ */
private[infer] def getPredictor(): PredictBase = {
new Predictor(modelPathPrefix, inputDescriptors, contexts, epoch)
}
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ImageClassifier.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ImageClassifier.scala
index 99c0432..fb5f39f 100644
---
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ImageClassifier.scala
+++
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ImageClassifier.scala
@@ -66,6 +66,10 @@ class ImageClassifier(modelPathPrefix: String,
protected[infer] val height = inputShape(inputLayout.indexOf('H'))
protected[infer] val width = inputShape(inputLayout.indexOf('W'))
+ /**
+ * Get the names and shapes that would be returns by a classify call
+ * @return a list of (name, shape) tuples
+ */
def outputShapes: IndexedSeq[(String, Shape)] = predictor.outputShapes
/**
@@ -127,6 +131,19 @@ class ImageClassifier(modelPathPrefix: String,
result
}
+ /**
+ * Creates a Classifier
+ *
+ * @param modelPathPrefix Path prefix from where to load the model
artifacts.
+ * These include the symbol, parameters, and
synset.txt.
+ * Example: file://model-dir/resnet-152
(containing
+ * resnet-152-symbol.json,
resnet-152-0000.params, and synset.txt).
+ * @param inputDescriptors Descriptors defining the input node names,
shape,
+ * layout and type parameters
+ * @param contexts Device contexts on which you want to run
inference; defaults to CPU
+ * @param epoch Model epoch to load; defaults to 0
+ * @return A Classifier to perform inference with
+ */
private[infer] def getClassifier(modelPathPrefix: String,
inputDescriptors: IndexedSeq[DataDesc],
contexts: Array[Context] = Context.cpu(),
@@ -156,19 +173,16 @@ object ImageClassifier {
/**
* Convert input BufferedImage to NDArray of input shape
- *
- * <p>
* Note: Caller is responsible to dispose the NDArray
* returned by this method after the use.
- * </p>
- * @param resizedImage BufferedImage to get pixels from
*
- * @param inputImageShape Input shape; for example for resnet it is
(3,224,224).
- Should be same as inputDescriptor shape.
- * @param dType The DataType of the NDArray created from the
image
- * that should be returned.
- * Currently it defaults to Dtype.Float32
- * @return NDArray pixels array with shape (3, 224, 224) in
CHW format
+ * @param resizedImage BufferedImage to get pixels from
+ * @param inputImageShape Input shape; for example for resnet it is
(3,224,224).
+ * Should be same as inputDescriptor shape.
+ * @param dType The DataType of the NDArray created from the image
+ * that should be returned.
+ * Currently it defaults to Dtype.Float32
+ * @return NDArray pixels array with shape (3, 224, 224) in CHW format
*/
def bufferedImageToPixels(resizedImage: BufferedImage, inputImageShape:
Shape,
dType : DType = DType.Float32): NDArray = {
@@ -235,4 +249,4 @@ object ImageClassifier {
def loadInputBatch(inputImagePaths: List[String]):
Traversable[BufferedImage] = {
inputImagePaths.map(path => ImageIO.read(new File(path)))
}
-}
\ No newline at end of file
+}
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/MXNetHandler.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/MXNetHandler.scala
index d2bed3a..593bab6 100644
---
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/MXNetHandler.scala
+++
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/MXNetHandler.scala
@@ -23,6 +23,12 @@ import org.slf4j.LoggerFactory
private[infer] trait MXNetHandler {
+ /**
+ * Executes a function within a thread-safe executor
+ * @param f The function to execute
+ * @tparam T The return type of the function
+ * @return Returns the result of the function f
+ */
def execute[T](f: => T): T
val executor: ExecutorService
@@ -31,7 +37,11 @@ private[infer] trait MXNetHandler {
private[infer] object MXNetHandlerType extends Enumeration {
+ /**
+ * The internal type of the MXNetHandlerType enumeration
+ */
type MXNetHandlerType = Value
+
val SingleThreadHandler = Value("MXNetSingleThreadHandler")
val OneThreadPerModelHandler = Value("MXNetOneThreadPerModelHandler")
}
@@ -93,6 +103,10 @@ private[infer] object MXNetSingleThreadHandler extends
MXNetThreadPoolHandler(1)
private[infer] object MXNetHandler {
+ /**
+ * Creates a handler based on the handlerType
+ * @return A ThreadPool or Thread Handler
+ */
def apply(): MXNetHandler = {
if (handlerType == MXNetHandlerType.OneThreadPerModelHandler) {
new MXNetThreadPoolHandler(1)
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ObjectDetector.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ObjectDetector.scala
index 28a578c..b78cfbc 100644
---
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ObjectDetector.scala
+++
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/ObjectDetector.scala
@@ -111,6 +111,13 @@ class ObjectDetector(modelPathPrefix: String,
batchResult.toIndexedSeq
}
+ /**
+ * Formats detection results by sorting in descending order of accuracy
(topK only)
+ * and combining with synset labels
+ * @param predictResultND The results from the objectDetect call
+ * @param topK The number of top results to return or None for all
+ * @return The top predicted results as (className, [Accuracy, Xmin, Ymin,
Xmax, Ymax])
+ */
private[infer] def sortAndReformat(predictResultND: NDArray, topK:
Option[Int])
: IndexedSeq[(String, Array[Float])] = {
// iterating over the all the predictions
@@ -170,6 +177,18 @@ class ObjectDetector(modelPathPrefix: String,
result
}
+ /**
+ * Creates an image classifier from the object detector model
+ * @param modelPathPrefix Path prefix from where to load the model
artifacts.
+ * These include the symbol, parameters, and
synset.txt.
+ * Example: file://model-dir/resnet-152
(containing
+ * resnet-152-symbol.json,
resnet-152-0000.params, and synset.txt).
+ * @param inputDescriptors Descriptors defining the input node names,
shape,
+ * layout and type parameters
+ * @param contexts Device contexts on which you want to run
inference; defaults to CPU
+ * @param epoch Model epoch to load; defaults to 0
+ * @return The corresponding image classifier
+ */
private[infer] def getImageClassifier(modelPathPrefix: String,
inputDescriptors: IndexedSeq[DataDesc],
contexts: Array[Context] = Context.cpu(),
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Predictor.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Predictor.scala
index 66284c8..cb27c93 100644
--- a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Predictor.scala
+++ b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/Predictor.scala
@@ -33,27 +33,27 @@ import org.slf4j.LoggerFactory
private[infer] trait PredictBase {
/**
- * Converts indexed sequences of 1-D array to NDArrays.
- * <p>
- * This method will take input as IndexedSeq one dimensional arrays and
creates the
- * NDArray needed for inference. The array will be reshaped based on the
input descriptors.
- * @param input: An Indexed Sequence of a one-dimensional array
of datatype
- * Float or Double
- An IndexedSequence is needed when the model has
more than one input.
- * @return Indexed sequence array of outputs
- */
+ * Converts indexed sequences of 1-D array to NDArrays.
+ * This method will take input as IndexedSeq one dimensional arrays and
creates the
+ * NDArray needed for inference. The array will be reshaped based on the
input descriptors.
+ * @tparam T The Scala equivalent of the DType used for the input array and
return value
+ * @param input An Indexed Sequence of a one-dimensional array of datatype
+ * Float or Double
+ * An IndexedSequence is needed when the model has more than
one input.
+ * @return Indexed sequence array of outputs
+ */
def predict[@specialized (Base.MX_PRIMITIVES) T](input: IndexedSeq[Array[T]])
: IndexedSeq[Array[T]]
/**
- * Predict using NDArray as input.
- * <p>
- * This method is useful when the input is a batch of data
- * or when multiple operations on the input have to performed.
- * Note: User is responsible for managing allocation/deallocation of
NDArrays.
- * @param input IndexedSequence NDArrays.
- * @return Output of predictions as NDArrays.
- */
+ * Predict using NDArray as input.
+ * <p>
+ * This method is useful when the input is a batch of data
+ * or when multiple operations on the input have to performed.
+ * Note: User is responsible for managing allocation/deallocation of
NDArrays.
+ * @param input IndexedSequence NDArrays.
+ * @return Output of predictions as NDArrays.
+ */
def predictWithNDArray(input: IndexedSeq[NDArray]): IndexedSeq[NDArray]
/**
@@ -248,6 +248,10 @@ class Predictor(modelPathPrefix: String,
resultND
}
+ /**
+ * Creates the module backing the Predictor with the same path, epoch,
contexts, and inputs
+ * @return The Module
+ */
private[infer] def loadModule(): Module = {
val mod = mxNetHandler.execute(Module.loadCheckpoint(modelPathPrefix,
epoch.get,
contexts = contexts, dataNames = inputDescriptors.map(desc =>
desc.name)))
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala
index 05334e4..8131273 100644
---
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala
+++
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala
@@ -31,19 +31,23 @@ import scala.language.implicitConversions
* The ObjectDetector class helps to run ObjectDetection tasks where the goal
* is to find bounding boxes and corresponding labels for objects in a image.
*
- * @param modelPathPrefix Path prefix from where to load the model
artifacts.
- * These include the symbol, parameters, and
synset.txt.
- * Example: file://model-dir/ssd_resnet50_512
(containing
- * ssd_resnet50_512-symbol.json,
ssd_resnet50_512-0000.params,
- * and synset.txt)
- * @param inputDescriptors Descriptors defining the input node names, shape,
- * layout and type parameters
- * @param contexts Device contexts on which you want to run
inference.
- * Defaults to CPU.
- * @param epoch Model epoch to load; defaults to 0
+ * @param objDetector A source Scala Object detector
*/
class ObjectDetector private[mxnet] (val objDetector:
org.apache.mxnet.infer.ObjectDetector){
+ /**
+ *
+ * @param modelPathPrefix Path prefix from where to load the model
artifacts.
+ * These include the symbol, parameters, and
synset.txt.
+ * Example: file://model-dir/ssd_resnet50_512
(containing
+ * ssd_resnet50_512-symbol.json,
ssd_resnet50_512-0000.params,
+ * and synset.txt)
+ * @param inputDescriptors Descriptors defining the input node names,
shape,
+ * layout and type parameters
+ * @param contexts Device contexts on which you want to run
inference.
+ * Defaults to CPU.
+ * @param epoch Model epoch to load; defaults to 0
+ */
def this(modelPathPrefix: String, inputDescriptors:
java.lang.Iterable[DataDesc], contexts:
java.lang.Iterable[Context], epoch: Int)
= this {
@@ -98,32 +102,78 @@ class ObjectDetector private[mxnet] (val objDetector:
org.apache.mxnet.infer.Obj
(ret map {a => (a map {e => new ObjectDetectorOutput(e._1,
e._2)}).asJava}).asJava
}
+ /**
+ * Helper to map an implicit conversion
+ * @param l The value to convert
+ * @tparam B The desired type
+ * @tparam A The input type
+ * @return The converted result
+ */
def convert[B, A <% B](l: IndexedSeq[A]): IndexedSeq[B] = l map { a => a: B }
}
object ObjectDetector {
- implicit def fromObjectDetector(OD: org.apache.mxnet.infer.ObjectDetector):
- ObjectDetector = new ObjectDetector(OD)
-
- implicit def toObjectDetector(jOD: ObjectDetector):
- org.apache.mxnet.infer.ObjectDetector = jOD.objDetector
+ /**
+ * Loads an input images from file
+ * @param inputImagePath Path of single input image
+ * @return BufferedImage Buffered image
+ */
def loadImageFromFile(inputImagePath: String): BufferedImage = {
org.apache.mxnet.infer.ImageClassifier.loadImageFromFile(inputImagePath)
}
+ /**
+ * Reshape the input image to a new shape
+ *
+ * @param img Input image
+ * @param newWidth New width for rescaling
+ * @param newHeight New height for rescaling
+ * @return Rescaled BufferedImage
+ */
def reshapeImage(img : BufferedImage, newWidth: Int, newHeight: Int):
BufferedImage = {
org.apache.mxnet.infer.ImageClassifier.reshapeImage(img, newWidth,
newHeight)
}
+ /**
+ * Convert input BufferedImage to NDArray of input shape
+ * Note: Caller is responsible to dispose the NDArray
+ * returned by this method after the use.
+ *
+ * @param resizedImage BufferedImage to get pixels from
+ * @param inputImageShape Input shape; for example for resnet it is
(3,224,224).
+ * Should be same as inputDescriptor shape.
+ * @return NDArray pixels array with shape (3, 224, 224) in CHW format
+ */
def bufferedImageToPixels(resizedImage: BufferedImage, inputImageShape:
Shape): NDArray = {
org.apache.mxnet.infer.ImageClassifier.bufferedImageToPixels(resizedImage,
inputImageShape)
}
+ /**
+ * Loads a batch of images from a folder
+ * @param inputImagePaths Path to a folder of images
+ * @return List of buffered images
+ */
def loadInputBatch(inputImagePaths: java.lang.Iterable[String]):
java.util.List[BufferedImage] = {
org.apache.mxnet.infer.ImageClassifier
.loadInputBatch(inputImagePaths.asScala.toList).toList.asJava
}
+
+ /**
+ * Implicitly convert a Scala ObjectDetector to a Java ObjectDetector
+ * @param OD The Scala ObjectDetector
+ * @return The Java ObjectDetector
+ */
+ implicit def fromObjectDetector(OD: org.apache.mxnet.infer.ObjectDetector):
+ ObjectDetector = new ObjectDetector(OD)
+
+ /**
+ * Implicitly converts a Java ObjectDetector to a Scala ObjectDetector
+ * @param jOD The Java ObjectDetector
+ * @return The Scala ObjectDetector
+ */
+ implicit def toObjectDetector(jOD: ObjectDetector):
+ org.apache.mxnet.infer.ObjectDetector = jOD.objDetector
}
diff --git
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/Predictor.scala
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/Predictor.scala
index 6c0871f..e1505a4 100644
---
a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/Predictor.scala
+++
b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/Predictor.scala
@@ -25,21 +25,25 @@ import scala.collection.JavaConverters._
/**
* Implementation of prediction routines.
*
- * @param modelPathPrefix Path prefix from where to load the model
artifacts.
- * These include the symbol, parameters, and
synset.txt
- * Example: file://model-dir/resnet-152 (containing
- * resnet-152-symbol.json, resnet-152-0000.params,
and synset.txt).
- * @param inputDescriptors Descriptors defining the input node names,
shape,
- * layout and type parameters
- * <p>Note: If the input Descriptors is missing
batchSize
- * ('N' in layout), a batchSize of 1 is assumed
for the model.
- * @param contexts Device contexts on which you want to run
inference; defaults to CPU
- * @param epoch Model epoch to load; defaults to 0
-
+ * @param predictor The underlying Scala predictor
*/
// JavaDoc description of class to be updated in
https://issues.apache.org/jira/browse/MXNET-1178
class Predictor private[mxnet] (val predictor:
org.apache.mxnet.infer.Predictor){
+
+ /**
+ *
+ * @param modelPathPrefix Path prefix from where to load the model
artifacts.
+ * These include the symbol, parameters, and
synset.txt
+ * Example: file://model-dir/resnet-152
(containing
+ * resnet-152-symbol.json,
resnet-152-0000.params, and synset.txt).
+ * @param inputDescriptors Descriptors defining the input node names,
shape,
+ * layout and type parameters
+ * <p>Note: If the input Descriptors is missing
batchSize
+ * ('N' in layout), a batchSize of 1 is assumed
for the model.
+ * @param contexts Device contexts on which you want to run
inference; defaults to CPU
+ * @param epoch Model epoch to load; defaults to 0
+ */
def this(modelPathPrefix: String, inputDescriptors:
java.lang.Iterable[DataDesc],
contexts: java.lang.Iterable[Context], epoch: Int)
= this {
@@ -53,19 +57,17 @@ class Predictor private[mxnet] (val predictor:
org.apache.mxnet.infer.Predictor)
* Takes input as Array of one dimensional arrays and creates the NDArray
needed for inference
* The array will be reshaped based on the input descriptors. Example of
calling in Java:
*
- * <pre>
- * {@code
+ * {{{
* float tmp[][] = new float[1][224];
* for (int x = 0; x < 1; x++)
* for (int y = 0; y < 224; y++)
* tmp[x][y] = (int)(Math.random()*10);
* predictor.predict(tmp);
- * }
- * </pre>
+ * }}}
*
- * @param input: An Array of a one-dimensional array.
- An extra Array is needed for when the model has
more than one input.
- * @return Indexed sequence array of outputs
+ * @param input An Array of a one-dimensional array.
+ * An extra Array is needed for when the model has more than
one input.
+ * @return Indexed sequence array of outputs
*/
def predict(input: Array[Array[Float]]):
Array[Array[Float]] = {
@@ -76,18 +78,16 @@ class Predictor private[mxnet] (val predictor:
org.apache.mxnet.infer.Predictor)
* Takes input as Array of one dimensional arrays and creates the NDArray
needed for inference
* The array will be reshaped based on the input descriptors. Example of
calling in Java:
*
- * <pre>
- * {@code
+ * {{{
* double tmp[][] = new double[1][224];
* for (int x = 0; x < 1; x++)
* for (int y = 0; y < 224; y++)
* tmp[x][y] = (int)(Math.random()*10);
* predictor.predict(tmp);
- * }
- * </pre>
+ * }}}
*
- * @param input: An Array of a one-dimensional array.
- An extra Array is needed for when the model has
more than one input.
+ * @param input An Array of a one-dimensional array.
+ * An extra Array is needed for when the model has
more than one input.
* @return Indexed sequence array of outputs
*/
@@ -100,8 +100,8 @@ class Predictor private[mxnet] (val predictor:
org.apache.mxnet.infer.Predictor)
* Takes input as List of one dimensional iterables and creates the NDArray
needed for inference
* The array will be reshaped based on the input descriptors.
*
- * @param input: A List of a one-dimensional iterables of DType
Float.
- An extra List is needed for when the model has
more than one input.
+ * @param input A List of a one-dimensional iterables of DType
Float.
+ * An extra List is needed for when the model has
more than one input.
* @return Indexed sequence array of outputs
*/
def predict(input: java.util.List[java.util.List[java.lang.Float]]):