ラズパイへOpenCVをソースからビルドしたらハマった話

はじめに

yoshitaku_jpです。

5月にIoTハッカソンがあり、そのための準備を第6回 Raspberry pi もくもく会でおこないます。

ハッカソンのテーマが「キッズIoT」ということで、子供のテレビ時間を抑制するものを作ろうとしています。
子供がテレビの前にいるかを確認しなければならないので、ラズベリーパイとOpenCVを使って確認してみようと思います。

こちらの記事は、第5回 秋葉原IoTツアーズの製作日誌も兼ねています。
まとめはこちら→第5回 秋葉原IoTツアーズ製作日誌

今回はRaspberry PiにOpenCVをインストールしてみます。

ファイルシステムの拡張

sudo raspi-configを実行し、「7 Advanced Options」の「A1 Expand Filesystem」を選択します。
実行することでラズベリーパイで使用できるファイルの領域が広がります。OpenCVのコンパイルでは大きいファイル領域を使用するので必ずおこないます。

SDカードの大きさが小さい場合は他にも必要のないソフトウェアをアンインストールしておきます。

sudo apt-get purge wolfram-engine
sudo apt-get purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove

OpenCV3をソースコードからインストールする

まずは依存関係のあるパッケージをインストール

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3-dev

次にソースコードのダウンロードと解凍

wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
unzip opencv_contrib.zip

numpyのインストール

pip install numpy

OpenCVのビルド

cd ~/opencv-3.3.0/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
-D BUILD_EXAMPLES=ON ..

OpenCVのコンパイル

make -j4

ここでエラー

エラー

何度かmake -j4を試してもfatal error: can’t write PCH file: No space left on deviceエラーが出てしまいました。一番最初にデバイスの領域を確保したはずなんだけどなぁ。SDカードも16GBを使っているので領域が足りなくなることはほぼ無いと思っています。結構調べたのですが、どれも解決には至らず…

解決したらまたブログを書きます。

参考URL

作業編

https://github.com/yoshitaku-jp/study-picamera-slack

https://qiita.com/nanbuwks/items/422eb405ceef84826ab4

https://www.pyimagesearch.com/2015/07/27/installing-opencv-3-0-for-both-python-2-7-and-python-3-on-your-raspberry-pi-2/

https://www.scivision.co/install-opencv-python-windows/

エラー編

https://teratail.com/questions/101689

https://www.raspberrypi.org/forums/viewtopic.php?t=124646

http://answers.opencv.org/question/18121/cant-write-in-pch-file-crunchbang/

https://raspberrypi.stackexchange.com/questions/63417/compiling-opencv-on-pi-3


追記

解決しました!!!!!!!!!!!!!!!!!!

【解決】OpenCVはpip3からインストールできます

#技術書典 に行ってきました

yoshitaku_jpです。

2018/4/22は技術書典4に行ってきました

技術書典とは

秋葉原UDX アキバ・スクエアにて開催された、技術書のオンリーイベントです!!

技術書典
https://techbookfest.org

第4回のページ
https://techbookfest.org/event/tbf04

開催1回目から知ってはいたのですが、都合が合わずにここまで来てしまった…
3回まで悪天候も続いていたので、今回は晴れてよかったですね!

びっくりするぐらい人が多い

だんだん注目度が上がっているようで、人が多かったです!!!
エンジニアがこんなにもたくさんいるとは!

そして、最終的な来場者数は6380人だったようです!!

次回は会場が広くなるんじゃなかろうか…

自分のお目当てのサークル

事前にサークルチェックしたところです!

シス管系女子会
マンガでわかるWebデザイン+Git
さかさまダイアリー
YATTEIKI Project
radiberry pi!
どっとすたぢお

今回自分が気になったサークルさんです!どこも面白そうー!!

当日の自分の動き

まぁまったり行っても大丈夫だろと思っていましたが、twitterで検索していると人がヤバイことを知りました。大慌てで秋葉原まで着き、11:30に整理券をもらえましたが、1830番でした。

整理券の番号が来るまでは中にはいることはできないので時間を潰します。

カールスジュニアで時間を潰しました。初めて行きましたが、1000円でアメリカンなハンバーガーが食べられます。飲み物がドリンクバーで飲み放題です。アメリカンです。

自分が中にはいったのは12:30ぐらい。
人気なところは既に本が完売していて、ダウンロード版のみの販売になってました。悲しい。すごい人気。そのダウンロード用のQRコードが書いてある紙もなくなってしまうところも出ていて、急遽印刷しているところもありました苦笑
会場内は肩はぶつかるわ、荷物ぶつかるわ、人の流れに逆らえないわで大変大変。転倒とかあると怖いので、本当に次は広い会場がいいですね… 女性も来にくくなってしまいそう…

買ったもの

マンガでわかるWebデザイン+Git
マンガでわかるDocker
わかばちゃんシリーズ!Dockerまだまだわからないこともあるし欲しかった!

YATTEIKI Project
今日からはじめる技術Podcast完全入門
YATTEIKI Project大好きです。インターネットTシャツ着てったらパーソナリティーの方々に笑ってもらえた。結構嬉しい。

あきよこブログ
現場で使えるDjango
日本語のDjangoの文献・資料って全然ないから衝動買いです!唯一の物理本。笑

date-refinement
kaggleのチュートリアル
kaggleやってみたかったから買い!

にくよし文庫
ソフトウェアエンジニアの情報収集について
情報収集能力高めたかったから買い!!

以上です!

午後から予定があったのと、人の密集率がすごくて行きたいところにたどり着けずバテました…
けど各サークルさんが電子版を出し始めているので、また面白いものがないかチェックしてみようと思います!次回のためにお金をためておこう。ハッシュタグ追いかけていくぞ!!

まとめ

めちゃくちゃ楽しかった!!!また行きたい!!!Podcast始めたい!!

そして、次回は自分も出してみたいなぁと思っていて
– OSSに参加してみよう本
– OSS BIツールを使ってみる本
– 情報収集について
– ブログを書く技術
なんか出してみたら面白いんじゃないかなぁーって勝手に思ってます!次回の開催はまだ発表されていないので今から楽しみです!

GWは買ってきた本を読んで書評かな??

参加した皆様、運営の皆様、技術書典に関わった全ての皆様お疲れ様でした!また技術書典5が開催されることを楽しみにしてます!!!

Google Cloud Vision APIのウェブ検出機能を使ったら自分の想定と違った話

yoshitaku_jpです。

自分は安住紳一郎アナウンサーに似てるってよく言われます(立ち居振る舞い含めて)。メガネをかけるとおぎやはぎの小木さんに似てるとも言われます。上記の二人同士が似てるとあまり思わないです。そこで自分がどちらに似ているのか、はたまた他に似ている芸能人がいるのか機械学習的なやつでハッキリさせてやろうと思いました。

数年ぶりに会った失礼な友人からです。

と思ったら、便利な世の中でして、GoogleのAPIで画像を投げたらそれにちかしいものを返してくれるものが既にありました。
https://cloud.google.com/vision/docs/detecting-web?hl=ja

このAPIを使って自分の画像を投げたら似ている芸能人を教えてくれることを期待しています。

ソースコードはこんな感じ

get_env.pyファイル

dotenvについての使い方はこちら
APIキーを見せずにpushできるpython-dotenvを使ってみた

APIキーを見せずにpushできるpython-dotenvを使ってみた

import os
import os.path
import dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
dotenv.load_dotenv(dotenv_path)

API_KEY = os.environ.get("ENV_KEY")

vision.pyファイル

import base64
import json
import requests

import get_env

bin_captcha = open("yoshitaku.jpg", 'rb').read()
str_encode_file = base64.b64encode(bin_captcha).decode('ascii')
str_url = "https://vision.googleapis.com/v1/images:annotate?key="
str_api_key = get_env.API_KEY
str_headers = {'Content-Type': 'application/json'}
str_json_data = {
    'requests': [
        {
            'image': {
                'content': str_encode_file
            },
                'features': [
                    {
                        'type': "WEB_DETECTION"
                    }
                ]
            }
    ]
}
response = requests.post(str_url + str_api_key,
    data=json.dumps(str_json_data),
    headers=str_headers
)
json_response = json.loads(response.text)
print(json_response["responses"][0]["webDetection"])

送った画像はこちら(白枠はなし)

返ってきたのはこちら

{'webEntities': [{'entityId': '/m/06ntj', 'score': 0.8901126, 'description': 'Sport'}, {'entityId': '/m/03x045', 'score': 0.7374585, 'description': 'Team sport'}, {'entityId': '/t/29syjjvbyn_rl', 'score': 0.7067}, {'entityId': '/m/0gl2ny2', 'score': 0.64155483, 'description': 'Football player'}, {'entityId': '/m/02vx4', 'score': 0.6196, 'description': 'Football'}, {'entityId': '/t/21vq7mhwrfsty', 'score': 0.5768}, {'entityId': '/m/02vzx9', 'score': 0.5675505, 'description': 'Player'}, {'entityId': '/m/018tl7', 'score': 0.5451121, 'description': 'Competition'}, {'entityId': '/m/011l78', 'score': 0.5430361, 'description': 'Team'}, {'entityId': '/m/020m7t', 'score': 0.5402399, 'description': 'Ball game'}], 'visuallySimilarImages': [{'url': 'https://www.gannett-cdn.com/-mm-/d6aadd8065c265d807c7d2692cc635d7e35332c0/c=0-235-1360-2048&r=537&c=0-0-534-712/local/-/media/2018/04/13/TennGroup/JacksonTN/636592306429549551-Paige-Hampton.JPG'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/3/3f/Cech_-_2015_Emirates_Cup.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Conor_O%27Brien_%28soccer_player%29.jpg/220px-Conor_O%27Brien_%28soccer_player%29.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Kara_Mbodj.jpg/220px-Kara_Mbodj.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Youssef_Toutouh.JPG/220px-Youssef_Toutouh.JPG'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Kingsley_Coman_Training_2017-03_FC_Bayern_Muenchen-2.jpg/220px-Kingsley_Coman_Training_2017-03_FC_Bayern_Muenchen-2.jpg'}, {'url': 'https://www.irishtimes.com/polopoly_fs/1.3319494.1512678148!/image/image.jpg_gen/derivatives/box_620_330/image.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Sean_Murray_watford_2014.jpg/220px-Sean_Murray_watford_2014.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Carl_Ikeme.jpg/200px-Carl_Ikeme.jpg'}, {'url': 'https://media.npr.org/assets/img/2015/11/25/cam-ron-12_sq-e466054e25e80550d4f73f281348433f7567a1e3-s300-c85.jpg'}], 'bestGuessLabels': [{'label': 'player'}]}

画像のURLはvisuallySimilarImagesに入ってるっぽいですね!
これらが似ているやつかぁ

なんか思っていたのと違う

ちゃんとドキュメントを読みました。
https://cloud.google.com/vision/docs/beta-web-entities?hl=ja

最良の推測ラベル: ウェブ エンティティ検出リクエストには bestGuessLabels リストが含まれ、画像の内容を最もよく表すラベルを提供します。

確かにレスポンスの最後にラベルがありました。'bestGuessLabels': [{'label': 'player'}]という記述が。自分の画像を送って、一番特徴あるもの・こと(今回はplayer)を抜き出して、その特徴に近い画像を取ってきてくれるんですね。勉強になりました。

しかし、ブラウザのGoogleから「player」「Sport」「Football Player」を調べても

「player」の結果

「Sport」の結果

「Football Player」の結果

同じものは出てきません。このあたりどうなっているか気になりました…
あとは、この機能はどういうことを想定して作られたんだ?自分の想像力が足りない…


本題に戻すと、自分が誰に似ているのかはAutoML Visionを使うと良さそうです。
https://cloud.google.com/automl/
http://www.atmarkit.co.jp/ait/articles/1801/30/news020.html

2018/4/22時点で日本では展開されていないようです。AutoML Visionは自分でテストデータを用意して、Google上で学習させて機械学習によるオリジナル識別器を作れるようです。
下のURLはラーメン二郎41店舗を機械学習し、どの店舗で作られたラーメンなのか見分けられるようです。精度は94.5%。す、すごい…
ラーメン二郎とブランド品で AutoML Vision の認識性能を試す

Googleで検索したところ、似ている芸能人を探すアプリってあまり良いのが無いようで、AutoMLを使って作ってみようかなと思いました。

たまには、やってみたけど失敗・うまくいかなかったネタでした。

FEARLESS CHANGEを読んだ

yoshitaku_jpです。

omoiyari.fmと言うPodcastで面白かったエピソード#22 「Trello があるので眠れない」を聞き直したところ、新しい発見がたくさんありました。Podcastは楽しいですね。自分でも配信したいなって思います。

この聞き直した中で、FEARLESS CHANGEが紹介されていました。4月に入って社内の働き方改革のメンバーに立候補したこともあり、組織やグループにアイデアをどう広めるのがいいのか知見が欲しかったので読んでみました。

社内でやりたいこと

読んだ感想とか共感した部分を書いてみたいのですが、その前に社内でやってみたい変えてみたいと思っていることを上げてみます。働き方改革とは少し趣向が違いますが、内部をこう変えていってみたいという思いで書いてみます。
– redashの導入
– crowiの導入
– ブログ執筆習慣の定着

見える化とか、アウトプットする土台作りが多いかな。
redashで社内を可視化していきたいです。出せない数字とかもあるかもしれないですが、すぐに見れる環境があることに寄って、そこから議論が始まっていけばいいかなって思いました。

crowiに限らず社内wikiは絶対に導入した方がいいと思っています。エクセルやパワーポイントはまず作成するのがめんどくさい、フォーマットが統一されない、みるときも開く手間が増えるし重いしで良いこと無いんじゃないかなって思ってます。資料作ったとしても見てもらえなければしょうがないので、みることに対するハードルを少しでも下げていきたいです。最近学んだことをアウトプットしてくれる人が出てきたので、そのアウトプット先を変えていきたいなって思います。

ブログ執筆習慣の定着は、各部署単位などで週1ブログを書いていきたいですね。
ブログ書いてアウトプットすることによって他部署の人がやっていることやどんなことに興味があるのかわかるので良いんじゃないかと思っています。


アイデアを組織に広めるための48のパターンから共感したところと新たに知識として得られたところをメモしておきます

読んで共感したところ

9.何かを食べながら

食べ物を持ち込んで、いつもの集まりを特別なイベントにしよう

確かに特別感が出る!!!毎日どこかで開催されている勉強会では必ずと言っていいほど食べ物が出されますよね。これはすぐ実践できると思うし、半期の全社会でやるように提案してみよう!

10.電子フォーラム

もっと話を聞きたい人のために、電子掲示板・グループメールアドレス・メーリングリスト・書込み可能なウェブサイトを用意しよう

グループを作るのって大切。気軽に聞ける場があると精神的なハードルも下がりますしね。けど、新しく入って来る人が既存のグループに入るのって結構ためらうと思うから、オープン感をどこまで提供し続けられるかってのも大切だと思う。

17.やってみる

新しいアイデアに関する話を広める前の準備段階として、まずは自分の仕事に使ってみて、そのアイデアの利点と限界を見極めよう。

プライベートでも「何か新しいことをしたい」と相談された時、まずは自分でやってみたら?と返します。自分がやってもいないことに他の人が付いて来ると思わないし…

18.感謝を伝える

感謝の気持ちを表すために、あなたに協力してくれたすべての人に、できるだけ誠実に「ありがとう」と言おう。

何にでも通ずることです。忘れずに生きたい。

19.次のアクション

イベントの最後の方で、新しいアイデアに対し、参加者が次に何ができそうかを確認する時間をとろう。

これをやらないで終わってしまう会があるので、意識的に最後に話すようにしています。「誰が何をいつまでにするのか」これをやるかやらないかで、次の集まりが開催されるかされないかの率に差が出ると思います。というか、やらない意味がわからない。

25.勉強会

あるトピックについて継続的に探求したい、学びたい同僚を集めて、小さなグループをつくろう。

同僚に限らず、社内外でたくさん作る・入るべきだと思います!所属するだけはダメですけど、所属しないよりはマシ!RPAの勉強会に行った後、たくさんの人に勉強会の存在をアピールしました!

41.勢いの持続

組織内で、新しいアイデアに対する興味を持続させる、という現在進行形の仕事に積極的にアプローチしよう。

19にも通じますね。いろいろ悩んではいるけど、ブログを続けられているのは新しいことに積極的にアプローチしているからかな。

47.お試し期間

組織が新しいアイデアの導入に前向きではない場合、少しの間だけ試験的に使ってもらい、その結果を観察することを提案しよう

17に通じますね。まずはトライしてみる。そして、そのハードルを下げてみる。自分が提案したいいくつかのことにも、お試し期間を設けて使っていってもらいたいなぁ。そして、周りの人を惹きつけるためにも、自分が使っていかないといけないなぁ。

読んで得た新しい気付き

21.便乗

新しいものを導入する戦略が障害にぶつかったときは、組織の慣習に便乗する方法を探そう。

変えないとって思うと180度一気に変えないといけないイメージを持っていました。けど、それは間違いなんだなぁ。今現在の状態から10度ずつ変えていって結果的に180度変わることもあるし、そういう視点も大事ですね。

24.定期的な連絡

一度キーパーソンに支援を求めたら、彼らのことを忘れてはならないし、あなたも彼らに忘れられないようにしよう。

継続性ですね。自分は頼られたら嬉しくなってしまうので、なるべく連絡を自分から取るようにしています。しかし自分からキーパーソンへはどうだろうか…もう少し積極的にやり取りしてみます。

36.場所重要

割り込みが入ってイベントの流れを断ち切られる自体を避けるために、仕事の現場を離れて重要なイベントを開催してみよう

全社会も自社内でやれば会場費かからないしいいんじゃないかと思っていたので、新しい視点でした。割り込み処理を避けるって発想ですね。特別な場での一体感も生まれるしいいんだろうなぁ。自分主催でのイベントの時も場所の選定気をつけたいと思います。

39.相談できる同志

厳しい状況のとき必要以上に落ち込まないよう、新しいアイデアの導入で、同じように困っている人達と話す機会を見つけよう。

社内の人と話すのは避けていたのですが、1.2年たくさん関わるように視点を切り替えてみました。そうすると相談できる同志がたくさんできてよかったです。必要以上に落ち込まないストッパーのように使わせていただくって視点はなかったし、自分もそういう役割になって生きたいなって思いました。

44.懐疑派代表

あなたのアイデアに懐疑的なオピニオンリーダーに「公式な懐疑派」の役割を演じてもらうよう、協力をお願いしよう。彼らの懐疑的な姿勢を変えられないとしても、あなたの取り組みを改善するために、その意見を活かそう。

反対派は嫌いじゃないですが、ダメなところだけをいうのって本当にやめて欲しいので嫌いです(どっちだ。

この部分を読んで考え方が変わりましたね。懐疑派代表って言葉いいなぁ。社内で愚痴が多くなってしまう人もこういう役割に任命してやってもらったらもっともっと良くなるのかなぁ。反対派と話すの怖いですけど、意見に反対なだけであって自分が嫌いなわけでは無いと強く思って、接していきたいなと思います。

46.恐れは無用

抵抗勢力を新しいアイデアの強みに変えよう。

44と同じですね。新しいアイデアの強み。ふむふむという感じです。反対意見と戦うのではなく、排除するわけでもなく、取り入れてアイデアを強くしていきたいと思います。

まとめ

  • FEARLESS CHANGEを読みました

  • 組織を変えていく上での為になるパターンがたくさんありました

  • 定期的に読み直して、実践できているか確認しチューニングしたいと思います!

  • コメントとも照らし合わせていきたいです!

  • 実践してこそ