【ImgSim】教師なしでの画像間の距離推論

# Imgsimとは
- 異なる画像間の特徴ベクトルの距離や類似度を計算できるライブラリ
- 手法はAugNet
  - 教師なし学習
### AugNetとは
https://arxiv.org/abs/2106.06250
- CNNを教師なし学習のルールで学習させる。
- 同じ元画像から増強された画像の表現は埋め込み空間で互いに近くなる
- 異なる画像から増強された画像の表現は互いに遠くなる
# インストール方法
```python
pip install imgsim
```
# やってみた

### 使用データセット
- DeepSportradar-ReIDというデータセットを使用。
- https://github.com/DeepSportradar/player-reidentification-challenge

### datasetのダウンロード
```zash
git clone https://github.com/DeepSportradar/player-reidentification-challenge
```

### ImgSimのテスト
この6枚の画像の距離を計算
![5_25_mans](https://github.com/e204208iy/TIL/assets/72591871/1841a259-22bb-404c-8948-a82ffdd2e80c)
左から1,2,3とインデックスをふる。
### 同じ人の距離を求めてみる。
| 赤い人１ | 赤い人２ | 距離 |　|　青い人１ | 青い人2 | 距離 |
| -- | -- | -- | -- | -- | -- | -- |
| 1 | 2 | 10.91 | | 4 | 5 | 14.72 |
| 1 | 3 | 16.64 | | 4 | 6 | 15.89 |
| 2 | 3 | 15.09 | | 5 | 6 | 14.89 |

### 異なる人の距離を求めてみる。
| 赤い人 | 青い人 | 距離 |　|　赤い人 | 青い人 | 距離 |　|　赤い人 | 青い人 | 距離 |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
| 1 | 4 | 30.58 | | 2 | 4 | 29.68 | | 3 | 4 | 27.37 |
| 1 | 5 | 29.46 | | 2 | 5 | 28.47 | | 3 | 5 | 25.35 |
| 1 | 6 | 30.19 | | 2 | 6 | 29.52 | | 3 | 6 | 26.67 |

## ユニフォームの色が似ている人同士でも距離を計算してみる
![to_github3](https://github.com/e204208iy/TIL/assets/72591871/be28070a-1247-4f98-81ac-2a4429553a1d)
※ 一段目が同じ人で二段目がGallery

#### 一段目の一番左の人をQueryとする。
| 同じ人 | 距離 |　|　違う人 | 距離 |
| -- | -- | -- | -- | -- |
| 　　1 | 13.560963 | | 1 | 15.342218 |
| 　　2 | 12.848311 | | 2 | 14.851833 |
| 　　3 | 19.586132 | | 3 | 23.056866 |
| 　　4 | 14.381772 | | 4 | 18.973288 |
| 　　5 | 17.720009 | | 5 | 15.511065 |
| 　　 |  | | 6 | 28.096533 |

## 実験からわかったことと課題
- 背景による影響が強い気がする。
  - インスタンスセグメンテーションで背景を削除してみる。
- １対多で探索する方法がわからない。
# 今回使用したコード
```python
import imgsim
import cv2

vtr = imgsim.Vectorizer()

red1_img = cv2.imread("./images/00437_01_01.jpeg")
red2_img = cv2.imread("./images/00437_01_10.jpeg")
red3_img = cv2.imread("./images/00437_01_19.jpeg")

blue1_img = cv2.imread("./images/00439_01_08.jpeg")
blue2_img = cv2.imread("./images/00439_01_11.jpeg")
blue3_img = cv2.imread("./images/00439_01_19.jpeg")

red1 = vtr.vectorize(red1_img)
red2 = vtr.vectorize(red2_img)
red3 = vtr.vectorize(red3_img)

blue1 = vtr.vectorize(blue1_img)
blue2 = vtr.vectorize(blue2_img)
blue3 = vtr.vectorize(blue3_img)

dist0 = imgsim.distance(red1, red2)
print("red1 red2 =", round(dist0, 2))
dist1 = imgsim.distance(red1, red3)
print("red1 red3 =", round(dist1, 2))
dist2 = imgsim.distance(red2, red3)
print("red2 red3 =", round(dist2, 2))

dist3 = imgsim.distance(blue1, blue2)
print("blue1 blue2 =", round(dist3, 2))
dist4 = imgsim.distance(blue1, blue3)
print("blue1 blue3 =", round(dist4, 2))
dist5 = imgsim.distance(blue2, blue3)
print("blue2 blue3 =", round(dist5, 2))

dist6 = imgsim.distance(red1, blue1)
print("red1 blue1 =", round(dist6, 2))
dist7 = imgsim.distance(red1, blue2)
print("red1 blue2 =", round(dist7, 2))
dist8 = imgsim.distance(red1, blue3)
print("red1 blue3 =", round(dist8, 2))

dist9 = imgsim.distance(red2, blue1)
print("red2 blue1 =", round(dist9, 2))
dist10 = imgsim.distance(red2, blue2)
print("red2 blue2 =", round(dist10, 2))
dist11 = imgsim.distance(red2, blue3)
print("red2 blue3 =", round(dist11, 2))

dist12 = imgsim.distance(red3, blue1)
print("red3 blue1 =", round(dist12, 2))
dist13 = imgsim.distance(red3, blue2)
print("red3 blue2 =", round(dist13, 2))
dist14 = imgsim.distance(red3, blue3)
print("red3 blue3 =", round(dist14, 2))

```