File size: 3,588 Bytes
7f2a208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400cd87
7f2a208
773d5e1
7f2a208
773d5e1
7f2a208
773d5e1
7f2a208
 
773d5e1
 
7f2a208
773d5e1
 
 
7f2a208
773d5e1
 
7f2a208
 
773d5e1
7f2a208
773d5e1
7f2a208
773d5e1
7f2a208
773d5e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7f2a208
 
773d5e1
7f2a208
773d5e1
7f2a208
400cd87
7f2a208
 
773d5e1
 
 
 
 
 
 
 
 
 
 
 
 
 
7f2a208
 
773d5e1
7f2a208
773d5e1
7f2a208
773d5e1
7f2a208
 
773d5e1
7f2a208
 
773d5e1
7f2a208
773d5e1
7f2a208
773d5e1
400cd87
7f2a208
773d5e1
 
400cd87
 
 
 
 
 
 
 
 
 
 
 
773d5e1
400cd87
 
 
 
 
 
 
 
 
 
 
 
773d5e1
400cd87
 
 
 
 
 
 
 
 
 
 
773d5e1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
---
library_name: ultralytics
tags:
  - mahjong
  - object-detection
  - image-segmentation
  - image-classification
  - yolo
  - resnet
---

# Mahjong models

麻雀卓の領域分割、各領域内の牌検出、牌種分類を行うための学習済みモデルです。

## ファイル

| ファイル | 役割 | 出力 |
| --- | --- | --- |
| `regions-yolo-26n.pt` | 卓上画像から手牌・河・副露などの領域を抽出 | 14クラスのセグメンテーション |
| `tile-yolo-26n.pt` | 領域画像から個々の牌面を抽出 | `tile` 1クラスのセグメンテーション |
| `classifier-resnet50.pt` | 正規化した牌面画像の牌種・裏向きを分類 | 39クラス |

## Git submoduleとして使用する

Git Xetをインストールしてから、親リポジトリの`models/`へsubmoduleとして追加します。

```bash
git xet install
git xet --version

git submodule add \
  https://huggingface.co/HaseLab/mahjong-models \
  models

git add .gitmodules models
git commit -m "Add model artifacts as submodule"
```

submoduleはモデルリポジトリの特定コミットを参照します。Hugging Face側のモデルを更新しても、親リポジトリ側でsubmoduleの参照を更新してcommitするまでは、既存の利用者が取得するモデルは変わりません。

## 推奨パイプライン

### 推論の流れ

```text
入力画像


Region YOLO
  regions-yolo-26n.pt
  手牌・河・副露などの領域をセグメンテーション


Tile YOLO
  tile-yolo-26n.pt
  Region YOLOの検出領域をそのまま入力し、
  領域内にある個々の牌面をセグメンテーション


牌面を正方形化
  検出ポリゴンの四隅から透視変換
  出力: 224 × 224 RGB


ResNet-50
  classifier-resnet50.pt
  正規化した牌面から38牌種または裏向きを分類


予測結果
  例: 5m(5萬)
```

## クラス

### Region YOLO

`regions-yolo-26n.pt`のクラスは次の14種類です。

```text
 0  self_hand  自分の手牌
 1  discard_0  自分の河
 2  discard_1  右家の河
 3  discard_2  対面の河
 4  discard_3  左家の河
 5  meld_0     自分の副露
 6  meld_1     右家の副露
 7  meld_2     対面の副露
 8  meld_3     左家の副露
 9  dora       ドラ表示牌
10  riichi_0   自分のリーチ棒
11  riichi_1   右家のリーチ棒
12  riichi_2   対面のリーチ棒
13  riichi_3   左家のリーチ棒
```

家番号は、カメラ側の自分を`0`、右家を`1`、対面を`2`、左家を`3`とします。

### Tile YOLO

`tile-yolo-26n.pt`は牌種を区別せず、すべての牌面を1クラスとして検出します。

```text
0  tile  牌面
```

牌種は後段のResNet-50で分類します。

### ResNet-50

再学習した`classifier-resnet50.pt`は、38牌種と`back`を合わせた次の39クラスを出力します。
indexはImageFolderのクラス名を`sorted()`した辞書順です。必ず次の順序を使用してください。

```text
 0  0m  赤5萬
 1  0p  赤5筒
 2  0s  赤5索
 3  0z  赤白
 4  1m  1萬
 5  1p  1筒
 6  1s  1索
 7  1z  東
 8  2m  2萬
 9  2p  2筒
10  2s  2索
11  2z  南
12  3m  3萬
13  3p  3筒
14  3s  3索
15  3z  西
16  4m  4萬
17  4p  4筒
18  4s  4索
19  4z  北
20  5m  5萬
21  5p  5筒
22  5s  5索
23  5z  白
24  6m  6萬
25  6p  6筒
26  6s  6索
27  6z  發
28  7m  7萬
29  7p  7筒
30  7s  7索
31  7z  中
32  8m  8萬
33  8p  8筒
34  8s  8索
35  9m  9萬
36  9p  9筒
37  9s  9索
38  back  裏向き
```