raoyutian / PaddleOCRSharp

PaddleOCRSarp是一个基于百度飞桨PaddleOCR的C++代码修改并封装的.NET的OCR工具类库。包含文本识别、文本检测、表格识别功能。本项目针对小图识别不准的情况下做了优化,比飞桨原代码识别准确率有所提高。 包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别。同时支持多种文本检测。
Apache License 2.0
588 stars 94 forks source link

框架相关优化 #45

Closed feast107 closed 1 month ago

feast107 commented 2 months ago

框架自适应

在默认情况下,.NET会对框架进行自适应,如当前项目框架定向为 .NET Framework4.0 时,他会自动兼容向上所有的框架,即4.0-4.8, 在中对框架全声明一般用于对于不同框架的不同编译(宏控制)以及区别Nuget包引用。现在.NET有三族:.NET Standard, .NET Framework, .NET.NET Standard 完全支持 .NET, 可参考:(.NET Standard版本族与兼容关系)

TargetFrameworks 声明为

<TargetFrameworks>netstandard2.0;net35</TargetFrameworks>

即可兼容所有的框架

接着对 .NET Standard2.0 引用 System.Drawing.Common 即可对 .NET Standard.NET 族安装该包

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="System.Drawing.Common" />
</ItemGroup>

System.Text.Json

自进入 .NET 以来,微软就已经对 Json 序列化进行了优化,以 Newtonsoft.Json 为参照推出了 System.Text.Json,在 .NET 族,他是内置的。在近乎一致的API风格下,后者拥有更好的性能,更重要的是在 .NET8.0 下支持 NativeAOT,它的作用不言而喻。进行迁移也不需要太多成本:

public static class SerializeExtension{
    public static string Serialize<T>(this T target){
#if NETSTANDARD20
        return System.Text.Json....Serialize(target);
#else
        return Newtonsoft.Json...SerializeObject(target);
#endif
    }
}

想必看到这段,迁移的方案就已经很明了了。

分包?为跨平台做准备?

通常情况下,一个存在Native交互的库会发布多个Nuget包,分为包含托管代码和PInvoke的包,以及实际Native依赖对应系统和架构的包这两种。本库的包是引用和Native打包在一起的。当然从现在的状况来看,本地推理、显卡加速似乎确实只有win-x64这一种环境,但是分包的优点是有利于构建时进行管理,按需对程序集进行组合和剪裁,避免臃肿。

raoyutian commented 2 months ago

谢谢你的建议。