SageMakerで実行したJupyter NotebookでOpenCVを使ってみる

2022.03.06

こんにちは、CX事業本部 IoT事業部の若槻です。

Amazon SageMakerでは、Jupyter Notebookインスタンスを立ててその上でPythonの各種科学計算や機械学習のライブラリを使用した処理を行うことができます。

そこで今回は、SageMakerで実行したJupyter NotebookでOpenCVを使ってみました。

やってみた

ノートブックインスタンスの作成

AWSマネジメントコンソールでNotebook instancesを開きます。

[Create notebook instance]をクリック。

[Create notebook instance]でノートブックインスタンスを作成します。インスタンス名とIAMロールを指定して、[Create notebook instance]をクリック。

作成が開始されました。

数分待つとStatusがInServiceとなりました。

ノートブックの作成

Jupyter Notebookのノートブックを作成します。

[Open Jupyter]をクリックします。

別タブでJupyterのコンソールが開きました。[New]より使用したい環境を選択します。今回はconda_python3です。

するとまた別タブでノートブックのコンソールが開きました。

コマンドを入力して[Run]をクリックするとコマンドが実行できます。OpneCVは既にインストールされているようですね。

画像ファイルのアップロード

OpenCVで使用する画像ファイルをアップロードします。

検索対象の画像(mesoko.jpg)と、そこから切り取ったテンプレートの画像(cm_logo.jpg)の2つです。

Jupyterのコンソールに戻り、[Files]タブで[upload]をクリック。

OpenCVでTemplate Matchingの検索対象およびテンプレートとなる画像ファイルを選択します。

[Upload]をクリック。

アップロードできました。(テンプレート画像を間違ってpng形式で上げてしまっていますが、後でjpgで上げ直しました。)

OpenCVを使ってみる

先程アップロードした画像を使用して、OpenCVでTemplate Matchingによる物体検出をしてみます。基本的には前回のエントリでやった内容です。

まずmatchTemplate()を使用して物体検出をしてみると、0.999以上の信頼度で検出できました。

import cv2

# 検索対象画像とテンプレート画像の読み込み
img = cv2.imread('mesoko.jpg')
template = cv2.imread('cm_logo.jpg')

# テンプレート画像の幅と高さを取得
w, h, _ = template.shape

# 画像の検索(Template Matching)
result = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
# 検索結果の信頼度と位置座標の取得
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

imshow()を実行するとインスタンスが落ちる

さらに画像内の検出箇所を長方形で指定した画像を作成して表示してみます。

# 検索結果の左上頂点の座標を取得
top_left = max_loc

# 検索結果の右下頂点の座標を取得
bottom_right = (top_left[0] + w, top_left[1] + h)

# 検索対象画像内に、検索結果を長方形で描画
cv2.rectangle(img, top_left, bottom_right, (255, 255, 0), 2)

# 画像を表示
cv2.imshow('img', img)

しかしimshow()を実行して画像を表示しようとするとThe kernel appears to have died. It will restart automatically.となりインスタンスが落ちてしまいます。

このようにDead kernelという状態です。

ml.t2.mediumだとインスタンスサイズが小さすぎたのかも知れません。

そこでサイズを上げるためにノートインスタンスを一旦ストップ。

ストップできたら[Update settings]をクリック。

ml.t2.xlargeに上げてみます。

上げられたので、インスタンスを再度スタートします。

しかしサイズを上げたノートブックインスタンスでimshow()を実行するとまたThe kernel appears to have died. It will restart automatically.が発生してしまいます。

Matplotlibを使えば表示できた

OpenCVのimread()はHigh-Level GUIを使用してMatオブジェクトを画像表示するので、Jupyter Notebookでは使えないものでした。代わりにMatplotlibを使用します。

Matplotlibにより画像を表示できました。(色味が変わっていますが。)

from matplotlib import pyplot as plt
plt.imshow(img)

よく見ると検出部分がちゃんと長方形で囲まれているのがわかります。

参考

以上