hiroi-sora / PaddleOCR-json

OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。提供各种语言API。由 PaddleOCR C++ 编译。
Apache License 2.0
983 stars 129 forks source link

更新gflags + 修bug (#123) #125

Closed Gavin1937 closed 5 months ago

Gavin1937 commented 5 months ago
C:\Users\user\Dev\PaddleOCR-json\cpp\.source\win\paddle_inference\paddle\lib\paddle_inference.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x358 [C:\Users\user\Dev\PaddleOCR-json\cpp\build\PaddleOCR-json.vcxproj]

解决方法也很简单:

https://github.com/hiroi-sora/PaddleOCR-json/blob/fe697e6a8c2226ca32bab0643ef1dd4444e488b3/cpp/CMakeLists.txt#L244-L245

把这行的 CMAKE_SHARED_LIBRARY_SUFFIX 换成 CMAKE_STATIC_LIBRARY_SUFFIX 就行了。 这里是在编译后链接的环节里链接 paddle_inference.lib 而不是 paddle_inference.dll。即使cmake参数设置了 WITH_STATIC_LIB=OFF也得链接静态库paddle_inference.lib,要不然就会出错。

我以前也有遇到MSVC的这个奇怪的行为:即使设置成动态链接,在编译后链接的环节也要链接到一个静态库。当然,MSVC会正常生成动态库,并且软件也需要和动态库放一起才能工作。 在这个项目里,Windows下无论怎么设置WITH_STATIC_LIB都需要动态库,不把paddle_inference文件夹下的动态库放到exe旁边就会报错。

Gavin1937 commented 5 months ago

gflags的double精度设置的很高,所以在将double转成字符串之后就会变得很难看:

    -cls_thresh (Threshold of cls_thresh.) type: double
      default: 0.90000000000000002
    -det_db_box_thresh (Threshold of det_db_box_thresh.) type: double
      default: 0.59999999999999998
    -det_db_thresh (Threshold of det_db_thresh.) type: double
      default: 0.29999999999999999

问题再这里

https://github.com/Gavin1937/gflags/blob/bc7cacf90a02e481a4d0adbe671008aac031838e/src/gflags.cc#L387-L389

它用的是 "%.17g",在这里的意思是:保留小数点后至少17位数。 只需将其改成 "%g",就可以让它保留小数点后尽可能短的位数了。

改完之后长这样:

    -cls_thresh (Threshold of cls_thresh.) type: double default: 0.9
    -det_db_box_thresh (Threshold of det_db_box_thresh.) type: double
      default: 0.6
    -det_db_thresh (Threshold of det_db_thresh.) type: double default: 0.3

我再加个commit把它加上