試行錯誤ダイアリー

新卒エンジニアが日々の技術的な学び,働き方,日々感じたこと等を書きます

mxnetで画像を読み込んで表示させる

mxnetでImage APIを使って画像をndarrayに変換したあとに,matplotlib.pyplotで画像の表示ができなくて困ったので記録です.

mxnetでは画像をImageAPIを使って処理できます.主に画像は以下のようにするとndarray形式で読み込めて,出力はこんな感じになります.画像はカラー画像なので(縦,横,RGB)のshapeになってます.

import mxnet as mx
import numpy as np
import matplotlib.pyplot as plt

with open('./img/X1hfOkAM_400x400.jpg', 'rb') as fp:
        img = fp.read()
        
mx.image.imdecode(img)


# 出力
[[[ 14  34 183]
  [ 14  34 183]
  [ 14  34 183]
  ..., 
  [ 17  52 208]
  [ 17  52 208]
  [ 17  52 208]]

 [[ 14  34 183]
  [ 14  34 183]
  [ 14  34 183]
  ..., 
  [ 17  52 208]
  [ 17  52 208]
  [ 17  52 208]]

 [[ 14  34 183]
  [ 14  34 183]
  [ 14  34 183]
  ..., 
  [ 17  52 208]
  [ 17  52 208]
  [ 17  52 208]]

 ..., 
 [[201 172 142]
  [188 159 129]
  [193 164 134]
  ..., 
  [206 183 133]
  [203 181 131]
  [202 180 130]]

 [[198 169 139]
  [181 152 122]
  [184 155 125]
  ..., 
  [200 177 127]
  [200 178 128]
  [201 179 129]]

 [[197 168 138]
  [185 156 126]
  [189 160 130]
  ..., 
  [204 181 131]
  [201 179 129]
  [201 180 127]]]
<NDArray 400x400x3 @cpu(0)>

そして,このndarrayのデータをimport matplotlib.pyplotを使って

plt.imshow(img)
plt.show()

で表示させようとするとエラーが出る.

理由は,ImageAPIでは内部の処理ではpythonライブラリではないopencvを使っているからっぽいです.

Note: imdecode uses OpenCV (not the CV2 Python library).

参考:ImageAPI

実際に型を確認してみると,

img_array = mx.image.imdecode(img)

type(img_array)

# 出力
mxnet.ndarray.ndarray.NDArray

numpy.ndarrayではないんですね. なのでasnumpy()メソッドでコンバートする必要があります.

converted_img = img_array.asnumpy()
type(converted_img)

# 出力
numpy.ndarray

これで正しく変換されてます.

出力してみると,

f:id:appli-in:20180706010152p:plain:w600

問題なく出力できています.

まぁ学習用のデータセットをつくるのにわざわざmxnet上で処理する必要は無さそうなのですが...

多分kerasとかで処理してcsvにまとめたりした方が早くできる気がします.(適当言ってたらすいません)