SCORER SDK 箱だしから顔検出まで

SCORER SDKがプリインストールされたRaspberryPiを買ったので、顔検出するまでのレポート。
あとシャットダウン方法。

# SCORER SDKとは

[SCORER SDK](http://sdk.scorer.jp) とはRaspberryPi用の画像解析SDK。
買ってすぐ画像解析デバイスが作れる。すごい！！
RaspberryPi内に[Cloud9](https://c9.io/)というIDEが入っているので、同一ネットワーク内からRaspberryPiにアクセスしてコーディングしてすぐ実行できる。もちろんOpenCV等のライブラリもあらかじめ入ってるし、足りなければpipでインストールできる。

# 用意したもの

- SCORER SDK スターターキット 
  - amazonで買いました。
  - http://amzn.asia/i2EdJdy
- iPod touch
  - SCORERの初期設定にiOSアプリが必要なため。


# 1. 箱から出す

![IMG_20170708_155855.jpg](https://qiita-image-store.s3.amazonaws.com/0/143405/41aae930-eea4-f6ab-26a5-39f859ed28a4.jpeg)

ケース組み立て済みのRaspberryPi本体と、電源ケーブル、USBカメラ、[説明書](https://www.slideshare.net/daichifujii/scorer-quick-guide-67899179)が入っていました。
microSDは最初から装着状態なので、ほんとに電源ケーブルさすだけで動き始める。

# 2. 初期設定

[説明書](https://www.slideshare.net/daichifujii/scorer-quick-guide-67899179)を参照しながら、RaspberryPiをネットワークに接続して、デバイス登録をします。
iOSアプリでBluetooth接続して設定を行うのですが、接続されるまで数分かかるときもあります。以下のようにBluetoothのアイコンが出ればOKです。

<img width="320" alt="InkedIMG_0180_LI.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/143405/e653c2b4-eebb-f35f-d1ec-e8d98fc82a6a.jpeg">

ネットワーク接続とデバイス登録までできたら、[SDKダウンロードページ](http://downloads.scorer.jp/sdk.html)の[「導入の手引き」](http://downloads.scorer.jp/SCORER_SDK_Starter_Guide_v0.4.1.pdf)を読んで、サンプルプログラムを動かしながら大体の使い方を理解します。
基本的には、
- 管理画面に接続してCloud9起動
- Cloud9に接続してコーディング 
- 管理画面でWebShowサービス起動
- プログラム実行
の流れです。

# 3. 顔検出プログラムを動かす

## 実行ディレクトリ作成

今回は ~/scorer-sdk-python/samples/detect-face-sample ディレクトリを作成してここに作成したプログラム等を置いて作業しました。

## コーディング

[SCORERのブログ](http://blog.futurestandard.jp/entry/2017/02/04/131343)にUSBカメラで顔検出したらLINEに通知するプログラムのサンプルが載っています。これを参考に、顔検出したらprint("detect face!!")するプログラムを書いて上記のディレクトリに配置します。

```python:detect-face-sample.py
import scorer
import cv2
from time import sleep
from datetime import datetime, timedelta


#HAAR分類器の顔検出用関連設定
cascade_path = "haarcascade_frontalface_alt.xml"
color = (255, 255, 255) #白
cascade = cv2.CascadeClassifier(cascade_path)

#通知しすぎないように最低通知間隔と、顔の大きさの最低値（px）を設定
check=datetime.now()
faceminwidth=100

#USBカメラから画像取得開始
cap = scorer.VideoCapture(0)

print("waiting...")
while True:
    # Read Frame from Camera
    frame = cap.read()
    if frame == None:
       continue

    #グレースケールで顔検知し、通知用の画像はカラーを使う
    image = frame.get_bgr()
    gray = frame.get_gray()

    #確認用画面 
    scorer.imshow(1, gray)
    
    #顔検知実行
    facerect = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))    
    
    #顔が存在したら顔を検知して通知
    if len(facerect) > 0 and frame.datetime-check > timedelta(seconds=5):#5秒以内の検知は無視
        check=frame.datetime
        
        #検出した顔を囲む矩形の作成
        for rect in facerect:
            cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
           
           #細かい模様などを誤検知することがあるので、顔の最低サイズを決めて除外する
            if rect[2]>faceminwidth:
                print("detect face!!")
                
```

## OpenCVの定義ファイル

作ったプログラムを実行すると、

``` 
OpenCV Error: Assertion failed (!empty()) in detectMultiScale, file /root/Downloads/opencv/modules/objdetect/src/cascadedetect.cpp, line 1691
Traceback (most recent call last):
  File "/opt/scorer/home/dev/scorer-sdk-python/samples/detect-face-sample/detect-face-sample.py", line 34, in <module>
    facerect = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))    
cv2.error: /root/Downloads/opencv/modules/objdetect/src/cascadedetect.cpp:1691: error: (-215) !empty() in function detectMultiScale
```

が出て実行できませんでした。
どうやらOpenCVの顔定義ファイル(haarcascade_frontalface_alt.xml)にパスが通ってないようなので、[ダウンロード](https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml)して、プログラムと同じディレクトリに配置しました。

## 実行

こんな感じで実行できました。
<img width="469" alt="SnapCrab_NoName_2017-7-15_15-28-52_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/143405/f9af84b4-a6cc-5484-0b41-aedd932e68bc.png">

# 4. RaspberryPiのシャットダウン

マニュアルに載ってないのですが、シャットダウン方法がかなり独特です。というのもこのスターターキット実はrootパスワードが提供されてないからです。sudoできません。
なので例の設定アプリを使います。Bluetooth接続した後、デバイスを選択して右上の電源ボタンからシャットダウンできます。
<img width="320" alt="IMG_20170715_153825.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/143405/8ec7619c-8b01-2a62-561c-044e014a1c9d.png">

# まとめ
ラズパイ初体験だけど買って電源ケーブルさすだけで後はPythonなので、RaspberryPi感が全くなかった。とにかく作りたい物があって、途中のRaspberryPiの仕組みとかどうでもいいんじゃーって人向け。

# 参考情報
http://qiita.com/corona365/items/0fb6192d5e48d37a24eb

情報少な過ぎでは。。。