簡易的な対話型「画像の切り取り」ツールを作ってみた

Pocket

機械学習を行おうと思うと、学習のためのデータを用意しないといけません。各種チュートリアルを行う際は、例えば、手書き文字画像(MNIST)が事前に用意されていて、ディープラーニングのCNN(畳み込みニューラルネットワーク)の実行コードを写経するだけで体験することができます。しかし実際には、データが用意されていることはありません。というのも、何かしらデータが存在していたとしても、それらは機械学習やディープラーニングの処理に適したものになっておらず、そのまま使っても良い性能を出せない状態であることがほとんどだからです。

そこで今回は、学習用データとして画像データを想定し、それを準備する為のツールを作ってみたので紹介します。ただ作るだけでは面白くないので、今はやりのJupyter Notebookで動作する、HTMLウィジェットである「ipywidgets」を用いて、対話型インターフェースを有したツールにしてみたいと思います。

実行環境の準備

以下の環境で実装しています。

  • python 3.6.6(Anaconda Python)
  • Jupyter Notebook 5.6

「ipywidgets」は、以下のコマンドなどでインストールできます。

また、「matplotlib」の「ginput」を実行するにあたり、ライブラリ「wxpython」を求められたので、condaコマンドでインストールしました。

実装コードと実行結果の説明

以下は、Jupyter Notebook での実装です。

  • はじめにおまじないとして、以下のコードを「import matplotlib.pyplot as plt」より先に実行しないとうまく動きません 。

  • 今回の1つ目のメイン処理が「plt.ginput」になります。
    • 実行すると以下のようなウィンドウが表示され、ユーザによる操作を待機し続けます。
      • フッターにある虫眼鏡のアイコンをクリックしてONにしてから、上部の画像をドラッグすると、選択領域のみが拡大表示されます。
      • フッターにある「←」「→」アイコンはそれぞれ、「操作を1つ戻す」「操作を1つ進める」という操作ができます。
    • パラメータ「n」を「-1」、「timeput」を「0」にすることで、表示されるウィンドウをユーザが閉じるまで、操作を受け付けます。
    • パラメータ「mouse_add」を「1」にすることで、左クリックした箇所の座標が取得されます。
    • パラメータ「mouse_pop」を「3」にすることで、右クリックする度に、1つ前にクリックした箇所を取り除いてくれます。
    • 上記パラメータの設定値には1~3が指定でき、それぞれ以下のように対応しています。
      {1:左クリック、2:ミドルクリック、3:右クリック}
    • パラメータ「show_clicks」を「True」にすることで、クリックした箇所に自動的にマークがつきます。

  • ファイル名をパターンマッチングで指定することで、複数のファイルを連続して処理できるようにしています。

  • 上記を実行すると、以下のような対話型UIが表示されます。
    • スライダー「dpi」は、「30」~「300」の間で、「10」刻みで指定可能です。
      • ちなみに、この値は、「画像を保存する際の解像度」になります。
    • リスト「format_ext」は、「png」「jpg」から選択可能です。
      • ちなみに、この値は、「保存するファイルのフォーマット(拡張子)」になります。
    • 入力欄の指定内容に従い、一番下にあるボタンのキャプションが変わります。

 

使ってみよう

  1. 上から順に全てのセルを実行したいので、 Kernel メニューの Restart & Run All を実行します。
  2. 最下部にある入力欄を選択します。
    1. dpi:40
    2. format_ext:jpg
  3. ボタン「40,jpg」をクリックします。
  4. 立ち上がったウィンドウで切り抜きたい箇所を2か所クリックします。
  5. ウィンドウを閉じます(右上の「×」をクリック)
  6. 出力先を確認すると、ファイル「top-50years-b-40.jpg」が作成されています。
    1. 指定した箇所が切り取られています。
    2. ファイルのプロパティを確認すると、指定した解像度になっていることが確認できます。
  7. ※今回は指定ディレクトリにファイルを1つしか置いていなかったので、これで処理が終了しますが、ループしているので、ファイルが複数あれば、連続して、ファイル操作を行うことができます。

まとめ

データ分析において、データ前処理の活動は、重要であり、時間も必要とします。少しでもこの活動を効率的に行うためには、このような準備作業も重要になります。是非、各種ツールを作って、チームに共有しましょう。

お問い合わせ先

執筆者プロフィール

Oose Takashi
Oose Takashitdi デジタルイノベーション技術部
入社以来、C/S型の業務システム開発に従事してきました。ここ数年は、SalesforceやOutSystemsなどの製品や、スクラム開発手法に取り組み、現在のテーマは、DeepLearning/機械学習です。
Pocket

関連記事