Flow-Developers

Raspberry Pi, Raspbian, python, ROS, IoT, 電子工作, 機械学習, Deep learning, ライフハック

なぜ異なるメーカーのカメラの露出が合わないのか?

なぜ異なるメーカーのカメラの露出が合わないのか?

  • なぜ異なるメーカーのカメラの露出が合わないのか?今回はISO感度規定の観点でまとめる.

デジタルカメラISO感度とは.

撮像素子の光感度特性を表す単一規定ではない.

  • デジタルカメラの感度規定で重要な点は,イメージセンサー(撮像素子)の光感度特性を表す単一規定ではないと言う事.
  • 標準出力感度(SOS [Standard Output Sensitivty])と推奨露光指数(REI [Recommended Exporsure Index])の2つの感度規定があり, 2つの感度規定はメーカーが独自に選択可能である.
  • またデジタルカメラの信号処理を含む光感度特性であるため,画像処理エンジンの性能が反映される.

Image Comparison@Dpreviewのデータで検証.

  • Image Comparison@Dpreviewを参考にすれば,同一光量における各メーカーの露出差が確認できる.(S/N等を比較するにも便利なサイト) f:id:flow-dev:20180506131116j:plain

標準出力感度(SOS [Standard Output Sensitivty])

  • 所定の条件で標準反射版(反射率18%のグレー)を撮影しデジタル出力値が8bit(0~255段階中)で118の値となる状態で光感度特性で定義.
  • パナソニック, 富士フイルム, オリンパス, ペンタックスが採用している.
  • Image Comparisonのデータで見ると,SOSは,同じ光量の被写体に対して,カメラ制御値が一定.
F値 ISO感度 FUJIFILM X-H1 Panasonic GH5S Olympus E-M1 II
5.6 200 1/60s 1/60s 1/60s
5.6 400 1/125s 1/125s 1/125s
5.6 800 1/250s 1/250s 1/250s
5.6 1600 1/500s 1/500s 1/500s
5.6 3200 1/1000s 1/1000s 1/1000s

推奨露光指数(REI [Recommended Exporsure Index])

  • 単体露光計や外部ストロボなどを使用する際の露光指数設定の参考とし,メーカーが独自に推奨する光感度特性を定義.
  • キヤノンニコンソニーが採用している.
  • Image Comparisonのデータで見ると,REIは,キヤノン, ニコン/ソニーでも差がある.
  • SOS規格と比べて,REI規格のメーカーの方が+0.3EV程度光感度特性が高い傾向がある.
  • キヤノンのISO1600.ISO3200はSOS規格と比べて,+0.7EV程度光感度特性が高い傾向もある.
F値 ISO感度 CANON 5DmkIV SONY A7III Nikon D850
5.6 200 1/80s 1/80s 1/80s
5.6 400 1/160s 1/160s 1/160s
5.6 800 1/320s 1/320s 1/320s
5.6 1600 1/800s 1/640s 1/640s
5.6 3200 1/1600s 1/1250s 1/1250s

まとめ

  • CIPA感度規定がメーカー毎の独自規定を持てる規格であること.シャッター速度/F値/ISO感度が同じにしても,画像出力値は一定にならない.
  • SOS規格と比べて,REI規格のメーカーの方が+0.3EV程度光感度特性が高い傾向がある.
  • キヤノンのISO1600.ISO3200はSOS規格と比べて,+0.7EV程度光感度特性が高い傾向もある.
  • 映像制作のように,異なるメーカーのカメラを混在させ撮影/編集/合成する場合, 単体露光計など基準となる測光計を決め,その基準に対する各カメラのISO感度の差分を把握した上で,撮影被写体に対するカメラ制御値を設定できる準備が必須である.
  • 0.3EVの差は,LUTを利用したグレーディングを行う上で,無視できない露出差である.


参考文献

Raspberry Pi Compute Module 3 を立ち上げる (OSインストール~2つのPicameraを起動するまで)

はじめに

  • Raspberry Pi Compute Module 3 Development Kit を立ち上げてみました.
  • RaspbianOSのインストールと2つのPicameraを起動するまでご紹介します.
  • SDカードからBootしない(eMMC内蔵). USBポートが1つしかないなど一般的なRaspberry Piとは異なりますので,初動の参考になればと.

RaspbianOSのインストール

  • Raspberry Pi Compute Module 3のeMMCを別のPCでマウントし, そこからOSイメージを書き込む必要があります.
  • WindowsOSであれば, 以下からマウント用のツールをダウンロードできます. https://www.raspberrypi.org/documentation/hardware/computemodule/CM-Boot-Installer.exe
  • Raspberry Pi Compute Module 3のusb slaveにWindows PCを繋ぎます.(pinはスレーブ_EN側(スレーブ実行する)にしておく)
  • Raspberry Pi Compute Module 3のpower inに電源を供給します. f:id:flow-dev:20171224081049j:plain
  • rpiboot.exeを起動すると, 追加ドライブとしてRaspberry Pi Compute Module 3がマウントされますので, そこをターゲットとし,OSイメージを書き込みます.
  • Raspberry Pi Compute Module 3のeMMCは4GBなので, コンパクトサイズなOSである,Raspbian Stretch Liteを利用します.
  • OSイメージの書き込みには,一般的なRaspberrypiと同様に,Win32DiskImagerを使います.
  • OSイメージを上書きしたくなった場合も, 一般的なRaspberrypiと同様にSDcardFormatterでフォーマットしてから書き込めば出来ます.

参考

Raspberry Pi Compute Module 3の起動

f:id:flow-dev:20171224082106j:plain

  • Raspberry Pi Compute Module 3のusb slaveからUSBケーブルを外す.(pinはスレーブ_DIS側(スレーブ実行しない)にしておく)
  • slave USBを外さないと起動しないようです.
  • Raspberry Pi Compute Module 3のpower inに電源を供給します.
  • Raspberry Pi Compute Module 3をHDMI接続します.
  • Raspberry Pi Compute Module 3のusb portにキーボード等取り付けます(一口しかないので, 拡張必須)
  • LANがないので, 有線LAN等はUSBポートを増やし接続しました.(図参照)
  • 以下でloginできます(デフォルト)
user:pi
pw:raspberry

f:id:flow-dev:20171224084247j:plain

2つのPicameraを起動する

wget https://www.raspberrypi.org/documentation/hardware/computemodule/dt-blob-dualcam.dts
sudo dtc -I dts -O dtb -o /boot/dt-blob.bin dt-blob-dualcam.dts 
sudo shutdown -r now

f:id:flow-dev:20171224083234j:plain

  • 最終的にはこんな感じの接続になってます.これで2つのpicameraの絵がでました.

f:id:flow-dev:20171224083448j:plain

まとめ

flow-developers.hatenablog.com

flow-developers.hatenablog.com



参考文献

以上

pythonからC++関数を簡単に呼ぶ方法

はじめに

  • C++で書いたアルゴリズム関数をpythonに組み込んで頂戴」なんてことがあります.
  • numpyとか駆使すれば十分高速なコードが書けるのですが,書き換えるのも面倒です.(興味がないコードだったりもしますし.)
  • そういう時のために,pythonコード内でC++を簡単に呼ぶ方法をまとめておきます.
  • ベースはpythonで書いて,画像処理だけC++のコードで貰う時とか便利です.
  • ctypesを使います.
f:id:flow-dev:20171219075129p:plain

サンプルコード

  • githubに置きました.
  • ctypes_for_Image_processing.
  • 実践的じゃないhelloworldのサンプルではなく,変数とポインタ渡しのサンプルです.

要点

C++コードをWindowsOSであれば,DLL化. LinuxOSであればShared Object(so)化します.そうすればctypesで呼び出せます.

x86_64-w64-mingw32-g++ -c Image_processing.cpp
x86_64-w64-mingw32-g++ -shared -o Image_processing.dll Image_processing.o
  • Linux OS(こっちの方が簡単)
g++ -g -Wall -fPIC -o Image_processing.o -c Image_processing.cpp
g++ -shared Image_processing.o -o Image_processing.so
  • あとはサンプルコードをご参照ください.(出来るだけシンプルに書きましたので)


まとめ

  • pythonで手早くC++関数を呼ぶ方法をまとめてみました.
  • これでpythonC++関数を混在しなきゃいけない場面でも安心ですね.
  • ROSでpythonC++共存させちゃうのもありますけど,インストール大変ですしね.

flow-developers.hatenablog.com

以上

RaspberryPiで一眼レフカメラをリモート制御する環境を作るには,gphoto2-updaterが簡単です.

はじめに

  • 一眼レフカメラをリモート制御する定番ライブラリは,gphoto2です.
  • gphotoに関する日本語記事は古く∧少ないのですが,「インストールが大変面倒っぽい.動作が不安定」などネガティブな意見が散見されます.不安だけが残ります...
  • 2017年現在は,gphoto2-updaterというシェルがあって,これを叩けば簡単に環境構築できます.

gphoto2とは

f:id:flow-dev:20170814084918p:plain

  • gphoto2とは,PTP通信を叩けるライブラリです.
  • 各カメラメーカーのPTP仕様にカスタマイズしています.最新機種などカスタマイズが間に合ってない部分もありますが,PTPの個別アドレス自体はアドレス指定で叩けますので仕様解析すれば問題ないです.(←ココ重要です)

gphoto2-updaterでインストール

  • gphoto2-updaterでインストールしましょう.依存関係も解消してくれるので以下1コマンドで終わりです.
  • gphoto2-updaterの名前通りで,最新versionへのupdateもできそうです.
wget https://raw.githubusercontent.com/gonzalo/gphoto2-updater/master/gphoto2-updater.sh && chmod +x gphoto2-updater.sh && sudo ./gphoto2-updater.sh


一眼レフカメラをリモート制御してシャッターを切ってみる

  • 一眼レフカメラをRaspberryPiにUSB接続して以下のコマンドを打てば,シャッターが切れ,画像はカメラ側に保存されます.
sudo gphoto2 --capture-image

*動画のREC開始/終了は以下のコマンドです.

sudo gphoto2 --set-config movie=1
sudo gphoto2 --set-config movie=0


Raspberry Pi Tutorial 41: Control a DSLR with your Pi!

pythonでgphoto2が叩ける環境もいれておく

  • python-gphoto2という便利なラッパーばあります.pipで簡単に入ります.
  • これでpythonコードにgphoto2のコマンド埋め込みもできます.
sudo pip install -v gphoto2

まとめ

  • gphoto2-updaterpython-gphoto2を紹介しました.
  • 上記の通り,RaspberryPiで一眼レフカメラをリモート制御する環境を作るのは2017年現在はすごく簡単になっています.
  • ここまで簡単に環境できれば,ガジェット作りもやる気がしますね.

以上

USB型DeepLearningアクセラレータ,"Movidius Neural Compute Stick"をRaspberryPi2で動かしてみた。

はじめに

  • USB型DeepLearningアクセラレータ,"Movidius Neural Compute Stick"をRaspberryPi2で動かしてみました.
  • 基本的な手順はRaspberryPi3と変わりませんが,RaspberryPi2での動いた実績メモです.
  • Caffe modelのコンパイル環境にはUbuntu16.04が必要ですが,コンパイル済みのCaffe model(Graphバイナリ)があれば,Raspbian Jessie(2017-07-05)だけで動ごかせるのがポイントです.その辺を整理して書いてみます.

Movidius Neural Compute Stickとは.

f:id:flow-dev:20170812234951j:plain


Introducing Movidius Neural Compute Stick

MovidiusNCSとRaspberryPi2で動かしてみました。

  • MovidiusNCSとRaspberryPi2,SDKサンプルで動かしてみた事を動画でまとめてみました.
  • CVPR2017で購入したので,現地の状況なども動画に含んでいます.ご参考までに.
  • 2017-08-12現在.日本のRSコンポーネンツでも9900円で購入できそうです.
  • 以下に記載した手順を踏むと,この動画で行っていることができます.
  • 詳細や最新は,Latest version: Movidius™ Neural Compute SDKでご確認ください.(はまりそうなTIPSは細々書いてみました.)


Try Movidius Neural Compute Stick in Raspberry Pi 2

Movidius NCSに必要な,2つの環境.

  • Movidius NCSを使うには,2つの環境が必要となります.
  • 1つ目はCaffe modelをNCS用にコンパイルする環境です.これはUbuntu16.04が必須となります(Raspbian Jessieは今のところ×). 一方でMovidius NCSは不要です.
  • 2つ目はNCS用にコンパイルしたCaffe modelバイナリ(graphと呼ぶ)を実行する環境です.こちらはUbuntu16.04でもRaspbian Jessieでも実行可能です. Movidius NCSは必須です.
  • 今回は,1つ目のCaffe modelをNCS用にコンパイルする環境はRaspberryPi2 + Ubuntu16.04で. 2つ目の実行環境は,RaspberryPi2 + Raspbian Jessie + Movidius NCSで環境を別々に作ってみました.(もちろん分けなくても良いです.また,RaspberryPiではなく,上記OSを準備したPCなら同様に環境構築が可能です)
  • 以下の動画だけ見ると,RaspberryPi2 + Raspbian Jessieのみで全部出来るように見えますが,実はそうではなくて, Caffe modelをNCS用にコンパイルする環境がUbuntu16.04が別途必須なのです.


Getting Started with Neural Compute Stick and Rasbperry Pi 3

① Caffe modelをNCS用にコンパイルする環境を作る(Ubuntu16.04)

1.RaspberryPi2用のUbuntu16.04イメージをここからダウンロード(ubuntu-16.04.3-preinstalled-server-armhf+raspi2.img.xz)して,SDに書き込みます.

2.SDKをダウンロードして解凍します.

wget https://ncs-forum-uploads.s3.amazonaws.com/ncsdk/MvNC_SDK_01_07_07/MvNC_SDK_1.07.07.tgz
tar xvf MvNC_SDK_1.07.07.tgz
tar xvf MvNC_API-1.07.07.tgz
tar xvf MvNC_Toolkit-1.07.06.tgz

3.MvNC_Toolkit-1.07.06をセットアップします.これがCaffe modelをNCS用にコンパイルする環境です.セットアップ完了に3時間はかかったと思います...気長に.(あまりに長すぎて,Caffeのインストール途中で止めてしまい,その後Caffeのビルドが通らなくなったのですが,make cleanしてから,再度./setpu.shすればいけました.)

cd bin
./setup.sh

4.MvNC_API-1.07.07をセットアップします.これがNCS用にコンパイルしたCaffe modelバイナリ(graphと呼ぶ)を実行する環境です.Caffe modelバイナリ(graphと呼ぶ)を生成するために,Ubuntu16.04でCaffe model(Alexnet,Googlenet,Squeezenet,etc)のダウンロードを行い,MvNC_Toolkit-1.07.06に含まれるコンパイラを使ってCaffe modelをコンパイルし,graphを生成します.1点ファイル修正をします.デフォルトのconvert_models.shは,-s 12コンパイルオプションがついておらず,実行速度が半減以下になるので,以下のように書き換えます.(2017-08-12現在. 他のサンプルは,mvNCCompile.pycに対して-s 12コンパイルオプションがついてる場合のあるのですが,なぜかここには付いていない)

convert_models.sh

#!/bin/sh

NCS_TOOLKIT_ROOT='../../bin'
echo $NCS_TOOLKIT_ROOT
python3 $NCS_TOOLKIT_ROOT/mvNCCompile.pyc ../networks/SqueezeNet/NetworkConfig.prototxt -s 12 -w ../networks/SqueezeNet/squeezenet_v1.0.caffemodel -o ../networks/SqueezeNet/graph
python3 $NCS_TOOLKIT_ROOT/mvNCCompile.pyc ../networks/GoogLeNet/NetworkConfig.prototxt -s 12 -w ../networks/GoogLeNet/bvlc_googlenet.caffemodel -o ../networks/GoogLeNet/graph
python3 $NCS_TOOLKIT_ROOT/mvNCCompile.pyc ../networks/Gender/NetworkConfig.prototxt -s 12 -w ../networks/Gender/gender_net.caffemodel -o ../networks/Gender/graph
python3 $NCS_TOOLKIT_ROOT/mvNCCompile.pyc ../networks/Age/deploy_age.prototxt -s 12 -w ../networks/Age/age_net.caffemodel -o ../networks/Age/graph
python3 $NCS_TOOLKIT_ROOT/mvNCCompile.pyc ../networks/AlexNet/NetworkConfig.prototxt -s 12 -w ../networks/AlexNet/bvlc_alexnet.caffemodel -o ../networks/AlexNet/graph
cd ncapi/redist/pi_jessie
sudo dpkg -i *
cd ncapi/tools
./get_models.sh
./convert_models.sh

5.これで,Caffe modelをNCS用にコンパイルする環境作りと,NCS用にコンパイルしたCaffe modelバイナリ(graphと呼ぶ)の生成が完了しました.(ncapi/networks/Googlenetなどにgraphというバイナリファイルが生成出来ていれば成功です)

② NCS用にコンパイルしたCaffe modelバイナリ(graphと呼ぶ)を実行する環境を作る(Raspbian Jessie)

1.RaspberryPi2用のRaspbian JessieイメージをダウンロードしてDDで書き込みます.ここを参考にしました 2.Raspbian Jessieを起動したらapt-getで環境を最新にしておきます.

sudo apt-get upate
sudo apt-get upgrade

3.上記①Caffe modelをNCS用にコンパイルする環境を作るを完了した,ncapiディレクトリ一式を,Raspbian Jessieの実行用環境にフルコピーします.私はWindows環境でTeraTermを使ってssh接続したのちファイルコピーしました.ここを参考に,SCPコマンドを使うとファイルのやり取りが簡単でした. 4.Raspbian Jessie側に,NCS実行環境をインストールします.

cd ncapi/redist/pi_jessie
sudo dpkg -i *

5.SDKのstream_inferサンプルを動かす環境をインストールします.これはUSBカメラを使ったSqueezeNetの1000クラス分類デモを実行できます.(Googlenet等も実行可能です)

sudo apt install gstreamer-1.0
sudo apt install python3-gst-1.0
sudo apt-get install gir1.2-gstreamer-1.0 
sudo apt-get install gir1.2-gst-plugins-base-1.0

6.RaspberryPiで実行用に,ncapi/py_examples/stream_infer/stream_infer.pyを一行書き換えます.

stream_infer.py

#SINK_NAME="xvimagesink"         # use for x86-64 platforms
SINK_NAME="glimagesink" # use for Raspian Jessie platforms

7.Movidius NCSとUSBカメラを接続し,stream_infer.pyを実行すると,リアルタイムでカメラ映像のクラス分類が走ります.(SqueezeNetがper50msくらい,Googlenetがper80msくらいで実行できました.クラス分類の精度の方はまぁこんなものなのでしょうか.結構はっきりした物体じゃないと認識できませんね.

cd ncapi/py_examples/stream_infer/
python3 /stream_infer.py

まとめ

  • USB型DeepLearningアクセラレータ,"Movidius Neural Compute Stick"をRaspberryPi2で動かしてみました.
  • "Movidius Neural Compute Stick"が必要なのはコンパイル済のgraphバイナリを実行するときだけでした(まぁわかれば当たり前ですかね)
  • 次は,SDKサンプル以外のCaffe Modelを実行したり,これを使ったガジェット作りに進みたいと思います.

以上

Windowsですごく簡単にDeep Learningの環境を作る方法!

はじめに

ANACONDAを使えば,WindowsOSでもPython開発環境を簡単に作れる.

  • 今回は,ANACONDAで画像処理とDNNやるときに,かつProxy環境下で使う場合の設定方法についてまとめる.
f:id:flow-dev:20170423115754j:plain


ANACONDAのInstall

ダウンロードはDownload Anaconda Nowから.

  • 今回は,python2.7をベースとした環境構築で記述する.なので, python2.7 versionをダウンロード.
  • このInstallはガイドに従えば簡単.64bit版推奨.
f:id:flow-dev:20170423115750j:plain

ANACONDAのcondaコマンドをproxy環境で使えるようにする.

proxy環境だと,便利なcondaコマンドが使えなくて困る.設定しよう.

usage

proxy_servers:
    http: http://hoge.com:11110
    https: https://hoge.com:11110

PATHを通す

  • C:\Users\hogehoge\AppData\Local\Continuum\anaconda2\ScriptsにPATHを通しておく

python3.5を個別にInstall

tensorflowを使いたいので,python3の環境をInstallする.

usage

  • Anaconda Prompt.exeを管理者権限で実行(なにかinstallする際はこれで)
f:id:flow-dev:20170423115759j:plain
  • 以下実行すれば,python3.5のコアが導入できる.
  • activate py35 / deactivate py35で,環境を有効無効にできる.
conda create -n py35 python=3.5
activate py35
deactivate py35

tensorflowとkerasとsklearn入れる

tensorflowKerassklearnをinstall. * sklearnはデータ前処理で便利なので入れとく.

usage

  • Anaconda Prompt.exeを管理者権限で実行
  • tensorflowはpython3系じゃないと動かないので,activate py35してから.
activate py35
pip install tensorflow
pip install keras
pip install sklearn
  • proxy越しならこんな感じ.(hogeは置き換えて)
activate py35
pip --proxy http://hoge.com:11110 install tensorflow
pip --proxy http://hoge.com:11110 install keras
pip --proxy http://hoge.com:11110 install sklearn

opencv3とdlibをいれる

opencv3Dlibをinstall. * 画像処理をするのと,画像認識系APIとして双方便利. * menpo使うと簡単他にもライブラリまとまってる.

usage

  • Anaconda Prompt.exeを管理者権限で実行
  • python2.7,python3系どっちでも使えるが,今回はpython2.7がベースとして記述する.
conda install -c https://conda.anaconda.org/menpo opencv3
conda install -c https://conda.anaconda.org/menpo dlib


まとめ

  • これで画像処理やDeepleraningをWindowsOSで始める環境が整いました.
  • ここまで出来れば,chainer入れたりとかはadd-onで出来ます.
  • 簡単なんです.

Visual Stadio CodeでC/C++の開発環境を簡単に作る(Windows)

はじめに

f:id:flow-dev:20200204072808p:plain

C/C++環境で困ったこと

Visual Stadio CodeにC/C++ for Visual Studio Codeを導入すれば,C/C++コード検索するための環境はおおよそ整いますが,これだけだと「指定した関数が参照されている先を全て検索する」ができません.. この点だけ、Eclipseより劣るので不便でした.

gtagsの導入で解決

しかし調べてみるとC++Intellisenseと,GNU GLOBAL(gtags)を導入することで,「指定した関数が参照されている先を検索する」が可能になることがわかりました.

設定方法をまとめました

今回はWindows環境で,C++Intellisenseと,GNU GLOBAL(gtags)を導入に関する纏まった情報がなかったので,以下に記述します.

環境の作り方

VisualStadioCodeに拡張機能C++Intellisenseを追加する

f:id:flow-dev:20170109080711j:plain

GNU GLOBAL(gtags)をinstallする

GNU GLOBAL(gtags)とは,C/C++の参照関係を記述したタグファイルを生成するライブラリ. GNU GLOBAL(gtags)が詳しいので,以下はポイントを簡単に.

ターミナルを立ち上げて,gtags.exeを実行する.

  • VisualStadioCodeで,「指定した関数が参照されている先を検索する」を行いたいC/C++コード群のフォルダを開く.
  • VisualStadioCodeから"Ctrl+@"で統合ターミナル(コマンドプロンプト)を起動する.
  • 以下のコマンドで,gtags.exeを利用して,「指定した関数が参照されている先を検索する」ためのタグファイルを生成する.
> gtags.exe -v
  • GPATH, GRTAGS, GTAGSという3つのタグファイルが生成される.
  • [参考]C/C++コードの参照関係を変更したタイミングで,再度gtags.exeを実行する必要がある.

C/C++コード上で.「すべての参照の検索」を実行する.

  • VisualStadioCodeで,「指定した関数が参照されている先を検索する」を行いたいC/C++コードファイルを開く.
  • 任意の関数を反転させて,右クリックまたは,Shift+F12で,すべての参照の検索を実行する.

f:id:flow-dev:20170109080725j:plain

  • gtags.exeでタグファイルが正しく生成されていれば,参照先の一覧が表示される.

エラー(実行できない)時に確認すべき点

  • 任意の関数を反転させて,右クリックまたは,Shift+F12で,すべての参照の検索が出来ない場合は,C++Intellisenseプラグインからhttp://adoxa.altervista.org/global/の導入が出来ていない
  • ※gtags.exeでタグファイルが正しく生成されていなければ,結果がありませんと出る.


参考資料