あきらぼ

テック系ブログ

PyTorchをWindows環境にインストールしてPyCharmで使用する

こんにちは。

今回はPyCharmでYOLOv5を使用するためにPyTorchをインストールしようとしたところ、上手くいかなかったので備忘録として残しておきます。
まず、私の環境はAnaconda等の仮想環境を使っていません。仮想環境を使っている場合のインストール方法はすぐに見つかったのですが、Windowsに直接Pythonをインストールしている場合です。


まず、PyCharmが使用しているPythonのパスを確認します。
SettingのProject Interpreterから確認することができます。

私の場合はAppDataの中ですね。

次にコマンドプロンプトでインストールしてるCUDAのバージョンを確認します。
CUDAをインストールしていなければ以下を参考にしてください。
Python Tensorflow でcudart64_110.dll not found - あきらぼ

GPUを使用しないでPyTorchを使用する場合はインストール不要です。

CUDAのバージョン確認は以下のコマンドで行えます。

nvcc -V

私の場合はV11.6でした。

次にCUDAバージョンに合ったPyCharmをインストールします。
以下のサイトでインストールのコマンドをコピーします。
pytorch.org


今回はpipを使用してインストールするので以下になります。

こちらのインストールコマンドをコピーして、pipでインストールしていきます。
pipはPythonInterpreterと同ディレクトリのScriptというディレクトリにあります。

私の場合は以下です。
C:\Users\UserName\AppData\Local\Programs\Python\Python38\Scripts

今回はこのディレクトリのpip3.pyに対して先ほどのコマンドを使用します。
pip3.pyのあるディレクトリでコマンドプロンプトを使用して、私の場合は以下のようになります。

python pip3.py install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113

pip3ではなくpip3.pyに修正する必要があるのでご注意ください。
あとは勝手にPyTorchがインストールされます。

RaspberryPiでBME280で気圧測定

今回は気圧センサーであるBME280を使って気圧測定をしました。

 

最近梅雨入りしたせいで、ニュース等でも天気病などといって、気圧の低下に伴う体調不良が取り上げられるようになりました。
この天気病は気圧の絶対値ではなく、変化量が重要だと考えられています。

 

 

 

そこで、実際に時系列の自宅の気圧データを取得することで体調管理をしましょうというのが目的です。
完成形はこちらです。

 

 

さて、実際に実装に移っていきます。

BME280とRaspberryPiはI2Cで接続しています。

詳細はこちら

aki-lab.hatenadiary.com

 

今回使用した気圧センサーはドイツの自動車部品メーカーのボッシュ製のBME280になります。

ACEIRMC BME280搭載 温湿度 気圧センサーモジュール 5V用 SPI I2C Arduino対応 Raspberry Pi (1個)

 

データシートはこちらになります。

https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf

 

基本的にはこちらのデータシートの指示通りにレジスタを叩いてデータを取得していきます。

 

まず、実際のコードがこちらになります。

 

基本的にはデータシート通りの実装なのですが、pythonで記述する際に、変数の型が明示的ではなかったので、Numpyを使用して明示的に型変換を行うことでデータシート通りの温度と気圧の補正を行っています。

 

実際に実行するとこんな感じです。

pi@raspberrypi: python3 BME280.py
Device ID is 0x60
BME280 is connected.
Temperature 26.88 degC
Pressure 998.76 hPa

こちらの温度は気圧センサ補正に使用しているのでセンサーの温度です。

なので、室温よりは少し高い値になっているので単純な環境センサ値としては使えなさそうです。

 

あまり、レジスタ直叩きで使用している記事を見なかったので参考になればと思います。

 

実際に使用してみると、天気とは関係なく気圧が変動していることや、気密性の高いマンションだと換気扇を使うことで圧力が下がってしまうことです。

次回、頭が痛くなったときは値を確認してみようと思います。

 

コードの全体はこちらになります。

GitHub - Aki-R/CCS811_BME280_RPi: Upload CCS811 and BME280 measurement to database by using RaspberryPi

 

 

3Dプリンタで日用品作り

こんにちは。

 

今回は3Dプリンタで久々にものを作りました。

たいしたものではありませんが笑

 

f:id:AKIRA_san:20220614223644j:image

 

完全に積層方向ミスってる感はあるのですが、精度が必要なものでもないのでOKです。

 

f:id:AKIRA_san:20220614223755j:image
f:id:AKIRA_san:20220614223752j:image

できたものはこんな感じです。

印刷時間は1時間ぐらいでした。

 

こいつをどう使うかというと

f:id:AKIRA_san:20220614223902j:image

 

私は歯列矯正をしていて歯間用のブラシを追加で使っているのですが、毎日使うのに化粧台の中に入れるのは面倒くさい。

だからといって2本共うがいのコップに立ててしまうとコップを使うときに余った一本の置き場がないです。

 

そこで今回の歯ブラシ枕をに置くことで水が溜まって水垢が付かず清潔に保つことができます。

 

また何か思いついたら作ってみようと思います。

 

RaspberryPiでCO2センサーCCS811を動かす

こんにちは。

 

今回はRaspberryPiでCCS811を動かしました。

 

 

 

前回はRaspberryPiへの接続まで完了していました。

aki-lab.hatenadiary.com

 

KEYESTUDIO DC 5V CCS811 CO2 二酸化炭素 TVOC 大気質 センサー モジュール for Arduino アルドゥイーノ アルディーノ 電子工作

 

そして今回は実際に値を読み取るところまでを行います。

しかし、基本的なI2Cのフローは前回STM32で行った場合と同じになります。

aki-lab.hatenadiary.com

 

同じことをRaspberryPiで実装した形になります。

なので詳細は省きます。

 

今回のコードはこちらになります。

 

このまま実行します。

pi@raspberrypi: python3 CCS811_RPi.py
Device ID is 0x81
CCS811 is connected.
Application mode is in active.
Measure Mode is set to Mode1.
eCO2: 405
eTVOC: 0

 

二酸化炭素換算量が問題なく取得できました。

 

あとはこのデータをデータベースにアップロードして部屋環境モニターで使用する予定です。

 

コード全文はこちらに保存しています。

GitHub - Aki-R/CCS811_BME280_RPi: Upload CCS811 and BME280 measurement to database by using RaspberryPi

 

 

SQLデータベースで読み取り専用ユーザーを作る

部屋の環境モニターを構築中に、SQLデータサーバーに環境データを貯めていたのですが、読み取り専用のユーザーの作り方が分からなかったので、備忘録として書き留めます。

 

 

 

まず、データベースへ高い権限のあるユーザーでログインします。
私の場合はRootユーザーです。

 

私の場合はmariaDBを使用しています。

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 33705
Server version: 10.3.34-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

次に読み取り専用ユーザーを作りたいデータベースに移動します。

MariaDB [(none)]> use roomconditionmonitor

私の場合は室内環境モニタ用のデータベースなので「roomconditionmonitor」という名前になっています。

 

ここでユーザーを作成します。

MariaDB [roomconditionmonitor]> CREATE USER 'username'@'localhost' IDENTIFIED BY 'password' ;

 

今回は同一サーバーからアクセスする用のユーザーなのでLocalhostとしています。

そして、最後に今回の一番重要な権限付与です。

GRANT SELECT ON roomconditionmonitor.* TO 'roomcondition_reading_user'@'localhost';

 

SELECTの権限のみ付与しているのでデータベースの変更等はできません。

 

GRANTのMariaDBのDocumentはこちらです。

GRANT - MariaDB Knowledge Base

 

【Tensorflow】【Keras】CNNでHololiveメンバーの識別をしてみる

こんにちは。

今回は先日のモデルに引き続き、ざっくりと最初のHololiveメンバー識別機を作ってみたのでそのことを書こうと思います。


まず今回作った識別機がどのように動くかの動画がこちらになります。

youtu.be

 

 

 

 

背景

今回識別器を作った理由としては最近流行っているHololiveのメンバーがどんどん増えていって覚えきれません。

しかし、サムネイル等には出てくるし、いちいち調べるのも面倒。

そこでAIを使って判定させてしまおうというのが今回作った動機になります。

 

今回参考にしたのはこちらの本です。実際のKerasのコードまで書いてあって分かりやすかったです。

Pythonによるディープラーニング (Compass Booksシリーズ) 単行本(ソフトカバー)

 

教師データ収集

まず、教師データ集めです。

今回はGoogle検索を使ってHololiveメンバー58名分のデータをを集めました。

メンバー一覧はこちら。

所属タレント一覧 | hololive(ホロライブ)公式サイト

 

画像収集方法はこちらです。

aki-lab.hatenadiary.com

 

全部で集まった画像データは24254枚、平均一人あたり約400万になります。

しかし、インドネシア勢とはまだ画像データが少なく、あまり検出できていませんでした。

例えば、こぼ・かなえるはデータ数が少なく、集めたデータも本に以外のデータばかりだったので正しく識別できていませんでした。

 

 

そこで、後でYoutubeのサムネイル等から画像を集めて、正しいデータだけを残すようにすればまた精度が上がると思います。

 

識別CNNモデル

次に今回のモデルにはKerasに既に用意されている識別でよく使われるVGG16モデルをベースに使用します。

入力画像サイズは256×256です。

 

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 rescaling (Rescaling)       (None, 256, 256, 3)       0         
                                                                 
 random_rotation (RandomRota  (None, 256, 256, 3)      0         
 tion)                                                           
                                                                 
 random_zoom (RandomZoom)    (None, 256, 256, 3)       0         
                                                                 
 random_flip (RandomFlip)    (None, 256, 256, 3)       0         
                                                                 
 random_translation (RandomT  (None, 256, 256, 3)      0         
 ranslation)                                                     
                                                                 
 vgg16 (Functional)          (None, None, None, 512)   14714688  
                                                                 
 flatten (Flatten)           (None, 32768)             0         
                                                                 
 dense (Dense)               (None, 512)               16777728  
                                                                 
 dropout (Dropout)           (None, 512)               0         
                                                                 
 dense_1 (Dense)             (None, 58)                29754     
                                                                 
=================================================================
Total params: 31,522,170
Trainable params: 23,886,906
Non-trainable params: 7,635,264
_________________________________________________________________

 

上流のRandom層は過学習対策になります。

最初からこの層を追加した状態で学習のハイパーパラメータ等設定していたので少し沼ってしまいました。

詳細はこちら。

 

aki-lab.hatenadiary.com

 

また、VGG16の内、下流側4層のみをパラメータ学習可能としています。

 

学習

まず、学習にあたって集まったデータの80%を学習用、20%を検証用としてランダムに分割します。

学習・最適化は以下のようにしています。

  • Optimizer:Adam
  • 損失:Categorical Crossentropy
  • 学習率:1.0e-4
  • バッチサイズ:128

 実際に学習を始めると、すぐに過学習に入ります。

 

10エポックを過ぎたあたりで過学習が始まっています。

最大精度で60%を少し超えるぐらいでした。

そこで最大精度のものを使用したのが動画で使用しているモデルになります。

 

識別器

最後にモデルを学習してそれで終わりでは、全く役に立たないので、実際にYotubeや画像で範囲を選択すると判定してくれるようなアプリを作ってみました。

 

今回はTkinterを使用して簡単なGUIの識別器を作りました。

詳細な説明はここではしませんが、ウィンドウを透明の256X256ピクセルのサイズにすることで、そこの表示を読み取ってモデルで判定させています。

 

一番確度(そうである可能性)の高いメンバー名を表示するようにしています。

詳しくはソースコードをご参照ください。

 

問題点

実際使ってみた問題点として、256x256のウィンドウサイズだと、二人以上のメンバーが同時にウィンドウ内に入ってしまうケースが多く、どちらを検出しているのか分かりません。

そこで領域も検出できるようにすると便利さ増すかなと思っています。

そのあたりも使える方法がないか調べて実装してみようと思います。

 

 

 

今回使用したコードは以下になります。(適宜アップデートするかもしれませんが。)

GitHub - Aki-R/Hololive_Categorizer: CNN categorizer for VTuber Holilive members

 

また、識別対象を増やしたり、精度改善も暇な時にでもしていこうと思います。

(人力で画像データ集めと振り分けが少し必要そう。こういう仕事をアノテーターというらしいです(笑))

 

 

IFTTTでのスプレッドシート書き込みが2000行までしかできない件

こんにちは。

先日スマート家電リモコンを使った自室の温度・湿度モニターを作成したのですが、一月ほど前から更新されていないことに気が付きました。



前回の温度湿度モニター作成はこちら。
aki-lab.hatenadiary.com

原因としてはIFTTTによるGoogleスプレッドシートの書き込みが2000行が最大となっているからでした。
そのため、参照しているスプレッドシートが更新されずにモニターも停止していました。

実際に保存されているGoogleドライブを見に行ってみると、自動でもう一つファイルが作成されていました。

2000行を超えると自動で次のファイルを作成するようです。

APIの仕様等考えると、ファイル共有設定など複数のスプレッドシートを扱うのは煩雑になってしまします。

そこで、温湿度は1時間毎に追記されるので、それに合わせて自動で先頭行を減らすようにしようと思います。

2000行であっても3カ月弱のデータは確認できるので、私の用途的には十分かなと。

そこで今回はスプレッドシートのマクロ機能を使用しました。

まず、対象の2000行以内に抑えたいスプレッドシートを開きます。
そこで拡張機能からマクロを記録を選択します。

そこで記録が開始されたら先頭行を削除します。

記録を終了して、先頭行の削除のマクロとして保存します。

次に、拡張機能からマクロを管理を選択します。

次に右の拡張オプションからスクリプトを編集を選択します。

すると記録されたマクロがスクリプトとして表示されているので、左のメニューからトリガーを選択します。

そこで新しいトリガーを作成します。

そこで、先頭行削除のトリガーを定義します。

2000行以内に抑えるためには

といった方法があります。

今回はIFTTTがAPIでアクセスした際も編集・変更としてマクロがじっこうされるか分からなかったので、一時間おきに実行する仕様としました。

あとは保存すれば完了です。

一時間おきに先頭行の削除・IFTTTによる温湿度情報の追記が行われるので2000行より増えることはありません。

当面の間はこの仕様で様子を見てみようと思います。

追記:上記トリガー方法は変更時にすれば問題なく2000行に到達しないようになります。