OpenCV EDSRモデルが動かないよの巻

投稿日:

こんにちは。まーやです。
この投稿は PyLadies Japan Advent Calendar 2021 の20日目の投稿です。

とか宣言してたんですが、もろもろ諸事情により全然間に合わなかった★ということで、とりあえず進捗だけブログにして逃げていきたいと思います。ちゃんと動くようになったらどっかのタイミングでまたちゃんと正式にブログにしますね・・・

やりたかったこと

9月にPSF(Python Software Foundation)に寄付をしよう!というイベントである「Python Charity Talks in Japan 2021.09」 というイベントがありました。この中の飛騨高山Pythonの会の井伊さんの発表の中で出てきた超解像処理というのを私もやってみたかった。

超解像度処理を使えばぶれっぶれの海のお魚写真とかいい感じになるのでは?という打算のもと、とりあえず調べものしながら開始しました。

超解像度とは

超ざっくりいうと、粗い画像もなんかいい感じになめらかな画像になる・・・!というDNNモデルたちです。

https://github.com/opencv/opencv_contrib/tree/master/modules/dnn_superres

ESPCN、EDSRなどなどいくつかの超解像モデルが存在しており、それぞれモデルに特徴があるらしいのですが、まったく専門家ではないのでこのあたりのモデルの違いは後ほどちゃんと動くコードがかけるようになったあと色々試すことにするとして、とりあえずプレ学習済みのモデルが公開されているのを発見したEDSRというモデルを使って今回は実装してみることにしました。

https://github.com/Saafke/EDSR_Tensorflow/tree/master/models

やってみよう。

必要なもの↓

  • TensorFlow
  • opencv-contrib-python

opencv-pythonとopencv-contrib-pythonを共存させるとうまくいかないこととかあるようなので、今回はdnn_superresで色々モジュールを扱えるopencv-contrib-pythonのみをpip installしました。

こちらのopencv-contribのGitHubコード内にチュートリアルがあったのでこれにチャレンジ。だいたい写経していきます。各処理がなにしてるのか調べたりしながら進めてたので写経なのにめちゃくちゃ時間かかった。
https://github.com/opencv/opencv_contrib/blob/master/modules/dnn_superres/tutorials/upscale_image_single/upscale_image_single.markdown#an-example-in-python

import cv2
from cv2 import dnn_superres
from pathlib import Path

base_dir = Path().cwd()

# 超解像度オブジェクトの作成
resolution_obj = dnn_superres.DnnSuperResImpl_create()
resolution_obj.readModel(str(Path.joinpath(base_dir, 'models', 'EDSR_x4.pb')))
resolution_obj.setModel('edsr', 4)

# 画像の準備
target_img = cv2.imread(str(Path.joinpath(base_dir, 'target', 'IMG_3224.JPG')))

# 画像の高解像度化
resolution_image = resolution_obj.upsample(target_img)

# 画像出力
cv2.imwrite(str(Path.joinpath(base_dir, 'result', 'result.jpg')), resolution_image)

よっしゃ写経だし動くじゃろ、って思ったんですが、下記エラーが高解像処理実行にあたるupsample実行したところで発生します。

cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\dnn.cpp:3576: error: (-215:Assertion failed) total(os[i]) > 0 in function 'cv::dnn::dnn4_v20211004::Net::Impl::getLayerShapesRecursively'

んーなんじゃろなー。エラー内容的にニューラルネットワークの層を重ねるあたりで失敗しているように見えます。total(os[i]) > 0 だから空回りしちゃってるのかな―などと思いつつ。タイムアップが来てしまいました。

読み込ませてるモデルファイルまわりかな・・・もうちょっと調査して動くようにしていきたいと思います・・・雪山合宿の宿題にします。

なんだか煮え切らないブログですみません。。。

明日はJava女子部から参加してくださってるmiiちゃんのブログだよ!おたのしみに・・・!

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください