高木のブログ

DeepStackのObject Detectionの結果を画像に矩形を描画して可視化する

2021/07/22

DeepStackのObject Detectionを試すの続き

以下の画像をAPIに投げて物体検出することができた
結果のJSONに物体の座標も載っているので今回はそれ使って画像に矩形を描画する

フエ郊外の村と牛(ベトナム)の写真素材 この画像はPAKUTASO様からお借りした(https://www.pakutaso.com/20170609172post-12164.html)

{
  "success": true,
  "predictions": [
    {
      "confidence": 0.7281746,
      "label": "motorcycle",
      "y_min": 275,
      "x_min": 241,
      "y_max": 388,
      "x_max": 401
    },
    {
      "confidence": 0.856776,
      "label": "person",
      "y_min": 219,
      "x_min": 131,
      "y_max": 418,
      "x_max": 246
    },
    {
      "confidence": 0.86147404,
      "label": "bicycle",
      "y_min": 294,
      "x_min": 100,
      "y_max": 468,
      "x_max": 301
    },
    {
      "confidence": 0.9212758,
      "label": "cow",
      "y_min": 293,
      "x_min": 359,
      "y_max": 482,
      "x_max": 566
    }
  ],
  "duration": 0
}

画像に矩形を描画する

画像に描画するにはImageMagickを使う

矩形の描画するコマンド

以下のコマンドとオプションで矩形の描画ができる

$ convert 元の画像 -draw "rectangle X1の座標, Y1の座標, X2の座標, Y2の座標" 描画後の画像

牛の位置に矩形を描画してみる

$ convert original.jpg -draw "fill #ffffff fill-opacity 0.5 rectangle 359, 293, 566, 482" draw_rectanglejpg

そのままだと黒い矩形ができるので半透明の白を指定して実行した

フエ郊外の村と牛(ベトナム)の写真素材 加工1

これで正しい座標が返ってきていることが確認できた

複数矩形を描画する

複数物体検出されているので全て描画してみる

JSONの結果から描画に必要なオプションを出力するスクリプト

複数の座標を入力するのは手間なので必要なオプションを出力するスクリプトを書いた

#!/bin/bash

if [ -p /dev/stdin ]; then
  json=`cat -`
else
  json=`echo $@`
fi

echo `echo $json | \
      jq -r '.predictions[] | "-draw \"fill #ffffff fill-opacity 0.5 rectangle " + (.x_min|tostring) + ", " + (.y_min|tostring) + ", " + (.x_max|tostring) + ", " + (.y_max|tostring) + "\""' | \
      tr '\n' ' '`

実行権限を付与して実行

$ chmod +x ./parser.sh
$ ./parser.sh '{"success":true,"predictions":[{"confidence":0.7281746,"label":"motorcycle","y_min":275,"x_min":241,"y_max":388,"x_max":401},{"confidence":0.856776,"label":"person","y_min":219,"x_min":131,"y_max":418,"x_max":246},{"confidence":0.86147404,"label":"bicycle","y_min":294,"x_min":100,"y_max":468,"x_max":301},{"confidence":0.9212758,"label":"cow","y_min":293,"x_min":359,"y_max":482,"x_max":566}],"duration":0}'
-draw "fill #ffffff fill-opacity 0.5 rectangle 241, 275, 401, 388" -draw "fill #ffffff fill-opacity 0.5 rectangle 131, 219, 246, 418" -draw "fill #ffffff fill-opacity 0.5 rectangle 100, 294, 301, 468" -draw "fill #ffffff fill-opacity 0.5 rectangle 359, 293, 566, 482"

牛以外の物体の位置に矩形を描画してみる

$ convert original.jpg -draw "fill #ffffff fill-opacity 0.5 rectangle 241, 275, 401, 388" -draw "fill #ffffff fill-opacity 0.5 rectangle 131, 219, 246, 418" -draw "fill #ffffff fill-opacity 0.5 rectangle 100, 294, 301, 468" -draw "fill #ffffff fill-opacity 0.5 rectangle 359, 293, 566, 482" draw_rectanglejpg

フエ郊外の村と牛(ベトナム)の写真素材 加工2

全て正しい位置に検出できている、良きね

(補足)パイプで繋げることも可能

標準入力でも値を受け付けられるようにしてあるので、APIに投げるコマンドにパイプで繋げてあげたら結果をダイレクトで変換することも可能

$ curl -s -X POST -F image=sample.jpg http://localhost:80/v1/vision/detection | ./parser.sh
-draw "fill #ffffff fill-opacity 0.5 rectangle 241, 275, 401, 388" -draw "fill #ffffff fill-opacity 0.5 rectangle 131, 219, 246, 418" -draw "fill #ffffff fill-opacity 0.5 rectangle 100, 294, 301, 468" -draw "fill #ffffff fill-opacity 0.5 rectangle 359, 293, 566, 482"

Written by ytkg, Twitter, GitHub

Pixela