【Python】リクルート人工知能APIに肉のインスタ映え診断をしてもらう

#０．はじめに
こんにちは。この記事は[国産Web API Advent Calendar 2018](https://qiita.com/advent-calendar/2018/apijp)の9日目の記事です。

クリスマスが近いですね。みんなが大好きな食べ物といえば、**肉**！
リクルートがA3RTという人工知能APIを公開しており、その中でも画像系の人工知能APIを使って、肉のSNS映え度を判定を試してみたいと思います。
<img width="150" src="https://3.bp.blogspot.com/-98MOlf3cJpA/W4PKFXWjwMI/AAAAAAABOMg/CA8htuxGesIVzaL-UP-Bme8dxOnSmXuegCLcBGAs/s400/syokuji_steak_man.png"><img width="150" src="https://3.bp.blogspot.com/-I-tB5Lp2jqk/W4PKGBeBmGI/AAAAAAABOMo/6dDIIJZWuRQIvZkHvggimtlO1DejUqVTwCLcBGAs/s400/syokuji_steak_woman.png">

ちなみに、今回紹介する機能に雑談機能やMicrosoft AzureのVisionAPIの機能を組み合わせたLINEのチャットボットを作ったので、参考に紹介しておきます。今回作るのはインスタ映えを判定している部分です。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">リクルートの人工知能APIとMicrosoftのVisionAPIを合わせた肉のインスタ映え診断LINEボット完成。言語はPython。環境はHerokuです。<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://t.co/D2k3x8rHJ9">pic.twitter.com/D2k3x8rHJ9</a></p>&mdash; さい (@saisan78) <a href="https://twitter.com/saisan78/status/1071775905918283776?ref_src=twsrc%5Etfw">2018年12月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#１．この記事の対象者
- プログラミング初心者でAPIを使うことに興味がある人
    - Restlet Clientを利用したAPIのテスト方法が学べます
- PythonでAPIを使って見たい人
    - Reqestsモジュールを使ったPOSTの使い方を簡単に紹介します　。（multipart/form-dataをrequestsを使ってPOSTする方法となります。）
- リクルートのA3RTの雰囲気を知ってみたい人
    - 今回はImage Influence API
- なんといっても肉が好きな人：後半は肉の写真が登場
- 国産APIを応援している人


少し長くなるので、右の各章のリンクから興味のあるところだけでも読んで頂けると幸いです。


#２．A3RTとは
3RT（アート）は「ANALYTICS & ARTIFICIAL INTELLIGENCE API VIA RECRUIT TECHNOLOGIES」の略称で、リクルートグループ内の機械学習のノウハウが詰まったAPIだそうです。 
https://a3rt.recruit-tech.co.jp/
<img width="990" alt="スクリーンショット 2018-12-08 20.36.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/3f779219-bec0-9c6c-343d-0a71a894708b.png">

今回はその中でも、[Image Influence API](https://a3rt.recruit-tech.co.jp/product/imageInfluenceAPI/)というものを使用して、肉のインスタ映え度判定を行います。たくさんの肉画像をあらかじめ学習しており、ユーザが投稿する肉画像について、**どれ位インスタ映えするのか0~9点で教えてくれる**ようです！

>Image Influence APIは、画像の”影響度”を測り、多くの人に注目されやすい画像の判別に利用します。最終的には全ての種類の画像に対応したいのですが、まずは肉の画像にフォーカスを当てています。 
例えば、お店の紹介ページに載せる画像として、肉の映った画像AとBどちらが良い印象を与えるか迷った時や、FacebookやinstagramなどのSNSにアップする画像が複数あり、どちらがイイねを多くもらえるか迷った時、などに利用してみてください。 
また、自分で画像と点数を集めてモデルを作成すると、その傾向を学習して未知の画像に対する点数を、あなたの基準で返却するようなモデルも作成可能です。

#３．APIキーの取得
APIの取得はとっても簡単です。Productページからメールアドレスを登録するだけ。
他のAPIと違って、クレジットカード情報や住所などの個人情報もいりません。
メールの認証を済ませると、登録したメールにAPIキーが送られてきます。
<img width="1428" alt="スクリーンショット 2018-12-08 20.42.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/c5692b01-c2c7-ca61-f879-35cfdc928ce9.png">

#４．REST　APIテストツールで試してみる！
いきなりコーディングしてもいいのですが、今回はAPIを試す練習もかねて、APIテストツールを使います。色々あるのですが、Chromeのアドオンとして使える[Restlet Client - REST API Testing](https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm)を使いたいと思います。

(参考に読みたい記事)　[Restlet Clientで始めるREST APIテストの自動化](https://qiita.com/84zume/items/fac99705c39d2f18ada7)

それでは、早速公式のReferenceページを見ながら、試していきましょう。
リクエストパラメータを見ると、以下の３つをエンドポイント（APIのURL）に送ればいいようです。
- apikey ※メールで取得しましたね
- predict　※適当な数値で良さそうです
- imagefile ※3MB以下という、画像ファイルのサイズに注意しておきたいですね

<img width="792" alt="スクリーンショット 2018-12-08 20.54.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/a8b01a0b-b0a9-0fb9-8b00-fb1ded3806be.png">

まず使用する画像はこちらのいらすとやの美味しそうなステーキです。
<img width="200" alt="スクリーンショット 2018-12-08 20.54.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/767ff3c6-782b-1270-24e5-57be16c1767a.png">

それでは、Restlet Clientに必要なパラメータを入れて見ましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/870a473e-91c9-4b9b-b095-c319e84158b5.png)

最後にSendをポッチとすると、下のほうにレスポンスが帰ってきます。
なんと、"3.422203540802002"点！　満点は９点なので低めですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/a6c7c0ba-de99-261f-c710-f1f4171dd4a1.png)

それでは、リクルートのホットペッパーの記事に使われている画像を使わせていただきます。
https://www.hotpepper.jp/SA11/dncLU0054/
<img width="977" alt="スクリーンショット 2018-12-08 23.14.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/f0f4e059-d176-cb65-d5eb-88b5a82467e8.png">

うーん、"4.6302995681762695"点。画像の解像度が良くないのかも知れません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/7709a399-19de-c308-eeda-f51717023af1.png)



#５．Pythonで実行してみる
それではAPIテストツールでの実行方法をPythonでもやってみます。
Restlet Clientには、cURLコマンドに変換する機能があります。
以下のキャプチャ画像のように今回のテスト内容をcURLに変換しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/c171b387-ad67-1cc5-650a-9beaa7fb36c1.png)

さらに、ｃURLコマンドをPythonのReqestに変換できるサイトを使うことで簡単にコードを作成します。今回は、[curl.trillworks.com](https://curl.trillworks.com/)を使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/b89185e5-3e15-c433-3ec6-bbe18f47a8eb.png)

そして完成したコードがこちらになります。たったの12行です。肉画像のファイルのパスはご自分の保管場所なので気をつけてくださいね！

```python
import requests
URL = 'https://api.a3rt.recruit-tech.co.jp/image_influence/v1/meat_score'
APIKEY = '秘密' #自分のAPIキーを入れてね
headers = {'Content-Type': 'multipart/form-data'}
files = {
    'apikey': (None, APIKEY),
    'predict': (None, '1'),
    'imagefile': ('肉画像.jpg', open('肉画像.jpg', 'rb'))
}
r = requests.post(URL, files=files)
score = r.json()['result']['score']　#scoreを表示する部分を追加で作ります
print(score) 
```

#６．いろんな肉画像（フリー）を試してみる
最後に色々な肉画像のスコアがどうなるか試してみます。
[pexels.com](www.pexels.com)より、フリーで使用できるものを使用しています。

■Score: 4.536550998687744
https://www.pexels.com/photo/steak-food-769289/
![beef-cooking-delicious-769289.jpg](https://qiita-image-store.s3.amazonaws.com/0/133230/341e42e0-5dc0-4d0b-4c3d-fd256981110f.jpeg)

■score: 3.3790462017059326
https://www.pexels.com/photo/raw-meat-on-brown-wooden-surface-1539684/
![beef-beef-chuck-beef-steak-1539684.jpg](https://qiita-image-store.s3.amazonaws.com/0/133230/f59d67b7-99c7-4bb9-b8eb-32cb2beaf243.jpeg)

■score: 4.49148416519165
https://www.pexels.com/photo/chicken-close-up-dish-food-265393/
![chicken-close-up-dinner-265393.jpg](https://qiita-image-store.s3.amazonaws.com/0/133230/037a469f-482a-3e5a-8666-138d348c87ae.jpeg)

■score: 4.612046241760254
https://www.pexels.com/photo/cooked-sausage-929137/
![barbecue-bbq-cooking-929137.jpg](https://qiita-image-store.s3.amazonaws.com/0/133230/7b6433d5-8bfa-07e0-e9ac-35237301b22e.jpeg)

残念ながら５点以上の肉画像が見つからず。ハイスコアとなる基準が謎ですね。笑
学習データを持っているリクルートの中の人だけが知っているのだと思います。

#７．まとめ
- APIのおかげで誰でも簡単に（今回はたったの12行）で人工知能を使えるようになった！
- RESTAPIテストツールや、cURLからのReqestsコマンド変換など、初心者でもコードを作りやすいツールが実はたくさんある！
- 画像の分類など、分類するもの、分類の目的がはっきりとしてきたらカスタマイズを行う必要があり
    - 参考)　[Azure Custom Vision Serviceで「きのこの山」と「たけのこの里」を判別させてみる](https://azure-recipe.kc-cloud.jp/2017/12/custom_vision_2017adcal/)
- 肉をいっぱいたべよう

みなさんよい年末を。

#おまけ
人に教えること、勉強することが好きです。色々と学んだことを記事で共有していきたいと思います！

-[【COTOHA API】NTTグループの40年にわたる研究成果を使って、西野カナさんの年齢を予測する【Python】](https://qiita.com/sai-san/items/c60e90c1e56d78449c6b)
-[【Pythonたったの12行】リクルート人工知能APIに肉のインスタ映え診断をしてもらう](https://qiita.com/drafts/c2bdd676f4c7c96934c3/edit)