2024年2月19日月曜日

カラー図解 Raspberry Piではじめる機械学習 補足情報トップ

はじめに

本ページは、金丸隆志著「Raspberry Piではじめる機械学習」(講談社ブルーバックス)の補足情報をまとめるためのページです。

下記の2つのページと合わせて本書をお読みください。サンプルファイルへのリンクは2つ目のページのトップにあります。
下記にはさらに興味がある方向けの情報を記します。

[Raspberry Pi 5]


[Windows / macOS での演習実行について]


[カメラでの演習実行について]


[TensorFlowについて]


[機械学習と電子工作]


[物体検出と姿勢推定について]

以下は、今となっては古くなったのでサポートを停止した情報です。
(実用的な速度で動作しなかったり、高価な Coral USB Accelerator が必要だったり)

[その他]

以下は必要に応じて参照してください。
最後に、読者の方々の感想などを下記にまとめます。


8 件のコメント:

  1. Busterの場合、環境変数の設定でexport文が使えないようですが、プロキシの設定はどのようになるでしょうか?

    返信削除
    返信
    1. Busterで「環境変数の設定でexport文が使えない」ということはないと思うのですが、
      どこかにそのような記述があるのでしょうか。

      なお、本書および本サイトではexportで環境変数を設定する手法を紹介しておらず、
      ファイル /etc/environment に設定を記述する方法をとっています。

      詳細は以下をご覧ください。

      プロキシ(Proxy)環境下での本書の演習の実行
      https://mlbb1.blogspot.com/2018/03/proxy.html

      削除
  2. ご回答ありがとうございました。expor文の記述についてはSlackにありました。
    https://raspberrypi.stackexchange.com/questions/68580/how-do-i-set-proxy-in-raspberry-pi-raspbian-os-or-any-linux-using-command-li

    プロキシ(Proxy)環境下での本書の演習の実行を拝見させていただきました。
    export使用されていないですね。大変失礼いたしました。
    ブラウザの閲覧ですが、
    http_proxy=http://プロキシサーバー名:ポート番号/
    https_proxy=http://プロキシサーバー名:ポート番号/
    ftp_proxy=http://プロキシサーバー名:ポート番号/
    に、no_proxy="localhost,127.0.0.1"を追加するだけで良かったでしょうか?
    接続できない場合に疑うべき点や対策などあればアドバイスをお願いします。

    返信削除
    返信
    1. まず最初に理解して頂きたいことは、本ページは本書および本サイトに記した内容への質問やコメントを受け付けるページであるということです。
      外部のサイトに書かれた内容に対する質問は受け付けておりませんのでご注意ください。

      以上のことを理解して頂いた上で、一つコメントするとすれば、
      システムの設定ファイル /etc/environment では
      昔から export を用いない記法が基本であるということです。

      export を用いる記法は、
      ユーザー用設定ファイル .bashrc などで利用される記法ですが、
      本書および本サイトでは .bashrc の利用法を紹介していません。

      本件に関する回答は以上とさせてください。
      よろしくお願いします。

      削除
  3. 本書を通じて、楽しく機械学習を学ばせていただいております。ところで、本書310ページにおいて質問があります。コマンドを実行して結果をみたところ、「theanoはインストールされていません」となり、本書の記載内容と異なる結果が出てしまいました。もし解決方法がありましたらお教えいただけないでしょうか?なお、次の手順においてleafpad には何も表示されません。お手数ですが回答頂けると嬉しいです。よろしくお願いします。

    返信削除
    返信
    1. コメントありがとうございます。

      まず、書籍の内容は古くなっており、実行コマンドが変更になっていることがあります。
      さらに、書籍は python2 用に記述されていましたが、
      現在は python3 で実行することを前提としています。

      それらの変更や変更後のコマンドは下記のページで紹介されています。

      書籍で用いたコマンドおよび追加情報
      https://mlbb1.blogspot.com/2018/03/blog-post.html

      上記ページには、書籍のページの順番で補足内容が記述されています。
      今回の場合、該当するのは上記ページの下記のセクションです。

      p.308 kerasとtheanoの利用の前に
      p.308 kerasとtheanoの利用に必要なツールをインストールするためのコマンド
      p.309 kerasとtheanoをインストールするためのコマンド

      これらのセクションに書かれているインストールコマンドを列挙しますと
      下記のようになります。

      (1)
      sudo apt update

      (2)
      sudo apt install python3-sklearn python3-pil.imagetk mpg321

      (3)
      sudo apt install python3-opencv

      (4)
      sudo apt install liblapack-dev libhdf5-dev python3-h5py

      (5)
      sudo pip3 install keras==2.3.1 theano


      上記コマンド(1)~(3)は9章までに実行済であるコマンドの再掲、
      (4)、(5) が10章で新たに実行すべきコマンドです。

      theano がインストールされていない場合、
      (5) が適切に実行されていないことが考えられますが、
      (4) もインストールされていないと
      演習を実行できませんのでご注意ください。

      なお、実行も python3 での実行が前提となりますので、
      下記の二択となります。

      ・Thonnyでの実行
      ・コマンド「python3 ml-03-01-version.py」での実行

      よろしくお願いします。

      削除
  4. こんにちは。今更ながら貴著で勉強させて頂いております。一つ質問があります。
    「8.5画像の用意と学習」のml-08-03-learn.pyに関してです。
    付録と照らし合わせたり確認用のコードを書いて理解を進めていた所、二値化した画像を取り込んでいるので変数imgは0か255の数値しか取らないのですが、cv2.warpAffineでimgを回転させたもの(img_rot)は色々な数値を格納していることがわかりました。
    これは何故でしょうか?
    回転とは配列の中の要素(0 or 255)をそのまま移動先のインデックスに移動させるだけでは無いのでしょうか?
    自分のレベルと致しましては
    ・過去に別言語でプログラムを書いていたのでPython自体に付いては調べながら問題無く理解できる
    ・画像処理は完全初見で、本書に登場するopenCVの各関数を調べながら何とかやってる事の意味は理解しながら進められている
    ・数学は高校数学の内容もかなり忘れており行列を復習しながらやっている
    というもので一応8章までのプログラムの内容はモデルの内部の動き以外の事は大方意味や目的を理解できているつもりです。
    本書でご教授頂く内容から逸脱している事だとは思いますがご回答頂けましたら幸いです。

    返信削除
    返信
    1. 質問ありがとうございます。また、回答が遅れまして申し訳ありません。

      > 二値化した画像を取り込んでいるので変数imgは0か255の数値しか取らないのですが、
      > cv2.warpAffineでimgを回転させたもの(img_rot)は色々な数値を格納していることがわかりました

      warpAffine はおっしゃる通り画像を回転させるための関数なのですが、
      その際に、回転後の画像をなめらかにするために補完を行う場合があります。
      補完のための方法を指定しているのが、

      img_rot = cv2.warpAffine(img, rot_mat, (lx, ly), flags=cv2.INTER_CUBIC)

      上記命令のうちの flags=cv2.INTER_CUBIC です。

      この INTER_CUBIC の部分に何を指定できるのかは、
      OpenCVの C++ 版のドキュメント
      http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html
      の cv::resize の項目を見ると下記の5項目であることがわかります。

      INTER_NEAREST 最近傍補間
      INTER_LINEAR バイリニア補間(デフォルト)
      INTER_AREA ピクセル領域の関係を利用したリサンプリング.画像を大幅に縮小する場合は,モアレを避けることができる良い手法です.しかし,画像を拡大する場合は, INTER_NEAREST メソッドと同様になります
      INTER_CUBIC 4x4 の近傍領域を利用するバイキュービック補間
      INTER_LANCZOS4 8x8 の近傍領域を利用する Lanczos法の補間

      上で書かれている通り、デフォルトは「INTER_LINEAR バイリニア補間」なのですが、
      私は「INTER_CUBIC」に変更していますね。また、恐らく「INTER_NEAREST 最近傍補間」を指定すると、
      ご指摘の通り0が255の2通りしかない画像になるはずです。

      プログラム ml-08-03-learn.py を書いたのは私ですが、
      書いたのは5年以上前ですから、なぜ補完方法として INTER_CUBIC を指定したのかはさすがに覚えていませんでした、

      そこで、
      INTER_NEAREST
      INTER_LINEAR
      INTER_CUBIC
      の3通りの回転で何が違うのか、画像を作成し、確認してみました。

      それを示したのが下記の図です。
      (長いアドレスですが、ブラウザのアドレスバーに貼り付けるなどしてご覧ください)

      https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM0x3OJfT4qIpU4UtaV7QtRwEcdUar2xQTPEryw2r2VpMxT0n35TH7yy9QCos0pRsQgVG2-yNA4HYnkh-Cg5zQvhFSAHQcxZBq-yFKdlwvSkcyqEFVKW_81-UeF51Eg5V-4LyGLBCjHYefvhNcQtdkRqPESp1Xz4_oJ0X5oA9U8cQ-kzX3bip8yzzijyc/s1784/img_rotation.png

      これを見ると、以下のことがわかります。
      ・INTER_NEARESTを指定すると、0と255しか現れないこと
      ・INTER_LINEARとINTER_CUBICは確かに補完が行われているが、見た目では両者に違いはあまり見られないこと

      なので、恐らくINTER_LINEARとINTER_CUBICのどちらを指定しても、結果に大きな違いはないだろうと予想されます。

      さらに言えば、warpAffine 関数の後、下記の関数を実行し、
      0(黒) 以外の領域をひとまとめに扱っていることがわかります。

      # 白い領域(ピクセル値が0でない領域)の座標を集める
      nonzero = cv2.findNonZero(img)

      これは、新たに白と黒との二値化を行っていることと同じですので、
      結局のところ、warpAffine関数において、
      INTER_NEAREST、INTER_LINEAR、INTER_CUBIC
      のどれを指定しても、結果に大きな違いはないだろうと予想されます。

      長くなりましたが、以上で回答になっておりますでしょうか。

      削除