The AI Service provides two primary sub-services, AI Picking and AI Vision, which utilize deep learning models to perform complex recognition tasks. Often working in conjunction with the Machine Vision Service.
Connecting to the gRPC service can be performed by using the hostname or IP address followed by the port number.
| Hostname | Port | Module |
|---|---|---|
| AIService | 50210 | AI Picking server |
| AIService | 50220 | AI Vision server |
| AIService | 50221 | Relearning server |
The following example demonstrates how to connect to the gRPC channel, load an AI model and execute an inference.
#include <grpc/grpc.h>
#include <grpcpp/channel.h>
#include <grpcpp/client_context.h>
#include <grpcpp/create_channel.h>
#include "ai_vision/v1/AIVisionService.grpc.pb.h"
#include <unistd.h>
#include <iostream>
using namespace ai_vision::v1;
int main(void) {
auto channel = grpc::CreateChannel("AIService:50220", grpc::InsecureChannelCredentials());
auto stub = AIVisionService::NewStub(channel);
// Create model instance
grpc::ClientContext context;
CreateInstanceRequest req;
CreateInstanceResponse res;
req.set_model_dir("my_model");
grpc::Status status = stub->CreateInstance(&context, req, &res);
// Handle error status
if (!status.ok()) {
std::cerr << "Error calling CreateInstance: " << status.error_message() << std::endl;
return 1;
}
// Get model instance ID
uint32_t id = res.instance_id();
// Perform inference
grpc::ClientContext context2;
InferRequest inf_req;
InferResponse inf_res;
inf_req.set_instance_id(id);
inf_req.mutable_image_binary_data()->set_data(image_data); // <-- fill out image data
inf_req.mutable_image_binary_data()->set_width(image_width); // <-- fill out image width
inf_req.mutable_image_binary_data()->set_height(image_height); // <-- fill out image height
status = stub->Infer(&context2, inf_req, &inf_res);
// Handle error status
if (!status.ok() || inf_res.status() != 0) {
std::cerr << "Error calling Infer: " << status.error_message() << std::endl;
return 1;
}
// Check detection results
if (inf_res.has_detection_res()) {
std::cout << "Detected " << inf_res.detection_res().bbs_prediction_size() << " objects."; << std::endl;
}
else {
std::cout << "No detections found." << std::endl;
}
// Cleanup model
grpc::ClientContext context3;
InstanceRequest del_req;
StatusResponse del_res;
del_req.set_instance_id(id);
status = stub->DeleteInstance(&context3, del_req, &del_res);
// Handle error status
if (!status.ok()) {
std::cerr << "Error calling DeleteInstance: " << status.error_message() << std::endl;
return 1;
}
return 0;
}