nswamy closed pull request #11451: [MXNET-531] add initial demo files
URL: https://github.com/apache/incubator-mxnet/pull/11451
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/scala-package/macros/pom.xml b/scala-package/macros/pom.xml
index d80f7259875..9436af6f5c3 100644
--- a/scala-package/macros/pom.xml
+++ b/scala-package/macros/pom.xml
@@ -51,6 +51,11 @@
<scope>provided</scope>
<type>${libtype}</type>
</dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.1</version>
+ </dependency>
</dependencies>
diff --git a/scala-package/mxnet-demo/Makefile
b/scala-package/mxnet-demo/Makefile
new file mode 100644
index 00000000000..227697ba2e8
--- /dev/null
+++ b/scala-package/mxnet-demo/Makefile
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+SCALA_VERSION_PROFILE := 2.11
+SCALA_VERSION := 2.11.8
+MXNET_VERSION := 1.2.0
+
+ifeq ($(OS),Windows_NT)
+ UNAME_S := Windows
+else
+ UNAME_S := $(shell uname -s)
+endif
+
+ifeq ($(UNAME_S), Windows)
+ # TODO: currently scala package does not support windows
+ SCALA_PKG_PROFILE := windows
+else
+ ifeq ($(UNAME_S), Darwin)
+ SCALA_PKG_PROFILE := osx-x86_64-cpu
+ else
+ SCALA_PKG_PROFILE := linux-x86_64
+ ifeq ($(USE_CUDA), 1)
+ SCALA_PKG_PROFILE := $(SCALA_PKG_PROFILE)-gpu
+ else
+ SCALA_PKG_PROFILE := $(SCALA_PKG_PROFILE)-cpu
+ endif
+ endif
+endif
+
+scalademo:
+ (mvn package -Dmxnet.profile=$(SCALA_PKG_PROFILE) \
+ -Dmxnet.scalaprofile=$(SCALA_VERSION_PROFILE) \
+ -Dmxnet.version=$(MXNET_VERSION) \
+ -Dscala.version=$(SCALA_VERSION))
+
+scalaclean:
+ (mvn clean -Dmxnet.profile=$(SCALA_PKG_PROFILE) \
+ -Dmxnet.scalaprofile=$(SCALA_VERSION_PROFILE) \
+ -Dmxnet.version=$(MXNET_VERSION) \
+ -Dscala.version=$(SCALA_VERSION))
\ No newline at end of file
diff --git a/scala-package/mxnet-demo/README.md
b/scala-package/mxnet-demo/README.md
new file mode 100644
index 00000000000..e30a61a2fc1
--- /dev/null
+++ b/scala-package/mxnet-demo/README.md
@@ -0,0 +1,67 @@
+# MXNet Scala Sample Project
+This is an project created to use Maven-published Scala package with two Scala
examples.
+## Setup
+User are required to use `mvn package` to build the package,
+ which are shown below:
+```Bash
+export SCALA_VERSION_PROFILE=2.11 SCALA_VERSION=2.11.8 MXNET_VERSION=1.2.0
+export SCALA_PKG_PROFILE=
+mvn package -Dmxnet.profile=$(SCALA_PKG_PROFILE) \
+ -Dmxnet.scalaprofile=$(SCALA_VERSION_PROFILE) \
+ -Dmxnet.version=$(MXNET_VERSION) \
+ -Dscala.version=$(SCALA_VERSION)
+```
+These environment variable (`SCALA_PKG_PROFILE`, `SCALA_VERSION_PROFILE`,
`MXNET_VERSION`, `SCALA_VERSION`)
+should be set before executing the line above.
+
+You can also use the `Makefile` as an alternative to do the same thing. Simply
do the following:
+```Bash
+make scalademo
+```
+This will load the default parameter for all the environment variable.
+ If you want to run with GPU on Linux, just simply add `USE_CUDA=1` when you
run the make file
+
+## Run
+### Hello World
+The Scala file is being executed using Java. You can execute the helloWorld
example as follows:
+```Bash
+java -Xmx8G -cp $CLASSPATH sample.HelloWorld
+```
+However, you have to define the Classpath before you run the demo code. More
information can be found in the `demo.sh` And you can run the bash script as
follows:
+```Bash
+bash bin/demo.sh
+```
+It will load the library automatically and run the example
+### Image Classification using Inference API
+We also provide an example to do image classification, which downloads a
ImageNet trained resnet18 model and runs inference on a cute puppy to return
the classification result as
+```Bash
+Classes with top 5 probability = Vector((n02110958 pug, pug-dog,0.49161583),
(n02108422 bull mastiff,0.40025946), (n02108089 boxer,0.04657662), (n04409515
tennis ball,0.028773671), (n02109047 Great Dane,0.009004086))
+```
+You can review the complete example
[here](https://github.com/apache/incubator-mxnet/tree/master/scala-package/examples/src/main/scala/org/apache/mxnetexamples/infer/imageclassifier)
+
+you can run using the command shown below:
+```Bash
+java -Xmx8G -cp $CLASSPATH sample.ImageClassificationExample
+```
+or script as follows:
+```Bash
+bash bin/run_im.sh
+```
+
+If you want to test run on GPU, you can set a environment variable as follows:
+```Bash
+export SCALA_TEST_ON_GPU=1
+```
+## Clean up
+Clean up for Maven package is simple, you can run the pre-configed `Makefile`
as:
+```Bash
+make scalaclean
+```
+
+## Q & A
+If you are facing opencv issue on Ubuntu, please try as follows to install
opencv 3.4 (required by 1.2.0 package)
+```Bash
+sudo add-apt-repository ppa:timsc/opencv-3.4
+sudo apt-get update
+sudo apt install libopencv-imgcodecs3.4
+```
\ No newline at end of file
diff --git a/scala-package/mxnet-demo/bin/demo.sh
b/scala-package/mxnet-demo/bin/demo.sh
new file mode 100644
index 00000000000..d5e567b432c
--- /dev/null
+++ b/scala-package/mxnet-demo/bin/demo.sh
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#!/bin/bash
+CURR_DIR=$(cd $(dirname $0)/../; pwd)
+CLASSPATH=$CLASSPATH:$CURR_DIR/target/*:$CLASSPATH:$CURR_DIR/target/classes/lib/*
+java -Xmx8G -cp $CLASSPATH sample.HelloWorld
diff --git a/scala-package/mxnet-demo/bin/run_im.sh
b/scala-package/mxnet-demo/bin/run_im.sh
new file mode 100644
index 00000000000..68beb894176
--- /dev/null
+++ b/scala-package/mxnet-demo/bin/run_im.sh
@@ -0,0 +1,21 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#!/bin/bash
+CURR_DIR=$(cd $(dirname $0)/../; pwd)
+
+CLASSPATH=$CLASSPATH:$CURR_DIR/target/*:$CLASSPATH:$CURR_DIR/target/classes/lib/*
+java -Xmx8G -cp $CLASSPATH sample.ImageClassificationExample
\ No newline at end of file
diff --git a/scala-package/mxnet-demo/pom.xml b/scala-package/mxnet-demo/pom.xml
new file mode 100644
index 00000000000..8fc30e78cac
--- /dev/null
+++ b/scala-package/mxnet-demo/pom.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>Demo</groupId>
+ <artifactId>mxnet-scala-demo_2.11</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <name>MXNet Scala Demo</name>
+ <packaging>pom</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.mxnet</groupId>
+
<artifactId>mxnet-full_${mxnet.scalaprofile}-${mxnet.profile}</artifactId>
+ <version>${mxnet.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.scala-lang</groupId>
+ <artifactId>scala-library</artifactId>
+ <version>${scala.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.4</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.3</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <encoding>UTF-8</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.7</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.9</version>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <configuration>
+
<outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ <includeScope>runtime</includeScope>
+ <excludeScope>test,provided</excludeScope>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>false</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.5</version>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ <configuration>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>net.alchim31.maven</groupId>
+ <artifactId>scala-maven-plugin</artifactId>
+ <version>3.2.2</version>
+ <executions>
+ <execution>
+ <id>compile</id>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <phase>compile</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/scala-package/mxnet-demo/src/main/scala/sample/HelloWorld.scala
b/scala-package/mxnet-demo/src/main/scala/sample/HelloWorld.scala
new file mode 100644
index 00000000000..c625b6d0e81
--- /dev/null
+++ b/scala-package/mxnet-demo/src/main/scala/sample/HelloWorld.scala
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package sample
+import org.apache.mxnet._
+
+object HelloWorld {
+ def main(args: Array[String]): Unit = {
+ println("hello World")
+ val arr = NDArray.ones(2, 3)
+ println(arr.shape)
+ }
+}
\ No newline at end of file
diff --git
a/scala-package/mxnet-demo/src/main/scala/sample/ImageClassificationExample.scala
b/scala-package/mxnet-demo/src/main/scala/sample/ImageClassificationExample.scala
new file mode 100644
index 00000000000..b5af654e691
--- /dev/null
+++
b/scala-package/mxnet-demo/src/main/scala/sample/ImageClassificationExample.scala
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sample
+
+import org.apache.mxnet.{Context, DType, DataDesc, Shape}
+import org.kohsuke.args4j.{CmdLineParser, Option}
+import org.slf4j.LoggerFactory
+import org.apache.mxnet.infer.{ImageClassifier, _}
+
+import scala.collection.JavaConverters._
+import java.io.File
+import java.net.URL
+import org.apache.commons.io._
+
+import scala.collection.mutable.ListBuffer
+
+/**
+ * Example showing usage of Infer package to do inference on resnet-18 model
+ * Follow instructions in README.md to run this example.
+ */
+object ImageClassificationExample {
+
+ def downloadUrl(url: String, filePath: String) : Unit = {
+ var tmpFile = new File(filePath)
+ if (!tmpFile.exists()) {
+ FileUtils.copyURLToFile(new URL(url), tmpFile)
+ }
+ }
+
+ def downloadModelImage() : (String, String) = {
+ val tempDirPath = System.getProperty("java.io.tmpdir")
+ printf("tempDirPath: %s".format(tempDirPath))
+ val imgPath = tempDirPath + "/inputImages/resnet18/Pug-Cookie.jpg"
+ val imgURL = "https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg"
+ downloadUrl(imgURL, imgPath)
+
+ val baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models"
+ var tmpPath = tempDirPath + "/resnet18/resnet-18-symbol.json"
+ var tmpUrl = baseUrl + "/resnet-18/resnet-18-symbol.json"
+ downloadUrl(tmpUrl, tmpPath)
+
+ tmpPath = tempDirPath + "/resnet18/resnet-18-0000.params"
+ tmpUrl = baseUrl + "/resnet-18/resnet-18-0000.params"
+ downloadUrl(tmpUrl, tmpPath)
+
+ tmpPath = tempDirPath + "/resnet18/synset.txt"
+ tmpUrl = baseUrl + "/resnet-18/synset.txt"
+ downloadUrl(tmpUrl, tmpPath)
+
+ (imgPath, tempDirPath + "/resnet18/resnet-18")
+ }
+
+ def main(args: Array[String]): Unit = {
+
+ var context = Context.cpu()
+ if (System.getenv().containsKey("SCALA_TEST_ON_GPU") &&
+ System.getenv("SCALA_TEST_ON_GPU").toInt == 1) {
+ context = Context.gpu()
+ }
+ val (inputImagePath, modelPathPrefix) = downloadModelImage()
+
+ val dType = DType.Float32
+ val inputShape = Shape(1, 3, 224, 224)
+ val inputDescriptor = IndexedSeq(DataDesc("data", inputShape, dType,
"NCHW"))
+
+ // Create object of ImageClassifier class
+ val imgClassifier: ImageClassifier = new
+ ImageClassifier(modelPathPrefix, inputDescriptor, context)
+
+ // Loading single image from file and getting BufferedImage
+ val img = ImageClassifier.loadImageFromFile(inputImagePath)
+
+ // Running inference on single image
+ val output = imgClassifier.classifyImage(img, Some(5))
+
+ // Printing top 5 class probabilities
+ for (i <- output) {
+ printf("Classes with top 5 probability = %s \n", i)
+ }
+
+ }
+}
\ No newline at end of file
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services