Tensorflowで自分に合った彼女を探すCNNを実装しようとしてみた~SSDで画像検出！~(第三回)

# 目的
前回、顔をタイプ分けしてみたいなことをしてきました！！

今回は最初に試してた写真全体から雰囲気を決定するみたいなのを試してみようと思いました！！

# 試したこと
#### 1 OpenCVのfullbody検知機？で人物を切り抜いてみる！ 
最初は、前回の顔切り抜きを応用して、全身の画像を切り抜いてしまおう！と試してみました！
```python:変更点
IMG_FILE = "haarcascade_frontalface_default.xml"
-> "haarcascade_fullbody.xml"
```
結果から言うと、うまくいきませんでした笑

なんか、とりあえず長方形に色々切り抜いてくれて…
あいにく、原因がわかるほどの知識はありませんが、とりあえず別の方法を試してみようと…

#### 2 マスク作って、切り抜く！！
[このサイト](http://www.otupy.net/archives/39235274.html)で、クロちゃんを切り抜くために、OpenCVのブラーを使って、こう、明るい、暗いみたいな感じでのマスクを作っていく方法をみてみたのですが…

![スクリーンショット 2022-08-09 12.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773097/f1d7340b-9e1e-acf3-e008-12ec2b18b490.png)

閾値の設定が細かいことと、背景の明るさが変わりやすい画像ではこの手法で人だけ切り抜くのは難しいことが発覚しました笑
(ちなみに画像は宮崎あおいさんだったものです…)

#### 3 SSDで画像検知！
悩みに悩んだ結果、たどり着いたのはSSDなるものを使うこと！！
「[openCVとKerasで画像から人物検出](https://qiita.com/nanako_ut/items/13849bd4cc087139a40c)」ではSSDを導入して人物検出を行うというやり方が書かれていました！
しかし、相手ある通りに実装しても、なんか全然動かない…

公式を見ると、
「This code was tested with Keras v1.2.2, Tensorflow v1.0.0, OpenCV v3.1.0-dev」
僕の使ってる環境では、Tensorflow v2.?で、KerasとかTensorflowと合併みたいなことしてるし…
そりゃできないよねぇ、っていう

# SSDの画像検知をtensorflow2の環境下で！
ググりまくった結果、辿り着いたのはtensorflow2でSSDを動かそうと挑戦したこのサイトです！！

https://techblog.cccmk.co.jp/entry/2020/05/11/094834

ただ、これを真似してコーディングを続けると、細かいところコピペとか修理をミスりまくって、エラーと格闘を続けた結果、ついに![スクリーンショット 2022-08-09 12.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773097/833993f5-c5ae-d75d-25fb-6fd3750e29d2.png)
人を検知することができるようになりました！！

これModelいじって、もう少しうまくやれれば、画像に存在してるものでその人の雰囲気を細かく検知できるようになるかも！！
色々悩んだりしたけど、ここに辿り着いたのは結果オーライかも！！笑

## 沼ったところ
### v2 にないsessionなどの機能
```python:tf1を使う挑戦
config = tf.compat.v1.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.45
tf.compat.v1.keras.backend.set_session(tf.compat.v1.Session(config=config))
```

このCompatなるもので、よくわからんけど使えるようになるみたいです！笑

### ただコピペして気づかずにいたレイヤー…
```python
    net['mbox_loc'] = Concatenate(axis=1,name='mbox_loc')([
                        net['conv4_3_norm_mbox_loc_flat'],
                        net['fc7_mbox_loc_flat'],
                        net['conv6_2_mbox_loc_flat'],
                        net['conv7_2_mbox_loc_flat'],
                        net['conv8_2_mbox_loc_flat'],
                        net['pool6_mbox_loc_flat']
                ])
    net['mbox_conf'] = Concatenate(axis=1,name='mbox_conf')([
                        net['conv4_3_norm_mbox_conf_flat'],
                        net['fc7_mbox_conf_flat'],
                        net['conv6_2_mbox_conf_flat'],
                        net['conv7_2_mbox_conf_flat'],
                        net['conv8_2_mbox_conf_flat'],
                        net['pool6_mbox_conf_flat']],
                )
    net['mbox_priorbox'] = Concatenate(axis=1,name='mbox_priorbox')([
                        net['conv4_3_norm_mbox_priorbox'],
                        net['fc7_mbox_priorbox'],
                        net['conv6_2_mbox_priorbox'],
                        net['conv7_2_mbox_priorbox'],
                        net['conv8_2_mbox_priorbox'],
                        net['pool6_mbox_priorbox']
                ])
```

ここ、mergeからConcatenateに変更したときに、単純にコピペしてて、全部の層をmbox_locで書いてしまっていて、後々エラーが続いてしまいました笑

コピペをするときは丁寧に、細かいところ調整しないとダメですね…

# 今後の予定 
今回、やっとSSDで画像認識できるようになったので、今後はこれ活かして、もっと細かく色々分けられるようにしていこうと思います！
その上で使えそうなのが下の記事です！

https://techblog.zozo.com/entry/detection_and_retrieval

こいつ活かして、彼女を…
俺は彼女を…

# まとめ
なんか最近、カップルにアンケートとか聞いてると虚しくなってきて、ラインbotで彼女作れば虚しさ半減するんじゃないかと思って勉強始めて…
虚しさで泣きそうです笑