IronViz2020、参戦してみた。

こんにちは!
分析官のMです。

今回私はTableauが主催するデータビジュアライゼーションコンテストである、
IronViz2020に参戦しました。
本記事では自分が
・どのような思考でダッシュボードを作成したか?
・どのような点にこだわったか?
についてまとめました。

まだまだ勉強中の身ではありますが、
ダッシュボード作成に興味がある方・お困りの方の参考になれば幸いです。

IronVizとは?

前述したとおり、IronVizはTableauが主催するデータビジュアライゼーションコンテストです。
年に数回程、予選大会が開催され、各予選の優勝者は年末に開催されるTableauConferenceでの決勝戦に駒を進めることができます。
今年はコロナの影響により、予選は1回のみで上位3名が決勝戦に進むことができるそうです。
公式サイト(https://www.tableau.com/iron-viz)を拝見する限り、評価項目は
1. ダッシュボードデザイン
2. ストーリーテリング
3. 分析
であり、この3項目の合計スコアで競うことになります。

今回の分析テーマ

毎回分析テーマは変わるのですが、
今回は"Health and Wellness(健康とウェルネス)"でした。
分析に用いるデータは上記のテーマに当てはまっていれば任意のデータでOKとのことなので、
私は厚生労働省が公表している喫煙データ(https://www.mhlw.go.jp/bunya/kenkou/kenkou_eiyou_chousa.html)を用いて、
日本人男性の喫煙習慣の推移を可視化することにしました。

今回作成したviz

こちらが今回作成したvizになります。

f:id:gri-blog:20200810220442p:plain

ironviz2020

https://public.tableau.com/profile/.83987181#!/vizhome/IronViz2020_15964687553760/ChangesinsmokinghabitsofJapanesemen

まずはじめに、日本人男性の喫煙傾向の推移をざっくりと伝えたかったので、
ダッシュボード上部で1989年~2018年の日本人男性の喫煙率推移を年齢別にヒストグラムで表現しました。
※こういった時系列推移を表現する際は、ヒストグラムではなく折れ線グラフを使う方が一般的かと思いますが、
今回はデザインに少し遊びをもたせたかったので、ヒストグラムを採用しました。
グラフを見ると、全体的に喫煙率は減少傾向にあり、特に2,30代の若者の喫煙率が著しく減少していることが分かります。

次に、喫煙者の中でも喫煙量に変化があることを伝えたかったので、
ダッシュボード下部で2009年~2018年(2012,2013,2016年は欠損)の日本人男性喫煙者の1日の喫煙本数を年齢別にエリアチャートで表現しました。
※欠損年の間隔を正確に空けて表現する場合はエリアチャートではなく、帯グラフで表現する方が好ましいかと思いますが、
今回はデザインを重視したので詰めて表現しました。(正確に間隔を空けるべきかどうかは賛否両論ありそうですね...)
グラフを見ると、男性全体では1日に21本以上吸うようなヘビースモーカーは減少し、10本未満の比較的ライトスモーカーが増えていることが分かります。

今回ダッシュボード作成する上で、主に以下の点にこだわりました。
1. ダッシュボードデザイン
ヒストグラムや背景色など、全体的にタバコをイメージしたデザイン・配色に統一
2. ストーリーテリング
・最初にざっくりとした情報(喫煙率の推移)を見せ、そのあとで細かな情報(喫煙者の喫煙量の推移)を見せることで、ストーリーテリングを意識
3. 分析
・各グラフ、ダッシュボード全体からどのような知見が得られるか、簡易的に記述

改良点・感想

IronViz参戦を決めた(というかIronViz開催を知った)のが締切約1週間前だったので、
表現したい内容全てをダッシュボードに落とし込むことはできませんでした。
喫煙率と増税(消費税やたばこ税)の関係性やたばこ産業の売上推移などを取り込めれば、
より知見が得られるダッシュボードになりそうな気がします。

しかし、海外勢のダッシュボードはおしゃれなものが多いですね...
参考になるものは吸収して、今後のviz作成に活かしたいと思います。

陰陽師とデータサイエンティストの類似性

「データサイエンティストって何している人?」と聞かれることも多く、「現代の陰陽師」と答えると神秘めいているので、2つの対比で読み解いていこうと思います。

 

f:id:gri-blog:20200810005508p:plainf:id:gri-blog:20200810005553p:plain


陰陽師は、今から約1500年ほど前の飛鳥時代の頃からはじまった朝廷の官職です。平安時代安倍晴明などで有名な陰陽道の儀式が注目されがちですが、本来やっていたことは方技(公務員の中の技官職)で、儀式を取り仕切るように変化したのは、成果を挙げていったためと考えられます。特に、当初の方技は、現代の理系の仕事に似ており、特にデータサイエンスと似ているところを紹介します。


方技の道具として知られるのが、占筮(せんぜい)で用いる筮竹や計算で用いる算木です。占筮は筮竹を何本かづつ取った余りの本数で陰陽を占うため、現代の確率論や剰余演算(Modulo)と捉えることができます。算木は赤と黒の棒を用いた計算方法なので、現代のアルゴリズムやコンピュータと言えます。

f:id:gri-blog:20200810005640j:plainf:id:gri-blog:20200810005659j:plainf:id:gri-blog:20200810005733j:plain


中国から輸入された方技の道具を使えても、偉い人に結果の解釈を上手く伝えられなくては政には使えません。「理(ことわり)」を上手く説明できる人が重用されます。これは、データサイエンティストが、データを使ったグラフや機械学習を使った後、「でっ何なの?」と言われないようにするために、結果を読み解くストーリテリングするのと同じです。


陰陽師は朝廷の中の8つの省の中で最も重要とされた中務省(なかつかさしょう)に属し、天皇の補佐や朝廷に関する職務全般に対する方技を用いたサポートをしていました。現代でもデータドリブン組織においては、社長直属部隊にてデータサイエンティストが組織の方向性に関わる助言をデータから導き出すような組織体系を持つ企業も多いです。


陰陽師は時代と共に、呪術・祭祀の色合いが濃いカリスマ的な精神的支配者へと変貌を遂げていきますが、やがて実践的な武家社会と共に凋落していきます。現代では、データサイエンティストもカリスマ性を増すために奇抜な恰好をしたり、きらびやかな営業資料と巧みな話術で提供する価値の暴騰を煽るパターンがありますが、情報の伝達スピードが速い現代では、しっかり地に足をつけた実践的な仕事が評価されると思います。

 

古幡征史

ForecastFlowをMatillionから使う-予測編

クラウドネイティブのETLツールMatillionを使って、データ加工からForecastFlowの予測までの処理を解説します
クラウドサービスはGCPを利用しております

モデルの作成

ForecastFlowでモデル作成と訓練を行ってください

Matillion Componentの作成

bashコンポーネントを作成します

f:id:gri-blog:20200727145030p:plain
bash-component
ここには依存パッケージをインストールするコードを書きます

# pipのアップグレード
python3 -m pip install --upgrade pip --user
# pandas, forecastflow, gcs sdkをインストール
python3 -m pip install pandas --user
python3 -m pip install forecastflow --user
python3 -m pip install google-cloud-storage --user

次にpythonコンポーネントを作成します

f:id:gri-blog:20200727161702p:plain
python-component
ここには推論APIスクリプトとGCSへのデータ入出力スクリプトを書きます
推論APIスクリプトの取得については下記ページの"スクリプトの用意"を参考してください ForecastFlow を Tableau Prep から使う方法 - 予測編

先に推論スクリプトをForecastFlowからコピペします
email, password, project_id, model_idは適宜編集してください

# 推論スクリプト
# Read the blog (Japanese) to figure out how to use this script.
# https://gri-blog.hatenablog.com/entry/2019/12/09/162019
import forecastflow
from forecastflow.tabpy_support import make_prediction_schema
import datetime

# ============================================================================
# [Required] Fill your ForecastFlow parameters
email = "email"
password = "password"
project_id = "project_id"
model_id = "model_id"
# ============================================================================

# ============================================================================
# [Optional] Change display names
data_name = "Test Stock" + str(datetime.datetime.now())
prediction_name = "Stock Prediction " + str(datetime.datetime.now())
# ============================================================================


user = forecastflow.User(email, password)
get_output_schema = make_prediction_schema(user, project_id, model_id)

def ff_predict(input_data):
    project = user.get_project(project_id)
    model = project.get_model(model_id)
    prediction_data = project.create_data_source(
        input_data,
        data_name,
        forecastflow.DataSourceLabel.PREDICTION
    )
    prediction = model.create_prediction(
        prediction_data,
        prediction_name
    )
    result = prediction.get_result()
    return result

続けてデータ入出力のコードを推論スクリプトの下に書き加えます
入力先のバケットと出力先のバケットをMatillionの変数に登録しておけば コピペするだけで他のモデルにも使えるので便利です

f:id:gri-blog:20200727163639p:plain
python-component-var

コードはこちら

# GCS(Google Cloud Storage)連携用
# 推論スクリプトの下部
import pandas as pd
import io
# Imports the Google Cloud client library
from google.cloud import storage


def download_blob(bucket_name, source_blob_name):
    # Instantiates a client
    storage_client = storage.Client()

    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(source_blob_name)
    stream = blob.download_as_string()
    
    return stream


def upload_to_storage(dataframe):
  # Instantiates a client
  storage_client = storage.Client()

  bucket = storage_client.get_bucket(BucketNameTo)

  # save file
  time_now = datetime.datetime.now()
  time_formatted = datetime.datetime.strftime(time_now, "%Y%m%d_%H%M%S")
  blob = bucket.blob(f"Result-{time_formatted}.csv")
  
  blob.upload_from_string(dataframe.to_csv(index=False), content_type='application/octet-stream')


# get data from gcs
stream = download_blob(BucketNameFrom, PredictionFileName)
df = pd.read_csv(io.StringIO(stream.decode("utf-8")))

# predict
result = ff_predict(df) # dataframe

# upload to gcs
upload_to_storage(result)

コンポーネント作成したらフローを作成して実行します

f:id:gri-blog:20200727163837p:plain
forecastflow-orchestration

結果が無事gcsに出力されました

f:id:gri-blog:20200727164138p:plain
gcs

MatillionのETLを使えば、データ加工 -> BigQuery -> ForecastFlowで予測するまでを自動化することでできます
下図はForecastFlow連携の一例になります

f:id:gri-blog:20200727170021p:plain
etl-example

終わりに

今回はForecastFlowの推論APIを用いたMatillion連携を簡単に紹介致しました
訓練API -> ETL(Matilliion)ツール -> 推論APIといった使い方をすることで、機械学習の自動化も可能になりそうです

訓練APIについてはこちら
PythonからForecastFlowで訓練と推論を行う方法

Higashi

PythonからForecastFlowで訓練と推論を行う方法

この度、PythonからForecastFlow訓練を行う機能を追加しました。
この記事では、訓練推論Pythonから行う方法について紹介します。

インストール

pip install forecastflowでインストールします。
以下はforecastflow==4.2.3を使用して執筆しています。

アカウント認証とプロジェクトの指定

ForecastFlowを使用するためには、訓練可能なアカウントが必要です。
アカウント情報を使用して認証を行います。

from forecastflow import User

email = 'メールアドレス'
password = 'パスワード'

user = User(email, password)

プロジェクトの指定

訓練を行うプロジェクトのIDを指定します。
存在しない場合はWeb上でプロジェクトを作成してください。

project_id = '訓練を行うプロジェクトのID'

project = user.get_project(project_id)

プロジェクトIDが不明な場合

プロジェクト画面のURLは以下の形式になっているため、URLからIDを確認します。
https://forecastflow.org/project/{プロジェクトID}

データの用意

訓練にはForecastFlow上に訓練用のデータが必要です。
データの指定方法について説明します。

Pythonからデータのアップロードを行う場合

Pythonからはpandas.DataFrameをアップロードすることができます。

import pandas as pd


train_df = pd.read_csv('train.csv', dtype=object)

train_data = project.create_data_source(
    data=train_df,
    name='train_data.csv',
    label=DataSourceLabel.TRAIN,
    description='data source for training'
)

既にForecastFlow上に存在するデータを使用する場合

データのIDを直接指定することで、ForecastFlow上のデータを訓練に使用できます。

train_data = project.get_data_source('訓練データのID')

モデルを訓練する

訓練設定を作成します。
訓練するモデルに合わせて設定を作ります。

  • 分類モデルを訓練する場合
    • ClassifierTrainingSettingsClassificationMetricsを使用
  • 回帰モデルを訓練する場合
    • RegressorTrainingSettingsRegressionMetricsを使用
from forecastflow.training import ClassifierTrainingSettings, RegressorTrainingSettings
from forecastflow.enums import ClassificationMetrics, RegressionMetrics

### 分類モデルの場合 ###
classifier_settings = ClassifierTrainingSettings(
    target='col5',    # 目的変数の列の名前
    metric=ClassificationMetrics.RECALL,    # パラメータ探索時の指標
    primary_id='ids',    # 主IDの列の名前
    secondary_ids=['col4', 'col6'],    # 副IDの列の名前
    feature_excludes=['col1', 'col2'],    # 訓練時に除外する列の名前
    random_state=777    # 乱数のシード値
)

作成した訓練設定をもとに訓練を行います。
テストデータの指定は以下のいずれかで行います。

  • データを分割して訓練データとテストデータに分ける
  • テストデータを別で用意する
classifier_model = train_data.create_model(
    train_settings=classifier_settings,    # 作成した設定オブジェクト
    name='new model',    # モデルの名前
    test_frac=0.28,    # テストデータとして使用する割合
    test_data_source=None,    # 別に用意したテストデータ
    description='trained model'    # モデルの説明
)

訓練したモデルで推論を行う

モデルにデータを与えて推論を行います。

prediction = classifier_model.create_prediction(
    data_source=pred_data,    # 推論を行うためのデータ
    name='new prediction'    # 推論の名前
)

推論結果を取得する

DataFrameとして推論結果を取得できます。

predicted_df = prediction.get_result()

終わりに

この記事ではPythonからForecastFlowによる訓練と推論を行う方法を紹介しました。
Pythonで完結して処理を行うことができます。
是非ご利用ください。

仲田勇太

Isolation Forest と異常検知(ネットアクセスログを用いて)

【はじめに】

日頃データサイエンスの研修においては、教師あり機械学習から入門し、それをビジネスの花形として紹介することが多いです。ただし世の中の問題に向き合うと実に教師なし機械学習の存在が大きいのも知っていただきたいです。その1つが異常検知です。

異常検知は異常値や外れ値を検出する手法を指しています。金融の不正取引識別、故障検知・故障予測、検品、設備管理、医療、セキュリティなど多岐にわたる分野で貢献しています。この記事では、異常検知の使いやすいかつ有力な教師なし学習手法の1つであるIsolation Forest手法を説明し、それを用いて不正侵入パケットに対する予測モデルの構築の例を示していきます。

 

演習に使用するデータ

インターネットの普及により,悪意のあるソフトウェア(マルウエア; Malicious Software)による攻撃が問題として現れています。コンピュータが感染すると、使えなくなったり、機密情報が流出したりします。全種類の攻撃から守ことは難しいですが、現在、攻撃に対抗するシステムが色々開発されております。大きく分けて、攻撃検知型 ( IDS=Intrusion Detection System)と検知後に脅威を排除する攻撃防御型 ( IPS=Intrusion Prevention System)の2タイプがあります。アクセスデータに対する分析手法も2タイプあります。攻撃パターンを把握し合致した通信データを得た場合に攻撃と判断する「シグネチャ型」、もう1つは正常通信のパターンを定義し、そこから性質が離れている通信データを攻撃と判断する「アノマリ型」があります。

IDS や IPS の研究で扱われる代表的なデータセットとしてKDD CUP 99 Data Set があります。UCI Machine Learning Repository から入手できます:http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html

約 500 万件(4,898,930) のフルセットから 10%を抽出した約 50 万件(494,021)の 10%データセットを今回、異常検知タスクの題材とします。自分で精度を評価したかったので、学習用データセットのみ使用します。

学習用データの、"label" 列に正常通信(normal)と22 種類の攻撃が含まれています。normalから不正を識別するためには、もちろん様々な機械学習の手法を使用できます(SVM、教師ありアンサンブル、ディープラーニングK-Meansなどの距離ベース)が、今回はIsolation Forest を使った分析例を紹介します。

 

【Isolation Forestについて】

分析手法の仕組み

Isolation forestは異常検知に特化して設計された教師なし学習の手法です。異常データを「孤立させる(isolate)」ことにより認識します。

馴染みの深いRandom Forestと同様に、Isolation Forest もアンサンブル学習器です。データ(行)と特徴量(列)をサンプリングして個別の木々(Isolation Trees) を作り、組み合わせることでロバストさを図ります。

簡単にIsolation Forest のデータ処理の流れを説明します。特徴量の中から1変数を選び出し、初期的にその変数の(最小値, 最大値)区間で「分割点」をランダムに選びます。最終的には、上記の分割点が節、データ点が葉である木構造になります。この分割操作を、満足の基準になるまで再帰的に分割を繰り返します。

各データ点に対して、葉にたどり着くまでの分割数はルートノードから葉までの距離に対応します。この距離(path length) path length という概念が重要です。なぜなら、 Isolation Forest アルゴリズム「異常値は量が少ない、かつ 正常データと性質がかけ離れている」という仮定に基づいています。異常データは、早い(木の浅い)段階で分割される確率が高く、結果としてpath length が小さくなります。この傾向を利用して異常データを正常データから見分けます(*)。

個別の木々を組み合わせる時、各データ点に対して、path lengthを森全体でとった平均を最終判断として採用します。この平均深さがまさに異常スコアに対応します。

(*)を直感的に理解するための例として、会社員の1ヶ月の給料のは概ね30万を中心に分布していますが、たまたま給料1000万のデータがあると、そのデータの区間は(30くらい,  1000)になります。この区間で分割する値をランダムに決める(一様分布とする)と、1000万のデータ点がisolateされる確率は圧倒的に高いですよね。

Isolation Forestの利点

異常検知の手法は他にも色々あります。その多くは「正常データ」のプロファイルを作り、それと比較して「遠い」ものを異常と判定します。この距離の概念は特徴量空間で形成されます。Isolation Forestは違います。「正常」の定義をしない、データ間の距離を計算に使わない、が差別化ポイントです。そのようなIsolation Forest のメリットとしては以下が挙げられます:

  • 高速に異常値を検出可能(理由:他のdistance-based手法と違って正常データのプロファイル作成不要のため、計算コストが比較的少ない)
  • メモリ占有率が比較的少ない(↑と似た理由)
  • 木が発達する深さを表すパラメータ max_depth を小さく設定できる(理由:異常データは短いパスのうちに既に識別できるから)
  • 小さなデータセットでも不利益が少ない
  • 不均衡データにも使いやすい (**)

(**)の補助説明:一般的に、正常データと異常データの間の不均衡問題が難しいです。不均衡をなくすために、データに重み付けをする方法とデータ数を調整する方法があります。後者では少ない方のデータを増やすオーバーサンプリングと多い方を減らすアンダーサンプリングがあります。一方で、Isolation Forest は不均衡問題にさほど敏感ではなくなるような設計なので、データ前処理の工数も削減できます。

 

【不正パケット検出のデモ】

演習を見せながら残りの解説をします。(本質ではないコードの部分を省略)

データの読み込み・概観

f:id:gri-blog:20200705164912p:plain

図1
 
正常、不正常データの割合を観察

今回はサービスの種類を http (よくあるもの)に限定した分析としました。

文字列データのlabel encoding を行いました。

f:id:gri-blog:20200705165050p:plain

図2
データを学習用と検証用に分割

Isolation Forestは教師あり学習ではないのですが、訓練データと評価データがあります。訓練データにもラベルがついている必要はありません。訓練データを用いて、Isolation Forestを学習させます。評価データでは、データを森に入れて、各データ点に対して異常スコアを取得します。

  • 入力:データ
  • 出力:各データ点の異常スコア

f:id:gri-blog:20200705165305p:plain

図3

 

モデルの定義・パラメータ設定・学習

Isolation Forest で重要となるパラメータは以下です。

  • n_estimators :アンサンブル内の木の数。デフォルトは100です。ここで500。
  • max samples:: それぞれの木を作るためにランダムサンプリングされるデータ数。 'auto' にしている場合 max_samples=min(256, n_samples)
  • contamination: 最も敏感に反応するパラメータの1つであり、その初期設定に要注意です。データせっとの中の期待される異常値の割合です。これはスコアの算出や判定閾値を出すときにも重要です。ここでは1割とする。

f:id:gri-blog:20200705165428p:plain

図4
異常スコアの算出・可視化

検証用と呼ばれている部分のデータに学習済みモデルを当てて、異常スコアを算出します。棒グラフで視覚化すると、異常判定の閾値が見えてきます。

f:id:gri-blog:20200705165659p:plain

図5

精度算出

図5において、スコアに対する閾値を0.19と決めました。

検証用データには正解がついており、それを用いて評価したAUCスコアは98.2でした。

f:id:gri-blog:20200705165908p:plain

図6

ちなみに、同じ課題を、アップまたはダウンサンプリングを行わずでKMeansで対応したところ、精度は85%程度でした。これだけの少ない工数でIsolation Forest手法を用いて、リアル世界の問題に対処できたのは素晴らしいと思います。

 

課題

今回は一発だけIsolation Forest の使い方を試しましたが、現実には精度を保証するために注意が必要です。例えば ....

  • 個別の攻撃を用いた場合、攻撃の種類、正常通信と攻撃通信の割合など学習データのバリエーションを増やした上での精度も評価すべき
  • 学習データにはない種類の攻撃が検証データにあったら精度はどうなるのか?

今度は、教師あり手法(random forest, SVM)やきちんと不均衡問題を解消するための前処理を施した上での kMeansの結果ときちんと比較したいと思います。

 

担当: ヤン・ジャクリン(分析官・講師)

 

参考

Scikit-learnのドキュメント

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html

https://scikit-learn.org/stable/auto_examples/ensemble/plot_isolation_forest.html

論文

Liu, F. T., Ting, K. M., & Zhou, Z. H. (2008, December). Isolation forest. In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). IEEE.

 

花束の画像から花の本数を特定する手法

花束の画像から機械学習を用いて花の名前と本数を特定する手法について考えてみます。 機械学習に慣れていない方が実際にこのようなタスクを行う場合には、多くの画像認識の手法の中からどの手法を選ぶとよいのか悩んでいるかもしれません。 また、API等の利用を考えているかもしれません。 今回は画像認識の手法ごとの違いやAPIを利用する場合、しない場合の違いを考え、どのように手法を選ぶべきかというのをまとめています。

画像認識手法の分類

まずは、画像認識全体の手法について見ていきます。 近年のDeep Learningの盛り上がりによって多くの画像認識手法が生み出されていますが、それらは大きく以下の図のように分類することができます。 f:id:gri-blog:20200630154552p:plain Image Classificationとはクラス分類を行う手法です。 画像の中に何が写っているのかを導き出す手法です。 画像から"CAT"であると判断するようなモデルがこれになります。 もし画像のどこに猫が写っているのかを知りたいのであれば、Image Localizationを行います。 そして、"犬と猫"のように複数の物体の位置を知りたい場合にはObject Detectionを行います。 Image LocalizationやObject Detectionではどこに"Dog"がいるのかを矩形によって表現しましたが、ピクセル単位で知りたい場合にはImage Segmentationを行う必要があります。 Image Segmentationを行うと複数の物体の形まで認識することができます。

複数の花が写っている画像から花の名前と本数を知りたいのであれば、Object Detectionを行う必要があります。 複数の花が写っているためImage Localizationでは不十分です。 また本数が分かれば、位置を正確に知る必要はないため、Image Segmentationを行う必要はありません。

Object Detectionの実現手法

Object Detectionを行うための手法は3つあります。 これらの手法は実現までの早さ、作業量、実現できるタスクの細かさ(=自由度)に違いが現れます。

1つ目はAPIを利用する手法です。 仮に画像から花の位置と名前を正確に特定できるAPIが存在するのであれば、それを利用することを検討すべきです。 既存のAPIを利用すれば、早く、少ない作業量で目的を達成することができます。 ただし、その分自由度は低くなり、望んでいるラベルが存在しないことも考えられます。 f:id:gri-blog:20200701101439p:plain

2つ目はタスクを分割し、複数のAPIを利用する手法です。 今回のタスクの場合には、花の位置を特定するAPIと花の名前を特定するAPIによって実現することができます。 前者は花の名前が分からずとも、位置が認識できれば、花1本ずつの画像を切り出してくることができます。 後者はImage Classificationを行い、花の名前を特定します。 この手法の場合にも早く目的を達成することができます。 作業量は1つ目の手法よりは増えますが、その分自由度も高くなる可能性があります。 ただし、API次第であることには変わりないため、望んでいるラベルが存在しないことも十分に考えられます。 f:id:gri-blog:20200701101530p:plain

3つ目は自作のモデルを構築する手法です。 この場合には自由度が最も高くなり、望んでいるラベルを用意することができます。 ただし、大量の訓練データも用意する必要があります。 作業量が大きくなり、モデルを構築するまでに多くの時間がかかることも考えられます。 f:id:gri-blog:20200701101648p:plain

APIの調査

ここからはAPIが実際に存在しているのか、今回のタスクに利用できるのかを調べていきます。

まず、画像から花の位置と名前を特定するAPIですが、2020年7月1日時点では見つけることができませんでした。 そのため、1つ目の手法を選択することはできないと判断します。

次に、位置を特定するAPIと名前を特定するAPIについて調べてみました。 その結果、それぞれGoogle Cloud Vision APIとPlant.idというAPIが見つかりました。 それぞれを試してみます。

Google Cloud Vision APIにバラの画像を入力した結果は以下のようになります。 f:id:gri-blog:20200701104901p:plain 2本とも"Flower"であると正しく認識されています。

花束の画像でも試してみます。 f:id:gri-blog:20200701105339p:plain こちらは3本のみしか見つけることができませんでした。 今回のタスクでは花束の画像を扱うため、APIの利用を控えた方が良さそうです。

Plant.idについても見ていきます。コスモスの画像を入力します。 f:id:gri-blog:20200701111905j:plain コスモスであることが正しく認識されています。

次にシャクナゲを入力してみます。 f:id:gri-blog:20200701112028j:plain シャクナゲの場合には正しく認識することができませんでした。 実際に名前と本数を特定したい画像にシャクナゲの画像が入っている場合には注意が必要であることが分かります。

調査の結果、花束の画像に対してはAPIの利用が難しいことが分かりました。 そのため今回のタスクを行う場合には、自作のモデルを構築する必要があります。

終わりに

花束の画像から花の名前と本数を特定するための手法について考えてみました。 早さや作業量、自由度のどれを重要視するのかによってAPIを利用するかどうかを決めます。 ただし、APIを利用する場合には望んでいるように画像を認識できるかどうかを十分に調査する必要があります。

私が1ヶ月でBIツール Tableauをマスターしたステップとおすすめコンテンツ

私が入社2ヶ月目に考えてやっていたことと、知っておきたかったことを整理して、これからTableauプロジェクトに入る人向けにどう習得したらいいかを書いてみました。Webや書籍として点在しているコンテンツの場所や、見る順番などを書いております。2020年6月時点版です。

Tableauって?

わかっている人は、ここは飛ばしてください。

Tableauって何かと言えば、ダッシュボードが作れるツールだと思います。 ではダッシュボードとは何か?「デジタルダッシュボード」についてはWikiにこうあります。

続きを読む