1+ #include " ImageEmbeddings.h"
2+
3+ #include < cstdint>
4+ #include < executorch/extension/tensor/tensor.h>
5+ #include < iostream>
6+ #include < rnexecutorch/Log.h>
7+ #include < rnexecutorch/data_processing/ImageProcessing.h>
8+
9+ namespace rnexecutorch {
10+
11+ ImageEmbeddings::ImageEmbeddings (
12+ const std::string &modelSource,
13+ std::shared_ptr<react::CallInvoker> callInvoker)
14+ : BaseModel(modelSource, callInvoker) {
15+ auto inputTensors = getAllInputShapes ();
16+ if (inputTensors.size () == 0 ) {
17+ throw std::runtime_error (" Model seems to not take any input tensors." );
18+ }
19+ std::vector<int32_t > modelInputShape = inputTensors[0 ];
20+ if (modelInputShape.size () < 2 ) {
21+ char errorMessage[100 ];
22+ std::snprintf (errorMessage, sizeof (errorMessage),
23+ " Unexpected model input size, expected at least 2 dimentions "
24+ " but got: %zu." ,
25+ modelInputShape.size ());
26+ throw std::runtime_error (errorMessage);
27+ }
28+ modelImageSize = cv::Size (modelInputShape[modelInputShape.size () - 1 ],
29+ modelInputShape[modelInputShape.size () - 2 ]);
30+ }
31+
32+ std::shared_ptr<JSTensorViewOut>
33+ ImageEmbeddings::generate (std::string imageSource) {
34+ auto [inputTensor, originalSize] =
35+ imageprocessing::readImageToTensor (imageSource, getAllInputShapes ()[0 ]);
36+
37+ auto result = BaseModel::forward (inputTensor);
38+ if (!result.ok ()) {
39+ throw std::runtime_error (" Forward pass failed: Error " +
40+ std::to_string (static_cast <int >(result.error ())));
41+ }
42+
43+ auto &outputs = result.get ();
44+
45+ if (outputs.size () > 1 ) {
46+ throw std::runtime_error (" It returned multiple outputs!" );
47+ }
48+
49+ auto &outputTensor = outputs.at (0 ).toTensor ();
50+ auto sizesRaw = outputTensor.sizes ();
51+ std::vector<int32_t > sizes =
52+ std::vector<int32_t >(sizesRaw.begin (), sizesRaw.end ());
53+ size_t bufferSize = outputTensor.numel () * outputTensor.element_size ();
54+ auto buffer = std::make_shared<OwningArrayBuffer>(bufferSize);
55+ std::memcpy (buffer->data (), outputTensor.const_data_ptr (), bufferSize);
56+ auto jsTensor = std::make_shared<JSTensorViewOut>(
57+ sizes, outputTensor.scalar_type (), buffer);
58+
59+ return jsTensor;
60+ }
61+ } // namespace rnexecutorch
0 commit comments