From abd823c4b51ca604098c6ebfb766fe12d60c739b Mon Sep 17 00:00:00 2001 From: Takaranoao Date: Mon, 12 May 2025 22:38:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E5=A0=86ocr=E7=9A=84bug=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20(#1575)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * NormalizeToTensorDnn 优化,可能会有精度损失 * 修复 OCR 强制使用CPU时还会使用GPU缓存模型的问题 * Refactor OCR engine namespaces and improve resource management in Det class * ocr预热图换成彩色多行文本,热的更彻底。 * BgiYoloPredictor 的 析构函数 * 修复TensorRT下使用CPU OCR的情况下TensorRT缓存被错误命中的问题 * 重构OCR初始化,避免cultureInfoName改变导致的预热失效 * 删掉之前的资源文件 * 修复优化模型的路径设置错误 --- .../Assets/Model/PaddleOCR/test_ocr.png | Bin 1080 -> 0 bytes .../Assets/Model/PaddleOCR/test_pp_ocr.png | Bin 0 -> 126994 bytes .../Core/Recognition/OCR/OcrFactory.cs | 57 ++++++-- .../OCR/engine/OcrOperationImpl.cs | 41 ------ .../Core/Recognition/OCR/engine/OcrUtils.cs | 66 ++++++---- .../OCR/engine/OcrVersionConfig.cs | 6 +- .../Recognition/OCR/engine/data/OcrImgMode.cs | 5 +- .../OCR/engine/data/OcrMatOrder.cs | 9 +- .../OCR/engine/data/OcrNormalizeImage.cs | 5 +- .../Recognition/OCR/engine/data/OcrShape.cs | 4 +- .../Core/Recognition/OCR/paddle/Det.cs | 10 +- .../OCR/paddle/PaddleOcrService.cs | 25 ++-- .../Core/Recognition/OCR/paddle/Rec.cs | 9 +- .../Core/Recognition/ONNX/BgiOnnxFactory.cs | 124 ++++++------------ .../Core/Recognition/ONNX/BgiYoloPredictor.cs | 7 +- .../ONNX/SVTR/PickTextInference.cs | 2 +- .../ViewModel/MainWindowViewModel.cs | 34 +++-- 17 files changed, 201 insertions(+), 203 deletions(-) delete mode 100644 BetterGenshinImpact/Assets/Model/PaddleOCR/test_ocr.png create mode 100644 BetterGenshinImpact/Assets/Model/PaddleOCR/test_pp_ocr.png delete mode 100644 BetterGenshinImpact/Core/Recognition/OCR/engine/OcrOperationImpl.cs diff --git a/BetterGenshinImpact/Assets/Model/PaddleOCR/test_ocr.png b/BetterGenshinImpact/Assets/Model/PaddleOCR/test_ocr.png deleted file mode 100644 index 8a70bd7d250f26828812fe75dc751997194b2998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmZvcaY!3i9LKYkL2afP2$_vpM8p%fm|mQV+z`iFo6UJ?w$eYGxVTfJ7Hk3+m>dh0 z4U=1G!Nil?Wy$ofk^j1+8M?z@X-+ZMGxm>;fh_f}celUR!MT5q9cJ&s#`eeV!QJD% z55M2<`}@9kcR#xRe)C1!MU%@N4U_4mHaK@(fG^X}g->ppOy}#PBk$c@c=@-- zABWD}`|{f3cmACE<8>Q4@Z;3_h-Ty8Sa!)zztj2kcUkq<8)uVGHpjF`Z(}jrSN|3R zv+AR_wWoLsv+U8jdl;c4&jrX}3zgBA6z65e!Ytn+x$NN>r>`-|3?)@ddqeU85cIX2 zmgC-XclhHrVtXA(ludO;xI(41|SBweno`_%Uf!d{&ZCKVjq@K4eQUb%)~G zgz3yssZa)ldx;>(RBj)j6lYg@or4T3(xM20ut0Q48=$yJF8c~)qb9~TtjIi;so@TU z7ON{w4X~=_ji5cJYei9jxesbG0S?OQ4=5(l^4#>aQ6+~`=_vfZNU`EE2(HAE+Ym;v z^pKCUdrz#XTui>|!l4=_)6~jr!vdbKh*CvL zE<9vy;800$R}O(+D#X`X61r%X*nK-$%ttG$)RVnEfcp6~eu9J}y_T+UR|hhsBr-wR z)ZfQ(Cq6z5q*+*M8$q^_{a8Ce4yrSx2W!{1pxD=tNBFK2u_De6HRyJ`F+7COojpv^ z&_a6n%oxQD;Vyhb`S69+Y;H|iv;lVkHL#@y1g8OHp4m>)4c%pM>j4NA^7$GJ_>e;j z`I;{jufZ& zp6L}LUGg0%R~$y(&OzukEyhF^1B->4GbO07{G14g3rr>kkM5!i5dX0|YICbw;~}d= zXo(_pB3W#b2z5sN9uIf}@#r^n*5~lHNFrDSA;5|x7p>%C(9l`(q5g$8po|?U$f3`n zApX-tj+dka+ezWeS2KzuHHHP)De$f;yv1W9iGkloBv$b d|GmTY^Pi*g@Y(*k4da(EdhPnigDanX^%t4DD7XLs diff --git a/BetterGenshinImpact/Assets/Model/PaddleOCR/test_pp_ocr.png b/BetterGenshinImpact/Assets/Model/PaddleOCR/test_pp_ocr.png new file mode 100644 index 0000000000000000000000000000000000000000..066f6305b41092a86ccea94a5c58f72285f2ed4a GIT binary patch literal 126994 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 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/Core/Recognition/OCR/OcrFactory.cs b/BetterGenshinImpact/Core/Recognition/OCR/OcrFactory.cs index dc82f453..7bf1c574 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/OcrFactory.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/OcrFactory.cs @@ -1,31 +1,72 @@ using System; +using System.Collections.Concurrent; +using System.Collections.Generic; using System.Threading.Tasks; +using BetterGenshinImpact.GameTask; +using Microsoft.Extensions.Logging; namespace BetterGenshinImpact.Core.Recognition.OCR; public class OcrFactory { // public static IOcrService Media = Create(OcrEngineTypes.Media); - public static IOcrService Paddle { get; private set; } = Create(OcrEngineTypes.Paddle); + private static readonly ILogger Logger = App.GetLogger(); - public static IOcrService Create(OcrEngineTypes type, string? cultureInfoName = null) + public static IOcrService Paddle => _ocrServices.TryGetValue(OcrEngineTypes.Paddle, out var value) + ? value.Value + : CreateAndSet(OcrEngineTypes.Paddle, TaskContext.Instance().Config.OtherConfig.GameCultureInfoName).Value; + + /// + /// 保存着OcrEngineTypes和cultureInfoName与IOcrService + /// + private static readonly ConcurrentDictionary> + _ocrServices = new(); + + /// + /// 创建并设置 + /// + /// OcrEngineTypes + /// 文化名称 + /// cultureInfoName与IOcrService的pair + /// 如果不能创建 + private static KeyValuePair CreateAndSet(OcrEngineTypes type, string cultureInfoName) { - return type switch + var result = type switch { - OcrEngineTypes.Paddle => new PaddleOcrService(cultureInfoName), + OcrEngineTypes.Paddle => new KeyValuePair(cultureInfoName, + new PaddleOcrService(cultureInfoName)), _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) }; + Logger.LogDebug("为 {CultureInfoName} 创建了类型为 {Type} 的 OCR服务", result.Key, result.Value); + _ocrServices[type] = result; + return result; } - public static async Task ChangeCulture(string cultrueInfoName) + private static string? GetCultureInfoName(OcrEngineTypes type) + { + return _ocrServices.TryGetValue(type, out KeyValuePair value) ? value.Key : null; + } + + public static async Task ChangeCulture(string cultureInfoName) { await Task.Run(() => { - lock (Paddle) + foreach (var ocrEngineTypes in Enum.GetValues()) { - Paddle = Create(OcrEngineTypes.Paddle, cultrueInfoName); - GC.Collect(); + try + { + // 避免重复创建OCR服务实例 + if (GetCultureInfoName(ocrEngineTypes) != cultureInfoName) + { + CreateAndSet(ocrEngineTypes, cultureInfoName); + } + } + catch (ArgumentOutOfRangeException) + { + } } + + GC.Collect(); }); } } \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrOperationImpl.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrOperationImpl.cs deleted file mode 100644 index 80217718..00000000 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrOperationImpl.cs +++ /dev/null @@ -1,41 +0,0 @@ -using OpenCvSharp; - -namespace BetterGenshinImpact.Core.Recognition.OCR.engine; - -/// -/// 实现PPOCR的自定义操作,代码翻自python -/// -public class OcrOperationImpl -{ - /// - /// 不支持 chw 之类的顺序 - /// https://github.com/PaddlePaddle/PaddleOCR/blob/0ee4094988c568077bba35ddb239030ced1ff270/ppocr/data/imaug/operators.py#L62 - /// - public static Mat NormalizeImageOperation(Mat data, - float? scale, // scale float32 - float[]? mean, //mean - float[]? std //std - ) - { - scale ??= 0.00392156862745f; - mean ??= [0.485f, 0.456f, 0.406f]; - std ??= [0.229f, 0.224f, 0.225f]; - var result = new Mat(); - data.ConvertTo(result, MatType.CV_32FC3, (double)scale); - Mat[] bgr = []; - try - { - bgr = result.Split(); - for (var i = 0; i < bgr.Length; ++i) - bgr[i].ConvertTo(bgr[i], MatType.CV_32FC1, 1 / std[i], (0.0 - mean[i]) / std[i]); - - Cv2.Merge(bgr, result); - } - finally - { - foreach (var channel in bgr) channel.Dispose(); - } - - return result; - } -} \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrUtils.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrUtils.cs index f8271b68..620c7190 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrUtils.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrUtils.cs @@ -2,14 +2,13 @@ using System; using System.Buffers; using System.Collections.Generic; using System.Linq; -using BetterGenshinImpact.Core.Recognition.OCR.engine; -using BetterGenshinImpact.Core.Recognition.OCR.paddle.data; +using BetterGenshinImpact.Core.Recognition.OCR.engine.data; using BetterGenshinImpact.Core.Recognition.OpenCv; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using OpenCvSharp.Dnn; -namespace BetterGenshinImpact.Core.Recognition.OCR; +namespace BetterGenshinImpact.Core.Recognition.OCR.engine; public static class OcrUtils { @@ -48,7 +47,7 @@ public static class OcrUtils } /// - /// 用于Det模型 + /// 用于Det模型 /// 归一化,标准化并返回Tensor。 ///
/// 归一化:固定范围归一化 @@ -63,51 +62,69 @@ public static class OcrUtils out IMemoryOwner tensorMemoryOwner, bool swapRb = false, bool crop = false, Size size = default) { + scale ??= 0.00392156862745f; + mean ??= [0.485f, 0.456f, 0.406f]; + std ??= [0.229f, 0.224f, 0.225f]; using var rt = new ResourcesTracker(); // 获取图像参数 var channels = src.Channels(); if (channels != 3) throw new ArgumentException($"图像通道数必须为3,当前为{channels}"); - var data = rt.T(OcrOperationImpl.NormalizeImageOperation(src, scale, mean, std)); + // var data = rt.T(OcrOperationImpl.NormalizeImageOperation(src, scale, mean, std)); + var stdMat = rt.NewMat(); + Mat[] bgr = []; + try + { + bgr = src.Split(); + for (var i = 0; i < bgr.Length; ++i) + bgr[i].ConvertTo(bgr[i], MatType.CV_32FC1, 1 / std[i], + (0.0 - mean[i]) / std[i] / (float)scale); + Cv2.Merge(bgr, stdMat); + } + finally + { + foreach (var channel in bgr) channel.Dispose(); + } + + //stdMat.GetArray(out var data); // 使用DNN模块创建blob var blob = rt.T(CvDnn.BlobFromImage( - data, - 1.0, + stdMat, + (double)scale, size, default, swapRb, crop )); + // 租用内存并复制数据 - var total = blob.Total(); - tensorMemoryOwner = MemoryPool.Shared.Rent((int)total); + var total = (int)blob.Total(); + tensorMemoryOwner = MemoryPool.Shared.Rent(total); blob.AsSpan().CopyTo(tensorMemoryOwner.Memory.Span); // 计算输出形状 return new DenseTensor( - tensorMemoryOwner.Memory[..(int)total], - new[] { 1, channels, data.Rows, data.Cols } + tensorMemoryOwner.Memory[..total], + new[] { 1, channels, stdMat.Rows, stdMat.Cols } ); } /// /// 不支持通道转换 - ///
- /// 用于PP-OCR的Rec模型,调整大小之后再归一化到-1~1,之后转换为Tensor + ///
+ /// 用于PP-OCR的Rec模型,调整大小之后再归一化到-1~1,之后转换为Tensor ///
- public static Tensor resize_norm_img(Mat img, OcrShape image_shape, + public static Tensor ResizeNormImg(Mat img, OcrShape imageShape, out IMemoryOwner tensorMemoryOwner, bool padding = true, InterpolationFlags interpolation = InterpolationFlags.Linear) { using var rt = new ResourcesTracker(); - var imgC = image_shape.Channel; - var imgH = image_shape.Height; - var imgW = image_shape.Width; + // var imgC = imageShape.Channel; + var imgH = imageShape.Height; + var imgW = imageShape.Width; var h = img.Height; var w = img.Width; - int resized_w; - var resizedImage = rt.NewMat(); if (!padding) { @@ -117,8 +134,8 @@ public static class OcrUtils else { var ratio = w / (double)h; - resized_w = Math.Ceiling(imgH * ratio) > imgW ? imgW : (int)Math.Ceiling(imgH * ratio); - Cv2.Resize(img, resizedImage, new Size(resized_w, imgH), 0, 0, interpolation); + var resizedW = Math.Ceiling(imgH * ratio) > imgW ? imgW : (int)Math.Ceiling(imgH * ratio); + Cv2.Resize(img, resizedImage, new Size(resizedW, imgH), 0, 0, interpolation); } /* @@ -126,7 +143,7 @@ public static class OcrUtils resized_image -= 0.5 resized_image /= 0.5 */ - // 归一化 + // 归一化到 +-1 // resizedImage.ConvertTo(resizedImage, MatType.CV_32F, 2 / 255f, 1); var blob = rt.T(CvDnn.BlobFromImage( resizedImage, @@ -166,15 +183,12 @@ public static class OcrUtils public static Mat Tensor2Mat(Tensor tensor) { var dimensions = tensor.Dimensions; - if (dimensions.Length !=4 || dimensions[0] != 1 || dimensions[1] != 1) - { + if (dimensions.Length != 4 || dimensions[0] != 1 || dimensions[1] != 1) throw new ArgumentException($"wrong tensor shape: {string.Join(",", dimensions.ToArray())}"); - } if (tensor is not DenseTensor denseTensor) return Mat.FromPixelData(dimensions[2], dimensions[3], MatType.CV_32FC1, tensor.ToArray()); var mat = new Mat(new Size(dimensions[3], dimensions[2]), MatType.CV_32FC1); denseTensor.Buffer.Span.CopyTo(mat.AsSpan()); return mat; - } } \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrVersionConfig.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrVersionConfig.cs index d0c6c58d..3e0f5d84 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrVersionConfig.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/engine/OcrVersionConfig.cs @@ -1,9 +1,9 @@ -using BetterGenshinImpact.Core.Recognition.OCR.paddle.data; +using BetterGenshinImpact.Core.Recognition.OCR.engine.data; -namespace BetterGenshinImpact.Core.Recognition.OCR; +namespace BetterGenshinImpact.Core.Recognition.OCR.engine; /// -/// ppocr的版本配置 +/// ppocr的版本配置 /// public readonly record struct OcrVersionConfig( string Name, diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrImgMode.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrImgMode.cs index 7d734627..f89f09b2 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrImgMode.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrImgMode.cs @@ -1,6 +1,7 @@ -namespace BetterGenshinImpact.Core.Recognition.OCR; +namespace BetterGenshinImpact.Core.Recognition.OCR.engine.data; + /// -/// 图像的颜色顺序 +/// 图像的颜色顺序 /// public enum OcrImgMode { diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrMatOrder.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrMatOrder.cs index 28f5a899..908f5e4b 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrMatOrder.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrMatOrder.cs @@ -1,8 +1,9 @@ -namespace BetterGenshinImpact.Core.Recognition.OCR; +namespace BetterGenshinImpact.Core.Recognition.OCR.engine.data; + /// -/// Mat的通道顺序 -/// hwc: height width channel -/// chw: channel height width +/// Mat的通道顺序 +/// hwc: height width channel +/// chw: channel height width /// public enum OcrMatOrder { diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrNormalizeImage.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrNormalizeImage.cs index b5077403..20992bd2 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrNormalizeImage.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrNormalizeImage.cs @@ -1,5 +1,6 @@ -namespace BetterGenshinImpact.Core.Recognition.OCR; +namespace BetterGenshinImpact.Core.Recognition.OCR.engine.data; + /// -/// 标准归一化的三个参数 +/// 标准归一化的三个参数 /// public record OcrNormalizeImage(float Scale, float[] Mean, float[] Std); \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrShape.cs b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrShape.cs index 82bfe847..cbdf1c37 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrShape.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/engine/data/OcrShape.cs @@ -1,6 +1,6 @@ -namespace BetterGenshinImpact.Core.Recognition.OCR.paddle.data; +namespace BetterGenshinImpact.Core.Recognition.OCR.engine.data; /// -/// 图像形状表示 +/// 图像形状表示 /// public readonly record struct OcrShape(int Channel, int Width, int Height); \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/OCR/paddle/Det.cs b/BetterGenshinImpact/Core/Recognition/OCR/paddle/Det.cs index e41af092..2fb4010c 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/paddle/Det.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/paddle/Det.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using BetterGenshinImpact.Core.Recognition.OCR.engine; using BetterGenshinImpact.Core.Recognition.ONNX; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; @@ -15,7 +16,7 @@ public class Det public Det(BgiOnnxModel model, OcrVersionConfig config) { _config = config; - _session = BgiOnnxFactory.Instance.CreateInferenceSession(model,true); + _session = BgiOnnxFactory.Instance.CreateInferenceSession(model, true); } /// Gets or sets the maximum size for resizing the input image. @@ -38,7 +39,10 @@ public class Det ~Det() { - _session.Dispose(); + lock (_session) + { + _session.Dispose(); + } } public RotatedRect[] Run(Mat src) @@ -124,7 +128,7 @@ public class Det if (output.ValueType is not OnnxValueType.ONNX_TYPE_TENSOR) throw new Exception($"Unexpected output tensor value type: {output.ValueType}"); var outputTensor = output.AsTensor(); - return OcrUtils.Tensor2Mat(tensor: outputTensor); + return OcrUtils.Tensor2Mat(outputTensor); // 因为一个已知bug,tensor中内存在dml下使用完后会被释放掉,锁之外的代码会报错 } } diff --git a/BetterGenshinImpact/Core/Recognition/OCR/paddle/PaddleOcrService.cs b/BetterGenshinImpact/Core/Recognition/OCR/paddle/PaddleOcrService.cs index a208eb56..a55507f8 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/paddle/PaddleOcrService.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/paddle/PaddleOcrService.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using System.Linq; using BetterGenshinImpact.Core.Config; +using BetterGenshinImpact.Core.Recognition.OCR.engine; using BetterGenshinImpact.Core.Recognition.OCR.paddle; using BetterGenshinImpact.Core.Recognition.ONNX; using OpenCvSharp; @@ -17,29 +18,29 @@ public class PaddleOcrService : IOcrService /// 模型列表: /// https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/models_list.md ///
- private readonly Det localDetModel; + private readonly Det _localDetModel; - private readonly Rec localRecModel; + private readonly Rec _localRecModel; - public PaddleOcrService(string? cultureInfoName = null) + public PaddleOcrService(string cultureInfoName) { var path = Global.Absolute(@"Assets\Model\PaddleOcr"); switch (cultureInfoName) { case "zh-Hant": - localDetModel = new Det(BgiOnnxModel.PaddleOcrChDet, OcrVersionConfig.PpOcrV4); - localRecModel = new Rec(BgiOnnxModel.PaddleOcrChtRec, Path.Combine(path, "chinese_cht_dict.txt"), + _localDetModel = new Det(BgiOnnxModel.PaddleOcrChDet, OcrVersionConfig.PpOcrV4); + _localRecModel = new Rec(BgiOnnxModel.PaddleOcrChtRec, Path.Combine(path, "chinese_cht_dict.txt"), OcrVersionConfig.PpOcrV3); break; case "fr": - localDetModel = new Det(BgiOnnxModel.PaddleOcrEnDet, OcrVersionConfig.PpOcrV3); - localRecModel = new Rec(BgiOnnxModel.PaddleOcrLatinRec, Path.Combine(path, "latin_dict.txt"), + _localDetModel = new Det(BgiOnnxModel.PaddleOcrEnDet, OcrVersionConfig.PpOcrV3); + _localRecModel = new Rec(BgiOnnxModel.PaddleOcrLatinRec, Path.Combine(path, "latin_dict.txt"), OcrVersionConfig.PpOcrV3); break; default: - localDetModel = new Det(BgiOnnxModel.PaddleOcrChDet, OcrVersionConfig.PpOcrV4); - localRecModel = new Rec(BgiOnnxModel.PaddleOcrChRec, Path.Combine(path, "ppocr_keys_v1.txt"), + _localDetModel = new Det(BgiOnnxModel.PaddleOcrChDet, OcrVersionConfig.PpOcrV4); + _localRecModel = new Rec(BgiOnnxModel.PaddleOcrChRec, Path.Combine(path, "ppocr_keys_v1.txt"), OcrVersionConfig.PpOcrV4); break; @@ -73,7 +74,7 @@ public class PaddleOcrService : IOcrService /// public string OcrWithoutDetector(Mat mat) { - var str = localRecModel.Run(mat).Text; + var str = _localRecModel.Run(mat).Text; Debug.WriteLine($"PaddleOcrWithoutDetector 结果: {str}"); return str; } @@ -92,7 +93,7 @@ public class PaddleOcrService : IOcrService /// private OcrResult RunAll(Mat src, int recognizeBatchSize = 0) { - var rects = localDetModel.Run(src); + var rects = _localDetModel.Run(src); Mat[] mats = rects.Select(rect => { @@ -102,7 +103,7 @@ public class PaddleOcrService : IOcrService .ToArray(); try { - return new OcrResult(localRecModel.Run(mats, recognizeBatchSize) + return new OcrResult(_localRecModel.Run(mats, recognizeBatchSize) .Select((result, i) => new OcrResultRegion(rects[i], result.Text, result.Score)) .ToArray()); } diff --git a/BetterGenshinImpact/Core/Recognition/OCR/paddle/Rec.cs b/BetterGenshinImpact/Core/Recognition/OCR/paddle/Rec.cs index f5fe1cb2..edf546fc 100644 --- a/BetterGenshinImpact/Core/Recognition/OCR/paddle/Rec.cs +++ b/BetterGenshinImpact/Core/Recognition/OCR/paddle/Rec.cs @@ -5,7 +5,8 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; -using BetterGenshinImpact.Core.Recognition.OCR.paddle.data; +using BetterGenshinImpact.Core.Recognition.OCR.engine; +using BetterGenshinImpact.Core.Recognition.OCR.engine.data; using BetterGenshinImpact.Core.Recognition.ONNX; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; @@ -22,7 +23,7 @@ public class Rec public Rec(BgiOnnxModel model, string labelFilePath, OcrVersionConfig config) { _config = config; - _session = BgiOnnxFactory.Instance.CreateInferenceSession(model,true); + _session = BgiOnnxFactory.Instance.CreateInferenceSession(model, true); _labels = File.ReadAllLines(labelFilePath); @@ -95,7 +96,7 @@ public class Rec 3 => src, var x => throw new Exception($"Unexpect src channel: {x}, allow: (1/3/4)") }; - var result = OcrUtils.resize_norm_img(channel3, new OcrShape(3, maxWidth, modelHeight), + var result = OcrUtils.ResizeNormImg(channel3, new OcrShape(3, maxWidth, modelHeight), out var owner); lock (owners) { @@ -162,8 +163,10 @@ public class Rec score += (float)maxVal; sb.Append(OcrUtils.GetLabelByIndex(maxIdx[1], _labels)); } + lastIndex = maxIdx[1]; } + return new OcrRecognizerResult(sb.ToString(), score / sb.Length); }) .ToArray(); diff --git a/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxFactory.cs b/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxFactory.cs index b7303554..feded240 100644 --- a/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxFactory.cs +++ b/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxFactory.cs @@ -19,35 +19,20 @@ public class BgiOnnxFactory : Singleton { private static readonly ILogger Logger = App.GetLogger(); - - public ProviderType[] ProviderTypes { get; } - public int DmlDeviceId { get; } - public int CudaDeviceId { get; } - public bool OptimizedModel { get; } - public bool TrtUseEmbedMode { get; } - public bool EnableCache { get; } - public bool CpuOcr { get; } - /// - /// 缓存模型路径。如果一开始使用缓存就一直使用缓存文件,如果没有使用缓存就一直使用原始模型路径。 - ///
- /// 这样能避免并发加载模型问题。比如使用了未完全构建好的缓存文件,导致模型加载失败。 + /// 缓存模型路径。如果一开始使用缓存就一直使用缓存文件,如果没有使用缓存就一直使用原始模型路径。 + ///
+ /// 这样能避免并发加载模型问题。比如使用了未完全构建好的缓存文件,导致模型加载失败。 ///
- private ConcurrentDictionary _cachedModelPaths = new(); - + private readonly ConcurrentDictionary _cachedModelPaths = new(); public BgiOnnxFactory() { var config = TaskContext.Instance().Config.HardwareAccelerationConfig; - if (config.AutoAppendCudaPath) - { - AppendCudaPath(); - } + if (config.AutoAppendCudaPath) AppendCudaPath(); if (string.IsNullOrWhiteSpace(config.AdditionalPath)) - { AppendPath(config.AdditionalPath.Split(Path.PathSeparator)); - } ProviderTypes = GetProviderType(config.InferenceDevice, CudaDeviceId, DmlDeviceId); OptimizedModel = config.OptimizedModel; @@ -68,9 +53,17 @@ public class BgiOnnxFactory : Singleton CpuOcr); } + public ProviderType[] ProviderTypes { get; } + public int DmlDeviceId { get; } + public int CudaDeviceId { get; } + public bool OptimizedModel { get; } + public bool TrtUseEmbedMode { get; } + public bool EnableCache { get; } + public bool CpuOcr { get; } + /// - /// 根据InferenceDeviceType选择Provider + /// 根据InferenceDeviceType选择Provider /// /// InferenceDeviceType /// cuda设备id @@ -92,7 +85,6 @@ public class BgiOnnxFactory : Singleton SessionOptions? testSession = null; var hasGpu = false; if (!hasGpu && cudaDeviceId >= 0) - { // tensorrt本身包含cuda,设备id也是cuda的id,且比纯cuda效果好很多。 try { @@ -108,10 +100,8 @@ public class BgiOnnxFactory : Singleton { testSession?.Dispose(); } - } if (!hasGpu && dmlDeviceId >= 0) - { // dml效果不如tensorrt,但是比纯cuda稳定性强 try { @@ -128,10 +118,8 @@ public class BgiOnnxFactory : Singleton { testSession?.Dispose(); } - } if (!hasGpu && cudaDeviceId >= 0) - { // cuda优先级比较低,因为跑起来并不太理想。 try { @@ -147,12 +135,8 @@ public class BgiOnnxFactory : Singleton { testSession?.Dispose(); } - } - if (!hasGpu) - { - Logger.LogWarning("[init]GPU自动选择失败,回退到CPU处理"); - } + if (!hasGpu) Logger.LogWarning("[init]GPU自动选择失败,回退到CPU处理"); //无论如何都要加入cpu,一些计算在纯gpu上不被支持或性能很烂 list.Add(ProviderType.Cpu); @@ -163,7 +147,7 @@ public class BgiOnnxFactory : Singleton } /// - /// 自动嗅探并修改path以加载cuda + /// 自动嗅探并修改path以加载cuda /// private static void AppendCudaPath() { @@ -191,10 +175,7 @@ public class BgiOnnxFactory : Singleton { // 体系架构 var architecture = Enum.GetName(RuntimeInformation.ProcessArchitecture); - if (architecture is null) - { - return [s]; - } + if (architecture is null) return [s]; return [ @@ -219,15 +200,12 @@ public class BgiOnnxFactory : Singleton } /// - /// 将附加的path应用进来 + /// 将附加的path应用进来 /// /// 附加的path字符串 private static void AppendPath(string[] extraPath) { - if (extraPath.Length <= 0) - { - return; - } + if (extraPath.Length <= 0) return; var pathVariables = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process) ?.Split(Path.PathSeparator).ToList() ?? new List(); @@ -244,17 +222,14 @@ public class BgiOnnxFactory : Singleton } /// - /// 根据模型创建一个YoloPredictor + /// 根据模型创建一个YoloPredictor /// /// 模型 /// BgiYoloPredictor public BgiYoloPredictor CreateYoloPredictor(BgiOnnxModel model) { Logger.LogDebug("[Yolo]创建yolo预测器,模型: {ModelName}", model.Name); - if (!EnableCache) - { - return new BgiYoloPredictor(model, model.ModalPath, CreateSessionOptions(model, false)); - } + if (!EnableCache) return new BgiYoloPredictor(model, model.ModalPath, CreateSessionOptions(model, false)); var cached = GetCached(model); return cached == null @@ -263,7 +238,7 @@ public class BgiOnnxFactory : Singleton } /// - /// 根据模型创建一个onnx运行时的InferenceSession + /// 根据模型创建一个onnx运行时的InferenceSession /// /// 模型 /// 是否是用于ocr的模型,默认false @@ -272,42 +247,33 @@ public class BgiOnnxFactory : Singleton { Logger.LogDebug("[ONNX]创建推理会话,模型: {ModelName}", model.Name); ProviderType[]? providerTypes = null; - if (CpuOcr && ocr) - { - providerTypes = [ProviderType.Cpu]; - } + if (CpuOcr && ocr) providerTypes = [ProviderType.Cpu]; if (!EnableCache) - { return new InferenceSession(model.ModalPath, CreateSessionOptions(model, false, providerTypes)); - } - var cached = GetCached(model); + var cached = GetCached(model, providerTypes); return cached == null ? new InferenceSession(model.ModalPath, CreateSessionOptions(model, true, providerTypes)) : new InferenceSession(cached, CreateSessionOptions(model, false, providerTypes)); } /// - /// 获取带有缓存的模型(目前只支持TensorRT) + /// 获取带有缓存的模型(目前只支持TensorRT) /// /// 模型 + /// 强制使用的 providerTypes /// 带有缓存的模型绝对路径,null表示尚未创建缓存 - private string? GetCached(BgiOnnxModel model) + private string? GetCached(BgiOnnxModel model, ProviderType[]? forcedProvider = null) { + var providerTypes = forcedProvider ?? ProviderTypes; // 目前只支持TensorRT - if (!ProviderTypes.Contains(ProviderType.TensorRt)) return null; + if (!providerTypes.Contains(ProviderType.TensorRt)) return null; var result = _cachedModelPaths.GetOrAdd(model, _GetCached); - if (result is null) - { - return result; - } + if (result is null) return result; // 判断文件是否存在 - if (File.Exists(result)) - { - return result; - } + if (File.Exists(result)) return result; Logger.LogWarning("[ONNX]模型 {Model} 的缓存文件可能已被删除,使用原始模型文件。", model.Name); return null; @@ -317,10 +283,8 @@ public class BgiOnnxFactory : Singleton { if (model.ModelRelativePath.StartsWith(BgiOnnxModel.ModelCacheRelativePath) && model.ModelRelativePath.EndsWith("_ctx.onnx")) - { // 这已经是带有缓存的文件路径了 return model.ModalPath; - } var ctxA = Path.Combine(model.CachePath, "trt", "_ctx.onnx"); if (File.Exists(ctxA)) @@ -343,8 +307,8 @@ public class BgiOnnxFactory : Singleton /// - /// 通过模型路径生成SessionOptions
- /// 如果加载的模型文件已经是带有缓存的模型,请将cacheFolder设为null避免重复生成。 + /// 通过模型路径生成SessionOptions
+ /// 如果加载的模型文件已经是带有缓存的模型,请将cacheFolder设为null避免重复生成。 ///
/// 模型路径 /// 是否生成缓存。有几种情况下不生成缓存:1为用户主动关闭,即enableCache为false。2为即将加载的模型文件已经是带有缓存的模型文件。 @@ -356,7 +320,6 @@ public class BgiOnnxFactory : Singleton var sessionOptions = new SessionOptions(); foreach (var type in forcedProvider is null || forcedProvider.Length == 0 ? ProviderTypes : forcedProvider) - { try { switch (type) @@ -395,23 +358,18 @@ public class BgiOnnxFactory : Singleton Logger.LogError("无法加载指定的 ONNX provider {Provider},跳过。请检查推理设备配置是否正确。({Err})", Enum.GetName(type), e.Message); } - } if (!OptimizedModel) return sessionOptions; if (!genCache) return sessionOptions; var optPath = Path.Combine(path.CachePath, "optimized"); - if (!Directory.Exists(optPath)) - { - Directory.CreateDirectory(optPath); - } - - sessionOptions.OptimizedModelFilePath = optPath; + if (!Directory.Exists(optPath)) Directory.CreateDirectory(optPath); + sessionOptions.OptimizedModelFilePath = Path.Combine(optPath, Path.GetFileName(path.ModalPath)); return sessionOptions; } /// - /// 获取TensorRT的配置 + /// 获取TensorRT的配置 /// /// 缓存生成的目录 /// trt配置 @@ -422,7 +380,7 @@ public class BgiOnnxFactory : Singleton // 不使用缓存目录 var r = new Dictionary { - ["device_id"] = CudaDeviceId.ToString(), + ["device_id"] = CudaDeviceId.ToString() }; return r; } @@ -438,7 +396,7 @@ public class BgiOnnxFactory : Singleton ["trt_timing_cache_path"] = Global.Absolute(Path.Combine(BgiOnnxModel.ModelCacheRelativePath, "trt_timing")), // ["trt_force_timing_cache"] = "1", - ["device_id"] = CudaDeviceId.ToString(), + ["device_id"] = CudaDeviceId.ToString() }; if (TrtUseEmbedMode) { @@ -451,22 +409,20 @@ public class BgiOnnxFactory : Singleton } if (!Directory.Exists(result["trt_ep_context_file_path"])) - { Directory.CreateDirectory(result["trt_ep_context_file_path"]); - } return result; } /// - /// 获取cuda provider的配置 + /// 获取cuda provider的配置 /// /// cuda配置 private Dictionary GetCudaProviderConfig() { var result = new Dictionary { - ["device_id"] = CudaDeviceId.ToString(), + ["device_id"] = CudaDeviceId.ToString() }; return result; } diff --git a/BetterGenshinImpact/Core/Recognition/ONNX/BgiYoloPredictor.cs b/BetterGenshinImpact/Core/Recognition/ONNX/BgiYoloPredictor.cs index d8db8188..c192b76e 100644 --- a/BetterGenshinImpact/Core/Recognition/ONNX/BgiYoloPredictor.cs +++ b/BetterGenshinImpact/Core/Recognition/ONNX/BgiYoloPredictor.cs @@ -77,4 +77,9 @@ public class BgiYoloPredictor : IDisposable Predictor.Dispose(); } } -} + + ~BgiYoloPredictor() + { + Dispose(); + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/ONNX/SVTR/PickTextInference.cs b/BetterGenshinImpact/Core/Recognition/ONNX/SVTR/PickTextInference.cs index 38fcb3df..5e6f0ee2 100644 --- a/BetterGenshinImpact/Core/Recognition/ONNX/SVTR/PickTextInference.cs +++ b/BetterGenshinImpact/Core/Recognition/ONNX/SVTR/PickTextInference.cs @@ -9,7 +9,7 @@ using System.Diagnostics; using System.IO; using System.Text; using System.Text.Json; -using BetterGenshinImpact.Core.Recognition.OCR; +using BetterGenshinImpact.Core.Recognition.OCR.engine; namespace BetterGenshinImpact.Core.Recognition.ONNX.SVTR; diff --git a/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs b/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs index 865cad01..b2b4067e 100644 --- a/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs +++ b/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs @@ -204,7 +204,8 @@ public partial class MainWindowViewModel : ObservableObject, IViewModel // 低版本才需要迁移 if (fileVersionInfo.FileVersion != null && !Global.IsNewVersion(fileVersionInfo.FileVersion)) { - var res = await MessageBox.ShowAsync("检测到旧的 BetterGI 配置,是否迁移配置并清理旧目录?", "BetterGI", System.Windows.MessageBoxButton.YesNo, MessageBoxImage.Question); + var res = await MessageBox.ShowAsync("检测到旧的 BetterGI 配置,是否迁移配置并清理旧目录?", "BetterGI", + System.Windows.MessageBoxButton.YesNo, MessageBoxImage.Question); if (res == System.Windows.MessageBoxResult.Yes) { // 迁移配置,拷贝整个目录并覆盖 @@ -224,13 +225,14 @@ public partial class MainWindowViewModel : ObservableObject, IViewModel */ private void Patch2() { - List files =[ + List files = + [ Global.Absolute(@"Assets\Map\mainMap256Block_SIFT.kp"), Global.Absolute(@"Assets\Map\mainMap256Block_SIFT.mat"), Global.Absolute(@"Assets\Map\mainMap2048Block_SIFT.kp"), Global.Absolute(@"Assets\Map\mainMap2048Block_SIFT.mat"), ]; - + // 循环删除 foreach (var file in files.Where(File.Exists)) { @@ -246,19 +248,24 @@ public partial class MainWindowViewModel : ObservableObject, IViewModel { try { - string gameCultureInfoName = TaskContext.Instance().Config.OtherConfig.GameCultureInfoName; - await OcrFactory.ChangeCulture(gameCultureInfoName); - var s = OcrFactory.Paddle.Ocr(new Mat(Global.Absolute(@"Assets\Model\PaddleOCR\test_ocr.png"))); + // 现在OCR创建的时候会自己读设置了 + // string gameCultureInfoName = TaskContext.Instance().Config.OtherConfig.GameCultureInfoName; + // await OcrFactory.ChangeCulture(gameCultureInfoName); + var s = OcrFactory.Paddle.Ocr(new Mat(Global.Absolute(@"Assets\Model\PaddleOCR\test_pp_ocr.png"))); Debug.WriteLine("PaddleOcr预热结果:" + s); } catch (Exception e) { Console.WriteLine(e); - _logger.LogError("PaddleOcr预热异常,解决方案:【https://bettergi.com/faq.html】\r\n" + e.Source + "\r\n--" + Environment.NewLine + e.StackTrace + "\r\n---" + Environment.NewLine + e.Message); + _logger.LogError("PaddleOcr预热异常,解决方案:【https://bettergi.com/faq.html】\r\n" + e.Source + "\r\n--" + + Environment.NewLine + e.StackTrace + "\r\n---" + Environment.NewLine + e.Message); var innerException = e.InnerException; if (innerException != null) { - _logger.LogError("PaddleOcr预热内部异常,解决方案:【https://bettergi.com/faq.html】\r\n" + innerException.Source + "\r\n--" + Environment.NewLine + innerException.StackTrace + "\r\n---" + Environment.NewLine + innerException.Message); + _logger.LogError("PaddleOcr预热内部异常,解决方案:【https://bettergi.com/faq.html】\r\n" + + innerException.Source + "\r\n--" + Environment.NewLine + + innerException.StackTrace + "\r\n---" + Environment.NewLine + + innerException.Message); throw innerException; } else @@ -270,8 +277,12 @@ public partial class MainWindowViewModel : ObservableObject, IViewModel } catch (Exception e) { - MessageBox.Warning("PaddleOcr预热失败,解决方案:【https://bettergi.com/faq.html】 \r\n" + e.Source + "\r\n--" + Environment.NewLine + e.StackTrace + "\r\n---" + Environment.NewLine + e.Message); - Process.Start(new ProcessStartInfo("https://bettergi.com/faq.html#%E2%9D%93%E6%8F%90%E7%A4%BA-paddleocr%E9%A2%84%E7%83%AD%E5%A4%B1%E8%B4%A5-%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3") { UseShellExecute = true }); + MessageBox.Warning("PaddleOcr预热失败,解决方案:【https://bettergi.com/faq.html】 \r\n" + e.Source + "\r\n--" + + Environment.NewLine + e.StackTrace + "\r\n---" + Environment.NewLine + e.Message); + Process.Start( + new ProcessStartInfo( + "https://bettergi.com/faq.html#%E2%9D%93%E6%8F%90%E7%A4%BA-paddleocr%E9%A2%84%E7%83%AD%E5%A4%B1%E8%B4%A5-%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3") + { UseShellExecute = true }); } } @@ -290,7 +301,8 @@ public partial class MainWindowViewModel : ObservableObject, IViewModel } catch (Exception e) { - _logger.LogDebug("获取设备ID异常:" + e.Source + "\r\n--" + Environment.NewLine + e.StackTrace + "\r\n---" + Environment.NewLine + e.Message); + _logger.LogDebug("获取设备ID异常:" + e.Source + "\r\n--" + Environment.NewLine + e.StackTrace + "\r\n---" + + Environment.NewLine + e.Message); } // 每个设备只运行一次