データサイエンス&サイバーセキュリティ備忘録

Python, Data Science, Kaggle, Cyber Security, CTF, などなど

AIオンラインLT#0全員リモート!?トライアル開催に参加しました

2020年4月16日、Deep Learning Labが主催したAIオンラインLT#0全員リモート!?トライアル開催というイベントに参加しました。

dllab.connpass.com

このイベントはタイトルにもある通り、オンライン(Microsoft Teams)での開催でした。

参加人数は100人以上で、LTのイベントとしては大規模なオンラインイベントかと思いますが、スムーズに進行していて普段のLTと特に変わりなかったです。

また、このイベントのコンセプトは"家にいよう"であり、新型コロナウイルスに感染していても無症状であるため、気付かずに外出して自分が感染源になってしまうことを防ぐ目的で、主催者の方々もオンラインで集まるというイベントでした。

イベントの会場でだけでなく、会場に向かうときに使用する電車などの公共交通機関でも感染のリスクがあるため、とても良い取り組みだと思います。

聞いていて内容が面白かったので、このイベントのLTを発表者ごとに内容をまとめたいと思います。

林 昌弘 さん (ノバシステム株式会社)

タイトル

あるSIerのAI取組報告

内容
  • AIで何かやれと言われても、上層部を納得/理解させないといけない
  • いざ、案件でAIを使用しようとしても...

   1. 課題(目的、データ)がない
   2. データがあるとしても、自由に使えない
   3. 課題を仮定しても、解決したいことが曖昧
   4. BtoBなので、お客さんごとに課題とデータのフォーマットが違う
   5. データ分析に詳しい人がいない

  • やってきたこと

 1. 社内業務改善
   オフィス受付の自動化
    ・はじめはPepperが受付⇒Webアプリ化
    ・顔検知、音声案内ができる
   ドアセキュリティ
    ・入退室の解錠デバイスを顔認証に切り替えるために作成中
 2. 社内案件への活用
   社内パッケージのデータを活用
    ・飲食店向けパッケージには、注文データが蓄積されている
    ・店舗ごとにデータの質が違うが、それを活かして店舗ごとの解析はできそう
    ・データ分析用にデータを蓄積していないので、必要な情報が欠落している
 3. 社内教育
   データサイエンティストの育成
    ・自社のノウハウを教材としてアウトプット
    ・AIやデータ解析が分かる人を増やす

www.slideshare.net

スマホで見ている方はこちらからどうぞ↓
https://www.slideshare.net/MasahiroHayashi6/sierai-232143086?ref=https://dllab.connpass.com/event/173273/presentation/

増井 隆治さん (株式会社HACARUS)

タイトル

Deep Learningとスパースモデリング

内容

  ・Deep Learning機械学習で学習しているもの = 関数
  ・予測値をどのように求めるかをデータから学習している

  ・スパース=少ない、疎という意味
  ・どのような要因によって得られたかを求める

  ・Lassoによる特徴量選択
  ・MRIの高速撮影高精細化
  ・ブラックホール撮像での応用

  ・レントゲン撮像で本当に骨の部分だけを写す

  ・VAE(Variational Autoencoder)のlatent codeをスパースにすることで、
   解釈性が高く再利用のしやすいlatent codeになる
  ・過学習を防ぐことができる
  ・latent codeは、データの一部が変化しても変化した箇所以外の値は
   変わらないというように、人間のような解釈をすることができる

speakerdeck.com

スマホで見ている方はこちらからどうぞ↓
https://speakerdeck.com/hacarus/deep-learning-and-sparse-modelling

女部田 啓太さん (日本マイクロソフト株式会社)

タイトル

Data Drift によるモデル管理

内容
  • 時間が経つにつれ、機械学習の精度がどんどん低くなる

  理由:
   新しいデータに追従できていない
  ⇒モデルの再構築が必要

  • データドリフト = モデルにインプットするデータの変化 *1
  • 運用中のモデル精度が分からないとき、データドリフトを見る
  • データドリフトが発生するとき

   1. データ計測方法の変更
   2. データ品質の劣化
   3. 季節性などの自然な変化
   4. 設備の劣化、嗜好の変化

  • Azure Machine Learningでデータドリフトをチェックできる

  Azure Machine Learningとは...
   ・Python やRのコードを複数種類の環境で書ける
   ・scikit-learnやTensorFlow、Pytorchなどのライブラリが揃っている

  • Azure Machine LearningでのData Driftの仕組み

   1. 学習データと推論データを調べて、ドリフト検知
   2. 検知したら、可視化してアラートを出す
   3. 使用者がデータを見て、自分でモデルを改修して精度を上げる

  • データドリフトの大きさや、特徴量ごとのドリフトへの影響を確認することができる

www.slideshare.net

スマホで見ている方はこちらからどうぞ↓
https://www.slideshare.net/keitaonabuta/datadrift-in-azure-machine-learning

まとめ

今回のLTでは、AIに関する業務の取り組みや手法、特徴量の変化の確認とモデルの管理方法を学びました。

実務に活かせそうな内容ばかりだったので、非常に為になりました。

PythonでPDFの表を読み込み、ExcelまたはCSVファイルで出力する

きっかけ

Tableauの使い方をマスターするために、埼玉県の公式サイトからデータを持ってきてデータ接続をしようとしました。

a7xche.hatenablog.com


公表されているデータを、てっきりCSVファイルでダウンロードできると思っていましたが、ファイルがPDF形式。

表記ゆれを発見した上に、データの表が複数ページにまたがっていたので、Pythonで結合させて前処理をする必要がありました。

しかし、CSVファイルやExcelファイルを読み込んだことはありましたが、PDFファイルを読み込んだことは一度もありませんでした。

read_pdfなんてあるのかな、と思っているそこのあなた!

このブログで明らかになります。

使用するライブラリ

PDFファイルを読み込む方法を調べてみると、tabula-pyというライブラリを見つけました。

tabula-py.readthedocs.io

サイトにも書いてある通り、PDFにある表をpandasのDataFrameに変換し、CSVファイルやJSONファイルなどで出力できる優れものです。

公式サイトには書いてありませんが、Excelファイルの出力も可能です。(実証済み)

また、Google Colabで試したい方向けにNotebookが用意されています。

今回は、ローカルのJupyter Notebookでtabula-pyを使用したい方向けに、インストール方法、コードの書き方、エラーが起きたときの設定方法を紹介します。

インストール方法

Anaconda Promptを開き、以下のコマンドを入力します。

pip install tabula-py 

これでインストールは完了です。

コードの書き方

最初に必要なライブラリを読み込み、read_pdfで読み込みます。
引数で、読み込みたいページ数が設定できます。

from tabula import read_pdf

# pageという引数がallなので全てのページが読み込まれる
df  = read_pdf("sample.pdf", page="all")

# この場合は、1~2ページ目と4ページ目が読み込まれる
df1 = read_pdf("sample.pdf", page="1-2,4")

自動的に表の部分を読み込んでくれるらしいので、基本的にはページを指定するだけで十分かと思います。

公式ドキュメントを読んでいて、他に便利そうと思った引数があるので紹介します。

どのファイルでもそうですが、重要な情報が入っているPDFファイルには、開くときにパスワードを入力する必要な場合もあるかと思います。

その時に使える引数として、passwordという引数があります。

使い方は、以下の通りです。

from tabula import read_pdf

# PDFを開くときに、abcdというパスワードが必要な時は以下で設定
# パスワードを直接入力するので、コードを他人に見せないように注意!
df  = read_pdf("sample.pdf", page="all", password="abcd")

パスワードつきのPDFをPythonで読み込んだことはないので、機会があればこの引数を使用してみたいです。

DataFrame型で読み込んだ後は、いつも通りPythonでいろいろいじることができます。

もちろん、ファイル出力をするときの to_csv や to_excel も問題なくできます。

read_pdf()でエラーが起きたときの設定方法 (Windows版)

ここからは、read_pdf()で以下のエラーが起きたときの対処法を紹介します。

`java` command is not found from this Python process. Please ensure Java is installed and PATH is set for `java`

そもそも、このライブラリはtabula-javaというJavaのライブラリをPythonでラッパーしたものです。

なので、パソコンの設定でJavaをインストールしないと使えないというわけです。

Javaが入っていない方は、以下のサイトからインストーラーをダウンロードできます。

www.java.com

ダウンロードが完了したらインストールし、Javaのパスの設定をします。

ここから先の設定方法は、Windows向けです。

Macのパソコンは持っていなくて、やり方が分からないです...

まず、インストールしたJavaがちゃんと入っているかを確認します。

Windows 10の場合、C:\Program Files\Java にあるとのことです。

ちなみに私のパソコン(Surface Pro)は、C:\Program Files (x86)\Java にありました。

このJavaのフォルダの中に、Javaのバージョンが記載されているフォルダ名があると思います。

その中に、bin というフォルダがあることを確認し、binのフォルダを含めたファイルパスをコピーします。

以下は見本なので、自分の環境のパスをコピーしてください。

C:\Program Files (x86)\Java\jre1.8.0_241\bin

コピーしたら、次にJavaのパスの設定です。

まず、コントロールパネルを開き、以下のパスまで進みます。

コントロール パネル\システムとセキュリティ\システム

システムまで進んだら、ウインドウの左側に4つ項目があるかと思います。

その中の1つの、システムの詳細設定をクリックします。

クリックすると、別ウインドウでシステムのプロパティが設定できます。

開いたら、環境変数のボタンをクリックし、別ウインドウで環境変数を設定することができます。

開かれたウインドウの下半分がシステム環境変数用の設定画面であり、その中の Path (またはPATH) という変数を選択します。

選択したら、編集ボタンをクリックし、パスを追加するために新規をクリックします。

クリックしたらパスが入力できるようになるので、そこに先ほどコピーした binまでのファイルパスを貼り付けます。

貼り付けたら、OKをクリックしてウインドウを閉じ、その後もOKをクリックします。

これで、Javaのパスの設定は完了です!

設定した後は、一度パソコンを再起動させ、Jupyter Notebookを開くとread_pdf()が使えるようになります。

以上、エラーの対処法の説明です。

Macユーザーの方も、Javaのパスが設定できれば使えるかと思います。

感想

PDFにある表を読み込む機会は、個人的にはほどんどないかもしれませんが、知っていて損はないライブラリだと思います。

パスの設定はちょっとめんどくさいですが、一度設定すれば基本的に設定をいじることがないかと思います。

あと、読み込んだファイルが前処理しやすいかはPDFファイル次第です笑

私がダウンロードした埼玉県の新型コロナウイルスの陽性確認者数の表は、複数ページにわたっていたので、ページごとにデータフレームが分かれてしまっていて(しかも何故かlist型だった)大変でした笑

Tableauで埼玉県におけるCOVID-19の陽性確認者のデータを可視化をしてみた(4/7/2020 9:40 pm 時点 公表データ)

はじめに

タイトルにある通り、埼玉県における新型コロナウイルスの陽性確認者のデータを可視化しました。

半年くらい前に会社でTableauのセミナーを受講したのですが、最近触っていませんでした。

Tableauは大量のデータを可視化するのに便利なツールなので、使いこなせるようになりたいと思い、この機会に新型コロナウイルスに関するデータを使用して練習、かつ、何か役に立ちたいと考えました。

なぜ、埼玉県のデータ?

ブログ筆者が埼玉県民だからです!

よく、ニュースでは東京都の感染者の情報は聞きますが、埼玉県の感染者についての情報はあまり聞きません。

東京に隣接しており、職場は東京だけど住んでいるのは埼玉という方も多いと思うので(ちなみに私がそうです)、埼玉県の感染者もそれなりにいるのでは、と思います。

全埼玉県民のためにも(?)、2020年4月7日 21時40分 時点で公表されている陽性確認者のデータを可視化しました。

今回使用したデータ

使用したデータは、埼玉県の公式サイトにある、陽性確認者一覧というPDF形式のデータです。

PDFファイルは、陽性確認者が増加するたびに更新されるため、ファイルがあるサイトのURLを貼ります。

www.pref.saitama.lg.jp

データは、陽性確認者というサブタイトルのところに置いてあります。

データの前処理

PDFファイルをダウンロードした後は、Pythonで前処理をしました。

正直、Tableauでの可視化より大変でした...

今回は、Tableauがメインの記事なので、前処理の方法は別の記事で書きます。(今週中には書きます、読んでね)

データを読み込んだあとは表記ゆれを統一するだけで、データ自体はもちろんいじっていません。

Tableauでの可視化

Tableau Publicを使用したので、データはTableauのサイトにあります。

https://public.tableau.com/profile/maho.uchida#!/vizhome/COVID-19inSaitamaApr_72020/sheet3 *1

各グラフのタイトルにある通り、市町村別、日別陽性確認者数、性別×年代別で可視化しています。

グラフにカーソルを合わせると、詳しい数値を確認することができるのでとても便利です。

例えば、日別陽性確認者数のグラフで2020年4月5日の棒グラフ(または折れ線グラフ)にカーソルを合わせると、その日の陽性確認者数とその時点での累計陽性確認者数を見ることができます。

また、市町村別の陽性確認者数は地図で可視化しているため、一目でどの市にどのくらいの感染者がいるかが分かります。

使い方

Tableauの使い方は非常に簡単です。

今回は、Tableauのインストール、データの接続方法、グラフの表示を簡単にまとめます。

最初に、以下のサイトでメールアドレスを入れてTableau Publicをインストールします。

public.tableau.com

インストールが完了したらアプリケーションを開いて、左側にある"接続"という欄から接続(可視化)したいデータを選択します。

CSVファイルに接続したい場合は、テキストファイルを選びます。

データを選択した後は、各列のデータ型を確認し、必要に応じて列名を書き換えることができます。

データが整ったら、ワークシートに移動し、ワークシート上部にある行・列に、左側にあるディメンションまたはメジャーを入れるとグラフの作成ができます。

グラフの種類を変えたい場合は、右上の表示形式から変更することが可能ですが、変更する前に可視化するための条件に当てはまらないと変更できないようなので注意が必要です。

Tableauの使い方の説明は以上です。

公式サイトの説明は分かりやすく、今回のデータを可視化したときも参考にしたのでおすすめです。

感想

やはり、Tableauは便利だな、というのが正直な感想です。

Pythonではゴリゴリにコードを書かないと表示できないものが、サクサクと短時間で作成できます。

Tableau Publicなら無料で使用できるので、KaggleのデータなどでTableauの使い方をマスターすることもできます。

まだまだTableau初心者なので、これからも勉強します!

*1:追記(2020/9/13): データが古いため、2020/9/13に作成したものを紹介しますpublic.tableau.com

Linuxの便利コマンド、screenコマンドを使ってみた

会社の先輩から教えてもらったscreenコマンドが便利で、リモートワークをするときにとても役立つので、自分のメモとしてまとめます。

screenコマンドの役割と使い方は後述しますが、使ったことがない&初めて知った方はぜひ使ってみてください!

使うようになったきっかけ

新型コロナウイルスが流行し、3月上旬からリモートワークが始まるようになりました。

今まではローカル(Windows)でコードを動かしていたのですが、データに関するセキュリティの観点から、仮想環境(Linux)でコードを動かすことに。

仮想環境を立ち上げると同時に会社のSSHに接続するため(というより接続しないと動かせない)、コードを実行したあとに突然ネットワークの不調でSSHの接続が切れてしまうとなると、コードの実行も止まってしまいます。

業務ではなかなか処理が重いコードを動かしているため、一度接続が切れてしまうとやり直しをするのにも時間がかかっていました。

先週、定時近くにコードを動かしてしまい、SSHが切れないように業務用のノートパソコンの電源をつけっぱなしにしてもいいか会社の先輩に聞いたところ、Linuxのscreenコマンドを教えてもらいました。

screenコマンドとは

screenコマンドを使用すると、以下のことができます。

  • シェルのセッションを保存できる
  • 1つのSSHセッションで、複数のシェルウィンドウが開ける
  • ネットワークが切断しても、シェルは動かしたままにできる
  • シェルのセッションをアクティブにし続けていなくても、実行時間が長いプロセスを行うことができる

つまり、screenコマンドを使用してセッションを保存すれば、パソコンの電源を消してもコードを回すことができます。

また、SSHが突然切断してしまってもscreenセッション内で動かしていれば、プログラムの実行が中断されるようなことがなくなります。

後述するインストール方法と使い方では、Linuxのターミナルで動かすコマンドをまとめます。

インストール方法

会社用の仮想環境では既にインストール済み&勝手にいじってもダメなので、自分の仮想環境(Ubuntu)で試してみました。

このコマンドは、Debianでインストールをするときも同様のようです。

$apt install screen

同じLinuxでも、CentOSの場合は以下のコマンドでインストールするようです。

$yum install screen

これで、インストールは完了です。

使い方

インストール方法ではOSによって使用するコマンドが違いましたが、使い方で紹介するコマンドはUbuntuDebianCentOS全て共通です。

念のため言っておきますが、スクショの画像は自分のパソコン内の仮想環境のものです!笑

SSHに接続するときは普段通りにSSHコマンドを使用して、screenコマンドを使う前に接続しておきます。

ターミナルを立ち上げて準備ができたら、まず最初に新しいscreenセッションを作成します。

$screen

上記のコマンドを入力してもターミナルに何も変化がないように見えるかもしれませんが、既に新しいscreenセッションの中にいます。

この状態をAttachedといいます。

この状態で普段通りにpythonファイルを実行すると、screenセッション内でプログラムが実行されます。

実行したあとは、Ctrl + a を押し(この時点では画面は何も変わらないです)、dを入力すると以下の画像のように英文(detached from ~)が出てきます。

f:id:a7xche:20200317002230p:plain

この英文が出てきたら、screenセッションから離れた状態になったことを表しています。

この状態をDetachedといいます。

Detachedになったら、SSHを切断したりパソコンの電源を消しても、screenセッション内でプログラムが実行し続けます。

作成したscreenセッションがどのような状態か確認したい場合は、以下のコマンドを入力します。

$screen -ls

すると、以下のような画像の文字が出力されます。

f:id:a7xche:20200316004013p:plain

画僧の中にある、1800.pts-0.kali や 1765.pts-0.kali は、セッションIDです。

セッションIDは、screenコマンドで新しく作成した分だけ表示されます。

各セッションIDの横にある、(Attached) や (Detached) は、セッションの状態を表しています。

Detachedの状態のものをAttachedにしたい場合、以下のコマンドを入力します。

$screen -r {セッションID}

このコマンドを入力すると、選択したscreenセッションに再び入ることができます。

以上が基本的なscreenコマンドの使い方です。

使ってみての感想

SSHの接続が切れてしまっても、screenセッション内で動かしていれば問題ないのがとても助かります。

このコマンドを知ってから、万が一SSHの接続が切れても大丈夫なように、毎回screenセッション内でコードを回しています。

リモートワークにおいて重宝するコマンドなので、皆さんもぜひ。

第2回 データアーキテクト(データ整備人)を”前向きに”考える会に参加しました

2020年2月6日、株式会社エウレカで第2回 データアーキテクト(データ整備人)を”前向きに”考える会というイベントに参加しました。

analytics-and-intelligence.connpass.com

この会は、データ抽出・加工・整備を行うデータアーキテクトと呼ばれるポジションのスキルやノウハウについて発表者が話してみんなで考える会です。

現在、私はデータサイエンティストとして働いていますがデータの抽出や集計も業務の一部として行っているため、とても興味深くてぜひ参加したいと思い、応募しました。

この会は非常に人気なため、抽選でしたが当選したので参加することができました。

実際にお話を聞いてみて、共感したところや勉強になったことが多かったので、発表者ごとに内容をまとめたいと思います。

しんゆう さん

タイトル

抽出や集計の依頼を受ける時に気を付けていること

内容
  • データ抽出を行うときは、

   1. 依頼内容をしっかり聞き、
   2. 具体的な納期を依頼者から確認し、
   3. 依頼内容とデータを鵜呑みにしない

  • データ抽出の目的は、データを使ってやりたいことを実現すること
  • データ抽出の依頼を受けて本当に求められているのが、データ・分析・提案のどれなのか確認する
  • データ抽出の依頼を受けたとき、"やっぱりこのデータも欲しい"というのを見越しておく
  • データ自体の納期確認だけでなく、依頼者がいつまでに何が知りたいのかも聞く

speakerdeck.com

スマホで見ている方はこちらからどうぞ↓
https://speakerdeck.com/shinu/maemuki-data-seibinin02

mida さん

タイトル

データエンジニアとデータアナリストを兼任して良かったこと

内容
  • データの流れは、データソース⇒分析基盤⇒集計・分析⇒意思決定
  • 分析要求の流れは、意思決定⇒集計・分析⇒分析基盤⇒データソース
  • データエンジニアが担当するのは、データソースを分析基盤に落とすこと
  • データアナリストが担当するのは、データの集計と分析を行って意思決定をすること
  • データエンジニアとデータアナリストの前提知識が違うため齟齬が発生しやすく、作業のタイムロスが発生してしまう
  • データエンジニアとデータアナリストを兼任していると、データを把握しているから、分析をするためのデータ加工や追加のデータ抽出などをスムーズに行うことができる
  • チームで作業している場合、メンバーに対してデータの意味や分析の情報を同時に提供できる

www.slideshare.net

sotaron さん

タイトル

データの価値を失わないためのData Reliability Engineeringについて

内容
  • データ整備も大事だが、正確な分析をするためにはデータ自体の品質や信頼性(= Reliability)も大事
  • Data Reliability Engineering(DRE)の定義はどこかの機関が定めたわけではない
  • sotaronさんにとってDREとは、以下を保つこと

   1. データの完全性
   2. データの一貫性
   3. データの新鮮さ
   4. データの可用性

  • DREは、正しい意思決定をするために必要
  • DREをするには、最初にサービスレベルの設計をして、開発・改善・モニタリングを繰り返す

speakerdeck.com

スマホで見ている方はこちらからどうぞ↓
https://speakerdeck.com/tanakarian/detafalsejia-zhi-woshi-wanaitamefalsedata-reliability

ぶんけい さん

タイトル

意思決定に繋がる Intelligence とは

内容
  • 世の中のデータ量が増加しているのに対して、国内のIT人材はまだ不足しているのに関わらず、経営者や上司を納得させないと意味がない
  • 経営者や上司を納得させるには、+αの価値を提供できるようにする
  • データを集めても、意思決定ができないとそのデータの価値は無い
  • データを活用するためには、数値データと地図データといったような複数のデータを組み合わせ、誰が見てもすぐに言いたいことが分かるようにする(= Intelligence)
  • Intelligence = Insight + Intuition
  • ちょっとした工夫や作業でIntelligenceに

まとめ

この会では、各発表者からデータ抽出・加工だけでなく、データの運用や可視化のコツまで学ぶことができました。

今までデータアーキテクトについて深く考えずに業務をこなしてきたので、今回学んだことを活かしていきたいと思います。

ちなみに、connpassでは第3回 データアーキテクト(データ整備人)を”前向きに”考える会の参加者を募集しています。

人気のため抽選となっていますが、おすすめなのでぜひ。

私は次回も抽選枠で応募したので、また当たるのを願うばかりです、、、!

analytics-and-intelligence.connpass.com

Python + OpenCVの勉強会に参加しました

2020年1月26日、日本マイクロソフト株式会社でPyLadies Tokyoが主催するPython + OpenCVの勉強会に参加してきました。

PyLadiesとは、Pythonが好きな女性のためのコミュニティであり、全世界に各支部があるそうです。

日本には、東京・京都・沖縄の3つの支部があるとご紹介がありました。
今回は、東京支部のmeetupということで、OpenCVをマスターしてインスタグラムやSNOWのように画像を加工して遊ぶという内容でした。

今までOpenCVを使用したことがありませんでしたが、基礎から丁寧に説明してくださったので非常に分かりやすかったです。

OpenCVとは何か、どのようにJupyter Notebook上でPythonコードを書くかを簡単にですがまとめたいと思います。

OpenCVとは

画像処理(色、サイズの編集や画像のnumpy/幾何学変換)や画像解析(特徴・物体検出)のためのオープンソースライブラリです。

加工した画像を、scikit-learnやKerasといった機械学習ライブラリと組み合わせることができ、人物検出などを行うことが可能です。

対応言語はPythonだけでなく、C++Javaも含まれているとのことです。

事前準備

OpenCVを使うためには、まずライブラリをインストールする必要があります。

私の場合は、Anaconda Promptを使用して以下のコマンドでインストールしました。

pip install opencv-python

ライブラリのインポート、ファイル読込みと表示

コードは以下の通りです。

# OpenCVのインポート
import cv2
# 読み込んだ画像を表示させるために必要
import matplotlib.pyplot as plt
# Jupyter Notebook上でインライン表示させる
%matplotlib inline


# 画像ファイルの読込
# "imgName.jpg"は読み込みたい画像のファイル名
img = cv2.imread("imgName.jpg")

# 色空間の変換 (注1)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 画像ファイルの表示
plt.imshow(img_rgb)
plt.show()

(注1) OpenCVはBGR空間(色の情報がBlue, Green, Redの順で保持)であるのに対し、matplotlibはRGB空間(Red, Green, Blue)なので変換が必要です。

変換せずに出力するとどうなるかは、ぜひ試してみてください。

グレースケール空間への変換

cv2.cvtColor()の関数を使用して他の色空間に変換することも可能です。

色空間は様々な種類がありますが、今回はグレースケール空間への変換の方法を紹介します。

画像をグレースケール空間に変換するということは、色の情報が必要のない処理において、色の情報を落とすことによってデータ量と処理を軽くするというメリットがあるとのことです。

上記のコードで読み込んだ画像(変数 img)をグレースケール空間へ変換して出力するコードは以下の通りです。

# 読み込んだ画像をモノクロにする
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# (注2)
plt.imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
plt.show()

(注2) 変数grayは既にモノクロだから色空間の変換が必要でないように見えますが、おそらくimshow()というBGR空間であるOpenCVの関数で表示させようとしているため、BGR空間からRGB空間に変換する必要があります。

ファイルの書き出し

OpenCVでファイルの書き出しを行うには、imwrite()という関数を使用します。

上記のコードでグレースケール空間に変換した画像を書きだそうと思います。

コードは以下の通りです。

# "gray.jpg"はファイル名、拡張子(.jpg)をつけ忘れない
cv2.imwrite("gray.jpg", gray)

これで、モノクロに変換した画像がgray.jpgというファイル名で保存されます。

その他の画像加工テクニック

この記事の先頭の方に書いた通り、今回はOpenCVでインスタグラムやSNOWのように画像を加工するというイベントでした。

なので、画像にフィルターをかけたような色変換をしたり、bit変換を行ってネガポジ反転させる方法も学びました。

それぞれのコードの書きかたは以下の通りです。

# カラーマップ変換
# applyColorMap()関数で他のカラーマップに変換
# 今回はCOLORMAP_INFERNOというカラーマップに変換
# カラーマップは今回教えていただいたものだけでも15種類もある
color_map = cv2.applyColorMap(img, cv2.COLORMAP_INFERNO) 

plt.imshow(cv2.cvtColor(color_map, cv2.COLOR_BGR2RGB))
plt.show()
# ネガポジ反転
# bitwise_not()関数で色の情報を反転
inversion = cv2.bitwise_not(img)

plt.imshow(cv2.cvtColor(inversion, cv2.COLOR_BGR2RGB))
plt.show()

機械学習用の画像加工テクニック

勉強会では、エッジ検出のコードの書き方も教えていただきました。

機械学習でエッジ検出を行う場合は前処理をしてからの方が良いとのことです。

エッジ検出のアルゴリズムはいくつかあるみたいで、今回はCanny(キャニー)法を学びました。

OpenCVのサイトに理論が記載されてますので、ご紹介します。

labs.eecs.tottori-u.ac.jp

以下がCanny法によるエッジ検出のコードになります。

# 0は最小閾値、80は最大閾値
# 閾値はCanny法検出内ので行われるヒステリシス式閾値処理に利用
# ヒステリシス式閾値処理については上記のサイトを参照
edge = cv2.Canny(img, 0, 80)

plt.imshow(cv2.cvtColor(edge, cv2.COLOR_BGR2RGB))
plt.show()

まとめ

今回はOpenCVで画像の読込み、書き出し、加工の仕方を学びました。

勉強会の趣旨の通り、OpenCVで画像を加工して遊ぶ目的で参加しました。

画像処理は難しそうというイメージを持っていましたが、一つ一つの処理は実は簡単であり、複数の処理を組み合わせで高度な処理ができることが分かりました。

エッジ検出に関してはKaggleの画像コンペで活かせそうな気がするので、今度使ってみたいと思います。

攻撃自動検知モデルを作成するワークショップに参加しました

2019年12月21日と22日の2日間、秋葉原SECCON 2019 Akihabaraが開催されています。

このイベントでは、サイバーセキュリティに関するカンファレンス、ワークショップ、展示が行われています。

また、SECCON CTF 2019と呼ばれるセキュリティの技術を競う大会が開かれていて、2日間にかけて国内大会と国際大会の決勝戦があります。

大会の様子は会場で直接見ることができ、決勝戦ということもあって参加者の皆さんは凄く集中して落ち着きながら問題を解いているようでした!

写真は、国際大会のランキング表です。

なんだかエヴァンゲリオンっぽい笑

f:id:a7xche:20191221221736j:plain

 

21日に、開催前から気になっていた、攻撃自動検知ワークショップに参加してきました!

Cyber Securityと機械学習の両方に興味がある私にとっては、夢のようなワークショップだったため、楽しみ過ぎて会場には一番乗りでした。

 概要

クロスサイトスクリプティングXSS)を突く攻撃(XSS文字列)を検知するモデルを作成し、運営が用意したデータに対して”正常・攻撃”の二値分類(0 or 1)をするというものです。

モデルのベースは運営が用意したものを使用し、特徴量エンジニアリングやハイパーパラメータのチューニングをして検知の精度を上げて競いました。

データ

train/test dataは、tsv形式のファイルです。

ファイルの中身は、HTMLのソースコードと攻撃ペイロードのコードを混ぜたもので、train dataには正常か攻撃かのラベルも列としてありました。

モデル作成

ファイルの中身がソースコード(文字列)であるため、前処理の仕方としては自然言語処理に近い印象でした。

運営が用意したモデルは2種類あり、ナイーブベイズ分類器と多層パーセプトロンです。

コードを変更せずに二値分類することも可能でしたが、精度を上げるために特徴量エンジニアリングやハイパーパラメータのチューニングをしました。

ちなみにですが、モデルの作成をするときはサイバーセキュリティの知識は全く必要なく、機械学習モデルを構築できるスキルの方が重要でした。

結果

私は、多層パーセプトロンのモデルを改良して検知の結果を提出しました。

モデルの精度はそこそこ高かったのですが、accuracyはサイバーセキュリティの観点からすると低いので、まだまだ改良する必要があります。

攻撃を検知するのも大事ですが誤検知を防ぐことも大事なので、accuracyの数値が高いことが求められるとのこと。

余談ですが、今回のワークショップでaccuracyが99%の方がいましたが、train dataで攻撃ラベルが付いているデータを目視で見分け、test dataの正解ラベルには手打ちで入力したそうです。

なので、モデル作成も大事ですが、自然言語処理においてもEDAの大切さを改めて感じました。

 

ワークショップでは、機械学習モデルがサイバーセキュリティの分野でどのように活用されているのかと同時に、機械学習のモデル精度がより高く求められることを知ることができました。

引き続き、作成したコードを改良して勉強したいと思います。