Raspberry PiでBluetoothオーディオ出力を使用

Bluetooth機器のペアリング

デスクトップ右上の下図に示すメニューを選択します。

Bluetoothオーディオ機器を探索モードにセットし、見つかったら「Pair」ボタンをクリックします。
下図は、SONYのSRS-X3というBluetoothオーディオスピーカーの例です。

先ほど追加したBluetooth機器を選択します。

alsa-toolsで確認

デバイスを一覧表示させてみる。
10行目のoutputがGUIで選択した出力デバイスを示す。

pi@raspberrypi4:~ $ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
jack
    JACK Audio Connection Kit
pulse
    PulseAudio Sound Server
default
    Playback/recording through the PulseAudio sound server
output
sysdefault:CARD=b1
    bcm2835 HDMI 1, bcm2835 HDMI 1
    Default Audio Device
dmix:CARD=b1,DEV=0
    bcm2835 HDMI 1, bcm2835 HDMI 1
    Direct sample mixing device
dsnoop:CARD=b1,DEV=0
    bcm2835 HDMI 1, bcm2835 HDMI 1
    Direct sample snooping device
hw:CARD=b1,DEV=0
    bcm2835 HDMI 1, bcm2835 HDMI 1
    Direct hardware device without any conversions
plughw:CARD=b1,DEV=0
    bcm2835 HDMI 1, bcm2835 HDMI 1
    Hardware device with all software conversions
usbstream:CARD=b1
    bcm2835 HDMI 1
    USB Stream Output
sysdefault:CARD=Headphones
    bcm2835 Headphones, bcm2835 Headphones
    Default Audio Device
dmix:CARD=Headphones,DEV=0
    bcm2835 Headphones, bcm2835 Headphones
    Direct sample mixing device
dsnoop:CARD=Headphones,DEV=0
    bcm2835 Headphones, bcm2835 Headphones
    Direct sample snooping device
hw:CARD=Headphones,DEV=0
    bcm2835 Headphones, bcm2835 Headphones
    Direct hardware device without any conversions
plughw:CARD=Headphones,DEV=0
    bcm2835 Headphones, bcm2835 Headphones
    Hardware device with all software conversions
usbstream:CARD=Headphones
    bcm2835 Headphones
    USB Stream Output

test.wavファイルを用意して再生してみる。

pi@raspberrypi4:~ $ aplay -D plug:output test.wav
再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

デバイス名(output)の前にplug(plugという名前のプラグイン)を付けないと下記の警告が表示され再生レートが間違った状態で再生される。

pi@raspberrypi4:~ $ aplay -D output test.wav
再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
警告: レートが不正確です (要求値 = 44100Hz, 使用値 = 48000Hz)
plug プラグイン(-Dplug:output) を使用してください

Raspberry PiでVisual Studio Code インストール後のaptで警告

問題

Rapsberry PiへVisual Studio Codeをインストール後、パッケージ更新を行う度にエラーが表示されるようになった。

>> apt-get update

・・・省略・・・
エラー:3 https://packagecloud.io/headmelted/codebuilds/debian stretch InRelease
公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 0CC3FD642696BFC8
・・・省略・・・

解決策

検索を行うと、

wget -qO - https://packagecloud.io/headmelted/codebuilds/gpgkey | sudo apt-key add -

というおまじないが見つかる。
ベンダーから公開鍵ファイルを取得してローカルへ追加するようだが、ポイントは、-qO -の部分をqとO -(大文字のオーにハイフン)の2つのオプションと解釈することである。

wgetのマニュアルページから引用。

       -O file
       --output-document=file
           The documents will not be written to the appropriate files, but all will be concatenated together and
           written to file.  If - is used as file, documents will be printed to standard output, disabling link
           conversion.  (Use ./- to print to a file literally named -.)

情報源

Visual Studio CodeのサイトのPublic GPG Keyの辺りにこの手順の記述がある。

VoTTでエクスポートしたPascal VOC形式のアノテーションデータをYolo形式に変換

問題

アノテーションにVoTT Version 2系を使用すると、Yolo V3の学習に必要なデータ形式でエクスポートすることが出来ない。
公式サイトでは、Pascal VOC形式からの変換に voc_label.py というスクリプトをダウンロードして使うよう説明されているが、ファイルの保存形式が合わず上手く変換できない。

解決策

voc_label.pyを変更。

#
# 名称:
#   Pascal VOC 形式のアノテーションデータをYolo V3形式に変換
#
# 前提:
#   Pascal VOCフォルダと同階層で本スクリプトを実行し、
#   その中にlabelsフォルダを作成し変換後データを格納する。
#   BASE_PATH_NAMEはPascal VOC 形式データを格納するディレクトリ名
#
# 入力ファイル:
#    BASE_PATH_NAME/ImageSets/Main/CLASS_DATASETS.txt  クラス数×データセット数
#    BASE_PATH_NAME/JPEGImages/INPUT_IMAGES.jpg        イメージファイル数
#
# 出力ファイル:
#    train.txt
#    val.txt
#    BASE_PATH_NAME/labels/IMAGE_FILENAME.txt          イメージフィアル数
#

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import glob

BASE_PATH_NAME = 'Output/PascalVOC-export' # PascalVOC形式データのルートディレクトリ
DATA_SETS = ['train', 'val']                    # データセットのリスト(訓練用と評価用の名称)
classes = ["class1", "class2"]            # Yoloでのclass,VoTTでのTAG

def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(image_file):
    in_file  = open('%s/Annotations/%s.xml'%( BASE_PATH_NAME, image_file))
    out_file = open('%s/labels/%s.txt'%(BASE_PATH_NAME, image_file), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for image_set in DATA_SETS:
    # 結果を保存するディレクトリを作成
    if not os.path.exists( BASE_PATH_NAME + '/labels/'):
        os.makedirs(BASE_PATH_NAME + '/labels/')

    files = glob.glob(BASE_PATH_NAME + '/ImageSets/Main/*%s.txt'%(image_set))

    # ファイル名のリストを取得(拡張子なし)
    image_ids = open(files[0]).readlines()  # 各データセットに全ファイルが列挙されるため[0]だけで良い
    input_files = []
    for line in image_ids:
        line = line.strip().split() # スペースで分割
        line = line[0].split('.')   # .で分割
        input_files.append(line[0])
    list_file = open('%s.txt'%(image_set), 'w')
    for image_file in input_files:
        list_file.write( '%s/%s/JPEGImages/%s.jpg\n'%( wd, BASE_PATH_NAME, image_file))
        convert_annotation(image_file)
    list_file.close()

Ubuntu18.04にOpenCV4.2をソースからインストール

インストール手順はこちら

大まかには下記の手順だが、公開されたインストールスクリプトを使った方が早くて確実。不要なパッケージやライブラリがあるならば、スクリプトを修正すれば良い。

  1. 必要なパッケージをインストール
  2. ソースをダウンロード
  3. cmake
  4. make
  5. make install
  6. ldconfig

TeamViewerで商用利用が検出された

問題

心当たりが無いがTeamViewerで商用利用していると検出され利用できなくなった。

解決策

商用利用していないことをこちらのフォームで申告する。
英語で個人的な利用であることを記載し送信した。
数日後、下記のメールが来た。

Dear TeamViewer User,
 
Thank you for your request regarding being unblocked from using the free version of TeamViewer. After reviewing the information provided to us, we were unable to confirm that the submitted ID is being used privately.
 
Requiring commercial users to purchase a license is also part of our effort to maintain the free version, and to therefore make help accessible to everyone. The free version is for people who are using it to help family and friends.
 
To continue using TeamViewer, there are two options for you to consider:
 
1) We encourage you to purchase a license that fits your needs: https://www.teamviewer.com/pricing
 
If you need help finding the perfect license, our sales team will be happy to assist you personally:
+49 7161 60692 50
 
2) THIS FORM is a declaration of private use that needs to be printed, signed personally and sent back to us replying to this email.

 
When you return this to us, we will review your response confirming your declaration of private use and use this to determine whether we can re-enable your use of TeamViewer.
 
For more information regarding the commercial use of the free version of TeamViewer, please refer to our community statement: https://community. teamviewer. com/t5/Knowledge-Base/Why-do-I-see-Commercial-use-suspected-Commercial-use-detected/ta-p/5265
 
We are looking forward to hearing from you.
 
Kind regards,
Your TeamViewer Team

商用利用をしていないことが確認できない。ライセンスを購入するか、個人的な利用である申告書を書いてメールに返信するのか、どちからを選べとのことである。
個人的な利用であるので後者で対応した。

申告書提出後

連絡はないが3日後に接続を試みたところ接続できるようになっていた。

申告書の単位

同様なウィンドウが表示され、別のマシンからの遠隔操作ができなくなった。
遠隔操作を行うマシン毎に申告書を提出する必要がある。
操作されるだけのマシンの申告書は不要。

Ubuntu 18.04 LTSにYolo v3環境を構築

cuda-toolkit 10.2をインストール

Post Processを忘れないこと。
環境変数PATHとLD_LIBRARY_PATHの設定を .bashrc に追記する。

ドライバの状態を下記のコマンドで確認できる。

nvidia-smi

cuDNNをインストール

nvidiaアカウントでログインが必要。
依存関係があるため、Runtime Library、Developer Libraryの順にインストールする必要がある。
/usr/lib、/usr/include等へインストールされる。
サンプルは/usr/src/cudnn_sample_v7にインストールされる。

OpenCVをインストール

こちらを参照。

モニタが接続されていないRaspberry Piの解像度

問題

モニターが接続されていない状態でRaspberry Piへリモート接続を行うと解像度がVGAになる問題を解決する。
モニターが存在しないとは、下記のような状態を示す。

  • HDMIケーブルを外した
  • HDMI切替器で他のモニタを選択している

リモート接続とは、下記のようなアプリケーションを利用する場合を示す。

  • VNC
  • TeamViewer

処置

/boot/config.txt の hdmi_force_hotplug=1 をコメント解除する。
解像度は、hdmi_gourpとhdmi_modeで設定する。
管理者権限でファイルを編集し再起動を行うと反映される。

設定についての詳細な説明はraspberry piの公式サイトを参照。

hdmi_group=2
hdmi_mode=82

hdmi_force_hotplug=1

メカニズム

hdmi_groupとhdmi_modeで指定する解像度は、HDMI機器が接続されたときに有効になる。hdmi_force_hotplug=1とすることで、強制的にHDMI機器が接続されていることにできる。

クーラーをつけっぱなしにしても明け方に暑くなるメカニズム

夏になり寝るときにはエアコンを使うようになった。
電源を入れっぱなしにしているにも関わらず、明け方になると暑くて目が覚める。
やすらかシステムを使い温度と湿度を1分毎にロギングして解析してみた。

下のグラフをご覧いただきたい。
22:45頃にエアコンのスイッチをONし5:50頃にOFFしている。

いろいろと気になる点があるが、明け方になると暑くなるという点について考察すると、温度は約±1℃の範囲でコントロールされている。湿度は時間の経過と共に上昇し80%を超える。湿度のために不快と感じて目が覚めるようである。
室温が設定温度に達すると、熱交換器を冷やす必要がなくなり、結露による除湿が行われなくなるというメカニズムである。冷たい飲み物が入ったグラスを部屋に置いておくとグラスの外側に水滴が付くが、室温と同じ温度の飲み物なら乾いたままであることと同じである。
最新型の上級グレードのエアコンには、再熱除湿という機能が付いており、除湿して温度が下がった空気を再び加熱して吹き出す機能が付いてる。2009年製のエアコンを古いとは思っていなかったが、技術は進歩しているようである。

湿度が上がる要因をネット上では扉やサッシの隙間と分析されているケースが多いが本当だろうか?下のグラフをご覧いただきたい。上のグラフは就寝時(夜間)のデータであるが、こちらは昼間に誰も寝ていない時間帯のデータである。外気温は異なるものの、人間の有無が支配的とは考えられないか?除湿器で湿度を下げると明け方に目覚めることなく快適に寝れるのかもしれない。

他の部屋で寝るほど研究熱心ではないが興味深い。

エアコン:三菱電機 霧ヶ峰 MSZ-EX25E6  体感OFF 冷房モード 27度設定 2009年製
部屋:鉄筋マンション 北向き 約8畳 2名就寝

TSキュービックカードの請求書をCSVファイルへ出力

TS3カードはWEBページからpdfファイルをダウンロード可能である。しかし画像データであるためExcel等の表計算ソフトでインポートできない。画像認識ソフトやAdobeのACROBATで変換できないか試行錯誤したものの、表として認識させるに至らなかった。

仕方なくツールを作成した。

オープンソースで公開します。