python

【機会学習】しずかちゃんのお風呂画像はエロいのか機械学習で検証してみた

しずか

おっす、おっす。
現役エンジニアのてぃーぽです。

 

さて、今回は巷を騒がしている機会学習を試してみました!

いぇーーーい!
ぱふぱふー!

 

今回のお題はタイトル通り…

「しずかちゃんのお風呂画像はエロいのか機械学習で検証する!」

です。

 

こちらが今回の被験者になります。

しずか

それでは検証していきましょう!!

 

開発環境

  • windows 10
  • Docker Quickstart Terminal
  • python:3.6
  • TensorFlow

 

事前知識

TensorFlow(テンソルフロー)とは、さまざまな機械学習の分野で使用するためのOSS(オープンソフトウェアライブラリ)です。
OSS(オープンソフトウェアライブラリ)とは、著作権を保持している作者のソースコードを学習や変更、配布することが可能なライブラリ(汎用性の高いプログラムをひとまとめにしたもの)となります。

TensorFlowは公式サイトによると、
データフローグラフを使用した数値計算用のオープンソフトウェアライブラリです。グラフのノードは数学的演算を表し、グラフのエッジはそれらの間で伝達される多次元データ配列(テンソル)を表す。 柔軟なアーキテクチャにより、1つのAPIを使用してデスクトップ、サーバー、またはモバイルデバイスの1つ以上のCPUまたはGPUに計算を展開できます。
と、説明されています。

機械学習について理解していないと、いまいちピンと来ないかもしれません。
そもそもTensor(テンソル)とは線形的な量を表す概念を一般化したもので、多次元の配列として表現できるものとなります。
そのため、”テンソル=多次元配列”と考えて良いでしょう。
より具体的に言えばTensorFlowは多次元のデータ構造を、流れるように処理することができる深層学習(ディープラーニング)を行えるライブラリとなります。
TensorFlowを始めるにあたり、機械学習や深層学習といった基礎知識は必要となります。

 

検証!

dokcerで環境を構築していきます。

 

// pythonの環境を作っちゃう!
$ docker pull python:3.6
// コンテナを作って中に入っちゃう!
$ docker run -it --name pytest python:3.6 /bin/bash
// tensorflowをインストールしちゃう!(homeに移動するのはお好みで)
$ cd /home
$ git clone https://github.com/tensorflow/tensorflow.git
$ wget https://github.com/tensorflow/hub/tree/master/examples/image_retraining
// vimをインストールしちゃう!(お好みで)
$ apt-get update
$ apt-get install vim
// Googleの画像収集ツールをインストールしちゃう!
$ pip install google_images_download
// エロ画像を収集する(小声)
$ googleimagesdownload -k エロ画像
// ero画像を移動
$ mv downloads

結果

Unfortunately all 100 could not be downloaded because some images were not downloadable. 98 is all we got for this search filter!
Errors: 2
Everything downloaded!
Total time taken: 31.08081817626953 Seconds

2件の失敗。

…Googleフィルターがあるだとっ!?

まぁ仕方ない。

コンテナ上でダウンロードしたのでどんな画像か確認するため、コンテナからローカルに画像をコピーします。(他意はありません)

もう1つDocker Quickstart Terminal を開いてそこで下記コマンドをたたく。

// 日本語フォルダ名を英語に変換する
$ mv エロ画像 ero
// 動いているコンテナを調べる
$ docker ps
// コンテナの画像をローカルに保存
$ docker cp 6fb3c08fb77d:/home/downloads python/

チェックして….

うむ! 問題なし!!

それでは機会学習を実行していきましょう!!

// retrain.pyが移動していてgit cloneできてなかったのでファイル単体でダウンロード
$ cd /home/tensorflow/tensorflow/examples/image_retraining
$ wget https://raw.githubusercontent.com/tensorflow/hub/1fa48fe991f22bebf4c8d4cd375eaf0daf5fa937/examples/image_retraining/retrain.py
// label_image.py を移動
$ mv home/tensorflow/tensorflow/examples/label_image/label_image.py home/tensorflow/tensorflow/examples/image_retraining
// label_image.pyの一部を書き換え
$ vim label_image.py
// label_image.py
input_layer = "Placeholder"
output_layer = "final_result"
// 学習!!
$ python retrain.py --bottleneck_dir=bottlenecks --how_many_training_steps=98 --model_dir=inception --summaries_dir=training_summaries/basic --output_graph=retrained_graph.pb --output_labels=retrained_labels.txt --image_dir=downloads
// こちらに書き換える例を出しておきます
$ python retrain.py --bottleneck_dir=bottlenecks --how_many_training_steps=学習データ数 --model_dir=inception --summaries_dir=training_summaries/basic --output_graph=retrained_graph.pb --output_labels=retrained_labels.txt --image_dir=画像ディレクトリ

結果

File "retrain.py", line 133, in <module>
import tensorflow_hub as hub
ModuleNotFoundError: No module named 'tensorflow_hub'
// モジュールがないと怒られたのでインストール
$ pip install tensorflow-hub

再度実行するも、振り分ける対象が一つだけだと検証できないらしい。

結果

tensorflow:Only one valid folder of images found at downloads - multiple classes are needed for classification
// 適当に画像をダウンロード
$ googleimagesdownload -k news

再度実行するも、ファイル名が長すぎて怒られる

結果

OSError: [Errno 36] File name too long: 'bottlenecks/ero/51. %e7%a7%81%e7%ab%8b%e3%83%91%e3%82%b3%e3%83%91%e3%82%b3%e5%a5%b3%e5%ad%90%e5%a4%a7%e5%ad%a6_%e9%95%b7%e8%b0%b7%e5%b7%9d%e7%94%b1%e9%a6%99_h%e3%82%ab%e3%83%83%e3%83%97_%e3%82%a8%e3%83%ad%e7%94%bb%e5%83%8f-300x225.jpg_https~tfhub.dev~google~imagenet~inception_v3~feature_vector~1.txt'

怒られたファイルの名前を変えて再実行!!

結果

---------------------------
news 0.67742705
ero 0.32257298
---------------------------

ニュースの要素:67.7%
エロい要素:32.2%

今回の実験でわかった結果…

「しずかちゃんのお風呂画像はエロくない!!!!」

ということがわかりました。

さすが、国民的な子供向けのアニメですね。

(今回はデータが少ないので結果としては微妙ですが、データ量があればもっと面白くできそうです。)

補足

これを作っていて思ったのはアプリで「この画像はエロいか判断器」とかでまぁまぁプチヒットできるんじゃね?

ってことです。

 

さぁ、みんなで機械学習やりましょう!

 

参考サイト

https://qiita.com/po3rin/items/45ba92e482efcf883325

https://qiita.com/karaimonoOitii/items/333098a74627e95c5350

公式: https://www.tensorflow.org/install/

画像収集:https://co.bsnws.net/article/295

 

:)