104 lines
2.9 KiB
C#
104 lines
2.9 KiB
C#
using static Community.CsharpSqlite.Sqlite3;
|
|
|
|
namespace Hawkeye.VisionBuilder.Workflow.DataTransfer;
|
|
|
|
public class CSharpDataTransferHTTP
|
|
{
|
|
private readonly PythonModelAPI _api;
|
|
private readonly HttpClient _client;
|
|
private readonly CancellationTokenSource _pingCts = new();
|
|
private readonly Thread _pingThread;
|
|
private readonly object _lock = new();
|
|
|
|
public CSharpDataTransferHTTP()
|
|
{
|
|
var handler = new SocketsHttpHandler
|
|
{
|
|
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(10),
|
|
MaxConnectionsPerServer = 100
|
|
};
|
|
_client = new HttpClient(handler)
|
|
{
|
|
DefaultRequestHeaders =
|
|
{
|
|
ExpectContinue = false
|
|
}
|
|
};
|
|
_api = new PythonModelAPI("http://localhost:8000", _client);
|
|
_pingThread = new Thread(PingLoop) { IsBackground = true };
|
|
_pingThread.Start();
|
|
}
|
|
|
|
private void PingLoop()
|
|
{
|
|
while (!_pingCts.Token.IsCancellationRequested)
|
|
{
|
|
try
|
|
{
|
|
_client.GetAsync("http://localhost:8000/").Wait();
|
|
}
|
|
catch
|
|
{
|
|
// Ignore errors, optionally log
|
|
}
|
|
Thread.Sleep(3000); // Ping every 3 seconds
|
|
}
|
|
}
|
|
|
|
public void LoadModel(string path, string modelName)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
_api.LoadModelAsync(new LoadModelIn()
|
|
{
|
|
Name = modelName,
|
|
Path = Path.GetFileName(path)
|
|
}).Wait();
|
|
}
|
|
}
|
|
|
|
public void ActivateModel(string modelName)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
_api.ActivateModelAsync(new ActivateModelIn() { Name = modelName }).Wait();
|
|
}
|
|
}
|
|
|
|
public int[] GetAcceptSize()
|
|
{
|
|
var response = _api.GetAcceptSizeAsync().Result;
|
|
return response.Accept_size.ToArray();
|
|
}
|
|
|
|
public int[] GetOutputSize()
|
|
{
|
|
var response = _api.GetOutputSizeAsync().Result;
|
|
return response.Accept_size.ToArray();
|
|
}
|
|
|
|
public byte[] PredictRaw(byte[] byteArray)
|
|
{
|
|
var response = _api.PredictRawAsync(new FileParameter(new MemoryStream(byteArray))).Result;
|
|
var stream = response.Stream;
|
|
using var memoryStream = new MemoryStream();
|
|
stream.CopyTo(memoryStream);
|
|
memoryStream.Seek(0, SeekOrigin.Begin);
|
|
var responseBytes = memoryStream.ToArray();
|
|
return responseBytes;
|
|
}
|
|
|
|
public byte[] Predict(byte[] byteArray)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
var response = _api.PredictAsync(new FileParameter(new MemoryStream(byteArray))).Result;
|
|
var stream = response.Stream;
|
|
using var memoryStream = new MemoryStream();
|
|
stream.CopyTo(memoryStream);
|
|
memoryStream.Seek(0, SeekOrigin.Begin);
|
|
var responseBytes = memoryStream.ToArray();
|
|
return responseBytes;
|
|
}
|
|
}
|
|
} |