行人重識別(17)——程式碼實踐之區域性對齊最小距離演算法(local_distance.py)
!轉載請註明原文地址!——東方旅行者
更多行人重識別文章移步我的專欄:行人重識別專欄
區域性對齊最小距離演算法
一、區域性對齊最小距離演算法作用
本檔案用於定義區域性對齊最小距離演算法。
用於解決兩張圖片行人部件不對齊的問題。如下圖所示
二、區域性對齊最小距離演算法編寫思路
主要的函式batch_local_dist,該函式呼叫shortest_dist函式與batch_euclidean_dist函式。
batch_euclidean_dist用於計算區域性特徵的歐氏距離。輸入兩個三維張量X(假設維度為(32,128,64)),Y(假設維度為(32,32,64))。首先需要判斷這兩個張量是否是三維,然後需要判斷張量的第一維數值與第三維數值是否對應相等。先計算各自張量的平方,然後使用維度擴充套件在進行維度交換是這兩個張量維度大小相同。然後使用torch.baddbmm_
進行批矩陣相乘,計算x2+y2-2xy,x維度為(32,128,64),y為(32,32,64)交換維度後(32,64,32),最終結果維度(32,128,32)。然後開平方返回兩區域性分支的歐氏距離。
shortest_dist用於計算區域性特徵的區域性對齊最小距離。設圖片A有區域性特徵8段,圖片B有區域性特徵6段,則設AB距離矩陣大小為8×6,則dist(3,4)就代表圖片A的前4段區域性特徵與圖片B的前5段區域性特徵的距離。由此我們可以知道dist(7,5)就是圖片A的前8段區域性特徵與圖片B的前6段區域性特徵的距離,即圖片A與圖片B的距離。在計算最小距離時同時具有區域性對齊的作用。在距離矩陣邊界上,最小距離只有一條通路,所以只能加和。在距離矩陣內部,可以選擇從上方的通路與左側通路,從中選取最小的路徑。
batch_local_dist根據輸入的區域性特徵先進行判斷張量是否合法,然後使用batch_euclidean_dist計算區域性特徵的歐氏距離,然後對距離矩陣進行歸一化,使用shortest_dist計算區域性對齊最小距離,返回該距離。
三、程式碼
import torch
"""
本檔案用於定義區域性對齊最小距離演算法
"""
def batch_euclidean_dist(x, y):
"""
計算區域性特徵的歐氏距離
輸入x(N, m, d),y(N, n, d)
輸出dist(N, m, n)
其中N為batch_size,m為x的local part,n為y的local part
"""
assert len(x.size()) == 3#需要判斷x是否是三維
assert len(y.size()) == 3#需要判斷y是否是三維
assert x.size(0) == y.size(0)#需要判斷x的第一維的數值是否等於y第一維的數值
assert x.size(-1) == y.size(-1)#需要判斷x的第二維的數值是否等於y第二維的數值
N, m, d = x.size()
N, n, d = y.size()
#經過計算後xx與yy維度都是維度(N, m, n)
xx = torch.pow(x, 2).sum(-1, keepdim=True).expand(N, m, n)
#先擴充套件維度在交換維度的原因時,如果n大於m的話無法使用.expand(N, m, n)函式,因為原始張量第二維數值為n大於目標數值n,所以只能先擴充套件第三維然後再交換
yy = torch.pow(y, 2).sum(-1, keepdim=True).expand(N, n, m).permute(0, 2, 1)
dist = xx + yy
#計算x^2+y^2-2xy
dist.baddbmm_(1, -2, x, y.permute(0, 2, 1))#進行三維矩陣相乘,x為N, m, d,y為N, n, d交換維度後N, d, n,最終結果維度N,m,d
dist = dist.clamp(min=1e-12).sqrt() #維度N,m,d
return dist
def shortest_dist(dist_mat):
"""
根據距離矩陣計算區域性對齊最小距離
設圖片A有區域性特徵8段,圖片B有區域性特徵6段,則設AB距離矩陣大小為8×6,則dist(3,4)就代表圖片A的前4段區域性特徵與圖片B的前5段區域性特徵的距離。
由此我們可以知道dist(7,5)就是圖片A的前8段區域性特徵與圖片B的前6段區域性特徵的距離,即圖片A與圖片B的距離。
在計算最小距離時同時具有區域性對齊的作用
輸入dist_mat(m, n, N)
輸出dist(N)
其中N為batch_size,m為x的local part,n為y的local part
"""
m, n = dist_mat.size()[:2]#獲取輸入距離矩陣前兩維
dist = [[0 for _ in range(n)] for _ in range(m)]#初始化距離矩陣,型別list,元素也為list
for i in range(m):
for j in range(n):
if (i == 0) and (j == 0):#初始化邊界
dist[i][j] = dist_mat[i, j]
elif (i == 0) and (j > 0):#當i為0時,最小距離只有一種,該種情況屬於距離矩陣邊界
dist[i][j] = dist[i][j - 1] + dist_mat[i, j]
elif (i > 0) and (j == 0):#當j為0時,最小距離只有一種,該種情況屬於距離矩陣邊界
dist[i][j] = dist[i - 1][j] + dist_mat[i, j]
else:#在位於距離矩陣內部時,可以選擇從上方或從左側的距離,所以選取其中更小的距離
dist[i][j] = torch.min(dist[i - 1][j], dist[i][j - 1]) + dist_mat[i, j]
dist = dist[-1][-1]#最後返回距離矩陣右下角元素,即為兩區域性特徵張量的區域性對齊最小距離
return dist
def batch_local_dist(x, y):
"""
根據區域性特徵計算最小距離
輸入x(N, m, d),y(N, n, d)
輸出dist(n)
"""
assert len(x.size()) == 3
assert len(y.size()) == 3
assert x.size(0) == y.size(0)
assert x.size(-1) == y.size(-1)
#維度(N, m, n)
dist_mat = batch_euclidean_dist(x, y)
#歸一化維度(N, m, n)
#dist_mat = (torch.exp(dist_mat) - 1.) / (torch.exp(dist_mat) + 1.)
#輸入維度(m, N, n),輸出維度(n)
dist = shortest_dist(dist_mat.permute(1, 2, 0))
return dist
if __name__=='__main__':
x=torch.randn(32,64,64)
y=torch.randn(32,32,64)
local_dist=batch_local_dist(x,y)
print(local_dist)
相關文章
- FOCS 2021 | 針對Insdel距離的區域性可解碼編碼的下界
- 深度學習-行人重識別實戰(2020)深度學習
- 資料對齊-編輯距離演算法詳解(Levenshtein distance)演算法
- 最小距離分類器,互動式選取影像樣本分類資料,進行最小距離分類(實現歐式距離,馬氏距離,計程距離)
- 圖片區域性識別怎麼操作
- 編輯距離及編輯距離演算法演算法
- 2058. 找出臨界點之間的最小和最大距離
- 重點區域人員徘徊識別監測系統
- Mars演算法實踐——人臉識別演算法
- 深度學習行人重識別ReID最新綜述與展望深度學習
- 人臉識別之Python DLib庫進行人臉關鍵點識別Python
- C#一行程式碼實現(01)最小化到通知區域C#行程
- 編輯距離演算法演算法
- 812考試總結(NOIP模擬37)[數列·數對·最小距離·真相]
- 線性dp:編輯距離
- SwiftUI 佈局之元件對齊實現上下對齊和水平居中 (教程含原始碼)SwiftUI元件原始碼
- 詳解影片中動作識別模型與程式碼實踐模型
- Docker 之 GitLab 區域網程式碼託管DockerGitlab
- 為什麼要將區域性變數的作用域最小化?變數
- 【行人慣性導航】關於行人導航中IMU位姿推導的知識點及相關程式碼
- 面試程式碼題(華為)編輯距離面試
- vue.js全域性元件和區域性元件區別Vue.js元件
- 程式效能優化-區域性性原理優化
- 平面最近點對 & 最小周長三角形 & 曼哈頓距離最近
- 783. 二叉搜尋樹節點最小距離
- Flutter 區域性路由實現Flutter路由
- EMNLP 2020 | 開放域對話系統的屬性一致性識別
- ModelArts 與HiLens Kit聯合開發丨行人社交距離風險提示Demo
- 微信小程式——計算2點之間的距離微信小程式
- 馬氏距離與歐氏距離
- (二)區塊鏈的共識演算法:PoS 及其 例子 程式碼 實現區塊鏈演算法
- dart系列之:dart程式碼最佳實踐Dart
- 記憶體四區之程式碼區,全域性區,棧區和堆區記憶體
- Elasticsearch 7.2 在 Laravel 中實踐 --經緯度及距離查詢ElasticsearchLaravel
- 領域驅動設計最佳實踐--程式碼篇
- python ubuntu dlib人臉識別3-人臉對齊PythonUbuntu
- vscode開啟關閉編輯區域頂部固定區域 頂部有一段行數距離高度 StickyScrollVSCode
- 2021愛分析・區域性銀行數字化實踐報告