From 0b38d9b24c17af983e3656e203bfbb1318d7f1c3 Mon Sep 17 00:00:00 2001 From: Alex Bezdieniezhnykh Date: Sun, 1 Dec 2024 00:46:47 +0200 Subject: [PATCH] add dummy dlls for show wrong pass caption add image processing --- Azaion.Annotator/Annotator.xaml.cs | 88 +++++++++++++----- Azaion.Common/Services/ResourceLoader.cs | 14 ++- Azaion.Launcher/Loader.xaml | 3 +- Azaion.Suite.sln | 22 +++++ Azaion.Suite/App.xaml.cs | 1 - Dummy/Azaion.Annotator.dll | Bin 0 -> 12800 bytes Dummy/Azaion.Annotator/Annotator.xaml | 25 +++++ Dummy/Azaion.Annotator/Annotator.xaml.cs | 9 ++ .../Azaion.Annotator/AnnotatorEventHandler.cs | 3 + Dummy/Azaion.Annotator/AnnotatorModule.cs | 54 +++++++++++ Dummy/Azaion.Annotator/AssemblyInfo.cs | 10 ++ .../Azaion.Annotator/Azaion.Annotator.csproj | 41 ++++++++ Dummy/Azaion.Annotator/DTO/FormState.cs | 3 + .../Extensions/VLCFrameExtractor.cs | 3 + Dummy/Azaion.Annotator/HelpWindow.xaml | 11 +++ Dummy/Azaion.Annotator/HelpWindow.xaml.cs | 3 + Dummy/Azaion.Annotator/YOLODetector.cs | 5 + Dummy/Azaion.Dataset.dll | Bin 0 -> 11776 bytes Dummy/Azaion.Dataset/AssemblyInfo.cs | 10 ++ Dummy/Azaion.Dataset/Azaion.Dataset.csproj | 28 ++++++ Dummy/Azaion.Dataset/BitmapExtensions.cs | 19 ++++ Dummy/Azaion.Dataset/DatasetExplorer.xaml | 24 +++++ Dummy/Azaion.Dataset/DatasetExplorer.xaml.cs | 3 + Dummy/Azaion.Dataset/DatasetExplorerModule.cs | 25 +++++ Dummy/Azaion.Dataset/GalleryManager.cs | 24 +++++ 25 files changed, 398 insertions(+), 30 deletions(-) create mode 100644 Dummy/Azaion.Annotator.dll create mode 100644 Dummy/Azaion.Annotator/Annotator.xaml create mode 100644 Dummy/Azaion.Annotator/Annotator.xaml.cs create mode 100644 Dummy/Azaion.Annotator/AnnotatorEventHandler.cs create mode 100644 Dummy/Azaion.Annotator/AnnotatorModule.cs create mode 100644 Dummy/Azaion.Annotator/AssemblyInfo.cs create mode 100644 Dummy/Azaion.Annotator/Azaion.Annotator.csproj create mode 100644 Dummy/Azaion.Annotator/DTO/FormState.cs create mode 100644 Dummy/Azaion.Annotator/Extensions/VLCFrameExtractor.cs create mode 100644 Dummy/Azaion.Annotator/HelpWindow.xaml create mode 100644 Dummy/Azaion.Annotator/HelpWindow.xaml.cs create mode 100644 Dummy/Azaion.Annotator/YOLODetector.cs create mode 100644 Dummy/Azaion.Dataset.dll create mode 100644 Dummy/Azaion.Dataset/AssemblyInfo.cs create mode 100644 Dummy/Azaion.Dataset/Azaion.Dataset.csproj create mode 100644 Dummy/Azaion.Dataset/BitmapExtensions.cs create mode 100644 Dummy/Azaion.Dataset/DatasetExplorer.xaml create mode 100644 Dummy/Azaion.Dataset/DatasetExplorer.xaml.cs create mode 100644 Dummy/Azaion.Dataset/DatasetExplorerModule.cs create mode 100644 Dummy/Azaion.Dataset/GalleryManager.cs diff --git a/Azaion.Annotator/Annotator.xaml.cs b/Azaion.Annotator/Annotator.xaml.cs index 1c52a90..829cabe 100644 --- a/Azaion.Annotator/Annotator.xaml.cs +++ b/Azaion.Annotator/Annotator.xaml.cs @@ -7,6 +7,7 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; +using System.Windows.Threading; using Azaion.Annotator.DTO; using Azaion.Annotator.Extensions; using Azaion.Common; @@ -513,10 +514,6 @@ public partial class Annotator _mediator.Publish(new PlaybackControlEvent(PlaybackControlEnum.Play)); _mediaPlayer.SetPause(true); - var mediaInfo = (MediaFileInfo)LvFiles.SelectedItem; - _formState.CurrentMedia = mediaInfo; - var path = mediaInfo.Path; - var manualCancellationSource = new CancellationTokenSource(); var token = manualCancellationSource.Token; @@ -534,40 +531,81 @@ public partial class Annotator _autoDetectDialog.Top = Height - _autoDetectDialog.Height - 80; _autoDetectDialog.Left = 5; + _autoDetectDialog.Log("Ініціалізація AI..."); + _ = Task.Run(async () => { - Dispatcher.Invoke(() => _autoDetectDialog.Log("Ініціалізація AI...")); - var prevSeekTime = 0.0; - - await foreach (var timeframe in _vlcFrameExtractor.ExtractFrames(path, token)) + MediaFileInfo mediaInfo = null!; + Dispatcher.Invoke(() => { - try - { - var detections = await _aiDetector.Detect(timeframe.Stream, token); - if (timeframe.Time.TotalSeconds > prevSeekTime + 1) - { - Dispatcher.Invoke(() => SeekTo(timeframe.Time)); - prevSeekTime = timeframe.Time.TotalSeconds; - } + mediaInfo = (MediaFileInfo)LvFiles.SelectedItem; + }); - if (!IsValidDetection(timeframe.Time, detections)) - continue; - - await ProcessDetection(timeframe, detections, token); - } - catch (Exception ex) + while (mediaInfo != null) + { + _formState.CurrentMedia = mediaInfo; + if (mediaInfo.MediaType == MediaTypes.Image) { - _logger.LogError(ex, ex.Message); - await manualCancellationSource.CancelAsync(); + await DetectImage(mediaInfo, manualCancellationSource, token); } + else + await DetectVideo(mediaInfo, manualCancellationSource, token); + + mediaInfo = Dispatcher.Invoke(() => + { + LvFiles.SelectedIndex += 1; + return (MediaFileInfo)LvFiles.SelectedItem; + }); } Dispatcher.Invoke(() => _autoDetectDialog.Close()); }, token); - _autoDetectDialog.ShowDialog(); + _autoDetectDialog.ShowDialog(); Dispatcher.Invoke(() => Editor.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0))); } + private async Task DetectImage(MediaFileInfo mediaInfo, CancellationTokenSource manualCancellationSource, CancellationToken token) + { + try + { + var stream = new FileStream(mediaInfo.Path, FileMode.Open); + var detections = await _aiDetector.Detect(stream, token); + await ProcessDetection((TimeSpan.FromMilliseconds(0), stream), detections, token); + } + catch (Exception e) + { + _logger.LogError(e, e.Message); + await manualCancellationSource.CancelAsync(); + } + } + + private async Task DetectVideo(MediaFileInfo mediaInfo, CancellationTokenSource manualCancellationSource, CancellationToken token) + { + var prevSeekTime = 0.0; + await foreach (var timeframe in _vlcFrameExtractor.ExtractFrames(mediaInfo.Path, token)) + { + try + { + var detections = await _aiDetector.Detect(timeframe.Stream, token); + if (timeframe.Time.TotalSeconds > prevSeekTime + 1) + { + Dispatcher.Invoke(() => SeekTo(timeframe.Time)); + prevSeekTime = timeframe.Time.TotalSeconds; + } + + if (!IsValidDetection(timeframe.Time, detections)) + continue; + + await ProcessDetection(timeframe, detections, token); + } + catch (Exception ex) + { + _logger.LogError(ex, ex.Message); + await manualCancellationSource.CancelAsync(); + } + } + } + private bool IsValidDetection(TimeSpan time, List detections) { // No AI detection, forbid diff --git a/Azaion.Common/Services/ResourceLoader.cs b/Azaion.Common/Services/ResourceLoader.cs index 8eaf052..0832521 100644 --- a/Azaion.Common/Services/ResourceLoader.cs +++ b/Azaion.Common/Services/ResourceLoader.cs @@ -23,8 +23,18 @@ public class ResourceLoader(AzaionApiClient api, ApiCredentials credentials) : I var assemblyName = resourceName.Split(',').First(); if (EncryptedResources.Contains(assemblyName)) { - var stream = Load($"{assemblyName}.dll").GetAwaiter().GetResult(); - return Assembly.Load(stream.ToArray()); + try + { + var stream = Load($"{assemblyName}.dll").GetAwaiter().GetResult(); + return Assembly.Load(stream.ToArray()); + } + catch (Exception e) + { + Console.WriteLine(e); + var currentLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!; + var dllPath = Path.Combine(currentLocation, "dummy", $"{assemblyName}.dll"); + return Assembly.LoadFile(dllPath); + } } var loadedAssembly = AppDomain.CurrentDomain.GetAssemblies() diff --git a/Azaion.Launcher/Loader.xaml b/Azaion.Launcher/Loader.xaml index 18bbea9..9f17f8b 100644 --- a/Azaion.Launcher/Loader.xaml +++ b/Azaion.Launcher/Loader.xaml @@ -74,14 +74,13 @@ BorderBrush="DimGray" BorderThickness="0,0,0,1" HorizontalAlignment="Left" - Text="admin@azaion.com"/> + /> (context.Configuration); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/Dummy/Azaion.Annotator.dll b/Dummy/Azaion.Annotator.dll new file mode 100644 index 0000000000000000000000000000000000000000..da7c522e578b00dead3cde429978aa792dc639b6 GIT binary patch literal 12800 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 + + + Будь ласка перевірте правильність email чи паролю! + Також зауважте, що запуск можливий лише з одного конкретного компьютера, копіювання заборонене! + Для подальшого вирішення проблеми ви моежете зв'язатися з нами: hi@azaion.com + + Please check your email or password! + The program is restricted to start only from particular hardware, copying is forbidden! + For the further guidance, please feel free to contact us: hi@azaion.com + + diff --git a/Dummy/Azaion.Annotator/Annotator.xaml.cs b/Dummy/Azaion.Annotator/Annotator.xaml.cs new file mode 100644 index 0000000..067b45b --- /dev/null +++ b/Dummy/Azaion.Annotator/Annotator.xaml.cs @@ -0,0 +1,9 @@ +namespace Azaion.Annotator; + +public partial class Annotator +{ + public Annotator() + { + InitializeComponent(); + } +} diff --git a/Dummy/Azaion.Annotator/AnnotatorEventHandler.cs b/Dummy/Azaion.Annotator/AnnotatorEventHandler.cs new file mode 100644 index 0000000..d27500f --- /dev/null +++ b/Dummy/Azaion.Annotator/AnnotatorEventHandler.cs @@ -0,0 +1,3 @@ +namespace Azaion.Annotator; + +public class AnnotatorEventHandler; diff --git a/Dummy/Azaion.Annotator/AnnotatorModule.cs b/Dummy/Azaion.Annotator/AnnotatorModule.cs new file mode 100644 index 0000000..2df179a --- /dev/null +++ b/Dummy/Azaion.Annotator/AnnotatorModule.cs @@ -0,0 +1,54 @@ +using Azaion.Common.DTO; + +namespace Azaion.Annotator; + +public class AnnotatorModule : IAzaionModule +{ + public string Name => "Анотатор"; + + public string SvgIcon => +@" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"; + + public Type MainWindowType => typeof(Annotator); + + public WindowEnum WindowEnum => WindowEnum.Annotator; +} \ No newline at end of file diff --git a/Dummy/Azaion.Annotator/AssemblyInfo.cs b/Dummy/Azaion.Annotator/AssemblyInfo.cs new file mode 100644 index 0000000..4a05c7d --- /dev/null +++ b/Dummy/Azaion.Annotator/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] \ No newline at end of file diff --git a/Dummy/Azaion.Annotator/Azaion.Annotator.csproj b/Dummy/Azaion.Annotator/Azaion.Annotator.csproj new file mode 100644 index 0000000..3c68237 --- /dev/null +++ b/Dummy/Azaion.Annotator/Azaion.Annotator.csproj @@ -0,0 +1,41 @@ + + + + enable + enable + true + net8.0-windows + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dummy/Azaion.Annotator/DTO/FormState.cs b/Dummy/Azaion.Annotator/DTO/FormState.cs new file mode 100644 index 0000000..ae14d69 --- /dev/null +++ b/Dummy/Azaion.Annotator/DTO/FormState.cs @@ -0,0 +1,3 @@ +namespace Azaion.Annotator.DTO; + +public class FormState; \ No newline at end of file diff --git a/Dummy/Azaion.Annotator/Extensions/VLCFrameExtractor.cs b/Dummy/Azaion.Annotator/Extensions/VLCFrameExtractor.cs new file mode 100644 index 0000000..7887ba9 --- /dev/null +++ b/Dummy/Azaion.Annotator/Extensions/VLCFrameExtractor.cs @@ -0,0 +1,3 @@ +namespace Azaion.Annotator.Extensions; + +public class VLCFrameExtractor; \ No newline at end of file diff --git a/Dummy/Azaion.Annotator/HelpWindow.xaml b/Dummy/Azaion.Annotator/HelpWindow.xaml new file mode 100644 index 0000000..a15a573 --- /dev/null +++ b/Dummy/Azaion.Annotator/HelpWindow.xaml @@ -0,0 +1,11 @@ + + diff --git a/Dummy/Azaion.Annotator/HelpWindow.xaml.cs b/Dummy/Azaion.Annotator/HelpWindow.xaml.cs new file mode 100644 index 0000000..4031078 --- /dev/null +++ b/Dummy/Azaion.Annotator/HelpWindow.xaml.cs @@ -0,0 +1,3 @@ +namespace Azaion.Annotator; + +public partial class HelpWindow; \ No newline at end of file diff --git a/Dummy/Azaion.Annotator/YOLODetector.cs b/Dummy/Azaion.Annotator/YOLODetector.cs new file mode 100644 index 0000000..ead825e --- /dev/null +++ b/Dummy/Azaion.Annotator/YOLODetector.cs @@ -0,0 +1,5 @@ +namespace Azaion.Annotator; + +public interface IAIDetector; + +public class YOLODetector : IAIDetector; diff --git a/Dummy/Azaion.Dataset.dll b/Dummy/Azaion.Dataset.dll new file mode 100644 index 0000000000000000000000000000000000000000..341ff74287d0cd666d8dd15fac6c2d7afdbe0f82 GIT binary patch literal 11776 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 + + + net8.0-windows + enable + enable + true + + + + + MSBuild:Compile + Wpf + Designer + + + + + + + + + + + + + + diff --git a/Dummy/Azaion.Dataset/BitmapExtensions.cs b/Dummy/Azaion.Dataset/BitmapExtensions.cs new file mode 100644 index 0000000..cb54e6a --- /dev/null +++ b/Dummy/Azaion.Dataset/BitmapExtensions.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Windows.Media.Imaging; + +namespace Azaion.Dataset; + +public static class BitmapExtensions +{ + public static async Task OpenImage(this string imagePath) + { + var image = new BitmapImage(); + await using var stream = File.OpenRead(imagePath); + image.BeginInit(); + image.CacheOption = BitmapCacheOption.OnLoad; + image.StreamSource = stream; + image.EndInit(); + image.Freeze(); + return image; + } +} \ No newline at end of file diff --git a/Dummy/Azaion.Dataset/DatasetExplorer.xaml b/Dummy/Azaion.Dataset/DatasetExplorer.xaml new file mode 100644 index 0000000..9b78e59 --- /dev/null +++ b/Dummy/Azaion.Dataset/DatasetExplorer.xaml @@ -0,0 +1,24 @@ + + + + Будь ласка перевірте правильність email чи паролю! + Також зауважте, що запуск можливий лише з одного конкретного компьютера, копіювання заборонене! + Для подальшого вирішення проблеми ви моежете зв'язатися з нами: hi@azaion.com + + Please check your email or password! + The program is restricted to start only from particular hardware, copying is forbidden! + For the further guidance, please feel free to contact us: hi@azaion.com + + diff --git a/Dummy/Azaion.Dataset/DatasetExplorer.xaml.cs b/Dummy/Azaion.Dataset/DatasetExplorer.xaml.cs new file mode 100644 index 0000000..c7fc94e --- /dev/null +++ b/Dummy/Azaion.Dataset/DatasetExplorer.xaml.cs @@ -0,0 +1,3 @@ +namespace Azaion.Dataset; + +public partial class DatasetExplorer; \ No newline at end of file diff --git a/Dummy/Azaion.Dataset/DatasetExplorerModule.cs b/Dummy/Azaion.Dataset/DatasetExplorerModule.cs new file mode 100644 index 0000000..c907ec5 --- /dev/null +++ b/Dummy/Azaion.Dataset/DatasetExplorerModule.cs @@ -0,0 +1,25 @@ +using Azaion.Common.DTO; + +namespace Azaion.Dataset; + +public class DatasetExplorerModule : IAzaionModule +{ + public string Name => "Переглядач"; + + public string SvgIcon => + @" + + + + + + + + + +"; + + public Type MainWindowType => typeof(DatasetExplorer); + + public WindowEnum WindowEnum => WindowEnum.DatasetExplorer; +} \ No newline at end of file diff --git a/Dummy/Azaion.Dataset/GalleryManager.cs b/Dummy/Azaion.Dataset/GalleryManager.cs new file mode 100644 index 0000000..7aeb993 --- /dev/null +++ b/Dummy/Azaion.Dataset/GalleryManager.cs @@ -0,0 +1,24 @@ +using System.Collections.Concurrent; +using System.Drawing; +using System.IO; +using Azaion.Annotator.Extensions; +using Azaion.Common; +using Azaion.Common.DTO; +using Azaion.Common.Extensions; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Color = System.Drawing.Color; +using ParallelOptions = Azaion.Annotator.Extensions.ParallelOptions; +using Size = System.Windows.Size; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using Azaion.Common.DTO.Config; + +namespace Azaion.Dataset; + +public delegate void ThumbnailsUpdatedEventHandler(double thumbnailsPercentage); + +public class GalleryManager : IGalleryManager; + +public interface IGalleryManager; \ No newline at end of file