前置き
もし、ワードプレス上に上げた画像にパスワードとか鍵情報とか載っていたら、誰だって困ったことが起きますね(世の中がいい人だらけなら違うかもしれませんが)
今回はまとめて禁止語句と呼びます。
今回はAmazon Rekognitionを用いて、禁止語句がWordpressに画像としてuploadされたときにその区域を自動で見えなくするスクリプトを書いてみたいと思います。
環境準備
環境 Amazon Linux 2 ユーザー root推奨
●割愛:(テスト用)ワードプレスの構築
●必要パッケージのインストール
yum install python3 imagemagick
pip3 install awscli
●awscliをアクセスできるようにしておく。
aws configure
AWSアカウントからシークレットキーなどをメモっておいて登録してください。
●禁止語句ファイルの設定
今回は適当にキーボードを叩いてできた2つの言葉を隠します。
rekog.txt
2ry3f289a faoy389yha
本来とても重要なファイルになるので、rootのみ許可を出します。
chmod 700 rekog.txt
●差分用に過去の写真名を記録しておくテキストファイルを作成しておきます。名前は変える場合はスクリプトも書き換えること。
touch pic_name_history.txt
大きいスクリプトなので大まかな流れ
wordpress内に保存されている画像タイトルの取得
↓
過去の利用状況から差分を取り、新しい画像のみAWS Rekognitionに送信する。
↓
帰ってきた応答から対象の文字があるかを検索し、あれば場所情報のみを切り抜く。
↓
Imagemagickを用いて対象の文字がある部分に黒い四角を書く。
というのを全画像で全語句順番にやっていく感じになります。
スクリプト
#!/bin/bash #その日の画像データのタイトルを取得 ls /var/www/html/wordpress/wp-content/uploads/`date "+%Y/%m"` > title.txt place="/var/www/html/wordpress/wp-content/uploads/`date "+%Y/%m"`" #このあとこの場所の情報をよく使うので、placeに格納しておきます。 while read pic_name || [ -n "$pic_name" ] #pic_nameに画像名が変数として格納される。 do #差分のみawsに渡すようにする。 dif="`grep "$pic_name" pic_name_history.txt`" if [ "$dif" = "$pic_name" ]; then continue fi echo "$pic_name" >> pic_name_history.txt #tmp2.txt に画像認識結果を出力 echo "$pic_name をAWSに渡します。" aws rekognition detect-text --image-bytes fileb://${place}/${pic_name} > tmp2.txt #rekog.txt内に記述してある「serchword」が認識結果の中に含まれているかどうかを確認する。 while read serchword || [ -n "$serchword" ] do A="`cat tmp2.txt | grep -A 26 "$serchword"`" #含まれていればAに禁止語句を格納する。含まれていなければ空白になる。 #禁止語句を見つけたら、その周辺情報のPolygonがある26行後まで回収する。 if [ "$A" != "" ]; then #前述のgrepが禁止語句を拾えば画像処理に入る。 #画像処理プロセス echo $A > tmp3.txt cut -f 2 -d "[" tmp3.txt | cut -f 1 -d "-" > tmp4.txt #Polygonの部分だけ切り取る #画像情報の取得 identify -verbose $place/$pic_name | grep "Geometry" | cut -f 1 -d "+" > tmp5.txt x_size=`cut -c 13- "tmp5.txt" | cut -f 1 -d "x"` y_size=`cut -c 13- "tmp5.txt" | cut -f 2 -d "x" ` startx_per=`cut -f 8 -d ":" tmp4.txt | cut -c 2-6` startx=`echo "scale=3; $startx_per*$x_size" | bc` starty_per=`cut -f 9 -d ":" tmp4.txt | cut -c 2-6` starty=`echo "scale=3; $starty_per*$y_size" | bc` finx_per=`cut -f 4 -d ":" tmp4.txt | cut -c 2-6` finx=`echo "scale=3; $finx_per*$x_size" | bc` finy_per=`cut -f 5 -d ":" tmp4.txt | cut -c 2-6` finy=`echo "scale=3; $finy_per*$y_size" | bc` #禁止語句がある部分を黒く塗りつぶす convert $place/$pic_name -draw "rectangle $startx,$starty $finx,$finy" tmp.png #塗りつぶした画像と元の画像を交換する rm $place/$pic_name -f mv tmp.png $place/$pic_name chown apache:apache $place/$pic_name fi done < rekog.txt done < title.txt #一時ファイルたちの削除 rm -f tmp2.txt; rm -f tmp3.txt; rm -f tmp4.txt; rm -f tmp5.txt; rm -f title.txt; exit
実行結果
☆実行前
☆実行結果
補足説明
■各一時ファイルの説明
- tmp2.txt = すべての検出語句+位置情報(AWSの出力そのもの)
- tmp3.txt = 禁止語句の検出語句+位置情報
- tmp4.txt = 位置情報のみ
- tmp5.txt = 送った画像の画素数の情報(これだけAWSとは直接関係ない)
●Amazon Rekognitionの文字検出位置の出力について Amazon Rekognitionでは位置情報は、割合で表示されます。
"Polygon": [ { "X": 0.9172113537788391, "Y": 0.9193277359008789 },
そのため、送った画像の画素数を、Amazon Rekognitionの結果と掛け合わせて実際の位置にする必要があります。
■Imagemagickのconvertについて
convertは画像を編集できるコマンドですが、
上書き保存が出来ないので、一度tmp.pngで保存し、その後、元データを削除、tmp.pngをもとの画像データの名前にするという若干遠回りですがやむなしとしてます。rootで作成するとワードプレスがアクセスできなくなってしまうため、権限をapacheにわたすのを忘れずに。