スパムFAXを画像解析+機械学習でブロックしてみた

はじめに

こんにちは、hacknoteのr.katoです。ここではs.nagasawaと2人で実際に作成したシステムを紹介していきます。

Townでは一部のサービスの関係でインターネット上のFaxを使用しています。
どこの企業さんでも業務の都合上Web上のFaxを使用しているところがあるかと思います。
しかし、FAXを受け入れるようにした結果、必ず起きる問題が・・・

Townはメールきっかけなので以下のような流れです。
多分FAXを受けている会社は、紙が直接出てくると思いますが、
似たような流れでFAXを処理しているんじゃないでしょうか。

僕はFAXを届けるために入社したんじゃないやい!

いるものいらないものに分けるためにも微妙なものを初めは聞いて、コレはいる、これはいらないとか覚える必要が・・・とにかく言えることは、

スパム(営業)FAX邪魔!

FAXが来たら自動印刷しているところでも、必要なFAXを探さないといけないくらい営業FAXが届いてくると思います。

基本的にはTownのFAX番号は公開してない(はず)なのにもかかわらず半分かそれ以上が邪魔なFAX。

もはや、もうFAX使わないでいいじゃんと思うけどそんな手前勝手なことを依頼するわけにもいかないわけで。

なので、欲しいFAXだけ受け取りつつ、いらないFAXを駆逐・・・。Gmailのスパム判定みたいなのがほしい・・・

だけど画像ファイルだから簡単な判定では難しいような・・・いる・・・いらない・・・検出・・・ん・・・?

Amazon SageMaker を使っておでん種を検出したかった

そういえば機械学習でこんなことしてたなー。コレは画像の中に物体があるかどうかだったけど。

そうか。いらないFAXを機械学習で覚えさせて排除すればいいのだ。

パッとみただけでも明らかにスパムFAXはゴテゴテしているし、わかるはず。(第3回で紹介するがコレは失敗した)

機械学習使ってスパムFAXを検出してみよう!

具体的な処理フローは次のようになりました。

  1. Fax着信通知をAWSのSESメールで受け取る(FaxのWebサイトの機能)
  2. メール内容を確認し、FAXの通知メールだったらLambda関数を起動
  3. Lambdaでインスタンス内のheadless chromeにより自動でファイルダウンロードしS3へ保存
  4. FAX画像をGoogleのCloudVisionAPIで文字に起こし、機械学習ができるようにデータを成形する
  5. pythonで書いた機械学習でスパム分類後、分類結果ごとにFAXをS3の所定位置へ保存、結果とDL用URLをSlackへ送信
  6. 識別成功・失敗をSlackのボタンでシステムに教えてシステムの頭を良くする

メールを受信したらheadless chromeで自動ダウンロードさせて、画像解析+機械学習を利用した言語解析によりスパムか判別、S3に保存して結果をslack通知するって流れです。

slackの通知であればみんなで確認できますし、FAX見る係をつくる必要なんてありません。

いらないものの精度をほぼ確実にし、いらないものをそもそも通知しなくすれば完璧です。

これならFAX配達係をやめて、その時間でコーヒーを淹れてゆったりすることができます。☕

画像認識ではじめはどうにかしようと思いましたが、画像処理のみでデータの判別を行おうとするとどうにも誤検知が多くなってしまうようです。(第3回で説明します)

データ数が千近くあればもしかしたらうまくいくのかもしれませんが、まだデータの蓄積は100程度なので・・・。

ボリュームが大きく、内容が別れているので、一つ一つ別記事にしてあります。ここではまとめでユーザー側の動作を見せたいと思うので中身は以下の記事を見てください。

▼Faxのスパム分類シリーズ記事(全6回)

スパムFAXを画像解析+機械学習でブロックしてみた

さて、システムが出来上がったのでここからは実際の動作確認。

FAXが送信されてくるとメールが飛んできます。

営業時間外に受け取ったものは営業時間に処理するように変更してあります。営業時間以外は待受を止めてインスタンス代を節約してるので・・・。

営業時間の9:30になるとこのような通知が。

誤検知があると不安なので、全送信がここの部屋に通知され人でも判別させることで精度を上げるようにしています。

実際のFAXデータはリンクをクリックするとDLできるようになっており、【必要のない】を開いてみると

PCの割引キャンペーンのチラシですね。チラシとはいえ、そのまま見せるのはやめて念の為ぼかしました・・・。

いらないFAXは正常に判断できているようです。

間違いなく、いらないものだったので、あっていたことを教えてあげます。

機械学習の判断が信頼できるようになればいらないFAXの通知を消して完了です。

これで面倒なFAXを見ずにすむようになりました!

ブロックの理由

第5回でも紹介していますが、今回は画像からの文字解析→言葉の中でいるもの・いらないものの特徴を出しスパム判定を行っています。

100枚くらいの「いる」・「いらない」の区別から出した特徴がこちら

「いる」

「いらない」

見てわかる通り、必要なさそうな「セミナー」、「採用」、「融資」などの単語を上手く弾くことができています。TOWNの旧会社名のエイムラックが出ないのは少し意外でした。

逆に必要なものに含まれている、重要そうな「送金」や会社名、自社のアプリケーション、支社がある「静岡」などよく学習できていそうですね。

データ数を増やし続ければ問題なくほぼ完璧な判定できそうです。

テストしてみた

FAXで送信されてくる必要なデータほぼ同一なので、まぁ問題なく判定出来ている事がわかりました。

なので、微妙なラインのFAXを作って自作自演で送信、判定が可能かをテストしてみます。

作ったのはこんなデータ

移転の案内ですね。一応FAXで送られる可能性が有り、複数回くることが無いデータですがこちらは正しく判定できるのか・・・

問題なし!!これをいると判断したのは結構すごい。会社名が入っているのと、「いらない」の要素が少ないことから判断されたのでしょうか。

これで判定を信頼してデータを確認できそうです。