【画像拡大】Cifar10画像をいろいろな手法でUpconversionして遊んでみた♬性能（変換時間）について

昨夜はざっくりいろいろな手法を試した記事を書いたが、画像の美しさも必要だが動画配信などで利用するには変換速度も重要な要素である。
ということで、昨夜記載しなかった性能について計測しているので記事にしたいと思う。
###やったこと
・OpenCVとPILの比較
・より変換時間を早くする
###・OpenCVとPILの比較
コードは以下のとおり、
①変換
②変換＋保管
時の時間を計測する

変換；OpenCV, PIL
対象；Cifar10、1000データ
ファイル種類；jpg, bmp, png, gif
変換時補完；CUBIC, LANCZOS

```cv2_resize.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import os
import glob
from PIL import Image
import time

def main():
    files = glob.glob('./caps_figures/X_train/*.jpg')
    st=time.time()
    print(st)
    s=0
    for f in files:
        # 入力画像の読み込み
        img = cv2.imread(f)

        # 方法1(PIL)
        #img = Image.open(f)
        #img_resize = img.resize((int(img.width*10), int(img.height*10)), Image.BICUBIC) #LANCZOS
        #img_resize.save('./caps_figures/Results/ex_PIL_' +str(s)+ fext)
        
        # 方法2(OpenCV)
        img_resize = cv2.resize(img, (int(img.shape[1]*10), int(img.shape[0]*10)), interpolation=cv2.INTER_LANCZOS4) #INTER_CUBIC #INTER_LANCZOS4

        # 結果を出力
        #ftitle, fext = os.path.splitext(f)
        #cv2.imwrite('./caps_figures/Results/ex_' +str(s)+ fext, img_resize)
        img_resize = img_resize[:,:,::-1]  #追記；理由はおまけに記載
        pilImg = Image.fromarray(np.uint8(img_resize))
        pilImg.save('./caps_figures/Results/ex_cv2_' +str(s)+'.jpg')  #gif #bmp #png #jpg
        s += 1
    print('Time = ',time.time()-st)    

if __name__ == "__main__":
    main()
```
###結果
計測は、代表的なものしかやっていないが、以下のとおりとなっている。
結果として、~~サイズ変更はOpenCVでやって、保存はPILでやるという組み合わせがベストである。~~
おまけの記載のとおりもう一つ変換が入ったため、サイズ変更も保存もPILでやったものが最速になりました。ただし、表示だけならOpenCVが最速なのは変わりません。
また補完は、CUBICか場合によってはLanczosがよさそうである。
保存ファイルの種類はjpgがよさそうだ。

####PILとOpenCVの比較
|単位；sec/1000件| OpenCV | PIL |
|:-:|:-:|:-:|
|変換＋保存(それぞれの手法)|4.37| 2.58 |
|変換のみ|0.660|0.994 |
|numpy > PIL 変換してsave|~~2.45~~3.98|－|
|Cubic(split無し)|2.23(注)|－| 
|Lanczos(split無し)|2.43(注)|2.79|
注）このデータもnumpy > PIL変換しているので変わってきますがCubicとLanczosは同条件なので変更しません
####保存ファイル形式による比較
|  |bmp| jpg | png | gif |
|:-:|:-:|:-:|:-:|:-:|
|容量㎅|300 |10|91|85|
|保存時間msec|2.61|2.23|43.66|85.98|
|拡大・縮小|可変|可変|可変| 固定 |

リアルタイムに変換して動画配信できるような数字が出ている。
どちらの手法も変換のみだと、1msecを切っているので40fpsで配信する場合も、追加処理も可能である。

例えば、以下の参考のアプリでは、もともとvgg16の(224,224)の矩形で物体を見ていたが、小さかったり大きい場合は、枠を変更して、リサイズするという選択肢があったということです。
というか、全体を変更できるので、面白いアプリができる可能性があるということです。
【参考】
・[Opencv: meanshift＆CamShiftで遊んでみた♬その２；VGG16で物体識別](https://qiita.com/MuAuan/items/0e4a305a5989bb972420)

一方、ファイル形式も変更できるので、以前以下の参考のようにgifアニメーションを作りましたが、この自由度も大きく広がっていることが分かります。当時は処理はPILでやっており、補完はresample=Image.NEARESTでやっていて、ちょっともったいないところです。
とはいえ、resizeをjpgでやって、それをgifに変換しつつ保存しているのでリーズナブルだと思います。
※こちらは時間がかかるのでリアルタイムは難しそうです
【参考】
・[Gif_Animation/out_gif.py](https://github.com/MuAuan/Gif_Animation/blob/master/out_gif.py)
###まとめ
・結果として、サイズ変更のみの場合はOpenCVでやって、保存が必要な場合はサイズ変更共PILでやるというのがベストである
・補完は、CUBICか場合によってはLanczosがよさそうである
・保存ファイルの種類はjpgがよさそうだ。bmpが同程度に早いので、容量に制限がなく画像を後で利用する場合は選択する可能性がある。
・変換時間（32,32,3）⇒(320,320,3)で1msec/件以下である。保存しても2-3msec/件程度である

・楽しいアプリが作成できそうだ
・保存ファイルをUpconversionで復元する技術を推進できる可能性がある
　一般的な付加情報は別途与える必要があるが、DLなどで学習させるとその可能性は極めて高いと言えるので試してみようと思う
###おまけ（追記）
後で記事にしたいと思いますが、動画にしてみたらどうも画素をBGR画像→RGB画像への変換が必要なようです。
以下で綺麗にFrameの保存ができました。
なお、今回のコードでは255の規格化因子は不要でした。
したがって、ちょっと性能も変わって3.98sec/1000件かかりました。

```py
img_resize = img_resize[:,:,::-1]  
pilImg = Image.fromarray(np.uint8(img_resize))
```
【参考】
・[Pillow, OpenCVなどでの画像の扱いの違い@にせねこメモ](https://nixeneko.hatenablog.com/entry/2017/09/01/000000)
以下のcmはインストールできましたが、上記で動いたのと以下が動かないので断念しました
・[How to convert Numpy array to PIL image applying matplotlib colormap
](https://stackoverflow.com/questions/10965417/how-to-convert-numpy-array-to-pil-image-applying-matplotlib-colormap)