diff --git a/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyGen.cs b/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyGen.cs index 66fc31a6..3f61f6c9 100644 --- a/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyGen.cs +++ b/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyGen.cs @@ -7,10 +7,13 @@ namespace BetterGenshinImpact.Test.Dataset; public class AvatarClassifyGen { // 基础图像文件夹 - private const string BaseDir = @"E:\HuiTask\更好的原神\侧面头像\"; + private const string BaseDir = @"E:\HuiTask\更好的原神\数据源\Snap.Static\AvatarIcon"; + + // 产出文件夹 + private const string OutputDir = @"E:\HuiAi\YOLOv8\3.avatar-side"; // 背景图像文件夹 - private static readonly string BackgroundDir = Path.Combine(BaseDir, "background"); + private static readonly string BackgroundDir = @"E:\HuiTask\更好的原神\数据源\background"; private static readonly Random Rd = new Random(); @@ -19,26 +22,17 @@ public class AvatarClassifyGen // 读取基础图像 // List sideImageFiles = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), "*.png", SearchOption.TopDirectoryOnly).ToList(); // 只用一个图像 - List sideImageFiles = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), - "UI_AvatarIcon_Side_Varesa.png", SearchOption.TopDirectoryOnly).ToList(); - List sideImageFiles2 = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), - "UI_AvatarIcon_Side_Iansan.png", SearchOption.TopDirectoryOnly).ToList(); - sideImageFiles.AddRange(sideImageFiles2); - List sideImageFiles3 = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), - "UI_AvatarIcon_Side_AmborCostumeWic.png", SearchOption.TopDirectoryOnly).ToList(); - sideImageFiles.AddRange(sideImageFiles3); - List sideImageFiles4 = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), - "UI_AvatarIcon_Side_Ambor.png", SearchOption.TopDirectoryOnly).ToList(); - sideImageFiles.AddRange(sideImageFiles4); - // List sideImageFiles5 = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), "UI_AvatarIcon_Side_XianglingCostumeWinter.png", SearchOption.TopDirectoryOnly).ToList(); - // sideImageFiles.AddRange(sideImageFiles5); - // List sideImageFiles6 = Directory.GetFiles(Path.Combine(BaseDir, "side_src"), "UI_AvatarIcon_Side_Mavuika.png", SearchOption.TopDirectoryOnly).ToList(); - // sideImageFiles.AddRange(sideImageFiles6); - + List sideImageFiles = []; + List imgNames = ["UI_AvatarIcon_Side_Escoffier.png","UI_AvatarIcon_Side_Ifa.png", + "UI_AvatarIcon_Side_Flamingo.png","UI_AvatarIcon_Side_Hookwalker.png","UI_AvatarIcon_Side_Mosasaurus.png","UI_AvatarIcon_Side_Shamansaurus.png","UI_AvatarIcon_Side_Drillhead.png"]; + foreach (string imgName in imgNames) + { + sideImageFiles.Add(Path.Combine(BaseDir, imgName)); + } // 生成训练集 - GenTo(sideImageFiles, Path.Combine(BaseDir, @"dateset\train"), 200); + GenTo(sideImageFiles, Path.Combine(OutputDir, @"dateset\train"), 200); // 生成测试集 - GenTo(sideImageFiles, Path.Combine(BaseDir, @"dateset\test"), 40); + GenTo(sideImageFiles, Path.Combine(OutputDir, @"dateset\test"), 40); // GenTo(new List { sideImageFiles[1] }, Path.Combine(BaseDir, @"dateset\test"), 1); } diff --git a/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyTransparentGen.cs b/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyTransparentGen.cs index cc6acffb..e0475b65 100644 --- a/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyTransparentGen.cs +++ b/Test/BetterGenshinImpact.Test/Dataset/AvatarClassifyTransparentGen.cs @@ -7,42 +7,40 @@ namespace BetterGenshinImpact.Test.Dataset; public class AvatarClassifyTransparentGen { // 基础图像文件夹 - private const string BaseDir = @"E:\HuiTask\更好的原神\侧面头像"; + private const string BaseDir = @"E:\HuiTask\更好的原神\数据源\Snap.Static\AvatarIcon"; + + // 产出文件夹 + private const string OutputDir = @"E:\HuiAi\YOLOv8\3.avatar-side"; // 背景图像文件夹 - private static readonly string BackgroundDir = Path.Combine(BaseDir, "background"); + private static readonly string BackgroundDir = @"E:\HuiTask\更好的原神\数据源\background"; private static readonly Random Rd = new Random(); // 在类的开头添加一个新的常量 - private const string SideSrcDir = "side_src"; - private const string SideSrcTransportDir = "side_src_transport"; public static void GenAll() { - // 调整透明度(可选,取消注释以启用) - AdjustTransparency(0.5f); + List sideImageFiles = []; + List imgNames = + [ + "UI_AvatarIcon_Side_Escoffier.png", "UI_AvatarIcon_Side_Ifa.png", + "UI_AvatarIcon_Side_Flamingo.png", "UI_AvatarIcon_Side_Hookwalker.png", "UI_AvatarIcon_Side_Mosasaurus.png", + "UI_AvatarIcon_Side_Shamansaurus.png", "UI_AvatarIcon_Side_Drillhead.png" + ]; + foreach (string imgName in imgNames) + { + sideImageFiles.Add(Path.Combine(BaseDir, imgName)); + } + + var newList = AdjustTransparency(sideImageFiles, 0.5f); - // 读取基础图像 - // List sideImageFiles = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "*.png", SearchOption.TopDirectoryOnly).ToList(); - // 只用一个图像 - List sideImageFiles = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "UI_AvatarIcon_Side_Varesa.png", SearchOption.TopDirectoryOnly).ToList(); - List sideImageFiles2 = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "UI_AvatarIcon_Side_Iansan.png", SearchOption.TopDirectoryOnly).ToList(); - sideImageFiles.AddRange(sideImageFiles2); - List sideImageFiles3 = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "UI_AvatarIcon_Side_AmborCostumeWic.png", SearchOption.TopDirectoryOnly).ToList(); - sideImageFiles.AddRange(sideImageFiles3); - List sideImageFiles4 = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "UI_AvatarIcon_Side_Ambor.png", SearchOption.TopDirectoryOnly).ToList(); - sideImageFiles.AddRange(sideImageFiles4); - // List sideImageFiles5 = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "UI_AvatarIcon_Side_XianglingCostumeWinter.png", SearchOption.TopDirectoryOnly).ToList(); - // sideImageFiles.AddRange(sideImageFiles5); - // List sideImageFiles6 = Directory.GetFiles(Path.Combine(BaseDir, SideSrcTransportDir), "UI_AvatarIcon_Side_Mavuika.png", SearchOption.TopDirectoryOnly).ToList(); - // sideImageFiles.AddRange(sideImageFiles6); // 生成训练集 - GenTo(sideImageFiles, Path.Combine(BaseDir, @"dateset\train"), 200); + GenTo(newList, Path.Combine(OutputDir, @"dateset\train"), 200); // 生成测试集 - GenTo(sideImageFiles, Path.Combine(BaseDir, @"dateset\test"), 40); - // GenTo(new List { sideImageFiles[1] }, Path.Combine(BaseDir, @"dateset\test"), 1); + GenTo(newList, Path.Combine(OutputDir, @"dateset\test"), 40); + // GenTo(new List { newList[1] }, Path.Combine(BaseDir, @"dateset\test"), 1); } static void GenTo(List sideImageFiles, string dataFolder, int count) @@ -79,11 +77,14 @@ public class AvatarClassifyTransparentGen for (int i = 0; i < count; i++) { // 随机挑选一张背景图像 - string backgroundImageFile = Path.Combine(BackgroundDir, Directory.GetFiles(BackgroundDir, "*.png")[Rd.Next(Directory.GetFiles(BackgroundDir, "*.png").Length)]); + string backgroundImageFile = Path.Combine(BackgroundDir, + Directory.GetFiles(BackgroundDir, "*.png")[ + Rd.Next(Directory.GetFiles(BackgroundDir, "*.png").Length)]); // 从背景图像中随机取一块 128x128 的区域 Mat backgroundImage = Cv2.ImRead(backgroundImageFile, ImreadModes.Color); - Rect backgroundRect = new Rect(Rd.Next(backgroundImage.Width - 128), new Random().Next(backgroundImage.Height - 128), 128, 128); + Rect backgroundRect = new Rect(Rd.Next(backgroundImage.Width - 128), + new Random().Next(backgroundImage.Height - 128), 128, 128); Mat backgroundImageRegion = backgroundImage[backgroundRect]; // 随机平移、缩放保留区域 @@ -100,9 +101,11 @@ public class AvatarClassifyTransparentGen // Cv2.ImShow("resizedSideImage", resizedSideImage); var resizedMaskImage = new Mat(); // Cv2.Threshold(alphaChannel, alphaChannel, 200, 255, ThresholdTypes.Otsu); - Cv2.Resize(~ alphaChannel, resizedMaskImage, new Size(128 * scale, 128 * scale), 0, 0, InterpolationFlags.Cubic); + Cv2.Resize(~ alphaChannel, resizedMaskImage, new Size(128 * scale, 128 * scale), 0, 0, + InterpolationFlags.Cubic); var resizedAlphaChannel = new Mat(); - Cv2.Resize(alphaChannel, resizedAlphaChannel, new Size(128 * scale, 128 * scale), 0, 0, InterpolationFlags.Cubic); + Cv2.Resize(alphaChannel, resizedAlphaChannel, new Size(128 * scale, 128 * scale), 0, 0, + InterpolationFlags.Cubic); // Cv2.ImShow("resizedMaskImage", resizedMaskImage); // generatedImage[transformedRect] = resizedSideImage; @@ -119,7 +122,8 @@ public class AvatarClassifyTransparentGen int offsetY = Rd.Next(-ySpace, 0); Debug.WriteLine($"{sideImageFileName} 缩放{scale}大于1 偏移 ({offsetX},{offsetY})"); - var roi = new Rect((resizedSideImage.Width - 128) / 2 + offsetX, (resizedSideImage.Height - 128) + offsetY, 128, 128); + var roi = new Rect((resizedSideImage.Width - 128) / 2 + offsetX, + (resizedSideImage.Height - 128) + offsetY, 128, 128); // result = new Mat(); // Cv2.BitwiseAnd(backgroundImageRegionClone, backgroundImageRegionClone, result, resizedMaskImage[roi]); result = Mul(backgroundImageRegionClone, resizedAlphaChannel[roi]); @@ -133,7 +137,8 @@ public class AvatarClassifyTransparentGen int offsetY = Rd.Next(-ySpace, 0); Debug.WriteLine($"{sideImageFileName} 缩放{scale}小于等于1 偏移 ({offsetX},{offsetY})"); - var roi = new Rect((128 - resizedSideImage.Width) / 2 + offsetX, (128 - resizedSideImage.Height) + offsetY, resizedSideImage.Width, resizedSideImage.Height); + var roi = new Rect((128 - resizedSideImage.Width) / 2 + offsetX, + (128 - resizedSideImage.Height) + offsetY, resizedSideImage.Width, resizedSideImage.Height); var res = new Mat(); // Cv2.BitwiseAnd(backgroundImageRegionClone[roi], backgroundImageRegionClone[roi], res, resizedMaskImage); res = Mul(backgroundImageRegionClone[roi], resizedAlphaChannel); @@ -155,6 +160,7 @@ public class AvatarClassifyTransparentGen { Cv2.Multiply(channels[i], ~ alphaChannel, channels[i], 1 / 255.0); } + Mat result = new Mat(); Cv2.Merge(channels[..3], result); return result; @@ -162,19 +168,19 @@ public class AvatarClassifyTransparentGen } // 在类中添加以下新方法 - public static void AdjustTransparency(float targetAlpha = 0.5f) + public static List AdjustTransparency(List sideImageFiles, float targetAlpha = 0.5f) { - string sourcePath = Path.Combine(BaseDir, SideSrcDir); - string destinationPath = Path.Combine(BaseDir, SideSrcTransportDir); + List newSideImageFiles = []; + string destinationPath = Path.Combine(OutputDir, SideSrcTransportDir); Directory.CreateDirectory(destinationPath); - List sideImageFiles = Directory.GetFiles(sourcePath, "*.png", SearchOption.TopDirectoryOnly).ToList(); foreach (string sideImageFile in sideImageFiles) { string fileName = Path.GetFileName(sideImageFile); string destFile = Path.Combine(destinationPath, fileName); + newSideImageFiles.Add(destFile); Mat image = Cv2.ImRead(sideImageFile, ImreadModes.Unchanged); Mat[] channels = Cv2.Split(image); @@ -197,5 +203,6 @@ public class AvatarClassifyTransparentGen } Console.WriteLine($"已完成透明度调整,结果保存在 {destinationPath}"); + return newSideImageFiles; } -} +} \ No newline at end of file