/// <summary>
        ///
        /// </summary>
        /// <param name="image"></param>
        /// <returns>Null on error</returns>
        public List <ImageFeature> Process(ByteString image)
        {
            bool succeeded = false;

            try
            {
                List <ImageFeature> result = new List <ImageFeature>();
                EnsureConnection();
                ImageBody body = new ImageBody
                {
                    Image = image
                };
                ImageReply reply = grpcClient.SubmitImage(body);
                for (int i = 0; i < reply.Classes.Count; i++)
                {
                    ImageFeature feature = new ImageFeature(reply.Classes[i], reply.Scores[i],
                                                            reply.Boxes[i].YMin, reply.Boxes[i].XMin, reply.Boxes[i].YMax, reply.Boxes[i].XMax);
                    result.Add(feature);
                }
                succeeded = true;
                return(result);
            }
            catch (Grpc.Core.RpcException ex)
            {
                if (ex.StatusCode == StatusCode.Unavailable)
                {
                    Console.WriteLine($"Error sending grpc message: Grpc server for FPGA is unavailable");
                    return(null);
                }
                else
                {
                    Console.WriteLine($"Error sending grpc for FPGA message");
                    Console.WriteLine(ex);
                    return(null);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error sending grpc for FPGA message");
                Console.WriteLine(ex);
                return(null);
            }
            finally
            {
                if (!succeeded)
                {
                    Disconnect();
                }
            }
        }
        public List <ImageFeature> Process(Google.Protobuf.ByteString image)
        {
            string imageJson = MakeImageJson(image);

            if (imageJson != null)
            {
                CpuModelResponse response = InvokeCpuModel(imageJson);
                if (response != null)
                {
                    List <ImageFeature> result = new List <ImageFeature>();
                    for (int i = 0; i < response.classes.Length; i++)
                    {
                        ImageFeature feature = new ImageFeature(response.classes[i],
                                                                response.scores[i], response.bboxes[i]);
                        result.Add(feature);
                    }
                    return(result);
                }
            }
            return(null);
        }