画像認識のための Raspberry Pi セットアップもいよいよカメラ設置段階まで進みました。今回の目標は Raspi でデジタルカメラを動作させて、得られた画像データをネットワークHDD (NAS) に転送することです。
ストレージも USB ポート数も何もかもが不足している Raspi の弱点はネットワーク接続機器を使って補います。
カメラモジュール
一般的に Raspi でカメラと言えば、カメラモジュールを用います。私も「ちょっと珍しいから」という理由で赤外線カメラモジュールを購入しました。
Raspberry Pi Camera Module V2 カメラモジュール
後述する理由から一般的なカメラモジュールは購入を見送りましたが、赤外線カメラでも接続方法は変わるところはありません。
モジュールに繋がっているフレキシブルケーブル (FFC)を Raspi 回路基板のクリップに差し込めば接続完了です。
Raspberry Pi Zero W の場合にはモジュール付属ケーブルの形状が合いませんので、モジュールからフレキケーブルを引き抜いて、対応するケーブルに差し替える必要があります。
このケーブルは専用ケースの付属品になっていますので、ケースを購入すると一緒に入手できます。
このモジュールを接続した状態で、ターミナルから以下のコマンドを打ち込むと動作確認ができます。
1 |
$ raspistill -o ~/Desktop/cam.jpg |
さらに画像の上下を反転させたり、ビデオやタイムラプスを撮影することも可能です。詳しくは公式のドキュメントに詳細が書いてあります。
WEBカメラ
カメラモジュールは簡単に使えて便利なのですが、私のそもそもの目的はコンベアベルトを作成することです。
この目的であれば、電子部品としては高額であまり入手性もよくない公式モジュールを使用しなくても十分な可能性があります。
また、モジュールに付属するフレキケーブル (FFC) やフレキ基盤 (FPC) も本音を言えば、あまり積極的に使いたい部品ではありません。繊細で壊れやすいためです。
市販品のデジタルカメラにも使用されている部品ですが、故障品を修理に出したときに補修部品としてよく見かける印象があります。
さらには学生時代にレンズスパナレンチを使ってオートフォーカスレンズを分解したときにも、自身で誤って破断させました。苦い経験です(※保証対象外になりますので真似しないでください)。
そこで、できればフレキケーブルは使用しておらず、複数個を調達することを考えて、もっと安価かつ入手性の良いカメラを探して行き着いた先が WEB カメラです。
こちらは USB ケーブルに Micro USB 変換コネクタを噛ませて Raspi の USB ポートに接続すれば、使用できるようになります。当然ながら Raspi 以外の普通の Linux デスクトップ PC でも問題なく使用できます。
使い方も lsusb コマンドで接続を確認、fswebcam コマンドで静止画キャプチャを作成、ffmpeg コマンドでビデオを録画といった具合に Linux マシンでいつもやっていることと変わりません。
1 2 3 4 5 6 7 8 |
$ lsusb Bus 001 Device 002: ID 058f:6366 Alcor Micro Corp. Multi Flash Reader Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ fswebcam -d /dev/video0 -r 1280x720 ~/Desktop/cam.jpg $ ffmpeg -t 30 -f v4l2 -framerate 25 -i /dev/video0 ~/Desktop/output.mkv |
これでファイル作成に成功していれば、画像認識用のプログラムからでも問題なく呼び出せるはずです。なんだか、こちらの方が使い慣れていて安心感がありますが、画質の面ではピクセル数 3280 × 2464 の SONY IMX219 を搭載した Raspi カメラモジュール(Camera Module v2) の方に利があります。
カメラから静止画像やビデオが取り込めるようになりましたら、次に問題になるのはストレージです。
画像認識の学習用データを自作しようと思ったら、どれだけ容量の大きなSDカードを用意したところで気休め程度にしかなりません。
むしろSDカードを補助記憶装置がわりに使用する Raspi の性質を考慮すると、学習データごときで容量を圧迫するのは「もったいない」とすら思えてきます。そこでデータの保存には無線接続されたハードディスク(NAS)をすることを考えます。
NAS(ネットワーク接続ストレージ)
一般的に市販されている NAS を購入してきて無線 LAN ルータやハブに接続すると、機器の内部ではローカル IP アドレスという 32bits のユニークな整数値が割り当てられます(※表示としては10進法に変換されて4桁ごとにドットで区切られたものが用いられます)。
このIPアドレスに同じネットワークに繋がっているパソコンやスマートフォンから接続すると、データを転送して保存したり、読み込んだりすることができるようになります。
Raspi を含む Linux マシンからローカル IP アドレスを調べるには、ずばりネットワーク自体のアドレスに対してホストスキャンをかければ一覧が表示されます。ネットワーク(※正確にはクラスCネットワークといいます)自体のアドレスは 192.168.1.0 に決まっているので対象の IP アドレスは 192.168.1.0 です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ sudo apt -y install nmap $ sudo nmap -sn 192.168.1.0/24 [sudo] password for Goddard: Starting Nmap 7.60 ( https://nmap.org ) at 2019-08-31 13:04 JST Nmap scan report for _gateway (192.168.1.1) Host is up (0.00036s latency). MAC Address: 00:00:00:00:00:00 (Mitsubishi Electric) Nmap scan report for 192.168.1.3 Host is up (0.044s latency). MAC Address: 00:00:00:00:00:00 (Sony Mobile Communications AB) Nmap scan report for 192.168.1.6 Host is up (0.12s latency). MAC Address: 00:00:00:00:00:00 (Asustek Computer) Nmap scan report for 192.168.1.10 Host is up (0.11s latency). MAC Address: 00:00:00:00:00:00 (Hon Hai Precision Ind.) Nmap scan report for 192.168.1.11 Host is up (0.11s latency). MAC Address: 00:00:00:00:00:00 (Raspberry Pi Foundation) Nmap scan report for 192.168.1.13 Host is up (0.00024s latency). MAC Address: 00:00:00:00:00:00 (I-O Data Device) Nmap scan report for Ganymede (192.168.1.7) Host is up. Nmap done: 256 IP addresses (7 hosts up) scanned in 6.56 seconds |
ここで私が使用している NAS は I-O DATA LAN DISK なので、目的のローカル IP アドレスは 192.168.1.13 と言うことがわかります。
I-O DATA NAS 4TB RAID 1/デュアルコアCPU/高速モデル/2ドライブ/日本製 3年保証
I-O DATA もしくは組み込み Linux と Samba で動いている NAS をお持ちの方は、試しにウェブブラウザから NASのローカルIPアドレス(私の場合では http://192.168.1.13/) にアクセスされると、そのまま設定画面にアクセスできちゃったりします。
この IP アドレスの SMB/CIFS ファイルシステムにある任意のディレクトリを Raspi にマウントしてしまえば、ターミナルやファイルシステムから自由にアクセスできるようになります。
ここではルート直下にある disk1 ディレクトリをマウントします。お使いの環境によっては share だったり Public だったりと言った別の名前がつけられているかもしれませんので、適宜改編してください。
1 2 3 |
$ sudo apt install cifs-utils $ sudo mkdir /mnt/iodata && chmod 755 /mnt/iodata $ sudo mount -t cifs //192.168.1.13/disk1 /mnt/iodata -o username=PI,password=RASPBERRY,iocharset=utf8 |
うまく実行できましたら、カメラから取得したデータを実際に保存してみます。うまく保存できていれば成功です。
1 2 |
$ sudo mkdir /mnt/iodata/raspberryPi/ $ sudo fswebcam -d /dev/video0 -r 1280x720 /mnt/iodata/cam.jpg |
再起動時に毎回マウントすることが面倒であれば、あらかじめ設定しておけば起動時に自動的にマウントされます。
1 2 |
$ sudo vi /etc/fstab //192.168.1.13/disk1 /mnt/iodata cifs username=PI,password=RASPBERRY,file_mode=0755,dir_mode=0755,iocharset=utf8, |
これでようやくカメラを使って画像認識をはじめる準備が整いました。ここまで来て、ようやく学習データづくりとソフトウェアの着手に取り掛かれます。
まだまだ先は長いのです。