All posts by chen

RPi : GoogleHome通知

GoogleHomeに喋らせるために
まずpychromecastのインストール。
(env) pi@donkeypi3chen02:~ $ pip install pychromecast
WARNING: You are using pip version 19.3.1; however, version 20.1.1 is available.
You should consider upgrading via the ‘pip install –upgrade pip’ command.
(env) pi@donkeypi3chen02:~ $ pip install –upgrade pip
GTTSのインストール
(env) pi@donkeypi3chen02:~ $ pip install gtts

RPi:SSHでリモート作業

現在のIPアドレスの確認

まず、現在のIPアドレスを調べてください。

$ ifconfig

Wi-Fi接続が完了すると、MacとRaspberryPiは、Wi-Fi経由で接続できます。 まずpingコマンドでネットの接続を確認してください。

$ ping 192.168.0.110
PING 192.168.0.110 (192.168.0.110): 56 data bytes
64 bytes from 192.168.0.110: icmp_seq=0 ttl=64 time=18.073 ms
64 bytes from 192.168.0.110: icmp_seq=1 ttl=64 time=6.089 ms

接続は確認したら、リモートログインへ進んでください。

標準RaspberryPiの SSHを有効化

Raspberry Pi は、デフォルトでSSHはが無効になっています。 有効にするにはraspi-configで設定する必要があるのですが、/bootにsshという名前のファイルを置くだけでも有効にできます。

/bootのパーティションは、Macに接続しただけで, そのままアクセス可能ですので、touchでSSHを有効化できます。

ただし、/boot/sshは、raspi-configで設定されていない場合だけ使用可能です。raspi-configでSSHを無効化した場合は、/boot/sshが存在しても、SSHは有効になりません。

MacOSからリモートログイン

ユーザpiをipのサーバにログインとする。
$ ssh pi@ip

例:

chen@Hong-Mac-mini workspace % ssh pi@192.168.86.140
The authenticity of host '192.168.86.140 (192.168.86.140)' can't be established.
ECDSA key fingerprint is SHA256:9aiGsOD5AIkArHq+ghDIlPUnUi/3zM57WeMmxtCVa+I.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.86.140' (ECDSA) to the list of known hosts.
pi@192.168.86.140's password:
Linux raspberrypi 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l

 

初回ログインする際、fingerprintの確認があります。

一度接続すると、fingerprint記録されるので、次回は確認しなくなる。

同じIPで過去ログインしたPiサーバの中身が入れ替わり、ログインが拒否される。その場合、~.ssh/know_hostに該当する(fingerprintを含めた)項目を削除してください。

 

Windowsからからリモートログイン

Windowsの場合puttyなどターミナルツールを予めインストールしてください。

https://www.putty.org/

putty.exe を起動すると PuTTY 設定 のウィンドウが現れます.
ここで Pi の IP アドレスを入力し, プロトコルに ssh を選択します.

 

RPi : CNNで深層学習

近年、画像分類技術の精度向上には目覚ましいものがあります。深層学習と呼ばれるニューラルネットワークを進化させた技術を画像分類に適用することにより、人間と同程度かそれ以上の高精度を実現できるようになりました。
そのような深層学習モデルの中でも、「畳み込みニューラルネットワーク(Convolutional Neural Network, CNN)」は、視覚野の特徴抽出の仕組みをモデル化したもので、画像解析において高い性能を発揮してきました。
集めた画像を CNNで解析
models/faceがない???
(env) pi@donkeypi3chen02:~/hello_ghome $ mkdir models/face
./dataset
|
|- dataA
|   |- image1a.jpg
|   |- image2a.jpg
|   |- image3a.jpg
|   |-       ・
|   |-       ・
|
|- dataB
|   |- image1b.jpg
|   |- image2b.jpg
|   |-       ・
|   |-       ・
|
沢山フォルダ作った。。。
(env) pi@donkeypi3chen02:~/hello_ghome $ python3 cnn/train.py
WARNING:tensorflow:From /home/pi/env/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.AUTO_REUSE is deprecated. Please use tf.compat.v1.AUTO_REUSE instead.
WARNING:tensorflow:From /home/pi/env/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.AttrValue is deprecated. Please use tf.compat.v1.AttrValue instead.
WARNING:tensorflow:From /home/pi/env/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.COMPILER_VERSION is deprecated. Please use tf.version.COMPILER_VERSION instead.
WARNING:tensorflow:From /home/pi/env/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.CXX11_ABI_FLAG is deprecated. Please use tf.sysconfig.CXX11_ABI_FLAG instead.
WARNING:tensorflow:From /home/pi/env/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.ConditionalAccumulator is deprecated. Please use tf.compat.v1.ConditionalAccumulator instead.
Traceback (most recent call last):
  File “cnn/train.py”, line 17, in <module>
    train_image ,train_label , test_image , test_label = image_dataset.make( img_path, train_num = 90 , test_num = 10 , img_size = IMG_SIZE )
  File “./cnn/util/image_dataset.py”, line 96, in make
    test_image.extend( test[0] )
IndexError: list index out of range
(env) pi@donkeypi3chen02:~/hello_ghome $
やり方間違っているかな?

RPi : 顔画像の自動収集

 

ソースコードの取得

pi@raspberrypi:~ $ git clone https://github.com/sey323/hello_ghome
Cloning into ‘hello_ghome’…
remote: Enumerating objects: 23, done.
remote: Total 23 (delta 0), reused 0 (delta 0), pack-reused 23
Unpacking objects: 100% (23/23), done.
pi@raspberrypi:~ $
pi@raspberrypi:~ $ cd hello_ghome/
pi@raspberrypi:~/hello_ghome $

顔画像の収集

OpenCVには顔認識用のライブラリがあらかじめ用意されており,そちらを利用するだけで簡単に顔画像を収集できる.

それを利用してWebカメラから撮影した画像から,顔領域で切り抜きを行い,保存をするプログラムを作成し画像を収集した.

コード実行してみる

pi@raspberrypi:~/hello_ghome $ mkdir img
pi@raspberrypi:~/hello_ghome $ python3 face_camera/camera.py img/
Traceback (most recent call last):
  File “face_camera/camera.py”, line 38, in <module>
    main(save_path)
  File “face_camera/camera.py”, line 26, in main
    camera_facedetect(save_path)
  File “face_camera/camera.py”, line 16, in camera_facedetect
    face_list = detector.face_detect( image )
  File “/home/pi/hello_ghome/face_camera/detector.py”, line 18, in face_detect
    facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
cv2.error: OpenCV(4.1.1) /home/pi/opencv-python/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function ‘detectMultiScale’
エラーに出会いました!!!

* 原因

調べてみたら、カスケードファイルのパスが異なることで起こっているエラーのようです。

* 解決策

pi@raspberrypi:~/hello_ghome $ vi face_camera/detector.py
プログラムに、haarcascadeファイル場所をみる、ありませんね。
pi@raspberrypi:~/hello_ghome $ ll /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml
ls: cannot access ‘/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml’: No such file or directory

haarcascadeファイルの場所を確認。

pi@raspberrypi:~/hello_ghome $ locate haarcas
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_eye.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_eye_tree_eyeglasses.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_frontalcatface.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_frontalcatface_extended.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_frontalface_alt.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_frontalface_alt2.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_frontalface_alt_tree.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_frontalface_default.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_fullbody.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_lefteye_2splits.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_licence_plate_rus_16stages.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_lowerbody.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_profileface.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_righteye_2splits.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_russian_plate_number.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_smile.xml
/usr/local/lib/python3.7/dist-packages/cv2/data/haarcascade_upperbody.xml
/usr/share/gst-plugins-bad/1.0/opencv_haarcascades
/usr/share/gst-plugins-bad/1.0/opencv_haarcascades/fist.xml
/usr/share/gst-plugins-bad/1.0/opencv_haarcascades/palm.xml
pi@raspberrypi:~/hello_ghome $

ファイルリンクしてみる

pi@raspberrypi:~/hello_ghome $ sudo mkdir /usr/local/share/OpenCV
pi@raspberrypi:~/hello_ghome $ cd /usr/local/share/OpenCV
pi@raspberrypi:/usr/local/share/OpenCV $ sudo ln -s /usr/local/lib/python3.7/dist-packages/cv2/data haarcascades
pi@raspberrypi:/usr/local/share/OpenCV $ ll
total 0
lrwxrwxrwx 1 root root 47 Jul 3 00:26 haarcascades -> /usr/local/lib/python3.7/dist-packages/cv2/data

再度, 同じコマンドでファイル確認できた。

pi@raspberrypi:/usr/local/share/OpenCV $ ll /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml
-rw-r–r– 1 root staff 676709 Jul 2 15:37 /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml

再度Webカメラから撮影した画像から,顔領域で切り抜きのコードを実行
pi@raspberrypi:~/hello_ghome $ python3 face_camera/camera.py img/
img//2020-07-03-003242_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003243_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003244_0.jpgis clip and saved!
img//2020-07-03-003245_0.jpgis clip and saved!
img//2020-07-03-003245_0.jpgis clip and saved!
img//2020-07-03-003248_0.jpgis clip and saved!
顔検出するたび、保存できた。

参考

RaspberryPi+GoogleHome+Webカメラで顔認識でお出迎えしてくれるGoogleHomeを構築する

RPi:VNCでリモート作業

できれば手元のMacから、Raspberry Piのデスクトップ画面をマウスとかトラックパッドで操作できたら便利。
というわけで、今回はVNCを使ったリモートデスクトップ接続にチャレンジしていきます!

MacのFinderからVNC接続

MacのFinderからVNCで接続するには
  1. 起動方法は簡単です。 Finderを起動して、メニューバーの「移動」ー「サーバへ接続」を選択します。 …
  2. サーバアドレスには「vpn://220.99.0.xx:ポート番号」の書式で入力します。 …
    例:vnc://192.168.86.140:5901
  3. 認証画面が表示されますので、VNCサーバで指定しているパスワードを入力します。

もし、接続できない場合、VNCの最新プロトコルに対応してない可能性があるので、次のRealVNCを利用した接続を試しましょう。

RealVNCを利用した接続

Raspberry Pi に毎回 HDMI・キーボ・マウスをつなぐのが面倒、SSHはまた慣れてない、MacとかからGUIで触れるようにしたい。その場合RealVNCを利用という選択肢があります。

Raspbian OSにはVNCサーバ(RealVNC)が組み込まれていますが、既定では無効になっています。

 

VNCビューアのインストール

RealVNCと互換性のあるVNCクライアントアプリを用意してください。

(macOSの場合、VNCクライアントなくでも、Finderから利用できます。)

Download VNC Viewer to the device

使用しているPCがMacの場合は、上記サイトを開いてから [macOS] アイコンをクリックしてください。
その後、画面中央の [DOWNLOAD VNC VIEWER]をクリックしてインストールイメージ(dmgファイル)をダウンロードします。

VNCビューアの起動

インストールされた「VNC Viewer」を起動します。
初期起動画面が表示されるので、そのまま[GOT IT]ボタンをクリックします。

ビューア画面が表示されたら、アドレス入力欄に Raspberry Pi のIPアドレスを入力して [enter]キーを押下します。

ログインユーザ名とパスワードを入力して [OK]ボタンをクリックします。

 

Piのサーバ設定

VNCを有効にする

最初からデスクトップ版のイメージでSDカードを作成した場合、VNCもインストールされ、これを有効化すればVNCクライアントから接続できるようになります。

Raspberry Pi を起動してデスクトップ画面が表示されたら、メニューバー左端のラズベリーアイコンをクリックします。
表示されたプルダウンメニューから [設定]-[Raspberry Piの設定]をクリックします。

「Raspberry Piの設定」画面で「インタフェース」タブをクリックし、[VNC]の「有効」を選択してから[OK]ボタンをクリックします。

VNCをインストール

次は、Piのターミナル版からインストールするので、たくさんのパッケージが必要だが、最初からデスクトップ版のイメージでSDカードを作成した場合不要。
(env) pi@donkeypi3chen02:~ $ sudo apt-get install tightvncserver
(env) pi@donkeypi3chen02:~ $ tightvncserver
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LANG = “ja_JP.utf8”
    are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).
You will require a password to access your desktops.
Password:
Warning: password truncated to the length of 8.
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Password too short
xauth:  file /home/pi/.Xauthority does not exist
New ‘X’ desktop is donkeypi3chen02:1
Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/donkeypi3chen02:1.log
今度、さらにxserver-xorg必要
(env) pi@donkeypi3chen02:~ $
sudo apt-get install –no-install-recommends xserver-xorg
sudo apt-get install –no-install-recommends xinit
sudo apt-get install raspberrypi-ui-mods

Ref:

GUIDE: Raspbian Lite with RPD/LXDE/XFCE/MATE/i3/Openbox/X11 GUI

RPi:Install Open CV

システムを最新版に更新

以下のコマンドを実行して、最新版に更新します。
pi@raspberrypi:~ $ sudo apt-get update
Get:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]
Get:2 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
Get:3 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages [13.0 MB]
Get:4 http://archive.raspberrypi.org/debian buster/main armhf Packages [330 kB]
Get:5 http://raspbian.raspberrypi.org/raspbian buster/non-free armhf Packages [104 kB]
Fetched 13.5 MB in 11s (1,246 kB/s)
Reading package lists… Done
pi@raspberrypi:~ $ sudo apt-get upgrade
Reading package lists… Done
Building dependency tree
Reading state information… Done
Calculating upgrade… Done
The following package was automatically installed and is no longer required:
rpi-eeprom-images
Use ‘sudo apt autoremove’ to remove it.
The following packages will be upgraded:
arandr ca-certificates firmware-atheros firmware-brcm80211 firmware-libertas firmware-misc-nonfree firmware-realtek libfm-data libfm-extra4
libfm-gtk-data libfm-gtk4 libfm-modules libfm4 libgnutls30 libnode-dev libnode64 libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc
libraspberrypi0 libvlc-bin libvlc5 libvlccore9 lxpanel lxpanel-data nodejs nodejs-doc pcmanfm pi-greeter pi-package pi-package-data
pi-package-session piclone pipanel piwiz raspberrypi-bootloader raspberrypi-kernel raspberrypi-ui-mods raspi-config rp-bookshelf rp-prefapps
rpi-chromium-mods rpi-eeprom rpi-eeprom-images scratch2 vlc vlc-bin vlc-data vlc-l10n vlc-plugin-base vlc-plugin-notify vlc-plugin-qt
vlc-plugin-samba vlc-plugin-skins2 vlc-plugin-video-output vlc-plugin-video-splitter vlc-plugin-visualization
57 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 225 MB of archives.
After this operation, 7,697 kB disk space will be freed.
Do you want to continue? [Y/n] y
。。。

Processing triggers for ca-certificates (20200601~deb10u1) …
Updating certificates in /etc/ssl/certs…
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d…

done.
done.
Processing triggers for libvlc-bin:armhf (3.0.11-0+deb10u1+rpt1) …
pi@raspberrypi:~ $

 

opencvインストール

opencvインストールしてみる。
(env) pi@donkeypi3chen02:~ $ sudo pip3 install opencv-python
Collecting opencv-python

Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-4.1.1.26-cp37-cp37m-linux_armv7l.whl (10.0MB)

100% |████████████████████████████████| 10.0MB 45kB/s

Requirement already satisfied: numpy>=1.16.2 in /usr/lib/python3/dist-packages (from opencv-python) (1.16.2)

Installing collected packages: opencv-python

Successfully installed opencv-python-4.1.1.26

(2023/1/18 update)最近上記のコマンドでbuildが延々と終わらない、最後にエラーになりました。数日悩んだ解決策は:

pipのバージョンが古いため起きる問題ではないかと、試す。

pi@chlab-a71b3eca:~ $ pip install –upgrade pip
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pip in /usr/lib/python3/dist-packages (20.3.4)
Collecting pip
Using cached pip-22.3.1-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
WARNING: The scripts pip, pip3, pip3.10 and pip3.9 are installed in ‘/home/pi/.local/bin’ which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use –no-warn-script-location.
Successfully installed pip-22.3.1

それでも効果がない!

https://teratail.com/ でARMアーキテクチャでは cmake の問題で OpenCV のビルドに失敗するようです。ビルド済みのパッケージのインストールではいいらしい。

pi@chlab-a71b3eca:~ $ sudo apt-get update
Get:1 http://raspbian.raspberrypi.org/raspbian bullseye InRelease [15.0 kB]
Get:2 http://archive.raspberrypi.org/debian bullseye InRelease [23.6 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [311 kB]
Fetched 349 kB in 3s (124 kB/s)
Reading package lists… Done
pi@chlab-a71b3eca:~ $ sudo apt-get install python-opencv
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
E: Unable to locate package python-opencv

ビルド済みのパッケージがない?

pi@chlab-a71b3eca:~ $ sudo apt-get install python3-opencv

これてうまくいく。

opencvで動作確認

追加パッケージ

必要なライブラリが足りないと、プログラム中エラーになるので、さらに不足のライブラリを一気に追加する。

$ sudo apt-get install libjasper-dev
$ sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig libqt4-test
$ sudo apt-get install libatlas-base-dev

Pythonからopencvの動作確認する。

環境変数にLD_PRELOAD追加

(env) pi@donkeypi3chen02:~ $ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.2.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import cv2
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “/usr/local/lib/python3.7/dist-packages/cv2/__init__.py”, line 3, in <module>
    from .cv2 import *
ImportError: /usr/local/lib/python3.7/dist-packages/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_fetch_add_8
>>>
ネットで調べて、次の処置で通りました。
.bashrcに、export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1 #この一文を追加
(env) pi@donkeypi3chen02:~ $ vi .bashrc
(env) pi@donkeypi3chen02:~ $ source .bashrc

ついにopencvの動作確認でき

ここまで苦労して、ついにopencvの動作確認できた。
(env) pi@donkeypi3chen02:~ $ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.2.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import cv2
>>> cv2.__version__
‘4.1.1’
>>>
ここまで、成功

参考

  • https://creepfablic.site/2020/04/10/python-opencv-error/ 
  • https://qiita.com/muramasa2/items/80a2cae31bafb9de0ea2
  • https://teratail.com/questions/301644

RPi:カメラの利用

USBカメラの利用

USBカメラ挿入、dmesgコマンドで、次のメッセージが追加されていることを確認。
[ 3290.950364] usb 1-1.5: new high-speed USB device number 5 using dwc_otg
[ 3291.100866] usb 1-1.5: New USB device found, idVendor=056e, idProduct=7009, bcdDevice= 1.00
[ 3291.100880] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3291.100889] usb 1-1.5: Product: UCAM-DLD200BA
[ 3291.100899] usb 1-1.5: Manufacturer: Novatek
[ 3291.175879] uvcvideo: Found UVC 1.00 device UCAM-DLD200BA (056e:7009)
[ 3291.241082] uvcvideo 1-1.5:1.0: Entity type for entity Extension 5 was not initialized!
[ 3291.241098] uvcvideo 1-1.5:1.0: Entity type for entity Processing 4 was not initialized!
[ 3291.241110] uvcvideo 1-1.5:1.0: Entity type for entity Selector 3 was not initialized!
[ 3291.241121] uvcvideo 1-1.5:1.0: Entity type for entity Camera 1 was not initialized!
[ 3291.241519] input: UCAM-DLD200BA: UCAM-DLD200BA as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/input/input6
[ 3291.241912] usbcore: registered new interface driver uvcvideo
[ 3291.241918] USB Video Class driver (1.1.1)
[ 3291.321345] usbcore: registered new interface driver snd-usb-audio
(env) pi@donkeypi3chen02:~ $

USB デバイス一覧からも確認

pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 008: ID 056e:7009 Elecom Co., Ltd
Bus 001 Device 003: ID 046d:c534 Logitech, Inc. Unifying Receiver
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $

デバイスのリストからも確認

(env) pi@donkeypi3chen02:~ $ ls /dev/video*
/dev/video0  /dev/video1  /dev/video10  /dev/video11  /dev/video12

ソフトでカメラの確認

guvcview

カメラの確認するソフトは色々ありますが、今回はguvcviewを使用してみました。

pi@raspberrypi:~ $ sudo apt-get install guvcview

VNCから、Piに接続し、メニューのからguvcviewを探して、起動してみてください。
起動するとエラーで何も表示しないからあせったが、再起動したら、見れるようになった。

fswebcam

raspberrypi公式サイトでは、fswebcamを利用している
pi@raspberrypi:~/hello_ghome $ sudo apt install fswebcam
pi@raspberrypi:~ $ cd Pictures/
こちらも
pi@raspberrypi:~/Pictures $ fswebcam image.jpg
— Opening /dev/video0…
Trying source module v4l2…
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384×288 to 352×288.
— Capturing frame…
Captured frame in 0.00 seconds.
— Processing captured image…
Writing JPEG image to ‘image.jpg’.
pi@raspberrypi:~/Pictures $

公式内蔵カメラの利用

カメラを有効にする

「sudo raspi-config」を起動して、「Legacy Camera Enable/disble legacy camera support」を選択して、Enableしてください。

カメラの回転

カメラ回転の場合、次のコマンドでファイルに v4l2-ctl –set-ctrl=rotate=90 を/etc/rc.local に追加。

pi@raspberrypi:~ $ sudo vi /etc/rc.local

カメラの認識

コマンドの次の行に「supported=1 detected=1」と表示されたら、カメラが認識されていることになります。

pi@raspberrypi:~ $ vcgencmd get_camera

supported=1 detected=1

pi@raspberrypi:~ $ 

写真を撮影

カメラモジュールが正常に認識できていることを確認できたら、実際に写真を撮影してみましょう。

写真撮影の操作もコマンドを入力して行います。

LXTerminalで「sudo raspistill -o image.jpg」と入力して実行します。

コマンドを実行すると、撮影画像が画面上に5秒ほど表示されます。

 

参考

  1. https://www.raspberrypi.org/documentation/usage/webcams/
  2. https://uepon.hatenadiary.com/entry/2017/01/22/170349 ーー RaspberryPiでUSB接続のWebカメラを使ってみる
  3. https://www.pc-koubou.jp/magazine/17276 ーー Raspberry Piとカメラモジュールを接続する

RPi:SDカード作成

Downloads

最新版の「Raspberry Pi OS」をダウンロードして下さい。

https://www.raspberrypi.org/downloads/

Raspberry Piユーザーは、Windows、macOS、Ubuntuで利用可能な新しいRaspberry Pi Imagerをダウンロードして使用できるようになります。

 

このユーティリティは、メカニクスに導入したいくつかのショートカットのおかげで、使いやすく、非常に高速です。

(今まではEtcherを使い焼き込みます。 https://www.balena.io/etcher/

 

初めて起動する

初めて起動する場合、 RaspberryPi にできたSDカードを差し込み、下記のものを接続し、電源は最後に接続する。

  • USBキーボード
  • HDMIディスプレイ
  • 電源(5V、2.5A)

ディスプレイで RaspberryPi用イメージ の起動を確認する。

 

Raspberry Pi基本のセットアップ

Raspberry Pi基本のセットアップについて、Linux & Raspberry Piを参照してください。

次は機械学習に必要なセットアップ手順;

  • 「Hostname」に好きなホスト名
  • Change Passwordからパスワード変更
  • 「SSH」の「Enable」
  • 「Camera」の「Enable」
  • 「Set Locale」の「Japan」
  • 「Set Timezone」は「Japan」
  • 「Keyboard」は「Japanese」

OKをクリックすると「再起動」

次は、システムを最新状態に更新

 

1 sudo apt update
2 sudo apt upgrade

固定IPに

 

リモート作業がメインになるので、IPアドレスしょっちゅう変えじゃうと困りますね。

IPアドレスを固定することができる。まず現在のIPを調べる。

$ ifconfig

 

そのIP範囲に固定のIPアドレスを設定。

$ sudo vi /etc/dhcpcd.conf

interface wlan0
static ip_address=192.168.0.70/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

CV(3) Eye Mosaic

検出領域にモザイク処理

検出した領域にモザイクをかけたりすることもできる。

Viでサンプルコードを作成

$ vi test3.py 

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'
                   'OpenCV/haarcascades/haarcascade_eye.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

ratio = 0.05

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        # cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
        eye = face[ey: ey + eh, ex: ex + ew]
        small = cv2.resize(eye, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
        face[ey: ey + eh, ex: ex + ew] = cv2.resize(small, (ew, eh), interpolation=cv2.INTER_NEAREST)

cv2.imwrite('data/dst/opencv_eye_detect_mosaic.jpg', src)

処理結果

$ python2 test3.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 512
drwxr-xr-x 4 chen staff 128 6 25 01:45 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 108333 6 25 01:51 opencv_eye_detect_mosaic.jpg
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_eye_detect_mosaic.jpg が作成されたことが確認した。

ESP32-CAMをテスト

Aliexpressで昨年8月購入した5ドル+送料の激安 ESP32-CAMは放置したまま、冬休み期間テストしてみることに。

配線

ESP32-CAM自体シリアルーUSB通信機能がないので、プログラムを書き込んだりするためにはUSB/TTLシリアルコンバーターが必要になる。300円でAmazonから購入した、Raspberry Pi ラズベリーパイ用の USB-TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル を使用した。黒い台はDonkeyCar 車台の不良品を利用。黄色テープも地面にDonkeyCarのトラックを作る際用意したもの。

IMG_3272

配線部分を拡大した写真です。青い線は、書き込み時には、ESP32-CAMのIO0とGNDをショートして行う。

USB-TTL ESP32-CAM
TXD ( 緑 ) UOR
RXD ( 白 ) UOT
( IO0 – GND )
5V 5V
GND GND

 

IMG_3266

プログラム

ボードマネージャーを使用してESP32ボードを追加する必要があります。

これを完了すると、Arduino IDEボードマネージャーにESP32ボードのリストが表示されます。このリストからA-Thinker ESP32-CAMボードを選択します。

使用するサンプルスケッチは、CameraWebServerスケッチです。次のようにロードできます。

  • Arduino IDEを開きます
  • トップメニューバーの[ファイル ]メニュー項目をクリックします。
  • 下にスクロールして、[  ]をクリックします。サブメニューが開きます。
  • サブメニューを下にスクロールして、Example for A-Thinker ESP32-CAMを探します。
  • この下には、ESP32のエントリが表示されます。それをクリックすると、別のサブメニューが開きます。
  • このサブメニューからカメラを選択します。
  • CameraWebServerを選択します

このスケッチはESPO32-CAMをフル機能のオンラインカメラに変え、顔検出機能と豊富なコントロールを完備しています。これは、ESP32-CAM機能の非常に印象的なデモです。

スケッチを使用する前に、ネットワークに合わせてスケッチを修正し、正しいESP32モジュールを選択する必要があります。

  • 「カメラモデルの選択」という行の下で、ボードの正しいエントリを選択する必要があります。私が使用したもの(そして最も人気のあるもの)はCAMERA_MODEL_AI_THINKERです
  • その下に、SSIDの行が表示されます。ここにネットワークのSSIDを入力します。
  • SSIDの下の行にネットワークアクセスパスワードを入力します。

ESP32-CAMは2.4 GHz WiFiネットワークでのみ機能することに注意してください。

スケッチのコンパイルには時間がかかる場合がありますが、これは正常です。完了したら、USBケーブルを取り外し、ジャンパー線を取り外してから、USBケーブルを再接続して、ボードの電源を再びオンにします。

シリアルモニターを開き、ボーレートが115,200 bpsに設定されていることを確認します。次に、ESP32-CAMモジュールのリセットスイッチを押します。

初期化情報に続いて、ボードがネットワークに接続し、IPアドレスを取得したことを示すメッセージが表示されます。IPアドレスは、http://192.168.0.180などのURLの形式になります。

このアドレスをコピーして、Webブラウザーのアドレスバーに貼り付けます。Webブラウザーは、ESP32-CAMが接続されているのと同じネットワーク上にある必要があります。

操作

ブラウザで、いろいろ操作できそう。

これで、カメラのWebページが表示され、いくつかのコントロールが表示されます。 

[ストリームの開始]ボタンをクリックして、ビデオをストリーミングします。画面上部のドロップダウンを使用して、ビデオのサイズとフレームレートを変更できます。

一応、顔の登録と認識までできたが、後日また補足する。

電源

ESP32は非常に低いスタンバイ電流で動作できますが、無線の動作時に大量の電流を消費するため、WiFiとBluetoothの両方のパフォーマンスに影響を与える可能性があります。

電源の問題があるかどうかを判断する1つの方法は、ESP32-CAMの起動時にシリアルモニターを観察することです。「ブラウンアウト状態」が検出されたというメッセージが表示された場合は、ESP32-CAMが供給できる電流よりも多くの電流を引き込もうとしている可能性があります。

参考

ESP32-CAM Video Streaming and Face Recognition with Arduino IDE