Lobeを使って癖のあるオライリー本を仕分ける

#みんな大好きオライリー本
オライリー本、有名ですよね。
エンジニアであれば少なくとも1回は手に取ったことがあるのではないでしょうか。

以下は20周年記念に発表された今まで出版した全書籍の表紙です。こんだけ並ぶと圧巻ですね。。
https://www.oreilly.co.jp/community/blog/2015/12/oreilly-japan-all-title-covers.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/1aa7327c-fbb7-2472-6e73-ea48f1cb1db8.png)

オライリー本とは学生の頃に初対面しましたが、表紙に書かれている癖のある謎生物のインパクトに圧倒された記憶があります。

試しにGoogle検索で「オライリー　表紙」と調べると、第3候補ワードに「気持ち悪い」があって、失礼ながらもみんな思うことは同じなんだなと笑ってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/24643df9-e5bf-9cc3-f882-3e568db315cf.png)

ただ、エンジニアを生業としている今となってはオライリー本は仕事をする上ではなくてはならず、勉強になることがとても多いので大変感謝しています。（大好きオライリー！）

そんな大好きなオライリー本を題材に何かできないかな・・・と思いついたのが今回の内容です。



#流行りのAIを使ってオライリー本を仕分ける
エンジニアであれば表紙を見ただけで「あ！オライリー本だ！」と結構すぐに分かると思いますが、一般の人はどうなんだろうか、さらには流行りのAIとやらで分かるか試してみたら面白そうとふと思いました。

オライリーの表紙は結構特徴もあるし、機械学習使えば仕分けることも出来そうと何となく思っていた時にLobeというツールを知りました。



# Lobeとは
Microsoftがベータ版として公開している**機械学習モデルの作成ツール**です。
機械学習に関する難しい前提知識など不要で無料で使えます。

https://lobe.ai/

現時点においてLobeで出来ることは**画像分類（Image classification）**で、公式サイトに記載されている例としては、撮影した写真から植物の名前を引き当てたり、写真に写っている人の表情を認識したりするようなことが出来ます。

他社にはなりますが、既に提供されているクラウドサービスで言うと、Google Cloudが提供している[Cloud AutoML Vision](https://cloud.google.com/vision/automl/docs)に似ている印象です。

学習に必要なデータ量が少なく、1ラベルにつき**最低限5枚**あれば学習出来てしまいます。

まさに、今回のような思い付きを手軽に試すには最適なツールだと言えます。
ということで、早速やってみました。



# Lobeを使ってみる
まずは手始めに、犬と猫の画像分類をやってみましょう。

## 利用するデータ
Kaggleのサイトにちょうどいいデータがあるので使います。膨大なデータ量ですが、実際に後で使うのはこの中のほんの一部のデータだけです。

https://www.kaggle.com/c/dogs-vs-cats/data


## インストール
LobeはWindowsやMac上で動作する**デスクトップアプリケーション**なのでインストールが必要です。
インストールが完了したらLobeを開きます。


## データ学習
以下のような画面が表示されたら、「New Project」をクリックしてプロジェクトを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/fca92286-54f9-7d08-130f-71096d7e9e30.png)

右上にある「Import」をクリックすると学習に利用するデータを読み込ませることが出来ます。
大量のデータを読み込む場合は「Dataset」を使ったほうが楽ですが、今回は**手軽に試す**というコンセプトなので、面倒ですが「Images」を選択して個別に画像を読み込んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/9f8694ee-56b7-7921-769b-f5533f668427.png)

先ほどKaggleからダウンロードしてきたフォルダ（dogs-vs-cats）内にある学習用画像ファイル（train配下）の中から犬、猫それぞれ5枚ずつ読み込んで、犬には「dog」猫には「cat」とラベルを付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/53e5afac-d80a-f996-c61f-ff5c95b340e8.png)

ラベルの付与がすべて完了すると自動的に学習（Train）が開始されます。左下に表示される学習の状況を見ると、今回は正解率100%で無事に学習が完了したようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/1593d6fa-d28e-1b40-0626-f9ca13acbd1f.png)


## モデル呼び出し
学習済みモデルを呼び出してみます。ちゃんと画像分類できるか実際に試してみましょう。
左にあるメニュー一覧から「Use」をクリックして、テストしたい画像をドラッグ＆ドロップしてみます。

試しに犬の画像でテストしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/4dae06e7-7566-021a-d050-f46cf27f2735.png)

正しく「dog」と認識されましたね。
念のため、猫の画像でもテストしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/310d3e1e-cc86-7fb4-c9e6-70f14628e087.png)
正しく「cat」と認識されました。

Lobeが問題なく使えそうなので、本題のオライリー本を仕分けてみます。



#いざオライリー本を仕分ける
## 利用するデータ
オライリー本の表紙は、オライリー・ジャパンのサイトに掲載されているのでそちらを利用します。

https://www.oreilly.co.jp/index.shtml

上記の犬vs猫分類のように、オライリー本と対する本は何を利用しようかと悩みましたが、同じ技術書で特徴的な表紙を持つものということで、技術評論社が出版しているWEB+DB PRESS plusシリーズを利用してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/aebd42ce-ca79-4cb2-8d7f-63f07f080c38.png)

https://gihyo.jp/magazine/wdpress/plus


##データ学習
新規にプロジェクトを作成し、先ほどと同様にそれぞれ5枚ずつラベルを付与して学習させます。
今回も正解率100%で無事に学習が完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/1ba84d14-7617-d384-4e64-d59cf9963136.png)


##いざ仕分け
学習済みモデルを呼び出して仕分けてみます。

テストはちょっと意地悪して、古典的なオライリーっぽくない、最近のナウい(?)デザインの表紙で試してみます。

まずは1冊目「Real World HTTP」です。
今読んでいますが、幅広くウェブ技術の変遷についてまとめられており読みやすくおススメです。

いざ・・・！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/84228e97-9c6a-fbe8-6512-3e75240ff0b3.png)

お！ちゃんと「O'Reilly」と認識されましたね。

追加でもう1つ。
2冊目は「ハンズオンNode.js」です。
Node.jsについて勉強したかったので購入しましたが、表紙がオライリーらしからぬかわいい感じだったので表紙買いしちゃいました。

いざ・・・！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/e16f1b92-88b4-4f03-10d7-0c2b5abb3a45.png)

お！これもちゃんと「O'Reilly」と認識されましたね。

参考までに、WEB+DB PRESS plusシリーズの表紙でも試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/5e455a2a-b027-0a50-7bd1-d5e64a479a4a.png)
ちゃんと「gihyo」(WEB+DB PRESS plusシリーズ)と認識されています。


##プログラムから学習済みモデルを呼び出す
学習済みモデルを手軽に呼び出すのであれば今回のような画像ドラッグ＆ドロップが使えますが、他にも**Tensorflow**から呼び出せたり、**WebAPI**として呼び出せたりします。

試しにWebAPIとして呼び出してみます。
上記にあるタブから「Export」を選択し、表示された一覧から「Lobe Connect」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/598a181c-e1f5-8eb4-dbfa-6aa5c82bee3f.png)

すると、以下のようにWebAPIに関する情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/e415b0f1-6806-1e3f-1b53-438a0f203ab8.png)

さらに、右上のFormatをクリックすると選択された言語に応じてWebAPIを呼び出せるプログラムが表示されます。表示されたコードをコピペして必要部分を修正すれば動かすことが出来るので、サクッと試すにはすごい便利。試しにPythonからWebAPI経由でモデルを呼び出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/a7c82525-e5dc-839c-a612-f50965bdc219.png)

利用するデータは先ほども試したオライリーの「Real World HTTP」です。

```python:
import base64
import requests

# Save string of image file path below
img_filepath = "img/http.jpeg"

# Create base64 encoded string
with open(img_filepath, "rb") as f:
    image_string = base64.b64encode(f.read()).decode("utf-8")

# Get response from POST request
response = requests.post(
    url="http://localhost:38101/v1/predict/be95b4cc-296d-4f79-90b9-611844136458",
    json={"image": image_string},
)
data = response.json()
top_prediction = data["predictions"][0]

# Print the top predicted label and its confidence
print("predicted label:\t{}\nconfidence:\t\t{}"
      .format(top_prediction["label"], top_prediction["confidence"]))
```

以下、実行結果です。

```
predicted label:	O'Reilly
confidence:		0.9408095479011536
```

ちなみにレスポンスはこんな感じで返ってきます。

```json
{
	"predictions": [
		{
			"label": "O'Reilly",
			"confidence": 0.9408095479011536
		},
		{
			"label": "gihyo",
			"confidence": 0.05919043347239494
		}
	]
}
```



#まとめ
今回試したのは二値分類で、かつ見分けがつきやすいものだったので実際の利用シーンからは程遠いかも知れませんか、手軽にカスタム画像分類したいならLobeが結構使えそうかなと思いました。もしLobeについてもっと知りたい場合は公式ページなどをご確認ください。
あとオライリー本これからもみんなで読みましょう。



#参考ページ
https://qiita.com/tkinjo1/items/5cfe561b8765add0b7d0#%E5%AD%A6%E7%BF%92%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B

https://internet.watch.impress.co.jp/docs/column/shimizu/1316830.html

https://www.atmarkit.co.jp/ait/articles/2011/18/news024.html