有時候,結果錯並不完全是壞事--至少它讓我們有重新審視演算法的機會,並更加了解AI模型做了什麼和沒做到什麼。 ![](https://hackmd.io/_uploads/HyGpPk_e6.png) 這張圖片是一個使用OpenVINO的範例,它的功能是讀取照片中gauge(中文多稱為儀表)的數值。我們可以簡單想像,如果一間傳統工廠並不想大幅度的更新他們的儀表系統,又想讓AMR進工廠做定時的抄表作業時,這個已經量化過的程式就可能派上用場。 當然,眼尖的各位肯定發現問題了,這個讀值並不準確--實際上或許36.3會比較正確? 發生錯誤時,我們首先檢視演算法:一張照片經過三個步驟來判讀數據,第一個步驟是抽取出包含儀表的區域(SSD);第二個步驟是將指針和刻度標記出來,這會使用到圖像分割技術;第三個步驟就很單純了,把分割完的部分拉平,計算是第幾個刻度。我們使用手動指定刻度的上下限(因OCR本身運算太耗時):上限120下限0,共60個刻度,讓計算加速到可以邊緣部署的等級。 ```mermaid graph LR; 獲取圖片-->SSD切割出區域-->圖像分割出刻度和指針-->計算指針位於第幾個刻度-->輸出數值 ``` 我們看到流程之後首先可以確定,SSD部分肯定是沒有問題的。因此,嘗試檢查圖像分割的部分,我們分別用白色顯示被標記為刻度的像素,並以紅色顯示被標記為指針的像素: ![](https://hackmd.io/_uploads/SkWvFyulp.jpg) 恩,發現問題了,我們注意到在圖片的左下角,也就是圖片中的這個地方: ![](https://hackmd.io/_uploads/HybjK1ug6.png) 這邊由於使用方框代表0刻度,致使實際上的刻度和我們手動指定的有落差,而要修正這個錯誤有幾個方式可以進行: 1. 將影像分割能讀取到的刻度範圍設為上限120下限2,共59個刻度 2. 加入OCR,以區間的方式讀取刻度。以這例子為例就是OCR後,知道指針在20~40間,10個刻度的第8個刻度後一點點。 3. 如果有額外資訊,比方說位置資訊,加上額外的演算法在這類儀表讀取時補上一個刻度 4. 直接把錶面那格塗黑(?) 5. 依靠OCR取出最大最小值的角度,再抓指針的角度內插數據 當然,我們可以依照實際狀況選擇使用哪一種方式來補全這個漏洞,而這就是人類能做GPT很難做到的事情了。