Amazon Rekognitionを使って写真に自動でタグ付けする

Amazon Rekognitionを使ってMacOS Finderのタグ機能を更に良いものにしよう | Amazon Web Services ブログ

こちらを読んでいて、面白そうだったのでやって見ました。
やっていることは、あるフォルダに画像が置かれると、Amazon Rekoginitionを使ってLabelを取得し、その値をplistにformatしてxattrでtagをセットするという仕組みです。
内部的に一旦jpg変換してからrequestしているのもあり、1画像あたり2〜6秒程度時間が掛かります。
 
MacのFolder Action初めて使いましたが、これは面白いです。
色々自動化できそう。
 

こんな感じ

この画像だと、
f:id:rochefort:20140122155711j:plain:w300
Alcohol, Beer, Beverage,Drink, Cup が設定されました。

spotlightのtag検索だと、こういう感じ。finderの検索も同じようにできます。
f:id:rochefort:20170322012622p:plain
 

また、finder上でもtagを見ることができます。
f:id:rochefort:20170322013300p:plain
 

やり方

pip installとかAWS側の設定は基本的な話なので省略。

ソース

mkosut/rekognition_osx_tagfile: Takes local OSX directory of images and uses Amazon Rekognition to tag them using OSX tags
に一式置かれています。

automator workflow

対象フォルダをworkflowで設定すると、installすることができます。
shellのパスなどを修正すればautomatorとしてはokです。
 
shellについては、私は以下のようにしてみました。

export AWS_DEFAULT_PROFILE=rek
LOG="/var/log/aws_rekognition.log"
echo "-- start $(date)" >> ${LOG}
for f in "$@"
do
  echo "/usr/local/bin/python3 ~/lib/rekognition_osx_tagfile/rek_osx_tag.py -f $f" >> ${LOG}
  /usr/local/bin/python3 ~/lib/rekognition_osx_tagfile/rek_osx_tag.py -f "$f"  >> ${LOG} 2>&1
done
echo "-- end   $(date)" >> ${LOG}
echo "" >> ${LOG}

AWS_DEFAULT_PROFILE についてですが、 Amazon Rekognition のregionは東京にはないので、profileを分けて実行するようにしています。 profileは aws configure --profile your_profile_name で作成可能です。
 

Folder Action

対象フォルダを右クリックし、Services > Folder Action Setup… で対象フォルダと実行サービスの紐付けを行い、有効化します。
f:id:rochefort:20170322014007p:plain

使い勝手について

Beerの画像のように分かりやすといいのですが、もう少し複雑なものだと大量にタグがセットされてしまいます。
例えば、台湾のお寺の写真だと
f:id:rochefort:20140319202843j:plain

こんなに沢山(script内で最大数は50に設定されています)。
People, Person, Human, Architecture, Shrine, Temple, Worship, Bar Counter, Pub, Night Club, Night Life, Clothing, Dress, Road, Street, Town, Subway, Train, Train Station, Vehicle, Costume, Alley, Alleyway

python script内でconfidenceを50としているのが、少し緩い印象。
ここは、-c オプションで変更可能ですが、調整した方がいいかもしれません。