發表文章

目前顯示的是有「python」標籤的文章

穩健的矩形 OCR 前處理校正技巧 - 特徵點順序校正

圖片
  上個月被派了幾個工項, 其中一個是解我們開單員拍到的車牌照片。 由於我們開單員同仁都是阿伯阿桑, 基本上不太會用 PDA 拍照,所以拍回來的照片都歪歪的。

完美關掉 Python OpenCV 圖片視窗的方法

  相信各位做影像的同行在驗證自己演算法的時候, 總是像我一樣眼見為憑、需要把圖片秀出來對吧?

如何使用 CPP 加速 DCT 運算

圖片
本篇文章來自  想知道網戀對象有沒有修圖嗎?試試看這款修圖偵測機器人!  的續篇, 因為 Python 的方法實在是太慢了,所以我一直在尋求加速的方法。 俗話說得好: 要看一個人怎麼做立委, 就要看他怎麼做立委! 不是,我是說有些人可能不適合做立委、適合做總統! 舉個例子: 拿 Python 去做文字處理就很開心,但是拿 C/CPP 去做文字處理你就準備腦血栓; 反之拿 Python 做數學運算也會慢到中風,但是拿 C/CPP 做數學運算就風馳電掣。 所以我用 CPP 實現了需要數學運算的 DCT 方法, 主要是使用 extern "C" 方法來與 Python 對接,在 Python 那邊設定好輸出入的參數。 這邊比較需要注意的是因為我選用的讀圖方式是 OpenCV 的 CPP 函式庫, 所以寫 Makefile 的時候需要注意把 OpenCV 包進來。 在編譯的過程中 Makefile 也會發生抓不到 g++ 的時候 (想好好編譯真難 😇) 總之做了一點 Soft-link 還有 Dirty work 後終於能正確編譯了。 因為我是用"Single Thread"、"Mask" 的方法來實現 DCT 變換的, 所以讓我們來看看與 Python 版 與 CPP 版 比較效果如何: CPP 版的運算速度比 Python 版快了近六倍, 有夠優質! 相關開源我更新在: https://github.com/wuyiulin/GraphAppBot 想要測試一下這個服務: https://t.me/DynamicGraphApp_bot 如果有任何問題歡迎聯絡我: wuyiulin@gmail.com

想知道網戀對象有沒有修圖嗎?試試看這款修圖偵測機器人!

圖片
  前陣子在咱們一群影像愛好者的群組開始流傳一套程式, 一套號稱能檢測愛情動作片封面詐欺的程式!

Python 寫自動白平衡 - 完美反射核心

圖片
  最近上班遇到一些圖片顏色偏離原色, 身為影像工程從業者就會想自己寫 3A算法來校正。

不均勻光源下的優化 SSIM 演算法

圖片
  這篇是 SSIM 系列第三篇,接續前篇  使用 PyTorch 實做 2D 影像捲積 , 要來談一下 SSIM 如何在不均勻光源下優化 SSIM。

ZLUDA 收官之戰 - 它還只是個孩子啊!

圖片
承上文: ZLUDA 拓荒之路 - 榨乾 Intel CPU 算力的中短期方案   先說結論: ZLUDA 目前在我的環境測試起來並不支援一些好棒棒框架,

ZLUDA 拓荒之路 - 榨乾 Intel CPU 算力的中短期方案

  在開始壞壞之前,我們先了解一下 ZLUDA 是什麼?

使用 PyTorch 實做 2D 影像捲積

圖片
 承上篇: Structural Similarity(SSIM) 的 PyTorch 實現 由於我 3D 影像處理做太多(X) 2D 影像處理還沒有恢復記憶(O) 上次在刻高斯濾波的時候忘記 PyTorch Kit 的 Convolution 一個很重要的特性:

OAK 相機模型轉換方法介紹

圖片
  去年暑假我在公司寫了一支轉換程式, 關於把 YOLOv3, v3Tiny, v4 的 .weight 檔案轉換成 OAK 系列相機能用的 .blob 檔。 主要是公司那邊想用這東西來做物件追蹤,如果成了,就能大幅度的提升效率還有推理速度。 推理速度能提升是因為 OAK 相機是一顆 Edge 裝置, 裡面有類似 GPU 的 VPU,可以理解為裡面插了之前 Intel 推出的神經推理棒晶片, 不用把資料再塞回伺服器推理。 然後就不出意外的出意外了。 主要大概遇到三個階段性問題: 一、無法推理,模型轉換報錯。 二、可以推理,模型推理錯誤。 三、可以推理,Anchor 尺寸錯誤。 一、無法推理,模型轉換報錯: 先講 OAK 這相機的由來,OAK 相機其實是 Openvino 推的硬體,Openvino 背後又是我們偉大的牙膏廠(Intel)。 牙膏廠的文件大家也是知道的。 OAK 相機這東西太新,總之原廠還沒有支援完整的轉換套件,所以依照之前牙膏出的神經推理棒轉換流程去轉會出錯,無法在 OAK 上面執行。 (後來推估原因,應該是轉換凍結模型模型的時候有一些網路層沒轉到。) 我研究後發現,雖然 .weight 檔沒辦法一步轉換成 .blob,但是可以先轉成中繼格式 .pb 再轉成 .blob。 確定這個路線後,程式就分成兩部分: 一、1 將 YOLO 的 .wight 模型還有 .cfg (依賴 COCO資料集)轉成 .pb。 一、2 將 .pb 轉成 .blob。 二、可以推理,模型推理錯誤: 查了一些文件,轉過去後的確是能放在 OAK 相機上面跑,不會報錯, 但是檢測結果很異常。 會有物件框,但是 label 是錯的、Anchor 也不會隨著不同物件變動尺寸。 為了釐清到底是 .pb 出問題,還是 .blob 出問題? 我找了正職的同仁要了一份內部訓練的 .pb 檔案, 也在網路上找了一份確定正常的 .pb 預訓練模型, 將這兩者放入 Openvino 在個人電腦上模擬推理、確認轉換後的模型沒問題。 結果這步驟(一、1)就出錯,推測是轉換時沒有融合到 .cfg 的資訊, 導致  label 與 Anchor 出錯。 後來透過查詢 Github 還有詢問同仁的經驗,才把這部分搞定。 這部分是使用一個將  YOLOv3, v3Tiny...

The Devil is in the Pose: Ambiguity-free 3D Rotation-invariant Learning via Pose-aware Convolution 論文導讀

圖片
  本文建議有點雲特徵的先驗知識者閱讀, 我會盡量講得平易近人, 但仍建議請先參考 此篇 ,先了解基本點雲處理如何處理特徵。 這篇論文的重點在於改變了底層特徵方法。 論文中由這張圖來解釋: 因為現行解決 Rotation Invariant 的方法都是乘上一個矩陣去收集數據, 並沒有考慮點與點之間的結構關係(i.e.上圖笑臉)。 但是我覺得這個例子呈述得很容易誤導, 聽起來很像在解決高低解析度、上下採樣的問題, 實際上在點雲裡面應該是解決類似 KNN 特徵的問題才對。 像是那三個有黑色像素的點,間隔距離、彼此夾角之類的結構關係所產生的資訊。 作者認為現在的 CNN 都沒有抓到結構關係 (Pose) 的精華 (e.g. 點雲中點與點的區域關係 AKA 底層特徵), 所以要提出解決方法稱為 PaRI 的新架構來解決問題 (我猜是 Pose: Ambiguity-free 3D Rotation-invariant 的縮寫)。 舊有的底層特徵方法: 好,那要改進一定得知道改哪裡嘛? 之前別人是怎麼做這種結構特徵的? 答案是:Point Pair Feature(PPF) Point Pair Peature Pr 是參考點,想像成 KNN 的目標點; Pj 是 Pr 附近的鄰居點,有 K 個; ∂n_r 是相較於 r 的三維座標軸,用  gram-schmidt orthogonalization 算出來的, 忘記的同學可以去複習一下 GSO 。 所以經過 PPF 計算,我們會得到一組四個特徵如下圖: 這樣會出個小問題,各位想想好的底層特徵應該要具備什麼特性? 應該要具備獨特性嘛! 因為這樣訓練起來才不會與其他特徵混淆。 仔細觀察 αn 的方程式我們會發現,沒有一條能分辨在這個半徑為 d 的圓圈上, 有若干個法向量相同的  Pj 的辦法。  (∂1_r, ∂1_j 分別代表各自的法向量,ModelNet40資料集會給定。) 改善方法: 在改善之前,我們先想想舊有方法遇到什麼問題? 問題是缺少 Pr 與 Pj 間的獨特特徵,對吧? 所以我們希望新的方法最好讓每個 Pj 對 Pr 有獨特性。 Local Reference Frame(LRF) +   Augmented Point Pa...

一行就寫完 For 迴圈 - Python 列表推導式

  近期因為要趕畢業, 大量參考前人大佬的 CODE,出現一堆列表推導式, 加上 co-worker 學弟有資策會背景,對接的時候他也寫列表推導式, 所以要學怎麼寫列表推導式,並留個紀錄。  先來看一個簡單的例子: [expr0 for i in iterable if expr1] 這種列表推導式等效於: for i in iterable:      if (expr1):           expr0 超棒 想要進階拓展 N 層迴圈? [expr0 for i in iterable for j in iterable if expr1] 沒問題,這種表達式等效於: for i in iterable:     for j in iterable:          if (expr1):               expr0 N 層迴圈也沒問題! 準備好面對真正的難題了嗎? query, key, value = [l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2).contiguous() \ for l, x in zip(self.linears, (query, key, value))] 哇靠這在寫三小? 先讓我們簡化一下程式碼: 把: l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2).contiguous() 改成: l(x) 既然 self.linears 是某種包好的函式,替換成: fs(x) 所以程式被我們簡化成: query, key, value = [l(x) for l, x in zip(fs, (query, key, value))] 讓資料從列表推導式跑過一次: def f(x):     a = x[0]*x[0]     b = x[1]*x[1] ...

TelegramBot :花十分鐘開發聊天機器人,多執行十小時的程式!(Python)

圖片
  身為一個工科的研究生,你是否也有以下的困擾: "總是搶不到實驗室機器"、"擔心這個禮拜的實驗做得不夠多"、"睡前忘記收數據,導致下的實驗比別人少?" 沒問題,你遇到的情況我通通都有遇過!

【論文筆記】Squeeze-and-Excitation Networks

圖片
簡介: Squeeze-and-Excitation Networks(以下簡稱 SENet)是一種類似於 plugin 的概念, 獲得對於 C 個特徵(frature)間的關係,進而提升整體模型的準確率。 方法概要:

[Python] YAML.dump TypeError: 'str' object is not callable 解決辦法

圖片
當出現 TypeError: 'str' object is not callable 但你確定傳進來的變數的確是 str 時? 別緊張,可能只是命令參數給錯了。 像是下圖只包到檔案名稱,沒把參數 'w' 用 () 包起來,就會出現這種錯誤。

自己寫全景處理程式 之 在 python 下 把 opencv 裝起來

前情提要: 中興煙火王子開的影像處理課,要我們自己手寫全景拼接三張圖片 苦於實驗室配發的電腦開 matlab 開不起來,只好用 opencv 做