機械学習のハンズオンやるならGoogle Colaboratoryでしょ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106459/7920eb65-7443-2f86-3c24-e8da30e48918.png)

# はじめに
* 先日、機械学習のハンズオンをやりました。
* 以前から感じてたのが、ハンズオンって結構大変。
* プレゼンの時間は食うし、環境構築とか大変だし、前提知識が必要だったり、非エンジニアがいたり結構ハードルが高い。

* 機械学習ならなおさら、その**敷居は高い**気がします。

* でも、せっかくだから聞いている方みんなに機械学習を体験してほしい。
で、考えたのが[Colaboratory](https://colab.research.google.com/notebooks/gpu.ipynb)でやる方法です！

# Colaboratoryとは
* Googleが提供しているブラウザでpythonの実行できるツールです！
* pythonをやっている方はご存知、jupyter notebookと非常に似た環境をGoogleアカウントを持っていれば、利用することができます！

# Colaboratoryが解消してくれること
## 1. 環境構築不要
* 通常、機械学習やるってなるとpythonをインストールして、pipで。。。
* 非エンジニアにとってCUI使うとか論外でしょ。

ColaboratoryならGoogleアカウント持っていれば、スプレッドシートを開くかのごとく利用できます！

## 2. ファイル共有
* 画像やモデルなどファイルを共有するってなったときにエンジニアならGitからcloneすればとなりますが、Git使ったことないっていう方もいるはず。
* Colaboratoryなら、Google Driveでファイル共有できます。受け渡し簡単。

## 3. 慣れたインターフェィス
* はじめて使うツールだと、動かし方がうーん。って迷ってつい違う操作とかしてしまいがちですが、
ColaboratoryならGoogleの他サービスに近いから安心！

# 実際にやってみた
* 写真から顔を判定するハンズオンを実施しました！

## ファルダ構成

```
マイドライブ
 ┗ ml_hands-on
　　 ┣ face_detect.py
  ┣ data
  ┃　　　 ┗　sample.jpg
  ┗　cascade
     ┗ haarcascade_frontalface_alt.xml
```

[Google Colabの知っておくべき使い方 – Google Colaboratoryのメリット・デメリットや基本操作のまとめ](https://www.codexa.net/how-to-use-google-colaboratory/)

## Google認証
* Google　Driveにあるファイルを読み込むには、認証する必要があります。
* pythonではなく、shellで書かれています。

```　face_detect.ipynb
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
```

## ファイルが取得できるか確認

```face_detect.ipynb
!mkdir -p drive
!google-drive-ocamlfuse drive
!ls drive/ml_hands-on/data
```

## 顔認識の処理
* 今回は、本題ではないため、ここの説明は省略させていただきます。

```face_detect.ipynb
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

ml_dir=''

# cascadeファイルの取得元
# 
 https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

cascade_file = "drive/ml_hands-on/cascade/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_file)

img1 = cv2.imread("drive/ml_hands-on/data/sample.jpg")

def detect_face(img):

  img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))

  if len(face_list) == 0:
      print("失敗")
      quit()

  #　判定した結果、顔だった場合、
  for(x, y, w, h) in  face_list:
      print("顔の座標=", x, y, w, h)
      red = (0, 0, 255)      
      cv2.rectangle(img, (x, y), (x+w, y+h), red, thickness=4)

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

if __name__ == '__main__':
  detect_face(img1)
```

# 課題
## ファイルの共有方法

* 1. ファイル共有
* 2. ファイルダウンロード
* 3. ファイルアップロード
* 4. ファイル開く
 
<img src="https://qiita-image-store.s3.amazonaws.com/0/106459/5336e312-0b3a-8315-a951-af21e3573ae8.png" width="280px"><img src="https://qiita-image-store.s3.amazonaws.com/0/106459/b031e1cf-7edd-4374-c3e5-3365c49a54f7.png" width="280px">


* google driveの仕様上。共有したファイルをコピーすることができません。
* つまり、ファイルを共有すると同時編集になってしまいます。
* それぞれ動かしてもらいたいので、私の場合はダウンロードしてもらい再度アップロードしてもらいました。（イケてない。。。）

# まとめ
* エンジニアも非エンジニアの方も割と簡単に使えて、滞りなくLTを進めることができました！
* ハンズオンだけではなく、ちょっとしたデータを表示したり、図解するのも便利なので、使ってみてください！

* ちなみにエクセルとかでコピーした内容を表示することもできます。

```read_clipboard.py
import pandas as pd
pd.read_clipboard(header=None)
```