diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index 35629fc9b..162a9a634 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -62,6 +62,7 @@
* xref:cron-source.adoc[]
* xref:data-type-action.adoc[]
* xref:delay-action.adoc[]
+* xref:djl-image-to-text-action.adoc[]
* xref:dns-dig-action.adoc[]
* xref:dns-ip-action.adoc[]
* xref:dns-lookup-action.adoc[]
diff --git a/kamelets/djl-image-to-text-action.kamelet.yaml b/kamelets/djl-image-to-text-action.kamelet.yaml
new file mode 100644
index 000000000..7031d9f71
--- /dev/null
+++ b/kamelets/djl-image-to-text-action.kamelet.yaml
@@ -0,0 +1,75 @@
+# ---------------------------------------------------------------------------
+# 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.
+# ---------------------------------------------------------------------------
+apiVersion: camel.apache.org/v1
+kind: Kamelet
+metadata:
+ name: djl-image-to-text-action
+ annotations:
+ camel.apache.org/kamelet.support.level: "Preview"
+ camel.apache.org/catalog.version: "4.8.0-SNAPSHOT"
+ camel.apache.org/kamelet.icon: "data:image/png;base64,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"
+ camel.apache.org/provider: "Apache Software Foundation"
+ camel.apache.org/kamelet.group: "Actions"
+ camel.apache.org/kamelet.namespace: "AI"
+ labels:
+ camel.apache.org/kamelet.type: "action"
+spec:
+ definition:
+ title: "Image-to-Text Action"
+ description: Detect and classify objects in an image into texts using the SSD and ResNet models and the ImageNet dataset.
+ type: object
+ types:
+ out:
+ mediaType: application/json
+ dependencies:
+ - "mvn:ai.djl.pytorch:pytorch-engine:0.29.0"
+ - "mvn:ai.djl.pytorch:pytorch-model-zoo:0.29.0"
+ - "mvn:net.sf.extjwnl:extjwnl:2.0.5"
+ - "mvn:net.sf.extjwnl:extjwnl-data-wn31:1.2"
+ - "mvn:org.apache.camel.kamelets:camel-kamelets-utils:4.8.0-SNAPSHOT"
+ - "camel:core"
+ - "camel:kamelet"
+ - "camel:jackson"
+ - "camel:djl"
+ template:
+ beans:
+ - name: imageNetUtil
+ type: "#class:org.apache.camel.kamelets.utils.djl.ImageNetUtil"
+ from:
+ uri: "kamelet:source"
+ steps:
+ - to: "djl:cv/object_detection?artifactId=ssd"
+ - convertBodyTo: "ai.djl.modality.cv.Image[]"
+ - split:
+ expression:
+ simple: "${body}"
+ aggregationStrategy: "#class:org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy"
+ steps:
+ - to: "djl:cv/image_classification?artifactId=resnet"
+ # The output from the image classification model is classified
+ # as one of 1000 labels from WordNet.
+ # Since it's too fine-grained, we want to find the higher-level
+ # group (= hypernym) for the classification using the WordNet
+ # dictionary.
+ - bean:
+ ref: "{{imageNetUtil}}"
+ method: extractClassName
+ - bean:
+ ref: "{{imageNetUtil}}"
+ method: addHypernym
+ - marshal:
+ json: {}
diff --git a/library/camel-kamelets-catalog/src/test/java/org/apache/camel/kamelets/catalog/KameletsCatalogTest.java b/library/camel-kamelets-catalog/src/test/java/org/apache/camel/kamelets/catalog/KameletsCatalogTest.java
index 5056592c7..8307e227f 100644
--- a/library/camel-kamelets-catalog/src/test/java/org/apache/camel/kamelets/catalog/KameletsCatalogTest.java
+++ b/library/camel-kamelets-catalog/src/test/java/org/apache/camel/kamelets/catalog/KameletsCatalogTest.java
@@ -155,7 +155,7 @@ void testAllKameletDependencies() throws Exception {
@Test
void testSupportedHeaders() throws Exception {
verifyHeaders("aws-s3-source", 20);
- verifyHeaders("aws-s3-sink", 27);
+ verifyHeaders("aws-s3-sink", 29);
verifyHeaders("aws-cloudtrail-source", 4);
verifyHeaders("aws-redshift-source", 0);
verifyHeaders("aws-not-exists", 0);
diff --git a/library/camel-kamelets-utils/pom.xml b/library/camel-kamelets-utils/pom.xml
index 704d05a9b..e217210ae 100644
--- a/library/camel-kamelets-utils/pom.xml
+++ b/library/camel-kamelets-utils/pom.xml
@@ -92,6 +92,24 @@
provided
+
+
+ org.apache.camel
+ camel-djl
+ provided
+
+
+ net.sf.extjwnl
+ extjwnl
+ 2.0.5
+ provided
+
+
+ net.sf.extjwnl
+ extjwnl-data-wn31
+ 1.2
+ provided
+
diff --git a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/djl/ImageNetUtil.java b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/djl/ImageNetUtil.java
new file mode 100644
index 000000000..26dad8808
--- /dev/null
+++ b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/djl/ImageNetUtil.java
@@ -0,0 +1,58 @@
+/*
+ * 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 org.apache.camel.kamelets.utils.djl;
+
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.RuntimeCamelException;
+
+import ai.djl.modality.Classifications;
+import net.sf.extjwnl.data.IndexWord;
+import net.sf.extjwnl.data.POS;
+import net.sf.extjwnl.data.PointerUtils;
+import net.sf.extjwnl.data.list.PointerTargetNodeList;
+import net.sf.extjwnl.dictionary.Dictionary;
+
+/**
+ * A utility bean class for handling ImageNet (https://image-net.org/) classifications.
+ */
+public class ImageNetUtil {
+
+ public ImageNetUtil() {
+ }
+
+ public void extractClassName(Exchange exchange) {
+ Classifications body = exchange.getMessage().getBody(Classifications.class);
+ String className = body.best().getClassName().split(",")[0].split(" ", 2)[1];
+ exchange.getMessage().setBody(className);
+ }
+
+ public void addHypernym(Exchange exchange) throws Exception {
+ String className = exchange.getMessage().getBody(String.class);
+ Dictionary dic = Dictionary.getDefaultResourceInstance();
+ IndexWord word = dic.getIndexWord(POS.NOUN, className);
+ if (word == null) {
+ throw new RuntimeCamelException("Word not found: " + className);
+ }
+ PointerTargetNodeList hypernyms = PointerUtils.getDirectHypernyms(word.getSenses().get(0));
+ String hypernym = hypernyms.stream()
+ .map(h -> h.getSynset().getWords().get(0).getLemma())
+ .findFirst().orElse(className);
+ exchange.getMessage().setBody(List.of(className, hypernym));
+ }
+}
diff --git a/library/camel-kamelets/src/main/resources/kamelets/djl-image-to-text-action.kamelet.yaml b/library/camel-kamelets/src/main/resources/kamelets/djl-image-to-text-action.kamelet.yaml
new file mode 100644
index 000000000..7031d9f71
--- /dev/null
+++ b/library/camel-kamelets/src/main/resources/kamelets/djl-image-to-text-action.kamelet.yaml
@@ -0,0 +1,75 @@
+# ---------------------------------------------------------------------------
+# 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.
+# ---------------------------------------------------------------------------
+apiVersion: camel.apache.org/v1
+kind: Kamelet
+metadata:
+ name: djl-image-to-text-action
+ annotations:
+ camel.apache.org/kamelet.support.level: "Preview"
+ camel.apache.org/catalog.version: "4.8.0-SNAPSHOT"
+ camel.apache.org/kamelet.icon: "data:image/png;base64,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"
+ camel.apache.org/provider: "Apache Software Foundation"
+ camel.apache.org/kamelet.group: "Actions"
+ camel.apache.org/kamelet.namespace: "AI"
+ labels:
+ camel.apache.org/kamelet.type: "action"
+spec:
+ definition:
+ title: "Image-to-Text Action"
+ description: Detect and classify objects in an image into texts using the SSD and ResNet models and the ImageNet dataset.
+ type: object
+ types:
+ out:
+ mediaType: application/json
+ dependencies:
+ - "mvn:ai.djl.pytorch:pytorch-engine:0.29.0"
+ - "mvn:ai.djl.pytorch:pytorch-model-zoo:0.29.0"
+ - "mvn:net.sf.extjwnl:extjwnl:2.0.5"
+ - "mvn:net.sf.extjwnl:extjwnl-data-wn31:1.2"
+ - "mvn:org.apache.camel.kamelets:camel-kamelets-utils:4.8.0-SNAPSHOT"
+ - "camel:core"
+ - "camel:kamelet"
+ - "camel:jackson"
+ - "camel:djl"
+ template:
+ beans:
+ - name: imageNetUtil
+ type: "#class:org.apache.camel.kamelets.utils.djl.ImageNetUtil"
+ from:
+ uri: "kamelet:source"
+ steps:
+ - to: "djl:cv/object_detection?artifactId=ssd"
+ - convertBodyTo: "ai.djl.modality.cv.Image[]"
+ - split:
+ expression:
+ simple: "${body}"
+ aggregationStrategy: "#class:org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy"
+ steps:
+ - to: "djl:cv/image_classification?artifactId=resnet"
+ # The output from the image classification model is classified
+ # as one of 1000 labels from WordNet.
+ # Since it's too fine-grained, we want to find the higher-level
+ # group (= hypernym) for the classification using the WordNet
+ # dictionary.
+ - bean:
+ ref: "{{imageNetUtil}}"
+ method: extractClassName
+ - bean:
+ ref: "{{imageNetUtil}}"
+ method: addHypernym
+ - marshal:
+ json: {}
diff --git a/pom.xml b/pom.xml
index 218db32e7..925171b55 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
org.apache.camel
camel-dependencies
- 4.7.0
+ 4.8.0-SNAPSHOT
org.apache.camel.kamelets
@@ -62,7 +62,7 @@
0.16.1
2.8.1
- 4.7.0
+ 4.8.0-SNAPSHOT
2.4.0
4.2.0