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
そのままだと黒い矩形ができるので半透明の白を指定して実行した
これで正しい座標が返ってきていることが確認できた
複数矩形を描画する
複数物体検出されているので全て描画してみる
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
全て正しい位置に検出できている、良きね
(補足)パイプで繋げることも可能
標準入力でも値を受け付けられるようにしてあるので、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"