Skip to content
Merged
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
16 changes: 8 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ jobs:
runs-on: ${{ matrix.os }}

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4

- name: Setup .NET Core 9.0
uses: actions/setup-dotnet@v1
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x

- name: Restore dependencies
run: dotnet restore
Expand All @@ -46,12 +46,12 @@ jobs:
runs-on: ubuntu-latest
needs: build-and-test
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4

- name: Setup .NET Core 9.0
uses: actions/setup-dotnet@v1
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x

- name: Restore dependencies
run: dotnet restore
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ jobs:
runs-on: ubuntu-latest
steps:

- uses: actions/checkout@v2
- uses: actions/checkout@v4

- name: Verify commit exists in origin/main
run: |
git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/*
Expand All @@ -21,10 +21,10 @@ jobs:
- name: Set VERSION variable from tag
run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV

- name: Setup .NET Core 9.0
uses: actions/setup-dotnet@v1
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x

- name: Build
working-directory: src/SortCS
Expand Down
4 changes: 2 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/src/SortCS.Evaluate/bin/Debug/net5.0/SortCS.Evaluate.dll",
"program": "${workspaceFolder}/src/SortCS.Evaluate/bin/Debug/net10.0/SortCS.Evaluate.dll",
"args": [],
"cwd": "${workspaceFolder}/src/SortCS.Evaluate/bin/Debug/net5.0/",
"cwd": "${workspaceFolder}/src/SortCS.Evaluate/bin/Debug/net10.0/",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
Expand Down
10 changes: 10 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project>

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
31 changes: 31 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<Project>

<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>

<ItemGroup>
<!-- SortCS (library) -->
<PackageVersion Include="HungarianAlgorithm" Version="2.3.5" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" />

<!-- SortCS.Evaluate -->
<PackageVersion Include="ini-parser-netcore" Version="3.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.8" />
<PackageVersion Include="System.CommandLine" Version="2.0.8" />

<!-- SortCS.Benchmarks -->
<PackageVersion Include="BenchmarkDotNet" Version="0.15.8" />

<!-- SortCS.Tests -->
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.6.0" />
<PackageVersion Include="MSTest" Version="4.2.3" />
<PackageVersion Include="coverlet.collector" Version="10.0.1" />

<!-- Shared analyzers (analyzers.targets) -->
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.300" />
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.27.0.140913" />
</ItemGroup>

</Project>
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@ SortCS is a 'Multiple Object Tracker' as described in [this paper](https://arxiv
```cs
using SortCS;

ITracker tracker = new SortTracker(iouThreshold = 0.3f, maxMisses = 3);
// maxMisses is the number of consecutive frames an object may be occluded before its track ends.
var tracker = new SortTracker(iouThreshold: 0.3f, maxMisses: 3);

// MaxMisses can be adjusted at runtime; the new value takes effect on the next Track(..) call.
tracker.MaxMisses = 5;

tracker.Track(new[]
{
new RectangleF(1695,383,159,343),
Expand Down
4 changes: 2 additions & 2 deletions analyzers.targets
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="9.0.0">
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

<PackageReference Include="SonarAnalyzer.CSharp" Version="10.4.0.108396">
<PackageReference Include="SonarAnalyzer.CSharp">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
10 changes: 4 additions & 6 deletions src/SortCS.Benchmarks/SortCS.Benchmarks.csproj
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
<PackageReference Include="BenchmarkDotNet" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\SortCS\SortCS.csproj" />
</ItemGroup>
</Project>

</Project>
120 changes: 58 additions & 62 deletions src/SortCS.Evaluate/Program.cs
Original file line number Diff line number Diff line change
@@ -1,78 +1,74 @@
using System.IO;
using System.CommandLine;
using System.CommandLine.Invocation;
using System.Threading.Tasks;
using System.Linq;
using System.Net.Http;
using System.IO.Compression;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SortCS;
using SortCS.Evaluate;

namespace SortCS.Evaluate;

class Program
var services = new ServiceCollection();
services.AddLogging(loggerBuilder =>
{
private static ILogger<Program> _logger;

static async Task<int> Main(string[] args)
{
var services = new ServiceCollection();
services.AddLogging(loggerBuilder =>
{
loggerBuilder.ClearProviders();
loggerBuilder.AddConsole();
});
var serviceProvider = services.BuildServiceProvider();
loggerBuilder.ClearProviders();
loggerBuilder.AddConsole();
});
var serviceProvider = services.BuildServiceProvider();

_logger = serviceProvider.GetService<ILogger<Program>>();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();

var dataFolderOption = new Option<DirectoryInfo>(
"--data-folder",
getDefaultValue: () => new DirectoryInfo(@"../../../../../../TrackEval/data"), // Sssuming SortCS/src/SortCS.Evaluate/bin/debug/net5.0 is working directory
description: "Location where data is stored using this format: https://github.com/JonathonLuiten/TrackEval/blob/master/docs/MOTChallenge-format.txt");
var dataFolderOption = new Option<DirectoryInfo>("--data-folder")
{
Description = "Location where data is stored using this format: https://github.com/JonathonLuiten/TrackEval/blob/master/docs/MOTChallenge-format.txt",
DefaultValueFactory = _ => new DirectoryInfo(@"../../../../../../TrackEval/data") // Assuming SortCS/src/SortCS.Evaluate/bin/debug/net10.0 is working directory
};

var benchmarkOption = new Option<string>(
"--benchmark",
getDefaultValue: () => "MOT20",
description: "Name of the benchmark, e.g. MOT15, MO16, MOT17 or MOT20 (default : MOT20)");
var benchmarkOption = new Option<string>("--benchmark")
{
Description = "Name of the benchmark, e.g. MOT15, MO16, MOT17 or MOT20 (default : MOT20)",
DefaultValueFactory = _ => "MOT20"
};

var splitOption = new Option<string>(
"--split-to-eval",
getDefaultValue: () => "train",
description: "Data split on which to evalute e.g. train, test (default : train)");
var splitOption = new Option<string>("--split-to-eval")
{
Description = "Data split on which to evalute e.g. train, test (default : train)",
DefaultValueFactory = _ => "train"
};

var rootCommand = new RootCommand
{
dataFolderOption,benchmarkOption,splitOption
};
var rootCommand = new RootCommand("App to evaluate the SortCS tracking algoritm")
{
dataFolderOption,
benchmarkOption,
splitOption
};

rootCommand.Description = "App to evaluate the SortCS tracking algoritm";
rootCommand.SetHandler(async (dataFolder, benchmark, splitToEval) =>
{
if (!dataFolder.Exists || !dataFolder.GetDirectories().Any())
{
await DownloadTrackEvalExampleAsync(dataFolder);
}
var sortCsEvaluator = new SortCsEvaluator(dataFolder, benchmark, splitToEval, serviceProvider.GetService<ILogger<SortTracker>>());
await sortCsEvaluator.EvaluateAsync();
}, dataFolderOption, benchmarkOption, splitOption);
rootCommand.SetAction(async (parseResult, cancellationToken) =>
{
var dataFolder = parseResult.GetValue(dataFolderOption)!;
var benchmark = parseResult.GetValue(benchmarkOption)!;
var splitToEval = parseResult.GetValue(splitOption)!;

return await rootCommand.InvokeAsync(args);
if (!dataFolder.Exists || !dataFolder.GetDirectories().Any())
{
await DownloadTrackEvalExampleAsync(dataFolder, cancellationToken);
}

private static async Task DownloadTrackEvalExampleAsync(DirectoryInfo groundTruthFolder)
{
var dataZipUrl = "https://omnomnom.vision.rwth-aachen.de/data/TrackEval/data.zip";
groundTruthFolder.Create();
var targetZipFile = Path.Combine(groundTruthFolder.ToString(), "..", "data.zip");
_logger.LogInformation(Path.GetFullPath(targetZipFile));
var sortCsEvaluator = new SortCsEvaluator(dataFolder, benchmark, splitToEval, serviceProvider.GetRequiredService<ILogger<SortTracker>>());
await sortCsEvaluator.EvaluateAsync();
});

_logger.LogInformation($"Downloading data.zip (150mb) from {dataZipUrl} to {targetZipFile}");
using var httpClient = new HttpClient();
var zipStream = await httpClient.GetStreamAsync(dataZipUrl);
using var fs = new FileStream(targetZipFile, FileMode.CreateNew);
await zipStream.CopyToAsync(fs);
ZipFile.ExtractToDirectory(targetZipFile, Path.Combine(groundTruthFolder.ToString(), ".."));
_logger.LogInformation("data.zip downloaded & extracted");
}
}
return await rootCommand.Parse(args).InvokeAsync();

async Task DownloadTrackEvalExampleAsync(DirectoryInfo groundTruthFolder, CancellationToken cancellationToken)
{
const string dataZipUrl = "https://omnomnom.vision.rwth-aachen.de/data/TrackEval/data.zip";
groundTruthFolder.Create();
var targetZipFile = Path.Combine(groundTruthFolder.ToString(), "..", "data.zip");
logger.LogInformation("{TargetZipFile}", Path.GetFullPath(targetZipFile));

logger.LogInformation("Downloading data.zip (150mb) from {DataZipUrl} to {TargetZipFile}", dataZipUrl, targetZipFile);
using var httpClient = new HttpClient();
var zipStream = await httpClient.GetStreamAsync(dataZipUrl, cancellationToken);
await using var fs = new FileStream(targetZipFile, FileMode.CreateNew);
await zipStream.CopyToAsync(fs, cancellationToken);
ZipFile.ExtractToDirectory(targetZipFile, Path.Combine(groundTruthFolder.ToString(), ".."));
logger.LogInformation("data.zip downloaded & extracted");
}
8 changes: 3 additions & 5 deletions src/SortCS.Evaluate/SortCS.Evaluate.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="ini-parser-netcore" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.0" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageReference Include="ini-parser-netcore" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" />
<PackageReference Include="System.CommandLine" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading
Loading