sql >> データベース >  >> RDS >> MariaDB

パート1:MariaDBサーバーとTensorFlowを使用した画像分類–概要

    最先端の企業は、新しいデジタルビジネス変革の時代の課題に対応するために、人工知能と機械学習に目を向けています。

    Gartnerによると、「シニアビジネスリーダーの87%がデジタル化が企業の優先事項であり、企業ストラテジストの79%がビジネスを改革し、新しい方法で新しい収益源を生み出していると述べています。 「。

    ソース :Gartner、デジタルビジネスの変革をスピードアップ、2019年1月15日

    しかし、これまでのところ、デジタルの変化は困難でした。ツール、アーキテクチャ、環境の複雑さは、機械学習を使用する上での障壁となります。 SQLベースのリレーショナルデータ管理を使用して画像のデータ探索を保存および実行すると、障壁が軽減され、機械学習のメリットが発揮されます。

    このブログ投稿では、一般的なオープンソースツールであるMariaDBサーバー、TensorFlow Pythonライブラリ、Kerasニューラルネットワークライブラリを使用して、機械学習の実装の複雑さを簡素化する方法を示しています。これらのテクノロジーを使用すると、データに効率的にアクセス、更新、挿入、操作、変更することで、市場投入までの時間を短縮できます。

    リレーショナルデータベースでの機械学習

    機械学習によって可能になるデジタルビジネス変革の中心には、チャットボット、レコメンデーションエンジン、パーソナライズされたコミュニケーション、インテリジェントな広告ターゲティング、画像分類などのテクノロジーがあります。

    画像分類には、法執行機関や軍隊から、小売車や自動運転車まで、さまざまなユースケースがあります。機械学習を実装すると、画像分類によりリアルタイムのビジネスインテリジェンスを提供できます。画像分類の目的は、画像に発生する特徴を一意のグレーレベル(または色)として識別して描写することです。画像分類の最も一般的なツールは、TensorFlowとKerasです。

    TensorFlowは、Googleによって作成およびリリースされた高速数値コンピューティング用のPythonライブラリです。 MariaDBサーバーは、データにアクセスして管理するためのSQLインターフェイスを備えたオープンソースのリレーショナルデータベースです。 Kerasは、Pythonで記述されたオープンソースのニューラルネットワークライブラリです。

    この投稿では、TensorFlowとMariaDBサーバー間の相互運用性を有効にして画像分類をテストする方法を紹介します。この投稿では、10のカテゴリに70,000のグレースケール画像を含むFashionMNISTデータセットを使用しています。画像は、低解像度(28 x 28ピクセル)の個々の衣料品を示しています。

    MariaDBサーバーへのデータのロードと準備は、この投稿の範囲外です。次のテーブルが事前に作成され、FashionMNISTデータセットが入力されています。

    画像 画像の役割 画像ラベル
    CREATE TABLE tf_images (
    img_label tinyint(4)、
    img_vector blob、
    img_idx int(10)unsigned NOT NULL、
    img_blob blob、
    img_use tinyint(4)
    )ENGINE =InnoDB DEFAULT CHARSET =utf8mb4
    CREATE TABLE img_use (
    use_id tinyint(4)NOT NULL AUTO_INCREMENT、
    use_name varchar(10)NOT NULL、
    use_desc varchar(100)NOT NULL、
    PRIMARY KEY(use_id)
    )ENGINE =InnoDB AUTO_INCREMENT =3 DEFAULT CHARSET =utf8mb4
    CREATE TABLE categories (
    class_idx tinyint(4)NOT NULL、
    class_name char(20)DEFAULT NULL、
    PRIMARY KEY(class_idx)
    )ENGINE =InnoDB DEFAULT CHARSET =utf8mb4

    データ探索

    次のライブラリは、MariaDBサーバーで基本的なデータ探索を実行するために使用されます。

    1. io モジュールは、さまざまなタイプのI/Oを処理するためのPythonの主要な機能を提供します。
    2. Matplotlib は、プラットフォーム間でさまざまなグラフを作成するためのPython2Dプロットライブラリです。
    3. パンダ 数値テーブルと時系列を操作するためのデータ構造と操作を提供します。
    4. pymysql パッケージには、MariaDBサーバーにアクセスするための純粋なPythonクライアントライブラリが含まれています。

    Pythonを介してデータベースサーバーに接続することから始めましょう:

    import io
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    import pandas as pd
    import pymysql as MariaDB
    %matplotlib inline
    
    conn = MariaDB.connect( host = '127.0.0.1'
    , port = 3306
    , user = 'mdb'
    , passwd = 'letmein'
    , db = 'ml'
    , charset = 'utf8')
    
    cur = conn.cursor()

    MariaDBサーバーに接続すると、データベース内の画像に簡単にアクセスして管理できます。モデルのトレーニングとテストに使用されるすべての画像は、単一のテーブル(tf_images)に保存されます。画像の使用方法は、画像使用テーブル(img_use)で定義されています。この場合、テーブルにはトレーニングとテストの2つのタプルしかありません。

    sql="SELECT use_name AS 'Image Role'
              , use_desc AS 'Description'
         FROM img_use"
    display( pd.read_sql(sql,conn) )

    画像の役割 説明
    トレーニング 画像はモデルのトレーニングに使用されます
    テスト 画像はモデルのテストに使用されます

    ターゲット属性をデータセット内の画像オブジェクトにマッピングすることをラベリングと呼びます。ラベルの定義はアプリケーションごとに異なり、画像の「正しい」ラベルが何であるかについての普遍的な定義はほとんどありません。リレーショナルデータベースを使用すると、ラベル付けプロセスが簡素化され、粗いラベルから細かいラベルに移行する方法が提供されます。

    この例では、「カテゴリ」テーブルを使用すると、以下に示すように、画像には1つのラベル(粗い)しかありません。

    sql="SELECT class_name AS 'Class Name' FROM categories"
    display( pd.read_sql(sql,conn) )
    クラス名
    0 Tシャツ/トップ
    1 ズボン
    2 プルオーバー
    3 ドレス
    4 コート
    5 サンダル
    6 シャツ
    7 スニーカー
    8 バッグ
    9 アンクルブーツ

    画像 表には、トレーニングとテストに使用されるすべての画像が含まれています。各画像には、一意の識別子、ラベル、およびモデルのトレーニングとテストのどちらに使用されるかが示されています。画像は元のPNG形式で、前処理された浮動小数点テンソルとして保存されます。このテーブルの単純な内部結合を実行して、画像表現(ベクトルまたはpng形式)、そのラベル、および使用目的を表示できます。

    sql="SELECT cn.class_name AS 'Class Name' 
              , iu.use_name AS 'Image Use' 
              , img_vector AS 'Vector Representation' 
              , img_blob AS 'Image PNG' 
         FROM tf_images AS ti 
              INNER JOIN categories AS cn ON ti.img_label = cn.class_idx
              INNER JOIN img_use AS iu ON ti.img_use  = iu.use_id
         LIMIT 5"
    display( pd.read_sql(sql,conn) )

    クラス名 画像の使用 ベクトル表現 画像PNG
    アンクルブーツ トレーニング b’\ x80 \ x02cnumpy.core.multiarray\n_reconstruct… b’\ x89PNG \ r \ n \ x1a \ n \ x00 \ x00 \ x00 \ rIHDR \ x00 \x00\…
    Tシャツ/トップ トレーニング b’\ x80 \ x02cnumpy.core.multiarray\n_reconstruct… b” \ x89PNG \ r \ n \ x1a \ n \ x00 \ x00 \ x00 \ rIHDR \ x00 \x00\…
    Tシャツ/トップ トレーニング b’\ x80 \ x02cnumpy.core.multiarray\n_reconstruct… b’\ x89PNG \ r \ n \ x1a \ n \ x00 \ x00 \ x00 \ rIHDR \ x00 \x00\…
    ドレス トレーニング b” \ x80 \ x02cnumpy.core.multiarray\n_reconstruct… b’\ x89PNG \ r \ n \ x1a \ n \ x00 \ x00 \ x00 \ rIHDR \ x00 \x00\…
    Tシャツ/トップ トレーニング b’\ x80 \ x02cnumpy.core.multiarray\n_reconstruct… b’\ x89PNG \ r \ n \ x1a \ n \ x00 \ x00 \ x00 \ rIHDR \ x00 \x00\…

    SQLステートメントを使用すると、データ探索プロセスが簡単になります。たとえば、次のSQLステートメントは、画像ラベルごとの画像分布を示しています。

    sql="SELECT class_name AS 'Image Label' \
         , COUNT(CASE WHEN img_use = 1 THEN img_label END) AS 'Training Images'\
         , COUNT(CASE WHEN img_use = 2 THEN img_label END) AS 'Testing Images'\
         FROM tf_images INNER JOIN categories ON class_idx = img_label \
         GROUP BY class_name"
    df = pd.read_sql(sql,conn)
    display (df)
    ax = df.plot.bar(rot=0)

    画像ラベル トレーニング画像 画像のテスト
    0 アンクルブーツ 6000 1000
    1 バッグ 6000 1000
    2 コート 6000 1000
    3 ドレス 6000 1000
    4 プルオーバー 6000 1000
    5 サンダル 6000 1000
    6 シャツ 6000 1000
    7 スニーカー 6000 1000
    8 Tシャツ/トップ 6000 1000
    9 ズボン 6000 1000

    トレーニングセットのラベルごとに6,000枚の画像があり、テストセットのラベルごとに1,000枚の画像があります。トレーニングセットには合計60,000枚の画像があり、テストセットには合計10,000枚の画像があります。

    個々の衣料品は低解像度の画像として保存されます。データベースはこれらの画像をバイナリラージオブジェクト(BLOB)として効率的に保存できるため、以下に示すように、SQLを使用して画像を取得するのは非常に簡単です。

    sql="SELECT img_blob \
         FROM tf_images INNER JOIN img_use ON use_id = img_use \
         WHERE use_name = 'Testing' and img_idx = 0"
    
    cur.execute(sql)
    data = cur.fetchone()
    file_like=io.BytesIO(data[0])
    img = mpimg.imread(file_like)
    plt.imshow(img)

    上:fashion_mnistデータセットからの画像

    ブログシリーズのこの最初のパートでは、リレーショナルデータベースを使用して、単純なSQLステートメントを使用して画像のデータ探索を保存および実行する方法を示しました。パート2では、TensorFlowに必要なデータ構造にデータをフォーマットする方法と、モデルをトレーニングし、予測を実行して(つまり、画像を識別し)、さらに分析または使用するためにそれらの予測をデータベースに保存する方法を示します。

    >

    MITライセンス

    このブログで利用されているFashionMNIST(fashion_mnist)データセットは、MITライセンスの下でライセンスされています。

    MITライセンス(MIT)Copyright©2017 Zalando SE、https://tech.zalando.com

    これにより、このソフトウェアおよび関連するドキュメントファイル(「ソフトウェア」)のコピーを取得するすべての人に、制限なしにソフトウェアを取り扱う許可が無料で付与されます。以下の条件を条件として、ソフトウェアのコピーを使用、コピー、変更、マージ、公開、配布、サブライセンス、および/または販売する権利、およびソフトウェアが提供される人にそうすることを許可する権利を含みますが、これらに限定されません。

    上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。

    本ソフトウェアは「現状有姿」で提供され、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示または黙示を問わず、いかなる種類の保証もありません。いかなる場合も、作者または著作権所有者は、契約、不法行為、またはその他の行為にかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因する、または関連する、いかなる請求、損害、またはその他の責任についても責任を負わないものとします。ソフトウェア。

    参考資料

    自分の画像をMNISTの画像に変換する
    matplotlib:画像チュートリアル
    AIがカスタマーエクスペリエンスを変革する5つの方法
    デジタル化はビジネスを再発明する
    画像分類とは
    Pythonの概要ディープラーニングライブラリTensorFlow


    1. Postgresウィンドウ関数とgroupby例外

    2. SQL Serverの「rowversion」とは何ですか?

    3. Oracleで一般的なORA-02049とロックの問題をトラブルシューティングする方法

    4. postgresql --sql--`true`値のカウント