HRNetをWindowsで実行する手順

HRNetをWindowsで動作確認しましたので、その手順を記載します。

## HRNet

### HRNetとは？

高解像度～低解像度を並列実行することで、高解像度を維持し、各解像度の特徴量のギャップを減少します。
Deep High-Resolution Representation Learning for Human Pose Estimation
K.Sun, B.Xiao, D.Liu, J.Wang, Microsoft Research Asia, 2019.
https://arxiv.org/abs/1902.09212

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493607/b973f26f-dc7c-e097-051a-5e7097cd4373.png)

### HRNetのGitHub

GitHubには、姿勢推定用コードだけでなく、様々な用途（領域分割、物体検出、画像分類、顔ランドマーク検出）用コードも公開されています。

https://github.com/HRNet

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493607/7e74caca-4731-1985-2d13-36b4ebebb9b5.png)

## 動作確認

### 動作確認対象

領域分割のコードを動作確認しました。
Pytorch 0.4.1、Pytorch 1.1、HRNet + OCRの3バージョンのうち、Pytorch 0.4.1、Pytorch 1.1の2バージョンを動作確認しました。

HRNet-Semantic-Segmentation
https://github.com/HRNet/HRNet-Semantic-Segmentation

### 動作確認環境

torch 1.4.0
torchvision 0.5.0

Python 3.7.4

Windows 10
GeForce GTX 1050 Ti 専用GPUメモリ 4.0GB

CUDA 10.1
cuDNN 7.6.2
nvidia driver 441.45

Visual Studio 2019

### 変更点

#### Inplace-ABN

私の環境では、Inplace-ABNを標準のBNに変更しました。
Inplace-ABNはメモリ消費を削減する効果があります。
しかし、GPU1枚では関係ないとのことです。
また、v0.4.1では、内部でC++ソースコードをコンパイルする必要があります。
開発環境の要件を幾つかクリアする必要があり、私の開発環境では断念しました。
文字コードを英語にする、等で解消できる可能性はあります。

- v0.4.1
lib\models\seg_hrnet.py
　InPlaceABNSyncを削除し、nn.BatchNorm2dに変更。
　nn.ReLUのinplaceはFalseからTrueに変更。

- v1.1
tools\train.py
　nn.SyncBatchNorm.convert_sync_batchnormを削除。

#### 分散学習

PyTorchは、Windowsでは、分散学習をサポートしていないので、無効にした。

- v1.1

tools\train.py
　nn.parallel.DistributedDataParallelをnn.DataParallelに変更。

lib\utils\utils.py
　torch.distributed.is_initializedをis_availableに変更。

#### 開発環境

PyTorch v0.4.1のCUDAは9.2ですが、
上記の変更を行うことで、
v0.4.1コードもCUDA 10.1で動作確認しました。

#### ハイパーパラメータ

- v0.4.1
　yamlの指定をsmallバージョンに変更。
　GPUSを(0,)に変更。
　WORKERSを0に変更。

- v1.1
　yamlの指定をsmallバージョンに変更。
　GPUSを(0,)に変更。
　WORKERSを0に変更。

#### その他
torchsummaryのsummaryはエラーになります。

## 動作結果

Pytorch 0.4.1、Pytorch 1.1両方で、train.py, test.py共に動作することを確認しました。
動作確認ですので、値の大小は気にしないでください。

### v0.4.1

- train

```
2020-07-12 11:18:39,433 Epoch: [0/1] Iter:[2900/2975], Time: 0.42, lr: 0.000364, Loss: 0.920190
2020-07-12 11:19:10,873 => saving checkpoint to output\cityscapes\seg_hrnet_w18_small_v1_512x1024_sgd_lr1e-2_wd5e-4_bs_12_epoch484checkpoint.pth.tar
2020-07-12 11:26:09,648 Loss: 0.551, MeanIU:  0.3185, Best_mIoU:  0.3185
2020-07-12 11:26:09,649 [8.90093562e-01 4.82133573e-01 7.44949369e-01 0.00000000e+00
 7.46722365e-03 3.42546150e-01 6.24819950e-05 3.81725337e-01
 8.42626474e-01 3.17069704e-01 7.76947559e-01 5.12606485e-01
 0.00000000e+00 6.06305701e-01 0.00000000e+00 0.00000000e+00
 0.00000000e+00 0.00000000e+00 1.46073571e-01]
2020-07-12 11:26:09,732 Hours: 0
2020-07-12 11:26:09,732 Done
```

- test

```
2020-07-12 16:56:18,841 processing: 400 images
2020-07-12 16:56:18,970 mIoU: 0.3187
2020-07-12 18:09:16,441 MeanIU:  0.3242, Pixel_Acc:  0.8665,             Mean_Acc:  0.3931, Class IoU: 
2020-07-12 18:09:16,471 [9.09264962e-01 4.76516629e-01 7.60600283e-01 0.00000000e+00
 1.47533559e-03 3.58354385e-01 2.10131315e-05 4.02326516e-01
 8.55247714e-01 3.37153738e-01 7.78925237e-01 5.36398270e-01
 0.00000000e+00 6.49926948e-01 0.00000000e+00 0.00000000e+00
 0.00000000e+00 0.00000000e+00 9.44377346e-02]
2020-07-12 18:09:16,522 Mins: 157
2020-07-12 18:09:16,522 Done
```

### v1.1

- train

```
2020-07-13 00:35:23,786 Epoch: [0/1] Iter:[2900/2975], Time: 0.46, lr: 0.000364, Loss: 0.971087
2020-07-13 07:20:23,035 => saving checkpoint to output\cityscapes\seg_hrnet_w18_small_v1_512x1024_sgd_lr1e-2_wd5e-4_bs_12_epoch484checkpoint.pth.tar
2020-07-13 07:20:23,497 Loss: 0.688, MeanIU:  0.2749, Best_mIoU:  0.2749
2020-07-13 07:20:23,498 [0.8741192  0.43420978 0.66894394 0.         0.04506454 0.29985142
 0.         0.24258245 0.80402744 0.24535251 0.67287447 0.44294556
 0.         0.49247732 0.         0.         0.         0.
 0.        ]
2020-07-13 07:20:23,592 Hours: 7
2020-07-13 07:20:23,592 Done
```

- test

```
2020-07-13 08:36:38,596 processing: 400 images
2020-07-13 08:36:38,596 mIoU: 0.2722
2020-07-13 08:52:25,544 MeanIU:  0.2786, Pixel_Acc:  0.8311,             Mean_Acc:  0.3495, Class IoU: 
2020-07-13 08:52:25,544 [0.88729298 0.41326129 0.68817204 0.         0.01781714 0.31907421
 0.         0.22556153 0.82695122 0.26384412 0.667692   0.47245012
 0.         0.51207316 0.         0.         0.         0.
 0.        ]
2020-07-13 08:52:25,605 Mins: 79
2020-07-13 08:52:25,605 Done
```

## 参考

### 他のコード

HRNetは他にもあります。
Multi-person Human Pose Estimation with HRNet in PyTorch
https://github.com/stefanopini/simple-HRNet

### 私のコード

私の方で行った変更は上記の通りで、限定的ですので、githubにアップロードしていません。
問合せありましたら、考えます。