OmniAICreator/Qiita-1.07M huggingface dataset:
PythonとOCRエンジンで画像から文字を認識する

# 目的
anacondaの仮想環境内でtesseractとPyOCRを使い、画像から文字を認識できるようにします。
今回は画像の文字を認識し、ターミナルへ出力できるところまでの行います。

こんな感じ↓
![mokuteki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/bde33c97-7e49-5cc6-9a80-6ce7efa5f611.png)



# 環境
python 3.6
tesseract 4.1.1
PyOCR 0.8

# 手順
### ツールのインストール
anacondaの仮想環境に下記2つをインストールします。

・文字認識のためのOCRエンジンである`Tesseract OCR`をインストール
https://anaconda.org/conda-forge/tesseract

```terminal
conda install -c conda-forge tesseract
```

・PythonからOCRエンジンを使用するための`PyOCR`をインストール
https://anaconda.org/conda-forge/pyocr

```terminal
conda install -c conda-forge pyocr
```

### 文字認識を試す
確認用にテスト用の画像を準備します（ファイル名は`moji_en.png`としています）。
※デフォルトは日本語未対応です。

![moji_en.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/e247fb29-f358-386c-ada6-1e5dbb02c419.png)

pythonコードは以下になります。

```python
from PIL import Image
import pyocr

# OCRエンジンを取得
engines = pyocr.get_available_tools()
engine = engines[0]

# 画像の文字を読み込む
txt = engine.image_to_string(Image.open('moji_en.png'), lang="eng")
print(txt) # 「Test Message」が出力される
```

実行結果に画像内のテキストが出力されていればOKです。



### 日本語対応化
次に、日本語も認識できるようにします。
下記から言語ファイル`jpn.traineddata`ダウンロードします。
https://github.com/tesseract-ocr/tessdata

ダウンロードした言語ファイルをanacondaの仮想環境にある指定の場所へ配置してください。
配置先：`C:\Users\user\anaconda3\envs\<仮想環境名>\Library\bin\tessdata\`


言語ファイルを配置したら、pythonコードの`engine.image_to_string()`の第2引数を`lang="jpn"`のように修正します。
ついでに対応言語も出力しておきます。

```python
from PIL import Image
import pyocr

# OCRエンジンを取得
engines = pyocr.get_available_tools()
engine = engines[0]

# 対応言語取得
langs = engine.get_available_languages()
print("対応言語:",langs) # ['eng', 'jpn', 'osd']

# 画像の文字を読み込む
txt = engine.image_to_string(Image.open('jugemu.png'), lang="jpn") # 修正点：lang="eng" -> lang="jpn"
print(txt)
```

これで日本語化は完了です。
動作確認してみましょう。使う画像はみんな大好き寿限無です。

![jugemu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/c29bd434-875f-f08f-7361-fc5cdc4411c9.png)

```terminal
対応言語: ['eng', 'jpn', 'osd']
寿 限 無 寿 限 無 五 劫 の す り き れ

海 砂 利 水 魚 の 水 行 末 雲 来 末 風 来 末

食 う 寝 る と こ ろ に 住 む と こ ろ

や ぶ ら 小 路 の ぶ ら 小 路

パ イ ポ パ イ ポ パ イ ポ の シ ュ ー リ ン ガ ン

シ ュ ー リ ン ガ ン の ク ー リ ン ダ イ

ク ー リ ン ダ イ の ポ ン ポ コ ナ ー の ポ ン ポ コ ピ ー の 長 久 命 の 長 助

```

対応言語に`jpn`が含まれており、出力も問題なさそうですね。
ちなみに`osd`は文字の識別を行うための特殊ファイルみたいなものです。

# まとめ
pythonのツールと数行のコードだけで画像から文字を認識することが出来ました。
日本語対応なども一度設定してしまえばOKなので、低コストでここまで出来るのは素晴らしいです。
データ入力の自動化など、様々なことに応用できそうですね。
ブラウザでGraphQLを試すときのメモ

# GrapfhiQLで試せる
https://hasura.io/learn/graphql/graphiql

* queryでデータの取得について
https://hasura.io/learn/graphql/intro-graphql/graphql-queries/

* データの書き込み
https://hasura.io/learn/graphql/intro-graphql/graphql-mutations/

_GraphQLのメリットについてのメモ_
https://qiita.com/akkiii/items/bf028a60096ac0a4a7cb
Macでzsh: command not found: npmがでる


# 解決方法
PATHに追加されていないことが問題らしい

下記実行した時にでてくるPATHに追加しなくてはならない模様

```
nodebrew setup
```

![スクリーンショット 2021-07-28 18.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/a31394cd-350b-1b16-b085-df25723d2dc5.png)


~/.zshrcを開いて、任意の場所にnodebrew setupで出てきた「export PATH ~~ 」を追加し保存

terminal再起動したらつかえるようになっていた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/bb4c40ac-0906-78e8-fce9-afc0eb7a9db1.png)


解決方法忘れないようにめも
Bert。ModuleNotFoundError: No module named 'transformers.tokenization_bert_japanese'のtransformers 4.xでの回避方法。

# 概要
Bert。ModuleNotFoundError: No module named 'transformers.tokenization_bert_japanese'のtransformers 4.xでの回避方法を示す。

## 補足情報
この記事の作成日: 2021/07/28
環境: windows
いまtransformersを取得した場合のバージョン: 4.9.1


# エラーが発生するケース

transformers 4.9.1にて

```py
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer
```

とすると、
該当のエラーになる。

# 回避方法

以下のように、tokenization_bert_japaneseを消す

```py
from transformers import BertJapaneseTokenizer
```

⇒⇒　BertJapaneseTokenizer　が直下（のみ）になったということ。

ちなみに、
transformers 3.5.1では、BertJapaneseTokenizerは<br>
直下と、transformers.tokenization_bert_japanese　の両方に見えるので、移行の方針だったのだと思う。

ただ、3.5.1環境で、「python -m pydoc transformers.tokenization_bert_japanese」で出る情報に廃止予定みたいなことは、わかりやすいところには書いてませんでした。。。


# 応用

以下も同様。transformers 4.9.1では、エラーになるはず。（対策は、同様。）

```py
from transformers.modeling_bert import BertModel
```

```py
ModuleNotFoundError: No module named 'transformers.modeling_bert'
```

# 補足

transformers 3.5.1に戻す対策しかネット上で見えなかったので記事にした。
pyenv-virtualenvのインストール

# はじめに
`pyenv`を[再インストール](https://qiita.com/takashi-mitani/items/9272ec4cac9869ef203e)したので、ついでに`pyenv-virtualenv`([link](https://github.com/pyenv/pyenv-virtualenv))もインストールしてみる。

# 環境

```
macOS: Catalina 10.15.7
xCode: version 12.4
```

# インストール

Homebrewでインストール。

```bash:terminal
$brew install pyenv-virtualenv
```

以下を`.bashrc`に書き込む。

```bash:.bashrc
eval "$(pyenv virtualenv-init -)"                                                                                                                                                                         
```

# 使い方

### 仮想環境の作り方

```bash:terminal
# Determine python version and create virtualenv
$ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
# Create vertualenv from current version
$ pyenv virtualenv venv34
```

### 仮想環境の確認方法

```bash:terminal
$ pyenv virtualenvs
```

### 仮想環境のActivateとDeactivate

```bash:terminal
$ pyenv activate <name>
$ pyenv deactivate
```

### 仮想環境の消し方
```bash:terminal
$ pyenv uninstall <name>
```
悪戦苦闘しながらGitHubに資料をアップした

## はじめに
GitHubに資料をアップしてみたかったが、中々できずにいた。まずは簡単なファイルをアップしてみた。
とりあえず挙げられたけど…という感じで、理解にはまだほど遠い。
正しいやり方ではなく、こんだけ苦戦しましたという流れを記載する。
反面教師として参考にしてもらえればいいかもしれない。

##内容
GitHubのアカウント作成とレポジトリ作成は下記のサイトなどを参考に実施済。
【参考】
https://qiita.com/under_chilchil/items/ec9d0050c1e3fb6576de
https://proengineer.internous.co.jp/content/columnfeature/7103

GitHubのページから引っ張ってきたコードを示す。
>
git init
git add README.md
git commit -m "First commit"
git branch -M main
git remote add origin 【アカウントのurl】
git push -u origin main

自分もこの流れで実施を試みた(途中エラー等があり、すんなりとはいかなかった)。

###git initまで
今回はdata1.csvというファイルをテストでアップする。
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/dcd41604-6ed8-5a1a-840f-85bbf46b09ab.jpeg)

`cd 【対象のディレクトリ】`で資料入っているディレクトに移動する。
`git init`でローカルリポジトリを作成する。
"Reintialzed …"と出てきたので調べたら、ただ初期化を再実施しただけとのこと。そのまま進む。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/acddc0af-4e5b-6161-9a06-5993ab3e8d44.jpeg)
【参考】
https://qiita.com/ragingalpaca/items/ef247e459ff2e7759ba9

###git push -u origin mainまで
`git add 【対象のファイル】`を実行。
`git commit -m 【"コメント名"】`を実行。コメント名はtestにしてみた。
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/d8f0ba54-5ae0-c1af-3f69-0772d46ed09e.jpeg)
"nothing to commit …"と出てきた。後で調べたらファイルが追跡されていないらしい(本当はよくないが、この場面ではとりあえず先に進んだ)。

![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/34ee765c-3ca8-ddbe-0d40-f68e431c188c.jpeg)
`git remote add origin 【アカウントのurl】`を実行。エラーが出た。すでにoriginがあるとのことなので、削除して再度実施した。
【参考】
https://qiita.com/yu-ki0718/items/3c8aae2c81ca3f82f522

`git branch -M main`を実行。
再度`git commit -m 【"コメント名"】`を実行。やっぱりおかしいと思い調べた。
![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/23b939ab-239c-a889-a56d-b5be61cadd05.jpeg)
追跡できていないので、ファイル状態を調べた。`git status -sb`で確認すると、mainブランチにいるようだ。"nothing to commit …"は出てこなかったので、いけそう？
【参考】
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%B8%E3%81%AE%E8%A8%98%E9%8C%B2

最初に立ち返ろうと思い、`git init`を実施した(多分いらなかったやつ)。
`git push -u origin main`でアップできるか確認した。表示の文からすると、いけてそう。
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/4d0c4703-01f9-e25e-8366-cfbdb3586f79.jpeg)

###GitHubでの確認
GutHubのアカウントで本当にアップされているか確認してみた。
ちゃんとdata1.csvがアップされていた。ひとまずやりたいことはできたようだ。
![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/d23c3d0e-863b-7715-d71a-ceb50a98dd7d.jpeg)

##まとめ
何とかファイルアップができた。
ただやり方的にはどう考えてもよくなさそうなので、継続して勉強が必要。
GraphQLのメリット関連のメモ

# 抜粋と翻訳になります。
https://hasura.io/learn/graphql/intro-graphql/graphql-vs-rest/

* オーバーフェッチの回避
    * 必要なフィールドを正確に指定できるため、必要以上のデータのフェッチを回避できます。
* 複数のAPI呼び出しを防ぐ
    * より多くのデータが必要な場合は、APIへの複数の呼び出しを回避することもできます。
* API開発者との通信オーバーヘッドの削減
    * 必要なデータを正確に取得するために、特により多くのデータを取得する必要があり、複数のAPI呼び出しを回避したい場合は、API開発者に新しいAPIの作成を依頼する必要があります。GraphQLを使用すると、作業はAPIチームから独立され、アプリ側の開発作業が速くなります。
* 自己文書化
    * すべてのGraphQL APIは、グラフデータモデルである「スキーマ」と、クライアントが実行できるクエリの種類に準拠しています。これにより、コミュニティはAPIを探索して視覚化するための多くの優れたツールを構築したり、GraphQLクエリをオートコンプリートしたり「codegen」を実行したりするIDEプラグインを作成したりできます。


# オーバーフェッチまたはアンダーフェッチとは何ですか？
https://www.it-swarm-ja.com/ja/graphql/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%82%A7%E3%83%83%E3%83%81%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%83%95%E3%82%A7%E3%83%83%E3%83%81%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/831766725/

## Q
>オーバーフェッチまたはアンダーフェッチとは何ですか？
私はgraphQLを時々遊んでいます。 graphQLの前は、通常REST APIを使用します。多くの開発者は、graphQLがRESTのいくつかの問題（たとえば、オーバーフェッチとアンダーフェッチ）を修正すると述べています）を私はこの用語と混同します。

誰かがこのコンテキストで何がフェッチされすぎて何が不足しているのか説明できますか？

## A
>オーバーフェッチとは、あまりにも多くのデータをフェッチすることです。つまり、使用しない応答にデータが含まれています。
アンダーフェッチでは、エンドポイントの呼び出しで十分なデータがないため、2番目のエンドポイントを呼び出す必要があります。
どちらの場合も、パフォーマンスの問題です。必要以上の帯域幅を使用するか、必要以上のHTTPリクエストを作成しています。

>完璧な世界では、これらの問題は決して発生しません。あなたはあなたの製品に正確に正しいデータを与えるための正確なエンドポイントを持っているでしょう。
これらの問題は、多くの場合、製品をスケーリングして反復するときに発生します。ページで使用するデータは頻繁に変更され、各コンポーネントに正確に適切なデータを使用して個別のエンドポイントを維持するためのコストが多すぎます。
したがって、エンドポイントが多すぎないことと、エンドポイントが各コンポーネントのニーズに最も適合するようにすることが妥協点になります。これにより、場合によってはオーバーフェッチ（特定のコンポーネントで必要なデータよりも多くのデータがエンドポイントから提供される）や、一部のコンポーネントでアンダーフェッチ（2番目のエンドポイントを呼び出す必要がある）が発生します。
サーバーから必要なデータを要求できるので、GraphQLはこの問題を修正します。必要なものを指定し、サーバーへの1回のトリップでこのデータを取得し、このデータのみを取得します。
MinIO Client (mcコマンド) 備忘録

# 環境情報

* Ubuntu 18.04.3
* MinIO: RELEASE.2021-06-17T00-10-46Z-28-gac7697426
* MinIO Client: RELEASE.2021-06-13T17-48-22Z

# インストール

[MinIO Client Quickstart Guide](https://docs.min.io/docs/minio-client-quickstart-guide.html)を参考に実施

```bash
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc

... snip ...

$ chmod +x mc 
$ sudo mv mc /usr/local/bin/
$ mc -v
mc version RELEASE.2021-06-13T17-48-22Z
```

# コマンド一覧

以下のコマンド一覧は、[MinIO Client Quickstart Guide](https://docs.min.io/docs/minio-client-quickstart-guide.html)を参考にしています。

## ストレージサービスの追加

```bash
mc alias set <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> --api <API-SIGNATURE> --path <BUCKET-LOOKUP-TYPE>
```

MinIOを追加

```
$ mc alias set minio http://xx.xx.xx.xx:9000/ xxxxxxx xxxxxxx
Added `minio` successfully.
ubuntu@ansible-01:~$ cat ~/.mc/config.json | jq -r .aliases.minio
{
  "url": "http://xx.xx.xx.xx:9000",
  "accessKey": "xxxxxxx",
  "secretKey": "xxxxxxx",
  "api": "s3v4",
  "path": "auto"
}
```

## バケットの追加

```
$ mc mb minio/backup/redmine-issue
Bucket created successfully `minio/backup/redmine-issue`.
$ mc ls minio
[2021-07-27 09:44:02 UTC]     0B backup/
$ mc ls minio/backup
[2021-07-27 09:46:18 UTC]     0B redmine-issue/
```

## ファイルのアップロード

単一のファイルのアップロード

```
$ mc cp /srv/docker/redmine/redmine_mysql/backups/1627453357_redmine_backup.tar minio/backup/redmine-issue
...3357_redmine_backup.tar:  1.21 MiB / 1.21 MiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 1.46 MiB/s 0s
$ mc ls minio/backup/redmine-issue
[2021-07-28 06:50:39 UTC] 1.2MiB 1627453357_redmine_backup.tar
```

ディレクトリ配下の複数ファイルをアップロード

```
$ mc cp -r /srv/docker/redmine/redmine_mysql/backups/ minio/backup/redmine-issue
...3357_redmine_backup.tar:  24.22 MiB / 24.22 MiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 15.55 MiB/s 1subuntu@ansible-01:~/mo-$ mc ls minio/backup/redmine-issue
[2021-07-28 07:21:21 UTC] 1.2MiB 1627438434_redmine_backup.tar
[2021-07-28 07:21:21 UTC] 1.2MiB 1627438554_redmine_backup.tar
[2021-07-28 07:21:21 UTC] 1.2MiB 1627438875_redmine_backup.tar

... snip ...

```

## ファイルの削除

1分前よりも古いファイルを全て削除

```
$ mc rm -r --force --older-than 1m minio/backup/redmine-issue
Removing `minio/backup/redmine-issue/1627452985_redmine_backup.tar`.
Removing `minio/backup/redmine-issue/1627453357_redmine_backup.tar`.
```
AlmaLinux8.3+JMeter5.4.1インストール手順

# やりたいこと

* AlmaLinux8.3にJMeterをインストールしたい。

# 前提

* VirtualBox + AlmaLinux8.3 が最小構成以上でインストール済みであること。
* root権限でSSH接続できること。

# 事前準備

https://jmeter.apache.org/download_jmeter.cgi
にて、JMeterのBinariesの最新バージョンを確認しておく。

```
https://mirrors.advancedhosters.com/apache//jmeter/binaries/apache-jmeter-5.4.1.tgz
```


# インストール

```
sysctl -w net.ipv6.conf.all.disable_ipv6=1
yum update -y
yum install -y java
cd /opt/
yum install -y wget
wget https://mirrors.advancedhosters.com/apache//jmeter/binaries/apache-jmeter-5.4.1.tgz
yum install -y tar
tar zxvf apache-jmeter-5.4.1.tgz
yum -y install vim-enhanced
```

```
vim ~/.bashrc
```

```
# Jmeter
PATH=$PATH:$HOME/bin:/opt/apache-jmeter-5.4.1/bin
```

```
source ~/.bashrc
which jmeter
jmeter --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/5acc2f5e-bee3-7dd2-be1e-184e6bd8d871.png)
Outlook(Windows)のHTMLメールで特定CSSやボタンタグが効かない

# 構成
* PHP 7.0
* php module sendmail

# メールクライアント
* Windows 10 Office 365 Outlook for Desktop

# 原因

一部のタグ・CSSが対応していないことが原因

# 対処法（CSS）

外部CSSを利用せず、インラインで記述する。
※CSSの対応リストが探しても見つからず、もし見つかったらコメント頂きたいです。

# 対処法（ボタンタグ）

HTMLに `<!--[if mso]> ~~mso用のHTMLタグ~~ <![endif]-->` でMSO用のタグを記載する。

## ボタンタグ
VML形式で記載が必要。こちらのサイトでコードが作れます。
https://buttons.cm/

```html:サンプルコード
<!--[if mso]>
    <div style="line-height:1em;">
        <v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://example.com" style="height:48px;v-text-anchor:middle;width:240px;max-width:350px;line-height: 48px;" arcsize="50%" stroke="f" fillcolor="#ffa500">
        <w:anchorlock/>
        <center>
        <a href="http://example.com" style="background-color:#ffa500;border-radius:20px;color:#ffffff;display:inline-block;font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;font-size:13px;font-weight:bold;line-height: 48px;text-align:center;text-decoration:none;width:240px;max-width:350px;-webkit-text-size-adjust:none;">
            ボタンのテキスト
        </a>
        </center>
        </v:roundrect>
    </div>
<![endif]-->
```

## Outlookの時だけ非表示したい要素を指定する
`mso-hide: all` を使用する。

```html:サンプルコード
<!--[if mso]><div style="mso-hide: all"><![endif]-->
<div style="mso-hide:all;">他のメールクライアントに表示するコード</div>
```
PyTorch 乱数固定

PyTorchで深層学習を行ったときの再現性を担保するために乱数固定を行うベストプラクティス．
```
import os
import random

seed = 0

def seed_everything(seed):
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed) # pythonのハッシュベース操作の再現性担保
    np.random.seed(seed)
    torch.manual_seed(seed) # ネットワーク重みの初期値を固定
    torch.cuda.manual_seed(seed) # ネットワーク重みの初期値を固定 (GPU)

    # cuDNN: NVIDIAのConvolution高速化ライブラリ．
    torch.backends.cudnn.deterministic = True # cuDNNによる最適化プロセス固定
    torch.backends.cudnn.benchmark = True # input_size固定CNNなら高速化が期待できる．iterationごとに変わるならFalseの方が速い．

seed_everything(seed=seed)
```
PyTorch StratifiedKFold+Dataset作成

PyTorchではDatasetでデータセットを作成する際，k分割法と合わせて使う手順がscikit-learnとは異なり，少し癖があるのでメモ．

1. train_dfにfoldカラムを追加
```
train_df["fold"] = 0
```
2. stratifiedkfoldのval_indexを利用してfold_idを割り当てる．
```
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for i, (train_index, val_index) in enumerate(kf.split(train_df, train_df["class_num"])): # kf.split(X, y)
    train_df.loc[val_index, "fold"] = int(i) # loc: 名前で参照
    print(f"FOLD: {i}, train: {len(train_index)}, val: {len(val_index)}")
train_df.head()
```

3. データセット作成時に，2で作ったfoldカラムを参照して割り当てる．

```
fold = 0
for fold in range(5):
    train_dataset = MyDataset(train_df[train_df['fold']!=FOLD].reset_index(drop=True),transform=transforms_train, mode="train")
    valid_dataset = MyDataset(train_df[train_df['fold']==FOLD].reset_index(drop=True),transform=transforms_valid, mode="valid")
```
PyTorch Early Stopping

PyTorchでアーリーストップを行うときのコードをすぐに忘れるのでメモ．
PyTorchでは自由度が高いので自分で実装する．

```
early_stop = 5
best_score = 0.
not_improving = 0

for epoch in range(n_epochs):
    loss_train = train_net(train_loader)
    loss_valid, score = valid_net(valid_loader)
    print(f"Epoch: {epoch+1}, lr: {optimizer.param_groups[0]['lr']:.7f}, loss_train: {loss_train:.5f}, loss_valid: {loss_valid:.5f}, score: {score:.6f}")
    not_improving += 1

    if score > best_score:
        best_score = score
        not_improving = 0
        best_loss = loss_valid

    if not_improving == early_stop:
        print("Early Stopping...")
        break
```
PyTorch 学習高速化 Tips

PyTorchでモデルを学習するときの高速化Tips. 
体感では10倍速位，速くなってびっくりした．

1. num_workers, pin_memory
num_workers: 一定の回数，同じ値を返す．マルチスレッド処理で高速化．
pin_memory: CPUのメモリ領域をページングしない．
```
train_loader = DataLoader(dataset_train, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True)
```

2. AMP (Automatic Mixed Precision)
```
use_amp = True
def _train_net(train_loader):
    if use_amp:
        scaler = torch.cuda.apm.GradScaler()
    for batch_idx, (images, targets) in enumerate(tqdm(train_loader)):
    images, targets = images.to(device), targets.to(device)
        if use_amp:
            with torch.cuda.amp.autocast():
                y_preds = model(images)
                loss = criterion(y_preds, targets)
            scaler.scale(loss).backward()
            scaler.step(optimizer)
            scaler.update()
            optimizer.zero_grad()
            scheduler.step()
    ```
コードを印刷して勉強する

　コードを印刷して勉強すると，すぐにコードを理解できるようになることに気が付いて，1年くらい前からやっている勉強方法です．

　私は優秀な方が書いたコードや，参考にしているアプリケーションのGithubのソースコードを印刷することが多いです．友達や先輩など身近な人が書いたコードは感情込めて読めるのでオススメです．あと，自分が書いたコードで，「ヤバい，美しいコードを書いてしまった...」と感動したときも印刷して飾っています．笑

　コードはwordにコピペして，印刷しています．形式はテンプレート化して使いまわしています．
好みによりますが，私はフォントは「Consolas」，大きさは8か9ポイント，1ページ2行に分割しています．

<br>
　これは11月くらいに，RiiidというKaggleコンペに出たときに，上位者のコードを印刷して勉強したときの写真です．当時はまだ実践的な機械学習のコードを知らなかったので，ちょうど良かったです．
あと機械学習だと，論文のコードはGithubに大体公開されている上，コード量も多くないので，印刷して勉強するのに向いていると感じます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/4adf26b1-a0f4-3362-e5ef-24e1383a727d.png)


<br>
　こちらは半年前くらいに，添加物チェックアプリをFlutter（Android, iOSを同時に作れるやつ）で開発したときに，勉強したコードです．FlutterはFlutter Awesome（https://flutterawesome.com/） という色々コード付きFlutterアプリが公開されているサイトなどがあるので，参考にしていました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/f50507fb-48cc-d12c-63ba-9b90dad1a001.png)



<br>
学習率，バッチサイズ，エポック，スケジューラ

自分で決定しなければならないハイパーパラメータである学習率・バッチサイズ・エポックについて．
大学院での授業でKaggleコンペみたいなことをやらされていて，パラメータ調整に時間をかけたので．

## 学習率
####  学習率 大
　一気に学習が進む．しかし一度の更新が大きすぎると最適解を飛び越えてしまい，無限に収束しない．

#### 学習率 小
　局所解に陥りがち．loss推移を追っていると，学習が局所解に陥っているか何となく分かる．学習の度に最終精度に差があるときも，その原因は局所解に陥っているからのときが多い．

## バッチサイズ
#### バッチサイズ 大
　学習が速く，かつ局所解にも陥りづらい．しかし，学習の束が大きいのでデータが平均化されてしまい，データの個性が失われ，結果精度が上がりづらい．

#### バッチサイズ 小
　学習は遅く，局所解にも陥りやすい．一方，精度は向上しやすい．

## スケジューラ
　上記からハイパーパラメータ調整が面倒だということが分かったと思うが，ここで学習率をよしなに調整するためのスケジューラを導入する．大体，初期学習率は1e-01~1e-03くらいでいいと思う．

#### OneCycleLR
　段階的に学習率を引き下げてくれる

#### ReduceLROnPlateau
　評価値が改善しなかったら学習率を落としてくれる

## エポック
　エポックは大体学習が収束するまで．

## 結論
　局所解に陥らずに，きちんと収束しているかが大事．loss推移を見て学習が局所解に陥っているか見る．局所解に陥っていたら，スケジューラの初期学習率を上げるか，バッチサイズを上げる．個人的には，スケジューラの初期学習率はどうせ下げてくれるので高めに設定しておき，バッチサイズをいじる．
押さえておきたい有名モデルたち

　自分が一番教えて欲しかったが，誰も教えてくれなかったテーマ．個人的な勉強してよかったオススメモデルたちです．細かい解説はしません．太字は特に良いと思うもの．画像認識しか知りませんでした．笑


# 1. 画像認識
## 1.1 画像分類
- Neocognitron
- LeNet
- AlexNet
- GoogleLeNet
- VGGNet
- **ResNet**
- DenseNet
- SENet
- MobileNet v1, v2
- SqueezeNet: Attention機構あり（最近知った）．
- EfficientNet

## 1.2 物体検出
-  R-CNN
-  SPPnet
-  Fast R-CNN
-  Faster R-CNN
-  **YOLO**
-  SSD

## 1.3 セマンティックセグメンテーション
- FCN
- SegNet
- U-Net
- PSPNet

## 1.4 GAN
- VAE: GANの理解のために．
- DCGAN
- LSGAN
- CGAN
- ESRGAN
- pix2pix
- **CycleGAN**
- Recycle-GAN
- StyleGAN
- AnoGAN
- EfficientGAN
- PGGAN
- StarGAN
- BigGAN
- SAGAN
- SNGAN
- WGAN
- infoGAN
- ACGAN

## 1. その他
- Xavierの初期値
- Heの初期値

# 2. 自然言語処理
- **Transformer**
- BERT
- GPT-3


# 3. 音声認識
よくやるNullPointerExceptionまとめ

基本的すぎることですがよくやるのでメモ

# 定数.equals(変数)で変数がnull
```java:
final String nullStr = null;

// ぬるぽにならない
System.out.println("a".equals(nullStr));
// ぬるぽになる
System.out.println(nullStr.equals("a"));
```

# if文がnull
```java:
final String nullStr = null;
// ぬるぽ
if (nullStr) {}
```
1. Numpy 【Math2Code】

数式をコードに直すことが増えてきたのでメモ．
よく使うnumpyを挙げてみた．

- np.dot()  : 内積
- np.linalg.inv(): 逆行列
- np.linalg.det(): 行列
- np.eye(): one-hot表現ないし単位行列
- np.random.randn(d, n): 標準正規分布に従うd次元×n個のデータ
- .T: 転置
- np.linalg.norm(): ノルム
- np.log(): log
- np.exp(): exp
- np.pi: π
- np.sqrt(): ルート
- np.meshgrid: 格子点
- np.sin(): sin
- np.cos(): cos
- np.linalg.eig(): 固有値，固有ベクトル
- np.linspace(): 等差数列
- np.where(): 条件を満たす要素にTrueを返す
- np.linalg.pinv(): 一般化逆行列（ゼロ固有値を無視して逆行列を求める）
- np.cov(): 共分散を求める
YOLOv5で物体検出してみる

YOLOv5で物体検出をしてみたら，とっても簡単に使えることが分かったので，共有．
たったの3行，1分で動かせるので，お手元のColabでやってみては．
レベル高すぎて物体検出の研究をするの諦めたくなりますね．

# コード
```
!git clone https://github.com/ultralytics/yolov5.git
cd yolov5
!python detect.py --source data/images --weights yolov5s.pt --conf 0.25
```

# 実験
data/images下に好きな画像を入れてみよう．
runs/detect/exp下に物体検出後の画像が出力される
monodepth2で単眼カメラから深度推定してみる

こちらは深度推定．前方車両との距離を測ろうと思い，行った．こちらも，monodepth2という素晴らしいライブラリを使うと，とっても簡単に実現できた．
- Github: https://github.com/nianticlabs/monodepth2
- Arxiv: https://arxiv.org/abs/1806.01260
- ICCV 2019
- 深度推定後のnpyファイルと画像を出力してくれる

# コード
```
!git clone https://github.com/nianticlabs/monodepth2.git
cd monodepth2
!python test_simple.py --image_path assets/demo-3.PNG --model_name mono+stereo_640x192
```

# 実験
assets下に画像を入れて実行すると，同じディレクトリ下(assets)に深度推定後の画像と，npyファイルを出力してくれる
Outlook(Windows)のHTMLメールで色が認識されない

# 構成
* PHP 7.0
* php module sendmail

# メールクライアント
* Windows 10 Office 365 Outlook for Desktop

# 原因

カラーコード16進数のみ認識するようになっていました。
例えば、`color:orange;`は効かないので注意。

# 対処法

16進数で定義する。
`color:#55C501;`
超解像をやってみる

相変わらず，ライブラリを使えば簡単にできる．一方で，imagenetなどのデータと比較すると運転データはあまり画質が上がっているとはいえず，用いるデータにドメインを合わせて，自分のデータを用意して学習しないといけないのかな，とも思った．

```
!git clone https://github.com/krasserm/super-resolution.git
cd /content/drive/MyDrive/Lectures/DSS/super-resolution/
!pip install tensorflow==2.5 -q

import os
import matplotlib.pyplot as plt

from data import DIV2K
from model.srgan import generator, discriminator
from train import SrganTrainer, SrganGeneratorTrainer

%matplotlib inline

img_path = "/content/drive/MyDrive/Lectures/DSS/data_blurred/frame_100/demo/frame_00000.jpg"


# Location of model weights (needed for demo)
weights_dir = 'weights/srgan'
weights_file = lambda filename: os.path.join(weights_dir, filename)

os.makedirs(weights_dir, exist_ok=True)

pre_generator = generator()
gan_generator = generator()

pre_generator.load_weights(weights_file('pre_generator.h5'))
gan_generator.load_weights(weights_file('gan_generator.h5'))

from model import resolve_single
from utils import load_image

def resolve_and_plot(lr_image_path):
    lr = load_image(lr_image_path)
    
    pre_sr = resolve_single(pre_generator, lr)
    gan_sr = resolve_single(gan_generator, lr)
    
    plt.figure(figsize=(20, 20))
    
    images = [lr, pre_sr, gan_sr]
    titles = ['LR', 'SR (PRE)', 'SR (GAN)']
    positions = [1, 3, 4]
    
    for i, (img, title, pos) in enumerate(zip(images, titles, positions)):
        plt.subplot(2, 2, pos)
        plt.imshow(img)
        plt.title(title)
        plt.xticks([])
        plt.yticks([])


resolve_and_plot(img_path)
```
【最新モデルを試す】PF-AFN: バーチャル試着

# 背景
　インテル×日立AIハッカソンに参加しているのだが，同じチームにとってもスゴい人がいて，曰く最新モデルが出ると自分で試さずにはいられないらしい．そんな彼の最新モデルをとにかく試してみるというノウハウを盗んできたので，ここで共有したい．以前の自動運転のときと同様ではあるが，簡単に最新論文の挙動を試せるので，私も不定期に行っていきたい所存．
　最新の技術で何がどこまでできるようになっているのか実感できるので，良い趣味だと思う．実際，下記で試したPF-AFNは上半身の画像ならなかなかの精度だが，全身画像になったり，自撮り画像になったりするだけでまったく使い物にならなくなることが分かる．

# PF-AFN
　とりあえず一回目は，そのハッカソンでも用いているPF-AFNでバーチャル試着を行ってみる．本論文の凄いところは，パースフリーなところで，人と服のセグメンテーション情報をinputに必要としないところ．以前のモデルではセグメントが少しでもずれると精度が著しく落ちていたが，その問題を改善した．

- CVPR2021: https://arxiv.org/abs/2103.04559
- https://github.com/geyuying/PF-AFN
- 実行Colab: https://colab.research.google.com/drive/1IpnpdT672AqDo6TTbN5rGsOa8ei2-17S?usp=sharing

# 実験結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/4369f66a-f613-68ce-bd18-d3efb0e22a1e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/766ad1a6-703e-5932-358a-3e98a8038f11.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/cc3c9f36-8c0a-de80-c008-7f88b2a3f6c3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/60a05d8a-95c9-5958-f7e0-c33fe32753c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/cec6685e-c4ea-40ba-20f8-1b91c800d0f0.png)



# 所感
　店舗で使うなら全身．でもおうちで使うアプリ用なら自撮りに対応すべきでは．
　あと実際のニーズって，ちょっと違う気がする．試着の目的って来てみた雰囲気よりもサイズとか着心地を確かめるためな気が．
【最新モデルを試す】DeepFashion_Try_On

　Virtual Try Onのジャンルの他論文．CVPR2020. このために作ったColabはモデルを試すTipsが含まれていて役に立つと思う．

- 実行Colab: https://colab.research.google.com/drive/1TzcTK9Xc6hQCmxTp46sfswvFEWZ03Pu0?usp=sharing
- 論文CVPR2020: https://arxiv.org/abs/2003.05863
- Github: https://github.com/switchablenorms/DeepFashion_Try_On

# モデルを試すときに良く使う手順
1. git clone
2. 足りないライブラリをpip install
3. gdownでモデル（checkpints）やデータセットをダウンロードしてunzip
4. run test

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/e5cc05aa-09e6-3c9f-e68d-731e20ff819b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/9f5b759d-72c7-83a1-e137-32d40abc3f6d.png)


# 所感
PF-AFNとは違い，事前のセグメント情報も入力する必要がある．少しだけ面倒．こちらの手法の方がスタンダード．精度は，PF-AFNの方が良さそう．
自分のデータを入れてみたかったけど，セグメンテーションする必要があったので，一旦保留．
【白線検出】MLND-Capstone

　白線検出を行おうと思って様々なモデルを試したが，どれも全く動かず，4年前のモデルにいきつき，成功．しかも普通の白線だけを検出するのではなく，自分のレーンぽい部分を検出するという一風変わったもの．結果をnpyで出力するためにスクリプトは書き換えた．
　これを使うと前方車両の有無やレーン幅やレーンの不明瞭さなどが分かり，危険検知に役立つ．

- 実行Colab: 共有がなぜかできなかったので，後日共有します．
- Github: https://github.com/mvirgo/MLND-Capstone
オートエンコーダ【PyTorch】

オートエンコーダを触る機会があったので，メモ

- コード: https://colab.research.google.com/drive/1xi4Tur0gJtlElMF92ljO2tCnnK6zmqvf?usp=sharing

### 異常検知
- 画像圧縮を通じて画像の特徴量を抽出し，そこから復元する．そのため，入力値に異常があるとうまく画像を復元できない．正解画像との差分を取ることによって異常箇所を検出できる．

### 再構成誤差
- 入力画像xと復元画像x'の画素値の誤差をピクセル単位で計算する．これを再構成誤差と呼ぶ．ピクセル単位で誤差を計算するのがポイント．

### 損失関数
- 結論から言うと，BCE（バイナリクロスエントロピー）とMSE（平均二乗誤差）のどちらも使われている．
- 回帰でも分類でもないので，回帰=MSE，分類=BCEの方程式が使えず，混乱した．分類でBCEが用いられる理由は，微分したときにラベルが0の項が消えるため計算がシンプルになるし，出力値が0に近いときは誤差が極端に大きくなるので更新幅が大きく収束が速いから．しかし，このオートエンコーダでは出力層でsigmoidをかませているので出力は0-1であり，正解画像も正規化して0-1にして，誤差を計算しているので，分類とは違ってラベルが0のときはないので特にBCE>MSEとなる理由もない．
- 簡単に比較実験している人がいた．[画像オートエンコーダの学習におけるロスの選び方の違い 後編（MIT Places2の場合） \- Qiita](https://qiita.com/YusukeSuzuki@github/items/bd9b8416c08771c310b7)
- ちなみに，VAEの損失関数では，再構成誤差に加えて，潜在変数が標準正規分布に従うように正則化の誤差も考慮する必要がある（後日まとめたい）
VAE

VAEを触る機会があったので，メモ．

- コード: https://colab.research.google.com/drive/196Doy1vS-HjHHemU4Atrd1SJwRi7cUVn?usp=sharing

# AEとの違い
- オートエンコーダでは圧縮した潜在変数zの分布が分からなかった
- VAEでは，潜在変数zを標準正規分布と仮定
    - 標準正規分布をデコーダに入力すれば画像を生成できる
    - 多様体仮説
        - 重要な部分は局所的に集中している
        - 標準正規分布の次元に押し込める

# ネットワーク
<img title='image.png' alt='image' src='/attachments/9c652c28-79c7-4667-b84e-243edc8f79f3' width="1279" data-meta='{"width":1279,"height":543}'>

- 入力画像から平均ベクトルと分散ベクトルを得る．
    - ここでの平均と分散は，潜在空間zを定義するパラメータ
- しかし，平均・分散から標準正規分布を得ても，サンプリングしないと値を得られない
- すなわち，誤差逆伝播できない
- よって，z = μ + εσ で近似する（Reparametrization Trick）
    - ランダムノイズεからサンプリングする
    - 確定的な値が得られ，誤差逆伝播できる
- Reparametrization Trcik部分のコードは以下のようになる．
```
def reparameterize(self, mean, var):
    eps = torch.randn(mean.size().to(self.device)
    z = mean + torch.sqrt(var) * eps
    return z
```
# 損失関数
- オートエンコーダの損失関数は再構成誤差のみだったが，VAEでは，再構成誤差に加え，潜在変数が標準正規分布に従うように正規化の誤差も考慮する．
- 損失関数の導出にはKLダイバージェンス等を使う．（説明略）
- 正則化の損失関数：<img title='image.png' alt='image' src='/attachments/00ee2f84-5969-44e0-889c-888421145857' width="225" data-meta='{"width":225,"height":68}'>
    - 変分下界の最大化と同じ．
    - これは，μ=1, σ=0の時に最小化する
    - すなわち，エンコーダが出力する潜在変数zが標準正規分布と一致すると損失が0になる．
    - 潜在変数zを標準正規分布に押し込める
- 損失関数をコードにすると以下．
```
# 再構成誤差
reconst = -torch.mean(torch.sum(x*torch.log(y)+(1-x)*torch.log(1-y), dim=1))

# 正則化
kl = - 1/2 * torch.mean(torch.sum(1+torch.log(var)-mean**2-var, dim=1))

# 損失関数
L = reconst + kl
```
# 結果
- ぼやける
    - 潜在変数の分布を標準正規分布と仮定
    - ピクセル単位での損失計算


次は，確率分布を明示的にモデル化するのではなく，NNで確率分布を最適化するGANを見ていく．
GitHubにパスワード認証禁止がやってくる

2021年7月28日現在、GitHubでフェッチやプルを行おうとすると、下記のエラーメッセージが表示されることがある（改行入れてます）。

```
remote: Password authentication is temporarily disabled as part of a brownout.
Please use a personal access token instead.
remote: Please see https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/ for more information.
fatal: unable to access 'https://github.com/xxx/yyy.git/': The requested URL returned error: 403
```

パスワード認証方式をとっていることが原因で、2021年8月13日以降、GitHubはパスワード認証を受け付けなくなるので、前もってプロモーション期間を設けているようだ。下記に詳しい。

[Token authentication requirements for Git operations](https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/)

ちなみに過去にも実施されたことがあるようで、今日・明日が最後のプロモーションになる。（下記は日本時間に変換している）

2021年6月30日 16時〜19時
2021年7月01日 01時〜04時
2021年7月28日 16時〜19時
2021年7月29日 01時〜04時

そんな訳で、8月13日以降に慌てないように、今のうちにSSH鍵認証の設定をしておいた方が良い。

主な手順としては①SSH鍵の作成、②公開鍵をGitHubに登録、③リポジトリ情報をssh接続のものに変更する、という形になるが、なぜか私の場合は `~/.gitconfig` ファイルが悪さをしていたようで、リネームした（いろいろ重要そうなのでいきなりの消去は悪手）ところエラーが解消した。

# 参考
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
上記の追記部分を参考にしてた部分がエラーの原因のようだ。

https://qiita.com/Qiitaman/items/40a133ce48779f138abd
削除は上記の記事を参考にしました。

[カスタマイズはほどほどにしましょう](https://aik0aaat.hatenadiary.jp/entry/2018/07/11/003419)
上記の記事の参考記事。
DCGAN

DCGANのメモ．
- コード: https://colab.research.google.com/drive/14sMgXakkgNhYD2K3RfdKL2N1THqPZfO9?usp=sharing

# メモ
- なぜ生成器の出力層はtanh関数なのか？
    - 学習が速い
        - 画像はスパースであり-1ではなく0が多いと学習しづらい
    - [tensorflow \- Generative adversarial networks tanh? \- Stack Overflow](https://stackoverflow.com/questions/41489907/generative-adversarial-networks-tanh)
    - 仮に[0 ,1]で入力画像を正規化しているならば，sigmoid関数を使う．
```
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
-> (x-μ)/σ で正規化．このときは (x-0.5)/0.5 = 2x-1 となるので，[-1, 1] にスケーリングできている．
ちなみに上は３チャンネル（RGB）の場合であり，１チャンネル（白黒）のときは
transforms.Normalize((0.5, ), (0.5, ))
```

- Transposed Convolution（転置畳み込み）の計算
    - out_size = (in_size-1) * stride -2*padding + kernel_size + output_padding
  
- 識別器のreturnでsqueeze()をかますのはなぜか？
    - squeeze(): 余計に１が入っているshapeを削除する
        - (A×1×B×1) -> (A×B)
     
- 識別器の損失関数をマイナスにするのはなぜか？
    - 損失関数は，識別器が最大化，生成器が最小化する．すなわち，識別器の損失関数をマイナスにすれば，識別器を最小化することと同義．

- 生成器の損失関数を，log(1-D(G(z)))から-log(D(G(z)))とするのはなぜか？
    - そのままだと，1.0付近で勾配が急になり，0付近では緩やかになる．つまり，学習初期の更新幅が小さく学習が進まない．
    - 結局，D(G(z))が1に近いほど値が小さくなってくれればよいので，-log(D(G(z)))と書き換えてしまう．このとき，0付近で勾配が急になり，識別器をうまく騙せない学習初期ほど更新幅が大きくなってくれる．

- detach(): 変数から定数を作る

- GANの損失関数はJSダイバージェンスと同じ．
    - 損失関数を最小化することはJSダイバージェンスを最小化することと同じ．
    - よって，モデル分布とデータ分布を可能な限り近づけようとしていることと同じ．
    - 理論的な説明はちょっと記事にするには重すぎるので割愛．

- torchsummary: モデルのshapeを確認できる．
CGAN

CGANのメモ．
- コード: https://colab.research.google.com/drive/1vrPl47CZQDtFkHHbh1u8P0KeIfYmv7KU?usp=sharing

- 条件にラベルを付与することで，指定したラベルの画像を生成する
    - real or fakeを識別する
    - ラベルとマッチしているかも識別する
- 単純に，画像にラベルをone-hotで結合するだけ．
- DCGANにほんの少しの工夫を加えるだけで，こうしたことができてしまう．研究においてオリジナリティを出す参考になると思う．

- 0-9まで順番に指定しながら生成した例（DCGANと違ってランダムではない）
１エポック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/14600d98-156c-6cb4-dac5-e1fb73af1f16.png)


10エポック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/4615f4c2-00d4-6f85-09e2-3d4a31e9a35f.png)
LSGAN

LSGANのメモ．
- コード：https://colab.research.google.com/drive/11vjn_j0h7jPjLJlTmfhlM5hyeNcl61rl?usp=sharing

- 損失関数
     - 要は，sigmoid+BCEの部分を，MSEにしただけ．
    - sigmoidだと大きい正または負の値だと勾配消失してしまうため，出力値をsigmoidをかまさずに直接扱おうという工夫．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/5f2de554-09c7-d2bb-d2ea-0b186ad9bcd2.png)


- 結果: DCGANの方が性能が良いらしい．ネコみたいな何かが生成された．

１エポック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/86f828e1-3a97-e59d-f318-fc0c04af69bd.png)

200エポック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/f3cca758-00e4-1b63-99ce-4f9e4ad2b4da.png)


1000エポック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/8411a23f-a0cb-3f36-0f47-249791d8a2cf.png)


2000エポック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/bc587160-d4be-b94a-b741-127638086093.png)
天気予報を表示する JXA

## 天気予報のAPIサービス

天気予報をJSON形式で取得できる「livedoor 天気」が2020年7月でサービス提供を終了しましたが、この互換サービスの[「天気予報 API（livedoor 天気互換）」](https://weather.tsukumijima.net)があることを知ったので使ってみました。

## JXA のコード
私はMacを使っているので、AppleScriptを使うのですが、JSONを扱うには JavaScript の方が楽かと思うので、スクリプトエディタをJavaScriptモードにして使用します。

```javascript:天気予報.scpt
// 緯度、軽度から住所を求める
// https://weather.tsukumijima.net/　のサービスを利用
// city コードは上記URLに一覧へのURLがありますので、参考にして設定してください
// このコードサンプルでは岩手県盛岡市のコード:030010 をデフォルトに設定しています
// 戻り値は JSON 形式

var app = Application.currentApplication()
app.includeStandardAdditions = true

var baseURL = '"https://weather.tsukumijima.net/api/forecast/city/'
var city = app.displayDialog("都市コードを入力", {defaultAnswer: "030010"}).textReturned
var URL = baseURL + city + '"'
var ans = app.doShellScript('curl -s ' + URL)
var jsonData = JSON.parse(ans)

app.displayDialog(jsonData['title'])
app.displayDialog(jsonData['description']['headlineText'])
app.displayDialog(jsonData['description']['bodyText'])

// 今日の天気を表示
app.displayDialog(jsonData['forecasts'][0]['date'] + 'の天気：' + jsonData['forecasts'][0]['telop'])
app.displayDialog(jsonData['forecasts'][0]['detail']['weather'] + '、\r風：' + jsonData['forecasts'][0]['detail']['wind'])
var temp = '最高気温:' + jsonData['forecasts'][0]['temperature']['max']['celsius'] + '度'
app.displayDialog(temp)
// 明日の天気を表示
app.displayDialog(jsonData['forecasts'][1]['date'] + 'の天気：' + jsonData['forecasts'][0]['telop'])

app.displayDialog(jsonData['forecasts'][1]['detail']['weather'] + '、\r風：' + jsonData['forecasts'][1]['detail']['wind'])
var temp = '最低気温:' + jsonData['forecasts'][1]['temperature']['min']['celsius'] + '度'
	temp = temp + '、最高気温:' + jsonData['forecasts'][1]['temperature']['max']['celsius'] + '度'
app.displayDialog(temp)

```

## 好きな場所を表示するには
[「天気予報 API（livedoor 天気互換）」](https://weather.tsukumijima.net)のサイトにある[全国の地点定義表](https://weather.tsukumijima.net/primary_area.xml)（XML）から希望の地点コードを見つけてソースを変更してお使いください。

なお、気象庁でも非公式ながらAPIを提供しているとのことなので、そちらもみてみましたが、こちらの方が使いやすいと思います。（私見）

天気予報APIのサービスに感謝いたします。
L1ノルム，L2ノルム

基本的な事項で恐縮だが，L1ノルムとL2ノルムの違いを意識する必要がある場面に遭遇したため，メモ．
- 一般的には過学習を防ぐための正則化項として用いられている
- GANでもpix2pixなどで極端な画像を生成しないように使う．正則化的に．

## L1ノルム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/fe94917a-945f-b412-224e-bf5c2a908c27.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/3b08928c-df3b-37f1-3084-aecf0d748aa0.png)


- マス目上で考える距離
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/1537b7cd-bece-f204-93a9-ad8ebb98aa5a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/a8725306-9648-5c3e-e7e5-7bf8c753f458.png)



- この例ではw1=0である．疎な解，スパースになりやすい．
- ゆえに，次元削減，余分な説明変数を省くことができる





## L2ノルム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/bab9c2a2-13cb-839a-6f33-894d227a50a3.png)


- 始点と終点を結んだ距離
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/300d7cd6-e5ea-171e-a620-d34f8296e4d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/a1bdb237-7ab0-baf0-c82c-272493d6bcb2.png)


- L2はL1よりも表現力が高い
- ゆえにL2はL1よりも精度が高い
- ただし，次元削減の効果はない．


## 結論
- L1正則化もL2正則化も，過学習を抑制する（パラメータが大きくなりすぎないようにする）
- L2正則化の方がL1正則化よりも過学習をうまく抑制する（表現力が豊かなため）
- L1正則化により疎な解を得られる可能性が高く，次元削減の効果がある
pix2pix

pix2pixのメモ．

- コード：https://colab.research.google.com/drive/1DaKGWas7Wv4T9HYUIiMdbDFmD66KGxpa?usp=sharing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/2e988ff8-b95d-85bd-e214-27fe45b58424.png)




- 線画と画像のペアを入力にしているところが工夫
    - 単純にdim=1（チャンネル次元）でconcatしているだけで実現できる（他のモデルも似たような感じをみかける）
- 生成器の損失関数では，敵対性損失に加え，L1損失で本物画像と偽物画像の平均絶対距離を考慮することで，極端になり過ぎないような画像を生成する
- 入力画像のデコードにはU-Netを用いている．実装は以下のように実はシンプル．Skip Connectionで繋ぐというと難しそうだが，コードにすると，単に前の出力とconcatするだけで良い．

```
class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.down0 = nn.Conv2d(3, 64, kernel_size=4, stride=2, padding=1)
        self.down1 = self.__encoder_block(64, 128)
        self.down2 = self.__encoder_block(128, 256)
        self.down3 = self.__encoder_block(512, 512)
        self.down4 = self.__encoder_block(512, 512)
        self.down5 = self.__encoder_block(512, 512)
        self.down6 = self.__encoder_block(512, 512)
        self.down7 = self.__encoder_block(512, 512, use_norm=False)

        self.up7 = self.__decoder_block(512, 512)
        self.up6 = self.__decoder_block(1024, 512, use_dropout=True)
        self.up5 = self.__decoder_block(1024, 512, use_dropout=True)
        self.up4 = self.__decoder_block(1024, 512, use_dropout=True)
        self.up3 = self.__decoder_block(1024, 256)
        self.up2 = self.__decoder_block(512, 128)
        self.up1 = self.__decoder_block(256, 64)

        self.up0 = nn.Sequential(
            self.__decoder_block(128, 3, use_norm=False),
            nn.Tanh()
        )

    def __encoder_block(self, input, output, use_norm=True):
        layer = [
            nn.LeakyReLU(0.2, True),
            nn.Conv2d(input, output, 4, 2, 1)
        ]
        if use_norm:
            layer.append(nn.BatchNorm2d(output))
        return nn.Sequential(*layer)

    def __decoder_block(self, input, output, use_norm=True, use_dropout=False):
        layer = [
                 nn.ReLU(True),
                 nn.ConvTranspose2d(input, output, kernel_size=4, stride=2, padding=1)
        ]
        if use_norm:
            layer.append(nn.BatchNorm2d(output))
        if use_dropout:
            layer.append(nn.Dropout(0.5))
        return nn.Sequential(*layer)

    def forward(self, x):
        x0 = self.down0(x)
        x1 = self.down1(x0)
        x2 = self.down2(x1)
        x3 = self.down3(x2)
        x4 = self.down4(x3)
        x5 = self.down5(x4)
        x6 = self.down6(x5)
        x7 = self.down7(x6)
        y7 = self.up7(x7)

        y6 = self.up6(self.concat(x6, y7))
        y5 = self.up5(self.concat(x5, y6))
        y4 = self.up4(self.concat(x4, y5))
        y3 = self.up3(self.concat(x3, y4))
        y2 = self.up2(self.concat(x2, y3))
        y1 = self.up1(self.concat(x1, y2))
        y0 = self.up0(self.concat(x0, y1))

        return y0

    def concat(self, x, y):
        return torch.cat([x, y], dim=1)
```
Detectron2のv0.5アップデート内容まとめ

画像認識や画像検出でよく利用されるプラットフォームであるDetectron2のアップデートがありました。

7/24にアップデートされた内容を確認して変更点のまとめと、気になった箇所を深掘りしました。

Detectron2そのものについては次の記事を参照ください。

https://github.com/facebookresearch/detectron2

https://detectron2.readthedocs.io/en/latest/

## 変更点まとめ
- LazyConfigシステムを追加
- Mask R-CNNベースラインを追加
- mmdetectionのモデルにバックボーンラッパーとディテクターラッパーを追加
- Implicit PointRend & PointSupのコードを公開
- BatchNormのRethinking Batchのコードをリリース
- BatchNormのRethinking Batchのコードをリリース
- RegNetバックボーンのサポートを追加
- DensePose CSEの新機能：詳細はリリースノート

以下の環境でビルド済みのLinuxバイナリが利用できます。

|CUDA|torch 1.9|torch 1.8|torch 1.7|
|--|--|--|--|
|11.1|install|install|
|11.0|||install|
|10.2|install|install|install|
|10.1||install|install|
|9.2|||install|
|cpu|install|install|install|

## LazyConfigシステムを追加
従来のyacsベースのコンフィグシステムからLazyConfigシステムに対応したことで、柔軟性が大幅に向上しました。

Detectron2での公式サンプルは以下のようになっています。

```python
# config.py:
a = dict(x=1, y=2, z=dict(xx=1))
b = dict(x=3, y=4)

# my_code.py:
from detectron2.config import LazyConfig
cfg = LazyConfig.load("path/to/config.py")  # an omegaconf dictionary
assert cfg.a.z.xx == 1
```

他にも実装時に参考になるサンプルが[GitHub](https://github.com/facebookresearch/detectron2/tree/master/configs/common)に公開されています。

```python
# Common training-related configs that are designed for "tools/lazyconfig_train_net.py"
# You can use your own instead, together with your own train_net.py
train = dict(
    output_dir="./output",
    init_checkpoint="detectron2://ImageNetPretrained/MSRA/R-50.pkl",
    max_iter=90000,
    amp=dict(enabled=False),  # options for Automatic Mixed Precision
    ddp=dict(  # options for DistributedDataParallel
        broadcast_buffers=False,
        find_unused_parameters=False,
        fp16_compression=False,
    ),
    checkpointer=dict(period=5000, max_to_keep=100),  # options for PeriodicCheckpointer
    eval_period=5000,
    log_period=20,
    device="cuda"
    # ...
)
```

https://github.com/facebookresearch/detectron2/tree/master/configs/common

LazyConfigそのものについては以下を参照して下さい。

https://github.com/FelixBenning/lazyConfig/blob/master/Motivation.md


## Mask R-CNNベースラインを追加

新しいベースラインはEpochsの増加によりAPが向上しています。
Mask R-CNN ResNet-50-FPN Box AP メトリックは、41から 46.7（ImageNet の初期化を使用）、47.4（ランダムな初期化を使用）に増加しました。

新しくDetectron2を動かす際は、Model Zooから最新のベースラインを使うことで精度向上が期待できます。

https://ai.facebook.com/blog/advancing-computer-vision-research-with-new-detectron2-mask-r-cnn-baselines


![baseline](https://scontent-nrt1-1.xx.fbcdn.net/v/t39.2365-6/203397301_3070023816561693_5303690705195211565_n.png?_nc_cat=111&ccb=1-3&_nc_sid=ad8a9d&_nc_ohc=yx6xSWEjFmIAX_0fUp-&_nc_ht=scontent-nrt1-1.xx&oh=1aded66f80d0949cd75f2a1702813deb&oe=610523B3)




## mmdetection
mmdetectionが追加されたことで、さらに多くの事前学習済みのモデルを使用して画像検出等のタスクを実行できるようになりました。
#### MMDetecitonについて
MMDetectionは、Model Zooで何百もの既存・在来の検出モデルを提供し、Pascal VOC、COCO、CityScapes、LVISなどの複数の標準データセットをサポートしています。これらの既存モデルや標準データセットに対して、以下のようなタスクを実行できます。

- 既存のモデルを使って、与えられた画像を推論する。
- 標準的なデータセットで既存のモデルをテストする。
- 標準的なデータセットで定義済みモデルを学習する

https://github.com/open-mmlab/mmdetection
CycleGAN

- コード: https://drive.google.com/file/d/1H6YU_6a1hPqvdBg-V00BbFnYABx0OwQQ/view?usp=sharing
- 損失関数が面白い．

# ポイント
### 損失関数
- 敵対性損失: 通常の損失．本物か偽物か．
- サイクル一貫性損失: ドメインAの画像をドメインBに変換した後，その変換後の画像を再びドメインAに戻したときの，生成画像と元画像のL1距離
- 同一性損失: 本物画像を生成器に入れて，元に戻るか．L1距離．画像に対する不要な変更にペナルティをかける．

### 最小二乗損失
- BCEよりも学習が安定し速く収束する．LSGANと同じ．

### patchGAN
- 画像全体ではなく画像パッチに対して本物か偽物か識別することで，画像のシャープさが増すだけでなく，重みパラメータ数も減少する．

### Reflection Padding
- ゼロパディングよりもデータ分布が元の入力に近いため，GANでよく用いられる．
RecycleGAN

- コード: https://colab.research.google.com/drive/15d6ymJnuukp2nDzpLfq-xSQFTI1u-hd1?usp=sharing
- 論文の実装に慣れてきた．初見GAN論文を自分で実装する背中が見え始めた...と思う．

# ポイント
- RecycleGANは動画に最適化したバージョンのCycleGAN
    - **生成器，識別器の他に，予測器を導入することで時系列情報を考慮する** （重要なのはここだけと言っても過言ではない．）
    - 動画生成が私の研究テーマなので，バッチリ．
- 損失関数: CycleGANと同じ．
    - 敵対性損失: 平均二乗誤差．LSGANと同じ．MSEを使うのはGANではデファクトなのだろうか．
    - サイクル一貫性損失: 普通にL1距離で．
    - 同一性損失: L1距離．
        - 再帰性損失: 予測器によって作られたものの損失関数．L1距離．
- 生成器: CycleGANと同じく，エンコードしてデコード．ResidualBlocksを9個挟む形．
- 学習に10時間くらいかかる．でも，CycleGANで実質2回GAN回してかつそれに予測器が加わって10時間なら，何とかなるかもしれない．
ESRGAN

- コード: https://colab.research.google.com/drive/1c1oXiLh61AKH7bboam1nIQx1p3jUvbC0?usp=sharing
- 超解像．

# ポイント
## 損失関数
### Pixcel Loss
本物画像と偽物画像のピクセルごとのL1距離．
Pixcel Lossのみでまず事前学習を行い，その後，他の損失関数を考慮する．

### Perceptual Loss
学習済みVGGにより特徴量を抽出．最終層の4096次元データを本物画像と偽物画像で比べ，L1距離を算出．

## relativistic discriminator
- これ重要．
- 元論文: https://arxiv.org/abs/1807.00734
- 分かりやすい解説: https://github.com/Yagami360/MachineLearning-Papers_Survey/issues/51
- 識別器は最終的に本物画像50%, 偽物画像50%として判定して欲しいという暗黙的な情報を考慮して最適化．
- 理論をまだ理解しきれていないので，今後の課題．
- コード自体はシンプル．

```
loss_GAN = self.criterion_GAN(pred_fake - pred_real.mean(0, keepdim=True), valid)
```

## pixcel shuffle
アップサンプリング時に通常のGANと同様に転置畳み込み層を用いると，ノイズが発生する．そこで，チャンネルを幅と高さの空間方向にマップする．
EfficientGAN

- コード: https://colab.research.google.com/drive/13pnodMQAsLKeVHW64h4MIlhLtvNJVXjy?usp=sharing
- 異常検知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/7e4c3dc1-3b71-d9d6-207a-9c4ec6b9f1d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/597ced17-4d6b-91a6-eb31-47e5d09f89f5.png)




# ポイント
## 異常度
- Residual Loss: 元画像と生成画像のピクセルごとの差
- Discrimination Loss: Discriminator最終層の1つ前の差

## L1Loss
- 入力画像xと生成画像G(E(X))，乱数zとエンコードした潜在変数E(G(z))の間でのL1損失を追加


## Bidirectional GAN
- 潜在変数zから偽物画像G(z)を生成するGeneratorだけでなく，入力画像xから潜在変数E(x)へとエンコードするEncoderも同時に学習させる．
- これにより最適な潜在変数zを探索する手間が省ける．入力画像xを使用できるため．
- 画像xの256次元と，潜在変数zの256次元をconcatすることで，セットで学習させる実装．
Self-Attention GAN

- コード: https://colab.research.google.com/drive/1pf1MjYkT0kOKz1xGooRzqvsh9LKDypIT?usp=sharing
- Attention機構を用いて精度を改善したGAN.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/f1956a3d-a4ff-a976-5486-6b5579b933f1.png)




# ポイント
## Self-Attention
- 生成器の転置畳み込みConvTanspose2dは局所情報の拡大であり，大域的な情報を考慮することができない．
- そこで，Self-Attentionによって「自分自身と値の似ているセル」に重みづけをすることによって計算コストを抑えながらも大域的な全体画像を網羅するカーネルで学習させる．
- 分かりやすい記事: https://xtech.nikkei.com/atcl/nxt/mag/rob/18/00007/00006/

### Self-Attention導出
1. 入力変数xをサイズC×W×HからC×NのC行N列に変換
2. xの転置とxを行列演算．内積の値によって似ている度合いを算出
3. softmaxによって足して１になるように規格化．
4. C×Nの行列xとAttention Mapを掛け算し，Self-Attention Mapのoを得る．

## 1×1 Convolutions (pointwise convolution)
- 入力xをチャンネルごとに線形和をとったもの．
- 次元削減と同じ働き．
- チャンネル数を少なくして計算コストを抑えたい．

## Spectral Normalization
- データそのものではなく，畳み込み層の重みパラメータを規格化する．
- ネットワークにリプシッツ連続性を持たせる
調整済み傾向スコア

傾向スコア(propensity score)は二値予測のTrueになる予測確率です。これは学習データでの確率を戻します。
SPSS Modelerの決定木モデルには調整済み傾向スコアというものもあります。これはモデルは学習データでつくり、傾向スコアはテストデータや検証データで返すもので、オーバーフィットをさけるためのスコアです。

ここでは調整済み傾向スコアを算出してみます。
まず、調整済み傾向スコアはテストデータや検証データが必要なので、データ区分ノードが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3a00decd-3278-daf0-34a8-f88d80cb316c.png)

次に、決定木のモデルで傾向スコアや調整済み傾向スコアを算出する設定をします。例ではC5.0で行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bb1816fe-de10-6716-2f8f-00b9ceb3bb27.png)


そして、モデルナゲットの設定タブで傾向スコアや調整済み傾向スコアの計算にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d4fab33-9392-d9ee-5ff5-9e77e62b8942.png)

学習データで作ったモデルではIncome levelは1.0(Low)の場合は16%の傾向スコアになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b147fa58-543e-2359-342a-70b37fd1fad9.png)

スコアリングしてみると算出されます。\$CRP-Credit_ratingは傾向スコアで、\$CAP-Credit_ratingは調整済み傾向スコアです。Incomeが1.0(Low)の場合は、先の決定木の通り傾向スコアでは16.9%ですが、テストデータで算出した調整済み傾向スコアでは19.4%が戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bdc7096f-eeb0-ca40-f86b-ef4ad6d4e7f6.png)

なお、\$CC-Credit_ratingは予測結果に対する確信度です。二値予測の場合はTRUEで予測した場合は傾向スコアと同値になり、FALSEで予測した場合は「1-傾向スコア」になります。

* テスト環境
Modeler 18.3
Windows 10 64bit

* サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/210728%E8%AA%BF%E6%95%B4%E6%B8%88%E3%81%BF%E5%82%BE%E5%90%91%E3%82%B9%E3%82%B3%E3%82%A2/210728%E8%AA%BF%E6%95%B4%E6%B8%88%E3%81%BF%E5%82%BE%E5%90%91%E3%82%B9%E3%82%B3%E3%82%A2.str

* 参考

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nuggets-decision-treerule-set-model-nugget-settings
GAN ベストプラクティス集


### BCEではなくMSEを用いる．
学習が安定化する．（LSGAN）

### 複数画像やベクトルをconcatして入力とする．
セットで学習させることができる．（CGAN, pix2pix等）

### pixcel shuffle
転置畳み込みにより発生する格子状のノイズを抑える（ESRGAN）

### 画素単位のL1Loss
きちんと元に戻ることを確実にする．（ESRGAN, pix2pix, EfficientGAN等）

### Relative Average Discriminator
本物画像，生成画像の両方で学習を進めることができる．(ESRGAN)

### PatchGAN
パッチ単位という狭い範囲で識別させる．より鮮明な画像を生成できる．（pix2pix）

### cycle-consistency（サイクル一貫性損失）
元に戻るか．（CycleGAN, RecycleGAN）

### identity-loss（同一性損失）
元画像を入力として，元に戻るか．（CycleGAN, RecycleGAN）

### 予測器の導入
予測器を導入することで，前後の時系列情報も考慮に入れる．（RecycleGAN）

### AdaIN
スタイルを適用する．（styleGAN）

### 乱数zの導入
細かなスタイル，テクスチャに反映．（styleGAN）

### Self-Attention
Attention機構の導入によって，大域的な情報も考慮する．（Self-Attention GAN）
DeepFillv2【Image Inpainting】

# Image Inpaintingとは
指定した領域（マスク）を補完する．最近はGANで行われている．Adobeとかが頑張っている．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/12e8deb1-fb5e-69ed-0f26-e218c15d953d.png)


# ファイルなど諸々
- ディレクトリ: https://drive.google.com/drive/folders/1NEULXQ0J1g5fL70xD-0_XeLxVO3C9QhJ?usp=sharing
- 実行
```
cd /content/drive/MyDrive/ImageExtension/DeepFillv2_Pytorch
!pip install imgcrop
!bash ./run_test.sh
```
- Github: https://github.com/csqiangwen/DeepFillv2_Pytorch
- Paper: https://arxiv.org/abs/1806.03589
    - ICCV2019

# 実験
背後の人を消す．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/15a605b9-ab3e-cdfb-0e89-e875877f899f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/94185845-e586-2ecd-d207-91badb3e5d86.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/d9a429fa-f34a-d08a-5eb5-0e493491c6b1.png)


# 所感
かなり精度も良く，推論速度も速い．マスク部分をセグメンテーションとかで自動化すれば，何らかのアプリに組み込めそう．
Boundless【Image Extension】

- Colab: https://colab.research.google.com/drive/1fqNM17Ie8gADeLS79Q7pIY2o8KmOKmfJ?usp=sharing
- Paper: https://arxiv.org/abs/1908.07007
- github: https://github.com/recong/Boundless-in-Pytorch
- 解説: https://github.com/Yagami360/MachineLearning-Papers_Survey/issues/28

# 実験
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/b4b8fd1e-0c4f-8390-e363-34edae733a27.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/f2785452-b0e6-5506-42b1-e5c987c30dd1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711751/a5ac0507-1410-b809-aed0-dbf881094b98.png)




# 所感
Googleすごい．推論速度も精度も問題ない．