Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GrafanaのVariablesとData linkを使ってインタラクティブなダッシュボードを作る

GrafanaのVariablesとData linkを使ってインタラクティブなダッシュボードを作る

Grafana Meetup Japan#4のLT3の資料です。
「GrafanaのVariablesとData linkを使ってインタラクティブなダッシュボードを作る」
Variablesと自ダッシュボードへのData Linkを組み合わせると、画面遷移無しに動的に表示内容を変更できるダッシュボードを作れます。「機械学習による不良画像モード分類のモデル評価(混同行列など)」のダッシュボードを作りましたので、ユースケースとして紹介します。混同行列(Tableパネル)のセルをクリックして詳細データを確認したり、該当画像を表示することができます。

Avatar for 中久木秀樹

中久木秀樹

February 05, 2025

Other Decks in Technology

Transcript

  1. スピーカー紹介 氏名 中久木 秀樹 所属 TOPPAN株式会社 製造統括本部 製造技術センター システム開発1部 部門の役割

    社内工場のスマートファクトリ化推進 自分の役割 ・データ利活⽤関連の開発 ・有⽤なツール、サービスを⾒つけて試⽤し、部内に広める 可視化︓ Metabase、Grafana Webアプリフレームワーク︓ Streamlit、NiceGUI 情報共有︓ Notion 好きなVisualization Table、Gantt Chart(プラグイン) 1
  2. 不良画像モード分類のモデル作成サイクル 外観検査機 不良画像収集 人手による仕分け Class A Class B Class C

    検査結果 不良画像 機械学習 モデル作成 Class a Class b Class c 評価 FB(学習画像の再選定など) ・Recall ・Precision ・F1 Score 混合⾏列 推論結果DB 作成したモデル で推論 Scoreや 画像 ここで Grafana 推論モデルの出⼒︓ 推論対象画像が何れに分類するのが妥当か、Class毎にScoreを算出。 最大Scoreを推論Classとするのが基本。 4 学習⽤Data set 不良画像
  3. 評価指標② 混同⾏列(Confusion Matrix) d c b a 実際のClass 0 0

    1 5 A 0 0 6 0 B 1 3 1 1 C 5 0 1 0 D 各クラスごとの正解数と誤分類数を⽰す⾏列 この例は A〜Dの分類に対して、 各実Class6枚ずつの画像を推論させて、 正しく分類できた件数と誤って分類した件数 を表⽰。 ←推論Class ↑ 実Class 7
  4. 説明 データ型 フィールド名 # id Integer evaluation_his_id 1 不良画像ファイル名 character

    varying img_file 2 推論Class名(Scoreが最大のClass) character varying class_1st 3 推論ClassのScore値 character varying score_1st 4 推論Scoreが2番目に大きいClass character varying class_2nd 5 2番目に大きい推論ClassのScore値 character varying score_2nd 6 全ClassのScore値 jsonb score_json 7 検査日時 timestamp inspected_at 8 実Class名 character varying class_real 9 推論クラスが実Classと一致していたら1、不一致は0 integer is_correct 10 データソースのテーブル ダッシュボードで参照しているのテーブルはひとつのみ。 Queryで各パネルの表⽰データを⽣成している。 *)#1〜8は推論処理プログラムで値を格納。#9と10は人が仕分けた結果を格納。 16
  5. ダッシュボードのVariables設定 4つのVariablesを設定。何れも非表⽰設定。 説明 Variables 混同行列のクリックされたセルの推論Class名を保持 v_infer_cls_click 混同行列のクリックされたセルの実Class名を保持 v_real_cls_click 詳細データのクリックされた画像のURLを保持 v_img_url

    詳細データのクリックされた画像の番号を保持 V_img_no 17 *)よくあるVariablesの使い ⽅ではユーザーがドロップダ ウンリスト等で選択した値が セットされるが、 後述のData-link-variablesを 使⽤するので、非表⽰、初期 値設定も無し。
  6. SELECT 'AL' AS class_real, coalesce(SUM(CASE WHEN class_1st='angle_left' THEN 1 ELSE

    0 END),0) AS angle_left, coalesce(SUM(CASE WHEN class_1st='angle_right' THEN 1 ELSE 0 END),0) AS angle_right, ・ ・ coalesce(SUM(CASE WHEN class_1st='short' THEN 1 ELSE 0 END),0) AS short, coalesce(SUM(CASE WHEN class_1st='vertical' THEN 1 ELSE 0 END),0) AS vertical, SUM(CASE WHEN class_1st='angle_left' THEN 1 ELSE 0 END)::real / count(*) AS recall FROM t_eva_his_takino WHERE class_real='AL' AND $__timeFilter(inspected_at) UNION ALL SELECT 'AR' AS class_real, coalesce(SUM(CASE WHEN class_1st='angle_left' THEN 1 ELSE 0 END),0) AS angle_left, coalesce(SUM(CASE WHEN class_1st='angle_right' THEN 1 ELSE 0 END),0) AS angle_right, ・ ・ 混同⾏列パネルのQuery 1⾏目(AL)のデータ⽣成 2⾏目(AR)のデータ⽣成 ・ ・ UNION ALLで連結 1⾏ごとに条件に合う件数をカウントしてUNION ALLで連結して⽣成。 18
  7. 混同⾏列パネルのData link設定 説明 設定値 Variables クリックされた行のclass_realフィールドの値を設定 ${__data.fields.class_real} v_real_cls_click クリックされたセルのフィールド名を設定 ${__field.name}

    v_infer_cls_click リンク先を自ダッシュボードにしてData-link-variablesをVariablesに設定。 https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links/#data-link-variables *) Data-link-variables 19 自ダッシュボードURL TitleでもVariablesを設定し てTooltip表⽰
  8. SELECT row_number() OVER(ORDER BY img_file) AS "#", img_file, concat('http://xxxxx/xxx/', '20',

    LEFT(img_file,4),'/', img_file) AS img, class_real, class_1st, score_1st, class_2nd, score_2nd, score_json jsonb FROM t_eva_his_takino WHERE class_real='${v_real_cls_click}' AND (class_1st='${v_infer_cls_click}' OR '${v_infer_cls_click}'='*') AND $__timeFilter(inspected_at) 詳細データパネルのQuery WHERE句でVariablesを参照することで、表⽰を動的に変更している。 DBにはファイル名 のみ格納してある。 URLベースと連結 して画像のURLを ⽣成。 ⾏番号を⽣成 20 Variablesを参照
  9. 詳細データパネルの画像カラムへのData link設定 説明 設定値 Variables 元のVariablesの値をそのまま設定 ${v_infer_cls_click} v_infer_cls_click 元のVariablesの値をそのまま設定 ${v_infer_cls_click}

    v_real_cls_click クリックされた画像のURLを設定 ${__data.fields.img} v_img_url クリックされた画像の番号を設定 ${__data.fields.#} v_img_no https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links/#data-link-variables リンク先を自ダッシュボードにしてData-link-variablesをVariablesに設定 *) Data-link-variables 21 自ダッシュボードURL
  10. Score分布パネルのQuery クラス毎に赤色マーキング部を変えたQueryのパネルを並べている。 23 WITH j AS( SELECT cast(score_json -> 'angle_left'

    AS real) AS angle_left_sc FROM t_eva_his_takino WHERE class_real='${v_real_cls_click}' AND (class_1st='${v_infer_cls_click}' OR '${v_infer_cls_click}'='*')), a AS( SELECT width_bucket(angle_left_sc, 0, 100, 10) AS rnk FROM j ), b AS ( SELECT cast(GENERATE_SERIES(0, 90,10) AS character varying) AS score, 0 AS cnt UNION SELECT cast((rnk-1)*10 AS character varying) AS score, count(rnk) FROM a GROUP BY rnk ) SELECT score, sum(cnt) AS "CNT" FROM b GROUP BY score ORDER BY score *) width_bucketはヒストグラム作成に使える PostgreSQLの算術演算関数 Variablesを参照 データが存在しないScore範囲も含めて、0から90までの10刻みのScore範囲を全て網羅するため
  11. 参考︓ 環境︓ Grafanaバージョン︓ v8.02 データベース︓ PostgrSQL v16.1 24 ダッシュボード作成時の参考になるサイト︓ AWSの動画︓

    https://www.youtube.com/watch?v=6rdwOxX7c8o ゆずたそさんの風⾳屋さんのブログ︓ https://techblog.kazaneya.com/20241208-design-of-analytical-sql-queries/
  12. 25