fix saving scale for datasetexplorer and annotation

This commit is contained in:
Oleksandr Bezdieniezhnykh
2025-10-01 14:29:23 +03:00
parent 9b80eaf435
commit 99b9058187
4 changed files with 38 additions and 23 deletions
+5 -3
View File
@@ -313,11 +313,13 @@ public class AnnotatorEventHandler(
private async Task<List<Annotation>> 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<Annotation>();
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];
+5
View File
@@ -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);
}
+9 -3
View File
@@ -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));
}
}
}
@@ -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,8 +127,9 @@ public class DatasetExplorerEventHandler(
var selectedClass = datasetExplorer.LvClasses.CurrentClassNumber;
datasetExplorer.AddAnnotationToDict(annotation);
if (annotation.Classes.Contains(selectedClass) || selectedClass == -1)
{
if (!annotation.Classes.Contains(selectedClass) && selectedClass != -1)
return;
var index = 0;
var annThumb = new AnnotationThumbnail(annotation, azaionApi.CurrentUser.Role.IsValidator());
if (datasetExplorer.SelectedAnnotationDict.ContainsKey(annThumb.Annotation.Name))
@@ -142,7 +145,6 @@ public class DatasetExplorerEventHandler(
datasetExplorer.SelectedAnnotations.Insert(index, annThumb);
datasetExplorer.SelectedAnnotationDict.Add(annThumb.Annotation.Name, annThumb);
}
});
return Task.CompletedTask;
}