OpenCV釋出了4。5。1,包含了BEBLID運算元,一個新的區域性特徵描述符,超越ORB!
注1:文末附【計算機視覺細分垂直方向】交流群(含檢測、分割、跟蹤、醫療、GAN、Transformer等)
注2:整理不易,歡迎點贊,支援分享!
作者:Iago Suárez | ronghuaiyang
原出處:AI公園
原文連結:修改一行程式碼,將影象匹配效果提升14%
導讀
OpenCV 4。5。1中最令人興奮的特性之一是
BEBLID (Boosted Efficient Binary Local Image Descriptor)
,一個新的描述符能夠提高影象匹配精度,同時減少執行時間!這篇文章將向你展示這個魔法是如何實現的。所有的原始碼都在這個GitHub庫中:
https://
github。com/iago-suarez/
beblid-opencv-demo/blob/main/demo。ipynb
在這個例子中,我們將匹配這兩個視角不一樣的影象:
首先,確保安裝了正確的OpenCV版本是很重要的。在你喜歡的環境中,你可以透過以下方式安裝並檢查OpenCV Contrib版本:
pip
install
“opencv-contrib-python>=4。5。1”
python
>>>
import
cv2
as
cv
>>>
(
f
“OpenCV Version:
{cv。__version__}
”
)
OpenCV
Version
:
4。5
。
1
在Python中載入這兩個影象所需的程式碼是:
import cv2 as cv
# Load grayscale images
img1 = cv。imread(“graf1。png”, cv。IMREAD_GRAYSCALE)
img2 = cv。imread(“graf3。png”, cv。IMREAD_GRAYSCALE)
if img1 is None or img2 is None:
print(‘Could not open or find the images!’)
exit(0)
為了評估我們的影象匹配程式,我們需要在兩幅影象之間進行正確的(即ground truth)幾何變換。它是一個稱為單應性的3x3矩陣,當我們從第一個影象中乘以一個點(在齊次座標中)時,它返回第二個影象中這個點的座標。載入這個矩陣:
# Load homography (geometric transformation between image)
fs = cv。FileStorage(“H1to3p。xml”, cv。FILE_STORAGE_READ)
homography = fs。getFirstTopLevelNode()。mat()
print(f“Homography from img1 to img2:\n{homography}”)
下一步是
檢測
影象中容易在其他影象中找到的部分:
Local image features
。在本例中,我們將使用ORB,一個快速可靠的檢測器來檢測角點。ORB檢測到強角,在不同的尺度上比較它們,並使用FAST或Harris響應來挑選最好的。它還使用區域性patch的一階矩來尋找每個角點的方向。我們檢測每個影象中最多10000個角點:
detector = cv。ORB_create(10000)
kpts1 = detector。detect(img1, None)
kpts2 = detector。detect(img2, None)
在下面的圖片中,你可以看到500個用綠點標記的檢測響應最強的角點特徵:
很好,現在是時候以一種我們可以在另一張圖中找到它們的方式來表示這些關鍵點了。這個步驟被稱為description,因為
每個角點的區域性patch中的紋理表示 為影象上不同操作得到的數字的向量
。有很多的描述符可以用,但如果我們想要一些精確的東西,即使在行動電話或低功耗裝置上也能實時執行,OpenCV有兩個重要的方法:
ORB(導向快速和旋轉簡短)
:一個經典的方法,有10年的歷史,工作相當好。
BEBLID (Boosted Efficient Binary Local Image Descriptor)
:2020年引入的一個新的描述符,已被證明在幾個任務中改善了ORB。由於BEBLID適用於多種檢測方法,所以必須將ORB關鍵點的比例設定為0。75~1。
# Comment or uncomment to use ORB or BEBLID
descriptor = cv。xfeatures2d。BEBLID_create(0。75)
# descriptor = cv。ORB_create()
kpts1, desc1 = descriptor。compute(img1, kpts1)
kpts2, desc2 = descriptor。compute(img2, kpts2)
現在可以匹配這兩個影象的描述符來建立對應關係了。讓我們使用暴力求解演算法,它基本上比較了第一張影象中的每個描述符和第二張影象中的所有描述符。當我們處理二進位制描述符時,使用漢明距離進行比較,即計算每對描述符之間不同的位元數。
這裡還使用了一個叫做比率檢驗的小技巧。它不僅確保描述符1和2彼此相似,而且確保沒有其他像2一樣接近1的描述符。
matcher = cv。DescriptorMatcher_create(cv。DescriptorMatcher_BRUTEFORCE_HAMMING)
nn_matches = matcher。knnMatch(desc1, desc2, 2)
matched1 = []
matched2 = []
nn_match_ratio = 0。8 # Nearest neighbor matching ratio
for m, n in nn_matches:
if m。distance < nn_match_ratio * n。distance:
matched1。append(kpts1[m。queryIdx])
matched2。append(kpts2[m。trainIdx])
因為我們知道正確的幾何變換,讓我們檢查有多少匹配是正確的(inliners)。如果影象2中的點和從影象1投射到影象2的點距離小於2。5畫素,我們認為匹配是有效的。
inliers1 = []
inliers2 = []
good_matches = []
inlier_threshold = 2。5 # Distance threshold to identify inliers with homography check
for i, m in enumerate(matched1):
# Create the homogeneous point
col = np。ones((3, 1), dtype=np。float64)
col[0:2, 0] = m。pt
# Project from image 1 to image 2
col = np。dot(homography, col)
col /= col[2, 0]
# Calculate euclidean distance
dist = sqrt(pow(col[0, 0] - matched2[i]。pt[0], 2) + pow(col[1, 0] - matched2[i]。pt[1], 2))
if dist < inlier_threshold:
good_matches。append(cv。DMatch(len(inliers1), len(inliers2), 0))
inliers1。append(matched1[i])
inliers2。append(matched2[i])
現在我們在inliers1和inliers2變數中有了正確的匹配,我們可以使用cv。drawMatches定性地評估結果。每一個對應點可以在更高級別的任務上對我們有幫助,比如homography estimation,Perspective-n-Point, plane tracking, real-time pose estimation 以及 images stitching。
由於很難定性地比較這種結果,讓我們繪製一些定量的評價指標。最能反映描述符可靠程度的指標是inlier的百分比:
Matching Results (BEBLID)
*******************************
# Keypoints 1: 9105
# Keypoints 2: 9927
# Matches: 660
# Inliers: 512
# Percentage of Inliers: 77。57%
使用
BEBLID
描述符獲得
77.57%的inliers。如果我們在描述符部分註釋掉BEBLID
並取消註釋
ORB
描述符,結果下降到
63.20%
:
# Comment or uncomment to use ORB or BEBLID
# descriptor = cv。xfeatures2d。BEBLID_create(0。75)
descriptor = cv。ORB_create()
kpts1, desc1 = descriptor。compute(img1, kpts1)
kpts2, desc2 = descriptor。compute(img2, kpts2)
Matching Results (ORB)
*******************************
# Keypoints 1: 9105
# Keypoints 2: 9927
# Matches: 780
# Inliers: 493
# Percentage of Inliers: 63。20%
總之,只需更改一行程式碼,將ORB描述符替換為BEBLID ,就可以將這兩個影象的匹配結果提高14%。這在需要區域性特徵匹配的高階任務中會產生很大影響,所以不要猶豫,試試
BEBLID
。
英文原文:
https://
towardsdatascience。com/
improving-your-image-matching-results-by-14-with-one-line-of-code-b72ae9ca2b73
CVer-細分垂直交流群成立
掃碼新增CVer助手微信,
可申請加入CVer-細分垂直方向 微信交流群,也可申請加入CVer大群,細分方向已涵蓋:目標檢測、影象分割、目標跟蹤、人臉檢測&識別、OCR、姿態估計、超解析度、SLAM、醫療影像、Re-ID、GAN、NAS、深度估計、自動駕駛、強化學習、車道線檢測、模型剪枝&壓縮、去噪、去霧、去雨、風格遷移、遙感影象、行為識別、影片理解、影象融合、影象檢索、論文投稿&交流、Transformer、PyTorch和TensorFlow等群。
CVer小助手微訊號:
CVer9999。一定要備註:研究方向+地點+學校/公司+暱稱(如目標檢測+上海+上交+卡卡)
,根據格式備註,才能透過且邀請進群
強烈推薦大家關注
CVer知乎
賬號和
CVer
微信公眾號,可以快速瞭解到最新優質的CV論文。
推薦閱讀
一文看懂 9 種Transformer結構!
TransFuse:融合Transformers和CNN用於醫學影象分割
視覺Transformer上榜!DeepMind科學家:2020年AI領域十大研究進展
沒有卷積!TransGAN:首個基於純Transformer的GAN網路
首個無trick,將ResNet-50 準確率提升到80%+!CMU開源MEAL V2
最強ResNet變體!歸一化再見!DeepMind提出NFNet,程式碼已開源!
自監督學習:全面調研
Facebook提出:基於視覺Transformer的影象檢索
谷歌提出ColTran:Colorization Transformer
TransUNet:用於醫學影象分割的Transformers強大編碼器
TransReID:首個基於Transformer的目標Re-ID
泛化神器!李沐等人提出兩種正則化技術:在CV和NLP均有大幅度提升
中國成都舉辦!ACM MM 2021 Call for Papers
效果遠超Transformer!AAAI 2021最佳論文Informer:最強最快的序列預測神器
深度學習理論的最新進展
DeepMind重新設計高效能ResNet!無需啟用歸一化層
VisualSparta:首個基於Transformer的大規模文字到影象檢索
CV待解決問題!華中科大提出OVIS:遮擋影片例項分割(資料集+程式碼)
VTN:影片Transformer網路
T2T-ViT:在ImageNet上從頭訓練視覺Transformer
84。7%!BoTNet:視覺識別的Bottleneck Transformers
沒有卷積!CPTR:用於影象描述的全Transformer網路
華為諾亞提出:AdderNet及其極簡硬體設計
南加大和Intel提出:基於注意力的影象上取樣
攻下SLAM!用於無監督視覺里程錶的Transformer引導幾何模型
沒有自然影象的預訓練 | ACCV 2020 最佳論文提名獎
基於深度學習的行人重識別(Re-ID)綜述:全面調研(2015-2020)
2020年最先進的3D醫學影象分割方法
Focal-EIOU Loss:用於精確邊界框迴歸的高效IOU損失
曠視提出Momentum^2 Teacher:用於自監督學習的具有動量統計的動量老師
計算機視覺中的Transformer
醫學影象語義分割最佳方法的全面比較:U-Net和U-Net++
生成對抗U-Net:實現Domain-free醫學影象增廣
80GB 醫學影像資料集釋出!OCTA-500公開下載
RepVGG:使VGG樣式的ConvNets再次出色
漲點神器!SoftPool:一種新的池化方法,帶你起飛,程式碼已開源!
又一篇視覺Transformer綜述來了!
深度神經網路中的池化方法:全面調研(1989-2020)
漲點神器!IC-Conv:具有高效空洞搜尋的Inception卷積
一文快速回顧U-Net Family
冠軍解決方案!用於腦腫瘤分割的nnU-Net改進