物体検出を用いたピースサインからの指紋情報流出を防ぐための画像処理

#はじめに
　[こちら](https://www.itmedia.co.jp/news/articles/2003/09/news043.html)の記事で、SNSに投稿された画像から指紋情報などの生体情報が盗み取られるといった内容が書かれていました。そこで、画像処理によって、SNSに投稿された画像の情報流出を防ごう!と思い立ったので記にまとめました。
　今回の目的は、SNSなどに投稿された画像から指紋が盗み取られないような画像処理を行うことです。ただし、今回の処理の対象としては、ピースサインのみとしています。
（※情報流出を防ぐならば、画像全体をぼかしたりすればいいのではないか？とも思いましたが、せっかくきれいに撮影した画像なので、情報流出となりそうな箇所だけを対象にすればいいのかなと個人的に思い、今回はピースサインを対象としてます。）

#処理の流れ
　以下のような流れで処理を行いました。
1. 物体検出を用いて、画像からピースサインを検出
2. 検出されたピースサインに対して、ぼかし処理を適用

これらの処理を行う上で、活用させていただいたものは以下になります。

- 学習画像のアノテーションツール：[labelImg](https://github.com/tzutalin/labelImg)

- 物体検出：[YOLO v3](https://github.com/qqwweee/keras-yolo3)

※コード全体は、後ほど紹介予定です。

### 1. 物体検出を用いて、画像からピースサインを検出
　学習画像は、295枚を準備しました。ピースサインの検出器を作成するに当たり、labelImgの使い方やYOLO v3に基づいたモデルの作成方法などは、以下のサイトを参考にさせていただきました。

- [Yolo学習用データセットの作成ツール：labelImg](https://demura.net/deeplearning/14350.html)
- [KerasのYOLO-v3を動かしたった](https://qiita.com/yoyoyo_/items/10d550b03b4b9c175d9c)

### 2. 検出されたピースサインに対して、ぼかし処理を適用
　今回は、ぼかし処理として、ガウシアンフィルタを採用しました。検出されたピースサインに対して、ぼかし処理を適用するため、紹介したYOLO v3のプログラムを少し編集しました。変更箇所は以下の2点です。

```ruby:yolo.pyの167行目
return image, out_boxes # out_boxesを追加
```

```ruby:yolo_video.py内
# ============ 4行目 ============
from PIL import Image, ImageFilter   # ImageFilterを追加

# ============ 関数 detect_img 内 ============
def detect_img(yolo):
    while True:
        img = input('Input image filename:')
        try:
            image = Image.open(img)
        except:
            print('Open Error! Try again!')
            continue
        else:
#            r_image = yolo.detect_image(image)
            # =============== 以下，編集・追加部分 =============== 
            import numpy as np
            r_image, out_boxes = yolo.detect_image(image)
            im = np.array(r_image)          
            for i in range(len(out_boxes)):
                box = out_boxes[i]   
                top, left, bottom, right = box
                top = max(0, np.floor(top + 0.5).astype('int32'))
                left = max(0, np.floor(left + 0.5).astype('int32'))
                bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32'))
                right = min(image.size[0], np.floor(right + 0.5).astype('int32'))
                im_crop = im[top:bottom, left:right, :]
                im_crop = Image.fromarray(im_crop)
                im_blur = im_crop.filter(ImageFilter.GaussianBlur(1.5))
                im_blur = np.array(im_blur) 
                im[top:bottom, left:right, :] = im_blur
            result_img = Image.fromarray(im)
            result_img.show()
            result_img.save('test.jpg', quality=95)                           
            # =============== 以上，編集・追加部分 ===============     
    yolo.close_session()
```





#結果
検証画像としては、「[無料の写真素材はフリー素材のぱくたそ](https://www.pakutaso.com/)」を利用しました。以下では、今回の処理を適用した結果を表示しており、左から「原画像」、「YOLOを適用した結果」、「ピースサイン領域をぼかした画像」となっております。

|![kuchikomi726.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/2712050e-4ce8-94fb-65b8-fb38e77b6459.jpeg)|![test1_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/a47646fb-3646-f973-20cf-53d767fd2945.jpeg)|![test1_gauss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/f9d6f6bb-fcf2-2a73-f6a3-033c844e1fac.jpeg)|
|:---:|---|---|
|原画像1|YOLOを適用した結果|ピースサイン領域をぼかした画像|

|![PAK86_futaridesyame20140321_TP_V.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/576f9ea0-c615-b8c9-5e40-9306e36099a8.jpeg)|![test2_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/e7a6dd5c-c169-e233-b6de-904bc212e151.jpeg)|![test2_gauss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/7f132e6e-acf6-5c41-0d6d-cee37d7a2b57.jpeg)|
|:---:|---|---|
|原画像2|YOLOを適用した結果|ピースサイン領域をぼかした画像|


|![yumikoIMGL7854.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/16e6f078-fa29-c3df-237b-23ee35d75975.jpeg)|![test3_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/0efa79c0-cfe3-6dee-7d7a-6c19e3dd898c.jpeg)|![test3_gauss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/c761fd53-9ca1-8b69-1e23-5d193858c129.jpeg)|
|:---:|---|---|
|原画像3|YOLOを適用した結果|ピースサイン領域をぼかした画像|

　原画像2に関して、女性の左手のピースサインが検出されていませんが、指紋が盗み取られそうな角度ではないため、検出できなくてもOKかなと思います。



#まとめ
　今回は、ピースサインを対象に指紋情報が盗み取られないような画像処理を行いました。鮮明に写っているピースサインであれば、検出精度は高かったです。今後は、指紋情報だけでなく、虹彩情報や今いる場所が特定されないような画像処理を考えていきます。
　SNSにおける情報流出を防ぐためには、ユーザーが注意深く活用する必要がありますが、それだと気軽に楽しめることができません。今回の技術がSNSに組み込まれれば（もしかしたらすでにあるのかもしれませんが）、情報流出を気にすることなく、気軽にSNSを楽しめるようになると思います。