GoogleCloudStoregeの画像をimgcatで見る
WED株式会社でデータエンジニアをしているthimi0412です。
WEDが運営するレシート買取アプリONEではレシートをOCR→構造化→DBといったフローでデータを格納しています。
今回はimgcatを使用してGoogleCloudStorageにある画像を表示しようと思います。
レシート画像の確認
OCRのミス等で取得できていない値や間違って取得しているもの、どのような画像なのかをしばしば目視で確認をしています。
レシートにはreceipt_idが振られており、弊社のMetabase等でreceipt_idを使用してGoogleCloudStorege(以下GCSと略)にある画像のURLを検索して確認をしています。
ターミナルでも画像を確認したい
OCRサーバーの開発を行う際に、ローカル環境でサーバーを立ち上げてローカルの画像ファイルを使用してOCRの検証をすることが多く、レシート画像をGCSからダウンロードする場合があります。
GCSのコンソールからダウンロードをしてもいいのですが、ターミナルのコマンド操作で画像の確認とダウンロードができればと思っていました。
imgcatを使う
(インストール等のやり方は省きます)
以下のようなコマンドを実行すると画像のURLからターミナル上に画像を表示してくれます。
もちろんローカルにある画像も見ることが出来ます。
imgcat -u https://assets.wow.one/onekun/onekun-standard.png

gcs_imgcat
レシート画像を保存しているGCSには閲覧制限をつけているので、imgcatでurlを指定しても見ることはできません。よって以下のようなshell function(gcs_imgcat)を作成しました。.zshrc等に貼り付けて使用しています。
コード
function gcs_imgcat () {
if [ $# -ne 1 ] && [ $# -ne 2 ];then
echo "Usage: gcs_imgcat gs://hogehuga.jpg";
echo "Option -d --delete Delete file";
return
fi
gcs_uri=$1
# URLチェック
pattern="^gs://.*\.jpg$"
if [[ $gcs_uri =~ $pattern ]]; then
echo "Match: $gcs_uri"
else
echo "No match: $gcs_uri"
return
fi
echo $gcs_uri
delete_flag=0
if [[ $2 = "-d" || $2 = "--delete" ]]; then
delete_flag=1
fi
directory="$HOME/Downloads/receipts/"
if [ ! -d "$directory" ]; then
mkdir -p "$directory"
echo "Directory created: $directory"
else
echo "Directory already exists: $directory"
fi
gsutil cp $gcs_uri $directory
file_name=$(basename $gcs_uri)
$HOME/.iterm2/imgcat "${directory}${file_name}"
if [ $delete_flag = 1 ]; then
rm "${directory}${file_name}"
fi
}
行っていることは
-
gsutilコマンドを使用してレシート画像をダウンロード - ダウンロードしたファイルを対象に
imgcatコマンドを実行 -
-dのフラグがついていたらその画像を削除
使い方としては以下のように使います。
gcs_imgcat gs://hogehuga/test/receipt00.jpg

出力にもあるように/Downloads/receiptsに表示したレシート画像をダウンロードしています。
/Downloadsにreceiptsのディレクトリがなければ作成します。
Directory already exists: /Users/<user_name>/Downloads/receipts/
-dのフラグをつけるとダウンロードして表示したファイルは削除されます。
gcs_imgcat gs://hogehuga/test/receipt00.jpg -d
終わりに
わざわざGCSコンソールを開かずとも、ターミナル上でレシート画像を確認できることが出来ました。
shell functionを自作してみましたが、画像そのものが大きいとターミナルに表示される領域も大きくなってしまうので、改善の余地ありだと思っております。
Discussion