diff --git a/Azaion.Annotator/AnnotatorEventHandler.cs b/Azaion.Annotator/AnnotatorEventHandler.cs index aa2ed2a..5d54802 100644 --- a/Azaion.Annotator/AnnotatorEventHandler.cs +++ b/Azaion.Annotator/AnnotatorEventHandler.cs @@ -313,11 +313,13 @@ public class AnnotatorEventHandler( private async Task> SaveAnnotationInner(string imgPath, CancellationToken cancellationToken = default) { var canvasDetections = mainWindow.Editor.CurrentDetections.Select(x => x.ToCanvasLabel()).ToList(); + + var source = (mainWindow.Editor.BackgroundImage.Source as BitmapSource)!; + var mediaSize = new Size(source.PixelWidth, source.PixelHeight); var annotationsResult = new List(); if (!File.Exists(imgPath)) { - var source = (mainWindow.Editor.BackgroundImage.Source as BitmapSource)!; - if (new Size(source.PixelWidth, source.PixelHeight).FitSizeForAI()) + if (mediaSize.FitSizeForAI()) await source.SaveImage(imgPath, cancellationToken); else { @@ -356,7 +358,7 @@ public class AnnotatorEventHandler( var timeImg = formState.BackgroundTime ?? TimeSpan.FromMilliseconds(mediaPlayer.Time); var annName = formState.MediaName.ToTimeName(timeImg); var currentDetections = canvasDetections.Select(x => - new Detection(annName, new YoloLabel(x, mainWindow.Editor.RenderSize))) + new Detection(annName, new YoloLabel(x, mainWindow.Editor.RenderSize, mediaSize))) .ToList(); var annotation = await annotationService.SaveAnnotation(formState.MediaName, annName, timeImg, currentDetections, token: cancellationToken); return [annotation]; diff --git a/Azaion.Dataset/BitmapExtensions.cs b/Azaion.Dataset/BitmapExtensions.cs index 618cd51..e745334 100644 --- a/Azaion.Dataset/BitmapExtensions.cs +++ b/Azaion.Dataset/BitmapExtensions.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Windows; using System.Windows.Media.Imaging; namespace Azaion.Dataset; @@ -16,4 +17,8 @@ public static class BitmapExtensions image.Freeze(); return image; } + + public static Size Size(this BitmapImage image) => + new(image.PixelWidth, image.PixelHeight); + } diff --git a/Azaion.Dataset/DatasetExplorer.xaml.cs b/Azaion.Dataset/DatasetExplorer.xaml.cs index be27a56..c6f5fb0 100644 --- a/Azaion.Dataset/DatasetExplorer.xaml.cs +++ b/Azaion.Dataset/DatasetExplorer.xaml.cs @@ -37,6 +37,7 @@ public partial class DatasetExplorer private readonly IConfigUpdater _configUpdater; public bool ThumbnailLoading { get; set; } + public string CurrentFilter { get; set; } = ""; public AnnotationThumbnail? CurrentAnnotation { get; set; } @@ -201,7 +202,7 @@ public partial class DatasetExplorer SwitchTab(toEditor: true); ExplorerEditor.RemoveAllAnns(); - ExplorerEditor.CreateDetections(ann, _appConfig.AnnotationConfig.DetectionClasses, new Size(image.PixelWidth, image.PixelHeight)); + ExplorerEditor.CreateDetections(ann, _appConfig.AnnotationConfig.DetectionClasses, image.Size()); } catch (Exception e) { @@ -261,7 +262,7 @@ public partial class DatasetExplorer SelectedAnnotationDict.Clear(); var annThumbnails = _annotationsDict[ExplorerEditor.CurrentAnnClass.YoloId] .WhereIf(withDetectionsOnly, x => x.Value.Detections.Any()) - .WhereIf(TbSearch.Text.Length > 2, x => x.Key.ToLower().Contains(TbSearch.Text)) + .WhereIf(!string.IsNullOrEmpty(CurrentFilter), x => x.Key.Contains(CurrentFilter, StringComparison.CurrentCultureIgnoreCase)) .Select(x => new AnnotationThumbnail(x.Value, _azaionApi.CurrentUser.Role.IsValidator())) .OrderBy(x => !x.IsSeed) .ThenByDescending(x =>x.Annotation.CreatedDate); @@ -300,6 +301,11 @@ public partial class DatasetExplorer private void TbSearch_OnTextChanged(object sender, TextChangedEventArgs e) { TbSearch.Foreground = TbSearch.Text.Length > 2 ? Brushes.Black : Brushes.Gray; - ThrottleExt.Throttle(ReloadThumbnails, SearchActionId, TimeSpan.FromMilliseconds(400));; + if (TbSearch.Text.Length > 2 || string.IsNullOrEmpty(TbSearch.Text)) + { + CurrentFilter = TbSearch.Text; + ThrottleExt.Throttle(ReloadThumbnails, SearchActionId, TimeSpan.FromMilliseconds(400)); + } + } } diff --git a/Azaion.Dataset/DatasetExplorerEventHandler.cs b/Azaion.Dataset/DatasetExplorerEventHandler.cs index eac51d6..42ed356 100644 --- a/Azaion.Dataset/DatasetExplorerEventHandler.cs +++ b/Azaion.Dataset/DatasetExplorerEventHandler.cs @@ -1,4 +1,5 @@ using System.Windows.Input; +using System.Windows.Media.Imaging; using Azaion.Common.Database; using Azaion.Common.DTO; using Azaion.Common.Events; @@ -66,8 +67,9 @@ public class DatasetExplorerEventHandler( var a = datasetExplorer.CurrentAnnotation!.Annotation; + var mediaSize = ((BitmapImage)datasetExplorer.ExplorerEditor.BackgroundImage.Source).Size(); var detections = datasetExplorer.ExplorerEditor.CurrentDetections - .Select(x => new Detection(a.Name, x.ToYoloLabel(datasetExplorer.ExplorerEditor.RenderSize))) + .Select(x => new Detection(a.Name, x.ToYoloLabel(datasetExplorer.ExplorerEditor.RenderSize, mediaSize))) .ToList(); var index = datasetExplorer.ThumbnailsView.SelectedIndex; var annotation = await annotationService.SaveAnnotation(a.OriginalMediaName, a.Name, a.Time, detections, token: token); @@ -125,24 +127,24 @@ public class DatasetExplorerEventHandler( var selectedClass = datasetExplorer.LvClasses.CurrentClassNumber; datasetExplorer.AddAnnotationToDict(annotation); - if (annotation.Classes.Contains(selectedClass) || selectedClass == -1) - { - var index = 0; - var annThumb = new AnnotationThumbnail(annotation, azaionApi.CurrentUser.Role.IsValidator()); - if (datasetExplorer.SelectedAnnotationDict.ContainsKey(annThumb.Annotation.Name)) - { - datasetExplorer.SelectedAnnotationDict.Remove(annThumb.Annotation.Name); - var ann = datasetExplorer.SelectedAnnotations.FirstOrDefault(x => x.Annotation.Name == annThumb.Annotation.Name); - if (ann != null) - { - index = datasetExplorer.SelectedAnnotations.IndexOf(ann); - datasetExplorer.SelectedAnnotations.Remove(ann); - } - } + if (!annotation.Classes.Contains(selectedClass) && selectedClass != -1) + return; - datasetExplorer.SelectedAnnotations.Insert(index, annThumb); - datasetExplorer.SelectedAnnotationDict.Add(annThumb.Annotation.Name, annThumb); + var index = 0; + var annThumb = new AnnotationThumbnail(annotation, azaionApi.CurrentUser.Role.IsValidator()); + if (datasetExplorer.SelectedAnnotationDict.ContainsKey(annThumb.Annotation.Name)) + { + datasetExplorer.SelectedAnnotationDict.Remove(annThumb.Annotation.Name); + var ann = datasetExplorer.SelectedAnnotations.FirstOrDefault(x => x.Annotation.Name == annThumb.Annotation.Name); + if (ann != null) + { + index = datasetExplorer.SelectedAnnotations.IndexOf(ann); + datasetExplorer.SelectedAnnotations.Remove(ann); + } } + + datasetExplorer.SelectedAnnotations.Insert(index, annThumb); + datasetExplorer.SelectedAnnotationDict.Add(annThumb.Annotation.Name, annThumb); }); return Task.CompletedTask; }