【10行でAI】機械学習・Docker・Python、全部触ったことないけど一度に触ってみる

# 機械学習、やってみた～い
機械学習を使って色々やってみたいことはあるけれど、何から手を付けていいかわからないところに  
[【Python】たった10行のコードで動かせる、物体検出のAIプログラムをマネして作ってみた。](https://punhundon-lifeshift.com/object_detection_python)  
ちょうど良い教材が。  
  
簡単そうだしとりあえず手を動かして遊んでみた。  
こんな画像も車やら人やら検出してくれるらしい…
ほぉ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/e276dff6-ea5a-dc9e-4424-1525eeb54f66.png)

  
ちょこちょこ躓いたのでとりあえず動かすための手引として参考にしてもらえれば幸いです。  
ちなみに私はwindows10 homeで動かしました。  
  
# 環境構築
上記記事では仮想環境としてAnacondaを使っていますが今回はDockerを使ってみます。  
使ったことなかったのでついでに触ってみようという算段です。  
  
## Dockerインストール
Dockerのインストールまではこちらを参考にしました。
[Windows 10 HomeへのDocker Desktop (ver 3.0.0) インストールが何事もなく簡単にできるようになっていた (2020.12時点)](https://qiita.com/zaki-lknr/items/db99909ba1eb27803456) 
 
1. Dockerをインストーラーをダウンロード  
[Docker公式-Docker Desktop](https://docs.docker.com/docker-for-windows/)からインストーラーをダウンロード。
私はwindows homeでしたのでHyper-vの設定は特にしていません。
dockerイメージの選択を迫られますが今回は最新のbusterにしました。
>結局どれにすればいいの？
>・十分なテストをする余裕がなく、環境を素早く立ち上げなければいけない場合、stretch, buster, jessie, bullseyeあたりを適当に選ぶ
[Dockerイメージ alpine,slim,stretch,buster,jessie等の違いと使い分け](https://www.ted027.com/post/docker-debian-difference/)
      
2. 再起動
インストール完了後「Close and restart」ボタンでwindowsを再起動します。  

3. Linuxカーネルのアップデート 
「WSL2 installation is incomplete」というダイアログが出てLinuxカーネルのアップデートを求められます。
ここではまだRestartボタンを押さずにダイアログ内のリンクに飛んでLinuxカーネル更新パッケージをダウンロードして実行します。
なにやらディストリビューションを選べなどと言われますが無視。実行が終わったら「WSL2 installation is incomplete」のRestartを押します。
無事インストール完了。  

4. dockerコマンドの確認
下記コマンドで怒られなければok

```
$ docker version
$ docker-compose -version
```

Windowsがproの場合Hyper-Vを有効にしなければならないそうです。
ここまででdocker導入完了。次はPython環境を整える。
## Python3.7用のコンテナ作成    
python環境構築はこちらの記事を参考にしました。 
[Docker for WindowsでPython3環境を簡単構築](https://kawadev.net/docker-windows-python3/)    
  
1. docker-compose.ymlを作成
まずコンテナの定義を書くファイルdocker-compose.ymlを作成する。  
複数のdockerコンテナを組み合わせる場合に作成するため、作らないでもよいのですが  
とりあえず手引通りにすすめる。  
  
>まずは作業フォルダを作成し、docker-compose.ymlファイルを作成します。
>作業フォルダ→ C:\develop\docker\python\
>このフォルダにdocker-compose.ymlファイルを作成します。
  
手作業で作る。

```
$ touch C:\develop\docker\python\docker-compose.yml
```

docker-compose.ymlの中は下記を記述。
  
```
version: '3'
services:
  python:
    image: python:3.7
    container_name: python_dev
    tty: true
```
  

2. コンテナ起動！

```
$ cd C:\develop\docker\python\
//イメージの作成・起動
$ docker-compose up -d
```
>docker-compose up コマンドは個々のコンテナの出力をまとめます。 
[Docker Compose コマンドリファレンス](https://docs.docker.jp/compose/reference/up.html)  
  
だそうです。  
    
>docker execでコンテナに接続してみます。

```
//python_devというコンテナ内に新しいbashセッションを作成
$ docker exec -it python_dev bash
```
リンク先ではbin/bash とありましたがno such file or directoryと言われるので上記で実行。  
  
これでコンテナ側のLinuxに入れました。  
  
[Docker Engine リファレンス](https://docs.docker.jp/engine/reference/commandline/exec.html)  
  
3. Vimを入れとく  
任意ですが、あると便利なのでVimを入れておきます。  

```
$ apt-get update
$ apt-get install -y vim
```
  
4. PythonでHello Worldしとく   

```
$ touch hello.py
$ vim hello.py
```

##### hello.py

```
print("Hello World!")
```

```
$ python hello.py
Hello World!
```

やったね！  
  
## 10行AIを作る   
ようやく本題です。  
[2. 必要なライブラリをインストールする](https://punhundon-lifeshift.com/object_detection_python)から再開します。  
  
1. ライブラリ・機械学習モデルをインストール  
pipでインストール。  

```
$ pip install tensorflow==1.13.1
$ pip install numpy==1.16.1
$ pip install scipy
$ pip install opencv-python
$ pip install pillow
$ pip install matplotlib
$ pip install keras==2.2.4
$ pip install h5py==2.10.0
```
keras2.2.4を入れるとh5py3.1.0がインストールされてしまうのでh5pyは2.10.0を指定。  
  
更に…  
>元になるPythonのバージョンによっては、OpenCVの前提パッケージをインストールしていなくて、以下のようなエラーが生じます。
>そんな時は、エラー内容に示されているように必要パッケージをインストールしましょう。
[DockerでOpenCVの環境を作る](https://dendenblog.xyz/opencv-dockerfile/)    
とのこと。入れる。  
```
$ apt-get install -y libgl1-mesa-dev
```
そしてimageAiというライブラリも入れる。  
```
pip install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl
```
おーけ。  
  
最後に機械学習モデルも入れる。  
```
//モデルを入れるディレクトリ。今後画像データやpythonデータもここに入れる。
$ mkdir modelDir
$ cd modelDir
$ curl -OL https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
```
マウスでぽちぽちやりたい人は[こちら](https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5)から。  
  
2. pythonファイルを作る  
まずはファイルを作る。  
```
$ touch FirstDetection.py
```
  
10行コピペ。何行だろうとかわらないのですがね。  
私はここで生まれて初めてpython構文を（なんとなく）見た。見ただけ。  
  
お好きなエディタでどうぞ。  
Vimで開けばすぐですね。  
  
##### FirstDetection.py  
```
from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))

for eachObject in detections:
    print(eachObject["name"] , " : " , eachObject["percentage_probability"] )
```
  
3. 画像データの保存  
Google画像検索で「横断歩道　車」と検索し、右クリックメニューから「画像アドレスをコピー」  
  
画像データのファイル名は必ず「image.jpg」とする。  
```
// -o(小文字)で名前を付けて保存できる。
curl -L -o image.jpg <コピーした画像アドレス>
```
  
さあ準備は整った！  
  
4. 実行！  

```
$ python FirstDetection.py
```
`ls`コマンドで見るとディレクトリ内に`imagenew.jpg`というファイルが生成される。
これで完了。
  
ただdockerコンテナにはGUIがないので今回はローカルにコピーして確認した。  
dockerを抜けた状態でdockerプロセスIDを確認。ローカルのデスクトップにコピーする。  
```
(ZZで抜ける）
//コンテナのpsIDを確認する
$ docker ps
$ docker cp コンテナID:/modelDir/imagenew.jpg ~/Desktop/
```
[Dockerコンテナ上のファイルをローカルにコピーする](https://itneko.com/docker-local-copy/)    
  
実行できた！検出できてる～  
![imagenew.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/e6cd156f-5670-926c-80e0-d9647b65158c.jpeg)

# まとめ
お手軽ハンズオンの機械学習記事は多いので遊ぶだけでも楽しいですねー。  
  
pythonはライブラリも日本語記事も多いのでエラーが出ても比較的脳死で解決していけたのも良かったです。  
  
私は今まで機械学習はおろかpythonすら触ったことなく、なんとなくハードルがあったのですが取り払えてよかったです。  
  
それでは。