2024-04-28

[Python] 使用 CnOcr 進行辨識時出現在 Windows/Linux 和 MacOSX 的結果不一樣的情況

最近公司的案子有要使用 OCR 辨識,然後技術方面是要用 python 去處理,公司的 RD 就利用 CnOcr 開發了一個程式…

然後最近這個案子的相關成員就跟老闆匯報進度跟問題,在會後老闆就在跟 RD 討論問題的部份,然後老闆就讓 RD 來找在下一起討論,看看我有沒有想法。

這邊遇到的問題是這樣的

因為 RD 在轉交辨識程式給案子其他的開發者時,有一位後端反應該程式運行時有狀況,無法正常辨識…先說明一下,該程式是要辨識表格中的數據,然後回傳某幾欄跟列的值,而遇到問題的後端是運行程式後,最後出現錯誤是『Indexerror: list index out of range』

我說: 這不就很明顯,就是辨識完後的結果並不存在指定的 index 位置
RD說: 是,但這不太可能,同一個程式用同一個模型去辨識同一個檔案,我在自己的環境跑是正常的
我說: 那有確定後端那邊的環境,python 安裝的套件的版本是一樣的嗎?
RD說: 是沒確認過,等等我問問
我說: 那你先把程式跟要辨識的檔案給我一份,我在我的環境用用看
....
我說: 我這邊跑是正常耶
RD說: 剛也跟後端確認過了,套件的版本是一樣的
我說: 後端那邊的系統是?
RD說: Mac電腦
我說: 呃,會是 MacOSX 有什麼特別的?比如 cpu 特別?或支援的指令集不同?
RD說: 這就不太確定了
老闆說: 公司這邊還有一台 Macbook Pro 2019 的,要不試試?
....
我說: 欸,奇了,在這台 Mac 跑也是有問題,而且問題的反饋還跟後端的不完全一樣…後端那邊反饋是應該要返回四個值,但結果是一個都沒有,可是公司這台的結果反而是有辨識到三個
....

好了,上面廢話太多,總之,就是這個 OCR 的辨識程式在 Mac 系統上跑出來的結果就是有問題,而因為該程式在其他環境像 Windows/Linux 跑都是正常的,所以其實其他人當下就放棄去理清 Mac 上為啥會這樣

可是,我覺得有意思,所以,我就在網路翻了兩天的資料,我先補一下其實程式在運行時除了回饋『Indexerror: list index out of range』之外,在之前是還有出現一些套件運行時的警訊

[W:onnxruntime:, coreml_execution_provider.cc:81 GetCapability] CoreMLExecutionProvider::GetCapability number of partitions supported by CoreML: 8 number of nodes in the graph: 232 number of nodes supported by CoreML: 216

是 onnxruntime 這套件所給的訊息,我有問 RD,他說 CnOcr 這套件確實有使用 onnx 的模型,我也查了一下相關的設定,有發現 CnOcr 是可以用 onnx 或 torch 來進行辨識的 engine,預設是 onnx,所以我想說是否會是這個的問題,我試著切換後情況依舊。

所以,我在 onnxruntime 的 github 中的 issue 中翻了翻,其中類似的警告,回答的人大部份都有說應該是 onnxruntime 的版本的關係,建議安裝最新的版本,但當下 Mac 中的 pip 安裝的 onnxruntime 已是最新版了 v1.17.3 了

後來,我就開始在會使用 onnxruntime 套件的套件的 issue 中翻找類似的,我在 deepinsight 中有看到有人詢問『does insightface support CoreML on Mac M1?』時,我才想到我也沒確認一下公司這台 Macbook Pro 2019 的規格,查了一下發現這台還是用 Intel cpu

而我有利用 issue 中有人提供了一個檢查的程式碼,以檢查在當前的環境所安裝的 onnxruntime 可以提供哪些方式,而程式中最用的 onnx 模型有支援哪些方式

以公司的 Macbook Pro 2019 來看,在 onnxruntime v1.17.3 中是有提供 [CoreMLExecutionProvide, CPUExecutionProvider」,而用來運用辨識的模型這兩個也有支援

但該 issue 中,詢問者好像當時是安裝 onnxruntime v1.16.0,而在另外其他有類似狀況的有建議更新 onnxruntime 的版本,好像當時是已經出 v1.17.x 了,而有些人有反應確實更新新版後就正常了

但,我這邊遇到的確是已經有使用新版的 onnxruntime 的情況下是異常的…難不成在 Macbook Pro 2019 這台是要把 onnxruntime 降版嗎?

想到就做,反正試錯嗎,又沒成本問題,所以我就把 Mac 上安裝的 onnxruntime 降版到 V1.16.2 ,然後就直接重跑 RD 的程式試試,結果這次過程中就沒出現 W:onnxruntime 的警告了,而且程式也正常的反饋四個值

然後,我再重新執行前面用來檢查 onnxruntime 提供 [CoreMLExecutionProvider, CPUExecutionProvider」,這時在 v1.16.2 的版本上,就沒出現 CoreMLExecutionProvider 了,只有 CPUExecutionProvider,而之前在 v1.17.3 時會出現的警告也確實是來自 "coreml_execution_provider..."

而奇怪的,我在網路上找到的都是針對 Apple M1, M2 安裝 onnxruntime 的一些要注意的,也都沒說到 Mac 是 INTEL cpu 的…

如果之後有找到 Macbook Pro 2019 INTEL cpu 能以 CoreMLExecutionProvider 的,我會再來更新…

沒有留言: