Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,16 @@ jobs:
- name: Download dependencies
run: ./download_dependencies.sh

- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
rust-src-dir: src/babble_trainer

- name: Build Rust trainer
run: |
cd src/babble_trainer
cargo build --release --lib

#- name: Install dependencies
# run: |
# dotnet tool install -g vpk
Expand Down Expand Up @@ -89,6 +99,16 @@ jobs:
shell: pwsh
run: ./download_dependencies.ps1

- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
rust-src-dir: src/babble_trainer

- name: Build Rust trainer
run: |
cd src/babble_trainer
cargo build --release --lib

- name: Build project
run: |
cd src/Baballonia.Desktop
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
[submodule "src/espflash"]
path = src/espflash
url = https://github.com/esp-rs/espflash.git
[submodule "src/babble_trainer"]
path = src/babble_trainer
url = https://github.com/acmdf/babble_trainer
10 changes: 8 additions & 2 deletions Baballonia.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35919.96
# Visual Studio Version 18
VisualStudioVersion = 18.4.11605.240 stable
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Baballonia", "src\Baballonia\Baballonia.csproj", "{00505DCC-588E-4E46-8F91-2AF6A88CBC78}"
EndProject
Expand Down Expand Up @@ -47,6 +47,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Baballonia.CaptureBin.IO",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Baballonia.LibV4L2Capture", "src\Baballonia.LibV4L2Capture\Baballonia.LibV4L2Capture.csproj", "{02E9F6A2-A443-491D-93FF-6F002F3C494F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "babble_trainer", "src\babble_trainer\bindings\bindings.csproj", "{692165EE-1668-066F-9D57-CC06413C6A55}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -126,6 +128,10 @@ Global
{02E9F6A2-A443-491D-93FF-6F002F3C494F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{02E9F6A2-A443-491D-93FF-6F002F3C494F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02E9F6A2-A443-491D-93FF-6F002F3C494F}.Release|Any CPU.Build.0 = Release|Any CPU
{692165EE-1668-066F-9D57-CC06413C6A55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{692165EE-1668-066F-9D57-CC06413C6A55}.Debug|Any CPU.Build.0 = Debug|Any CPU
{692165EE-1668-066F-9D57-CC06413C6A55}.Release|Any CPU.ActiveCfg = Release|Any CPU
{692165EE-1668-066F-9D57-CC06413C6A55}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Baballonia.Contracts;
using Baballonia.Helpers;
Expand All @@ -11,7 +12,7 @@ public Task EyeTrackingCalibrationRequested(string calibrationRoutine)
return Task.CompletedTask;
}

public Task<(bool success, string status)> EyeTrackingCalibrationRequested(CalibrationRoutine.Routines calibrationRoutine)
public Task<(bool success, string status)> EyeTrackingCalibrationRequested(CalibrationRoutine.Routines calibrationRoutine, List<string> args)
{
return Task.FromResult((true, "Not Supported"));
}
Expand Down
1 change: 1 addition & 0 deletions src/Baballonia.Desktop/Baballonia.Desktop.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
<ProjectReference Include="..\Baballonia.IPCameraCapture\Baballonia.IPCameraCapture.csproj" />
<ProjectReference Include="..\Baballonia.VFTCapture\Baballonia.VFTCapture.csproj" />
<ProjectReference Include="..\Baballonia\Baballonia.csproj" />
<ProjectReference Include="..\babble_trainer\bindings\bindings.csproj" />
</ItemGroup>

<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions src/Baballonia.Desktop/Calibration/FrameCollector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public void WriteBin(string path)
_frames.Clear();
}

CaptureBin.IO.CaptureBin.WriteAll(Path.Combine(Utils.ModelDataDirectory, path), copy);
CaptureBin.IO.CaptureBin.WriteAll(path, copy);
}
}
public class BinCollector(uint headerFlags)
Expand Down Expand Up @@ -149,6 +149,6 @@ public void WriteBin(string path)
_frames.Clear();
}

CaptureBin.IO.CaptureBin.WriteAll(Path.Combine(Utils.ModelDataDirectory, path), copy);
CaptureBin.IO.CaptureBin.WriteAll(path, copy);
}
}
176 changes: 97 additions & 79 deletions src/Baballonia.Desktop/Calibration/ICalibrationRoutine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public void Dispose()
}
}

public class GazeCaptureStep(IEyePipelineEventBus bus, TimeSpan time) : BasePositionalAwareEyeCaptureStep(bus, "gaze",
public class GazeCaptureStep(IEyePipelineEventBus bus, TimeSpan time, string fileName) : BasePositionalAwareEyeCaptureStep(bus, "gaze", fileName,
CaptureFlags.FLAG_GOOD_DATA |
CaptureFlags.FLAG_IN_MOVEMENT |
CaptureFlags.FLAG_VERSION_BIT1 |
Expand All @@ -168,7 +168,7 @@ public class GazeCaptureStep(IEyePipelineEventBus bus, TimeSpan time) : BasePosi
private Stopwatch _posDataTimer = new();
private readonly TimeSpan _posDataTimeout = TimeSpan.FromSeconds(0.2);

public GazeCaptureStep(IEyePipelineEventBus bus) : this(bus, TimeSpan.FromSeconds(120))
public GazeCaptureStep(IEyePipelineEventBus bus, string fileName) : this(bus, TimeSpan.FromSeconds(120), fileName)
{
}

Expand Down Expand Up @@ -204,6 +204,7 @@ public override void OnNewEyeFrame(EyePipelineEvents.NewTransformedFrameEvent fr
public class BasePositionalAwareEyeCaptureStep(
IEyePipelineEventBus eyePipelineEvent,
string name,
string fileName,
uint flags,
TimeSpan time)
: PositionalAwareCaptureStep(name, flags, time)
Expand All @@ -224,13 +225,14 @@ public override async Task ExecuteAsync(OverlayMessageDispatcher dispatcher, Can
if (ct.IsCancellationRequested)
return;

PositionalBinCollector.WriteBin(Name + ".bin");
PositionalBinCollector.WriteBin(fileName);
}
}

public class BaseEyeCaptureStep(
IEyePipelineEventBus eyePipelineEvent,
string name,
string fileName,
uint flags,
TimeSpan time,
float lid = 0,
Expand All @@ -257,7 +259,7 @@ public override async Task ExecuteAsync(OverlayMessageDispatcher dispatcher, Can
if (ct.IsCancellationRequested)
return;

BinCollector.WriteBin(Name + ".bin");
BinCollector.WriteBin(fileName);
}

public override Frame AddFrame(Mat[] images)
Expand Down Expand Up @@ -297,8 +299,8 @@ public async Task ExecuteAsync(OverlayMessageDispatcher dispatcher, Cancellation
dispatcher.Dispatch(new RunVariableLenghtRoutinePacket(Name, TimeSpan.FromSeconds(120)));
var onProgressHandler = (TrainerProgressReportPacket packet) => { dispatcher.Dispatch(packet); };
overlayTrainer.OnProgress += onProgressHandler;
overlayTrainer.RunTraining(Path.Combine(Utils.ModelDataDirectory, "user_cal.bin"),
Path.Combine(Utils.ModelDataDirectory, "tuned_temporal_eye_tracking_latest.onnx"));
await overlayTrainer.RunTraining(Path.Combine(Utils.ModelDataDirectory, "user_cal.bin"),
Path.Combine(Utils.ModelDataDirectory, "tuned_temporal_eye_tracking_latest"));
await overlayTrainer.WaitAsync();

overlayTrainer.OnProgress -= onProgressHandler;
Expand All @@ -307,14 +309,14 @@ public async Task ExecuteAsync(OverlayMessageDispatcher dispatcher, Cancellation

public class EyeCaptureStepFactory(IEyePipelineEventBus eyePipelineEvent)
{
public BaseEyeCaptureStep Create(string name, uint flags, TimeSpan time,
public BaseEyeCaptureStep Create(string name, string fileName, uint flags, TimeSpan time,
float lid = 0,
float browRaise = 0,
float browAngry = 0,
float widen = 0,
float squint = 0,
float dilate = 0) =>
new(eyePipelineEvent, name, flags, time, lid, browRaise, browAngry, widen, squint, dilate);
new(eyePipelineEvent, name, fileName, flags, time, lid, browRaise, browAngry, widen, squint, dilate);
}

public class MergeBinsStep(params string[] binNames) : ICalibrationStep
Expand All @@ -330,8 +332,7 @@ public Task ExecuteAsync(OverlayMessageDispatcher dispatcher, CancellationToken
private static void MergeBins(string result, params string[] inputs)
{
var resultPath = Path.Combine(Utils.ModelDataDirectory, result);
var inputPaths = inputs.Select(i => Path.Combine(Utils.ModelDataDirectory, i)).ToArray();
CaptureBin.IO.CaptureBin.Concatenate(resultPath, inputPaths);
CaptureBin.IO.CaptureBin.Concatenate(resultPath, inputs);
}
}

Expand All @@ -340,37 +341,92 @@ public class EyeCalibration(
ITrainerService trainer,
IEyePipelineEventBus eyePipelineEventBus)
{
public IEnumerable<ICalibrationStep> GetCalibrationStep(string stepName, string fileName)
{
return stepName switch
{
"gaze" => new List<ICalibrationStep>
{
new BaseTutorialStep("gazetutorial"),
new GazeCaptureStep(eyePipelineEventBus, fileName),
new CommandDispatchStep("close")
},
"blink" => new List<ICalibrationStep>
{
new BaseTutorialStep("blinktutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create(stepName, fileName,
CaptureFlags.FLAG_GOOD_DATA |
CaptureFlags.FLAG_IN_MOVEMENT |
CaptureFlags.FLAG_VERSION_BIT1,
TimeSpan.FromSeconds(20)
),
new CommandDispatchStep("close")
},
"widen" => new List<ICalibrationStep>
{
new BaseTutorialStep("widentutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create(stepName,fileName,
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), widen: 1, lid: 1),
new CommandDispatchStep("close")
},
"squint" => new List<ICalibrationStep>
{
new BaseTutorialStep("squinttutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create(stepName,fileName,
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), squint: 1, lid: 1),
new CommandDispatchStep("close")
},
"brow" => new List<ICalibrationStep>
{
new BaseTutorialStep("browtutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create(stepName, fileName,
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), browAngry: 1, lid: 1),
new CommandDispatchStep("close")
}
};
}

public IEnumerable<ICalibrationStep> TrainCalibration(List<string> args)
{
return new List<ICalibrationStep>
{
new MergeBinsStep(args.ToArray()),
new TrainerCalibrationStep(trainer),
new CommandDispatchStep("close")
};
}

public IEnumerable<ICalibrationStep> BasicAllCalibration()
{
List<ICalibrationStep> steps =
[
new BaseTutorialStep("gazetutorial"),
new GazeCaptureStep(eyePipelineEventBus),
new GazeCaptureStep(eyePipelineEventBus, Path.Combine(Utils.ModelDataDirectory, "gaze.bin")),
new BaseTutorialStep("blinktutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create("blink",
eyeCaptureStepFactory.Create("blink", Path.Combine(Utils.ModelDataDirectory, "blink.bin"),
CaptureFlags.FLAG_GOOD_DATA |
CaptureFlags.FLAG_IN_MOVEMENT |
CaptureFlags.FLAG_VERSION_BIT1,
TimeSpan.FromSeconds(20), lid: 0
),

// new BaseTutorialStep("widentutorial", TimeSpan.FromSeconds(10)),
// eyeCaptureStepFactory.Create("widen",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), widen: 1, lid: 1),
//
// new BaseTutorialStep("squinttutorial", TimeSpan.FromSeconds(10)),
// eyeCaptureStepFactory.Create("squint",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), squint: 1, lid: 1),
//
// new BaseTutorialStep("browtutorial", TimeSpan.FromSeconds(10)),
// eyeCaptureStepFactory.Create("brow",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), browAngry: 1, lid: 1),
new BaseTutorialStep("widentutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create("widen", Path.Combine(Utils.ModelDataDirectory, "widen.bin"),
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), widen: 1, lid: 1),

new BaseTutorialStep("squinttutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create("squint", Path.Combine(Utils.ModelDataDirectory, "squint.bin"),
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), squint: 1, lid: 1),

new BaseTutorialStep("browtutorial", TimeSpan.FromSeconds(10)),
eyeCaptureStepFactory.Create("brow", Path.Combine(Utils.ModelDataDirectory, "brow.bin"),
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20), browAngry: 1, lid: 1),
// steps.Add(new BaseTutorialStep("covergencetutorial"));
// steps.Add(_eyeCaptureStepFactory.Create("covergence",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_WHATEVER_NOT_IMPLEMENTED));

// new MergeBinsStep("gaze.bin", "blink.bin", "widen.bin", "squint.bin", "brow.bin"),
new MergeBinsStep("gaze.bin", "blink.bin"),
new MergeBinsStep(Path.Combine(Utils.ModelDataDirectory, "gaze.bin"), Path.Combine(Utils.ModelDataDirectory, "blink.bin"), Path.Combine(Utils.ModelDataDirectory, "widen.bin"), Path.Combine(Utils.ModelDataDirectory, "squint.bin"), Path.Combine(Utils.ModelDataDirectory, "brow.bin")),
//new MergeBinsStep(Path.Combine(Utils.ModelDataDirectory, "gaze.bin"), Path.Combine(Utils.ModelDataDirectory, "blink.bin")),
new TrainerCalibrationStep(trainer),
new CommandDispatchStep("close")

Expand All @@ -384,68 +440,30 @@ public IEnumerable<ICalibrationStep> BasicAllCalibrationQuick()
List<ICalibrationStep> steps =
[
new BaseTutorialStep("gazetutorialshort", TimeSpan.FromSeconds(5)),
new GazeCaptureStep(eyePipelineEventBus, TimeSpan.FromSeconds(10)),
new BaseTutorialStep("blinktutorial", TimeSpan.FromSeconds(4)),
eyeCaptureStepFactory.Create("blink",
CaptureFlags.FLAG_GOOD_DATA |
CaptureFlags.FLAG_IN_MOVEMENT |
CaptureFlags.FLAG_VERSION_BIT1 |
CaptureFlags.FLAG_ROUTINE_BIT1,
TimeSpan.FromSeconds(20)
),

//new BaseTutorialStep("widentutorial", TimeSpan.FromSeconds(4)),
//eyeCaptureStepFactory.Create("widen",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20)),
//
//new BaseTutorialStep("squinttutorial", TimeSpan.FromSeconds(4)),
//eyeCaptureStepFactory.Create("squint",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20)),
//
//new BaseTutorialStep("browtutorial", TimeSpan.FromSeconds(4)),
//eyeCaptureStepFactory.Create("brow",
// CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20)),

//new MergeBinsStep("gaze.bin", "blink.bin", "widen.bin", "squint.bin", "brow.bin"),
new MergeBinsStep("gaze.bin", "blink.bin"),
new TrainerCalibrationStep(trainer),
new CommandDispatchStep("close")

];

return steps;
}

public IEnumerable<ICalibrationStep> GazeCalibration()
{
List<ICalibrationStep> steps =
[
new BaseTutorialStep("gazetutorialshort", TimeSpan.FromSeconds(5)),
new GazeCaptureStep(eyePipelineEventBus),

new MergeBinsStep("gaze.bin", "blink.bin"),
new TrainerCalibrationStep(trainer),
new CommandDispatchStep("close")

];

return steps;
}

public IEnumerable<ICalibrationStep> BlinkCalibration()
{
List<ICalibrationStep> steps =
[
new GazeCaptureStep(eyePipelineEventBus, Path.Combine(Utils.ModelDataDirectory, "gaze.bin")),
new BaseTutorialStep("blinktutorial", TimeSpan.FromSeconds(4)),
eyeCaptureStepFactory.Create("blink",
eyeCaptureStepFactory.Create("blink", Path.Combine(Utils.ModelDataDirectory, "blink.bin"),
CaptureFlags.FLAG_GOOD_DATA |
CaptureFlags.FLAG_IN_MOVEMENT |
CaptureFlags.FLAG_VERSION_BIT1 |
CaptureFlags.FLAG_ROUTINE_BIT1,
TimeSpan.FromSeconds(20)
),

new MergeBinsStep("gaze.bin", "blink.bin"),
new BaseTutorialStep("widentutorial", TimeSpan.FromSeconds(4)),
eyeCaptureStepFactory.Create("widen", Path.Combine(Utils.ModelDataDirectory, "widen.bin"),
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20)),

new BaseTutorialStep("squinttutorial", TimeSpan.FromSeconds(4)),
eyeCaptureStepFactory.Create("squint", Path.Combine(Utils.ModelDataDirectory, "squint.bin"),
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20)),

new BaseTutorialStep("browtutorial", TimeSpan.FromSeconds(4)),
eyeCaptureStepFactory.Create("brow", Path.Combine(Utils.ModelDataDirectory, "brow.bin"),
CaptureFlags.FLAG_GOOD_DATA | CaptureFlags.FLAG_VERSION_BIT1, TimeSpan.FromSeconds(20)),

new MergeBinsStep(Path.Combine(Utils.ModelDataDirectory, "gaze.bin"), Path.Combine(Utils.ModelDataDirectory, "blink.bin"), Path.Combine(Utils.ModelDataDirectory, "widen.bin"), Path.Combine(Utils.ModelDataDirectory, "squint.bin"), Path.Combine(Utils.ModelDataDirectory, "brow.bin")),
//new MergeBinsStep(Path.Combine(Utils.ModelDataDirectory, "gaze.bin"), Path.Combine(Utils.ModelDataDirectory, "blink.bin")),
new TrainerCalibrationStep(trainer),
new CommandDispatchStep("close")

Expand Down
Loading