コンテンツへスキップ

Movidius Neural Compute Stick 2(NCS2)導入

めざましじゃんけん時に取得したWEBカメラ画像を216枚で画像認識エンジンを動作させた際の性能比較です。
NCS2(Movidius Neural Compute Stick 2)導入により十分高速化された結果となりました。

参考記事:ディープラーニング向けUSBアクセラレーターNeural Compute Stick 2ー

Windows(GPU未使用)
Core i7 6700/(Skylake) クロック周波数:3.4GHz
15秒
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
785秒
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
+ Movidius Vision Processing Unit(Myriad 2)
105秒
2019-08-14 20:34:48,460:202:INFO:ループ開始:D:\pic4ml\Janken_Target_Test\20190806_055717_102196_1.jpg 処理回数:1
2019-08-14 20:35:03,389:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
019-08-14 20:35:03,390:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
2019-08-15 12:11:10,292:202:INFO:ループ開始:/home/miki/cronScript/Janken_Target_Test/20190806_055717_102196_1.jpg 処理回数:1
2019-08-15 12:24:15,786:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
2019-08-15 12:24:15,787:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
2019-08-24 12:16:09,419:202:INFO:ループ開始:/home/miki/cronScript/Janken_Target_Test/20190806_055717_102196_1.jpg 処理回数:1
2019-08-24 12:17:54,200:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
2019-08-24 12:17:54,201:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo

OpenVINO™ toolkit for Raspbianインストール

インストールガイド:Install OpenVINO™ toolkit for Raspbian* OS

導入は簡単です。必要なライブラリをダウンロードし、ダウンロードしたライブラリー群にパスを通すスクリプトを実行して終了です。

Pythonスクリプト側も1行の変更で、無事にMovidius Neural Compute Stick 2(NCS2)の導入が完了しました。

「net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)」の記載を、DNN_TARGET_MYRIADに変更し、実行エンジンの指定を行います。
「net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)」
@raspberrypi:~# mkdir intel
@raspberrypi:~# cd intel/
@raspberrypi:~/intel# wget https://download.01.org/opencv/2019/openvinotoolkit/R2/l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz
--2019-08-19 10:42:59-- https://download.01.org/opencv/2019/openvinotoolkit/R2/l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz
download.01.org (download.01.org) をDNSに問いあわせています... 2600:140b:12:2b0::ae6, 2600:140b:12:29f::ae6, 23.218.7.188
download.01.org (download.01.org)|2600:140b:12:2b0::ae6|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 18637784 (18M) [application/x-gzip]
`l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz' に保存中

l_openvino_toolkit_ 100%[===================>] 17.77M 2.21MB/s 時間 8.5s

2019-08-19 10:43:08 (2.09 MB/s) - `l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz' へ保存完了 [18637784/18637784]

@raspberrypi:~/intel# sudo mkdir -p /opt/intel/openvino
@raspberrypi:~/intel# sudo tar -xf l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz --strip 1 -C /opt/intel/openvino

@raspberrypi:~ $ source /opt/intel/openvino/bin/setupvars.sh
[setupvars.sh] OpenVINO environment initialized
@raspberrypi:~ $ echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc
@raspberrypi:~ $ sudo usermod -a -G users "$(whoami)"
[sudo]パスワード:


miki@raspberrypi:~ $ source /opt/intel/openvino/bin/setupvars.sh
[setupvars.sh] OpenVINO environment initialized
miki@raspberrypi:~ $ sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh
Updating udev rules...
Udev rules have been successfully installed.

Movidius Neural Compute Stick 2(NCS2)

しっかりとした包装で発送されており、製品の質感も良かったです。
発熱する製品なので、Rasberry PiのUSBポートからUSB延長ケーブルを用いて接続しました。
また、電源付きUSBハブ経由だとうまく動作しないケースがあったので、Raspberrypiの本体USBポートよりUSB延長ケーブルでNCS2(Movidius Neural Compute Stick 2)を接続しました。

Intel Neural Compute Stick 2

SDカードからUSB接続ブートへ変更

古い情報も多く、結構苦労しました。2019年8月時点の情報となります。
SDカードでの運用による信頼性は多くの人が気にしているようです。
ディスクへのアクセス速度もUSB接続にした方が早くなると思います。

以下、一般的な規格などからくる速度目安。
USB接続として、SSDかHDDは、静音、消費電力、温度、耐久性より、ニーズに合わせた選択になると思います。

SDカード
CLASS6
6MB/S
SDカード
CLASS10
10MB/S
USB2.060MB/S
SSD470MB/S
HDD140MB/S
USB3.0(参考)640MB/S

注意事項

今回、SDカードなしのUSBデバイスのみの構成とはしませんでした。
SDカードなしのUSBデバイスの直接ブートは、センシティブでした。
Raspberry Pi 3B +は、標準でUSBブート対応という内容も散見されましたが、他USB接続しているデバイスや、接続ポート、USBハブ経由、直接接続など条件によりブート可能であったり不可能であったりしました。
SDカードなしのUSBデバイスのみ構成構築時には、Raspberry PiUSBデバイスに綺麗なブートイメージを作成し、他USBデバイスを接続せずに、SDカードなしでブート可能か確認し、最終的な接続機器を設定・接続した状態での再起動テストをお勧めします。
試行錯誤の結果、ブート時間起動処理の信頼性を考え、SDカードにブートコードを格納し、USBデバイスを利用する方法での運用に移行しました。

USBデバイスへのブートイメージ作成には、Etcherを利用します。

SDカードブート構成からUSBデバイス構成への移行

  1. SDカード情報のコピー
  2. コピーしたデータのデバイスファイル関係設定変更
  3. 新規SDカードに「bootcode.bin」を書込み  GitHub

SDカード情報のコピー

新規SDカードにパーティションを作成します。

  • /dev/sda ブート領域、100M
  • /dev/sdb ルート領域、ブート領域100Mを除いた残りのディスクスペース
root@raspberrypi:~# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? yes
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: StoreJet StoreJet Transce (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 99.6MB 98.6MB primary fat32 lba
2 99.6MB 120GB 120GB primary ext4 lba

(parted) quit
Information: You may need to update /etc/fstab.

作成したパーティションをフォーマットします。

  • /dev/sda FAT32のWindowsフォーマット
  • /dev/sdb Ext4の標準的なLinuxフォーマットinode, jounalなどは標準で良いです
root@raspberrypi:~# mkfs.vfat -n BOOT -F 32 /dev/sda1
mkfs.fat 4.1 (2017-01-24)
root@raspberrypi:~# mkfs.ext4 /dev/sda2
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 29280768 4k blocks and 7323648 inodes
Filesystem UUID: 8becaa42-5ad3-4bca-bcb2-6bdf1f371aeb
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

ファイル内容のコピーに向けて、コピー元、コピー先のマウントを実施。
現在のルート領域と作成したファイル領域をマウントするために、マウントフォルダを作成し、それぞれ、マウントします。

$ sudo mkdir /tmp/usd #作業ディレクトリ
$ sudo mount /dev/mmcblk0p7 /tmp/usd #MicroSDのRaspbianをマウント
$ sudo mkdir -p /mnt/ssd
$ sudo mount /dev/sda2 /mnt/ssd/
$ sudo mkdir /mnt/ssd/boot
$ sudo mount /dev/sda1 /mnt/ssd/boot/

/ Rootルート領域および /bootブート領域をコピーします。

$ (cd /tmp/usd; sudo tar --backup -c *)|sudo tar -C /mnt/ssd -xv
$ (cd /boot; sudo tar --backup -c *)|sudo tar -C /mnt/ssd/boot -xv

コピーしたデータのデバイスファイル関係設定変更

コピーした領域のブート関連ファイルの修正を行います。
comdline.txtファイルの「root」ディレクトリを「 /dev/sda2」へ変更します。

root@raspberrypi:/mnt/ssd/boot# vi cmdline.txt
root@raspberrypi:/mnt/ssd/boot# cat cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

fstabの「/boot」および 「/」ルートディレクトリを、それぞれ、「 /dev/sda1」および「/dev/sda2」へ変更します。

root@raspberrypi:/mnt/ssd/boot# vi /mnt/ssd/etc/fstab
root@raspberrypi:/mnt/ssd/boot# cat /mnt/ssd/etc/fstab
proc /proc proc defaults 0 0
/dev/sda1 /boot vfat defaults 0 2
/dev/sda2 / ext4 defaults,noatime 0 1

新規SDカードに「bootcode.bin」を書込み GitHub

容量の小さなSDカードに、「bootcode.bin」を書き込みます。
※ 他ファイルを書き込む必要はありません。/bootの内容も不要です。

「bootcode.bin」は、GitHubよりダウンロードし、SDカードに書き込んでください。

参考にさせて頂いたサイト

USB接続のSSDデバイス

USB Type-Cにも対応、今後の使いまわしなども考えても、コストパフォーマンスが良いと思いました。

Yolo3、Tiny-Yolo3での独自学習方法

画像検出に向けて、独自に準備した教師データを用いて、AlexeyAB Darknetを用いて、YOLO3、Tiny-YOLO3で独自学習を行います。
YOLO3とTiny-YOLO3での独自学習時の違いは、独自学習時に指定するコンフィグファイルの違いのみとなります。処理速度と画像検出の違いとなっておりますが、画像検出対象により向き不向きもあると思うので、両方での試行をお勧めします。

また、YOLO2など以前のフレームワークも利用しましたが、画像検出精度や検出速度で、明らかにYOLO3のほうが良いので、学習後のモデル動作環境がYOLO3で問題なければ、YOLO3の利用をお勧めします。

参考にさせて頂いたサイト

前提条件

AlexeyAB Darknetを用いて、YOLO3・Tiny-YOLO3で独自学習に向けた準備

LabelImg利用方法(アノテーション)で準備した、7クラスの学習を行います。
最終的な、独自学習を実行する際のコマンドラインは以下となります。

darknet.exe detector train cfg/obj.data cfg/yolov3-voc-janken.cfg darknet53.conv.74
  1. darknet.exe
    Windows10に AlexeyAB・Darknet・YOLO V3導入(Vestal Studio)でコンパイルした実行ファイル。(「darknet\build\darknet\x64」に格納されています)
  2. obj.data(obj.data内で指定するobj.names)の2ファイル
  3. yolov3-voc-janken.cfg、yolo3, tiny-yolo3向けに事前準備されたモデル定義をコピーして独自学習向けに作成
  4. darknet53.conv.74、学習開始時の初期ウェイトファイル。yolo3とtiny-yolo3では異なるファイルを用います。

obj.dataに、train(学習データー)とvalid(検証データー)のリストを設定します。
このtrainとvalidのファイルリストは、LabelImg利用方法(アノテーション)でラベリングしたフォルダで、以下のスクリプト(process.py)を実行し、自動的に作成します。

process.pyですが、データファイルのパス指定、ファイル名、テストデータの割合を指定します。以下の例では、検証データを全体のファイル数の10%を検証データに指定されています。

import glob, os

# Current directory
current_dir = os.path.dirname(os.path.abspath(__file__))

# Directory where the data will reside, relative to 'darknet.exe'
path_data = 'data/obj/'

# Percentage of images to be used for the test set
percentage_test = 10;

# Create and/or truncate train.txt and test.txt
file_train = open('train.txt', 'w')  
file_test = open('test.txt', 'w')

# Populate train.txt and test.txt
counter = 1  
index_test = round(100 / percentage_test)  
for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")):  
    title, ext = os.path.splitext(os.path.basename(pathAndFilename))

    if counter == index_test:
        counter = 1
        file_test.write(path_data + title + '.jpg' + "\n")
    else:
        file_train.write(path_data + title + '.jpg' + "\n")
        counter = counter + 1
  • train.txt トレーニング用画像ファイル一覧
  • test.txt 検証用画像ファイル一覧

obj.data(obj.data内で指定するobj.names)の2ファイル

「darknet\build\darknet\x64\cfg\obj.data」ファイル

学習クラス数をClassに登録します。作成した、train.txtとtest.txtファイルパスを指定します。
次に作成する、cfg/obj.namesと学習結果を格納するフォルダbackupを指定します。

classes = 7
train = train.txt
valid = test.txt
names = cfg/obj.names
backup = backup/

「darknet\build\darknet\x64\cfg\obj.names」ファイル

学習クラス名一覧を指定します。

janken_active
janken_goo
janken_choki
janken_pa
janken_won
janken_lose
janken_draw

yolov3-voc-janken.cfg、yolo3, tiny-yolo3向けに事前準備されたモデル定義をコピーして独自学習向けに作成

Yolo3向けcfgファイル作成

「darknet\build\darknet\x64\cfg\」フォルダ内の初期ファイルをコピーして、自己学習向けのコンフィグファイルを作成します。yolov3.cfg、yolo-obj.cfgをコピー元ファイルとして、編集するコンフィグファイルを作成します。

  • Batch数を変更します。batch=64
  • Subdivisionsを変更します。subdivisions=8
  • 学習するクラス数に合わせて、最大バッチ回数を指定します。
    学習するクラス数×2000となります。
    7クラスでの学習の際には、max_batches=14000 とします。
  • Stepsを最大バッチ回数の80%と90%になるように修正します。
    最大バッチ回数が14000の場合は、steps=11200,12600とします。
  • 3つある[yolo]レイヤーのClassesを、今回学習させる7に変更します。
  • [yolo]レイヤー直前の[convolutional]レイヤーのfiltersを変更します。
    filtersの値は、(classes + 5)×3とします。
    7クラスの場合は、(7+5)×3=36を指定します。

Tiny-Yolo3向けcfgファイル作成

「darknet\build\darknet\x64\cfg\」フォルダ内の初期ファイルをコピーして、自己学習向けのコンフィグファイルを作成します。yolov3-tiny-obj.cfg、yolov3-tiny_obj.cfgをコピー元ファイルとして、編集するコンフィグファイルを作成します。

yolov3-tiny-obj.cfg based on cfg/yolov3-tiny_obj.cfg

  • Batch数を変更します。batch=64
  • Subdivisionsを変更します。subdivisions=8
  • 学習するクラス数に合わせて、最大バッチ回数を指定します。
    学習するクラス数×2000となります。
    7クラスでの学習の際には、max_batches=14000 とします。
  • Stepsを最大バッチ回数の80%と90%になるように修正します。
    最大バッチ回数が14000の場合は、steps=11200,12600とします。
  • 2つある[yolo]レイヤーのClassesを、今回学習させる7に変更します。
  • [yolo]レイヤー直前の[convolutional]レイヤーのfiltersを変更します。
    filtersの値は、(classes + 5)×3とします。
    7クラスの場合は、(7+5)×3=36を指定します。

学習開始時の初期ウェイトファイル準備

Yolo3向け初期ウェイトファイルダウンロード

https://pjreddie.com/media/files/darknet53.conv.74よりdarknet53.conv.74ファイルをダウンロードします。ダウンロードしたdarknet53.conv.74ファイルが初期ウェイトファイルとなります。

darknet53.conv.74

Tiny-Yolo3向けウェイトファイルダウンロード

https://pjreddie.com/media/files/yolov3-tiny.weightsよりyolov3-tiny.weightsファイルをダウンロードし、darknet.exeおよび標準のcfgファイルを用いて、初期ウェイトファイルを準備します。

darknet.exe partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15

yolov3-tiny.conv.15

AlexeyAB/DarknetでYOLO3トレーニング開始

最初に示したコマンドラインで自己学習を開始します。

darknet.exe detector train cfg/obj.data cfg/yolov3-voc-janken.cfg darknet53.conv.74

Out of Memory

Out of Memoryが出る場合、GPUのメモリ不足となり、設定ファイルの変更が必要となります。設定ファイルで設定した、 subdivisions=16 を「32」や「64」へ変更し実行可能な設定へ変更が必要です。

32の倍数での画像サイズの縮小でも学習時のメモリサイズを減らすことが出来ます。width=256、height=256 などへwidth, heightを変更。

テレビの電源オンオフ

他のリモコン操作の家電も同様ですが、現在の状態把握が難しいです。NatureRemoで電源オンとスケジュールしていても、実際は、電源ボタンを押すのみで、電源が消えていれば、電源ボタン操作で電源がオンとなりますが、電源オン状態であれば、電源操作により電源オフ状態と期待通りになりません。

HDMI接続によるCEC(Consumer Electronics Control)

結構盲点でした、物理的にテレビに接続し、制御可能なデバイスが既に導入されていたとは。Raspberry PiのHDMI端子を活用し、テレビのON/OFF(STANDBY)変更操作となります。電源のON/OFF(STANDBY)状況を確認することも可能です。

HDMIのCEC(Consumer Electronics Control)は、機器間を制御するリンク機能となり、SONYだとブラビアリンク、東芝だとレグザリンク、パナソニックだとビエラリンク、SHARPだとAQUOSファミリンクとなります。

cec-utilsインストール

@raspberrypi:~ $ sudo apt-get update
@raspberrypi:~ $ sudo apt-get upgrade -y
@raspberrypi:~ $ sudo apt-get install cec-utils -y

Raspberry Piの電源起動時に、TVの入力が切り替わったり、TVの電源が入らないよいうに、boot/config.txthdmi_ignore_cec_init=1を追記します。

@raspberrypi:~ $ vi /boot/config.txt
@raspberrypi:~ $ sudo vi /boot/config.txt
@raspberrypi:~ $ tail /boot/config.txt
#dtoverlay=vc4-fkms-v3d

# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
start_x=1
gpu_mem=128

#add
hdmi_ignore_cec_init=1

cec-utilsコマンド実行

状態確認:sudo cec-client -l

HDMIケーブル未接続時

@raspberrypi:~ $ sudo cec-client -l
libCEC version: 4.0.4, compiled on Linux-4.15.0-48-generic ... , features: P8_USB, DRM, P8_detect, randr, RPi, Exynos, AOCEC
Found devices: NONE

HDMIケーブル接続時

@raspberrypi:~ $ sudo cec-client -l
libCEC version: 4.0.4, compiled on Linux-4.15.0-48-generic ... , features: P8_USB, DRM, P8_detect, randr, RPi, Exynos, AOCEC
Found devices: 1

device: 1
com port: RPI
vendor id: 2708
product id: 1001
firmware version: 1
type: Raspberry Pi

TV電源ON:echo 'on 0' | cec-client -s

アクセス権によりコマンド失敗

@raspberrypi:~ $ echo 'standby 0' | cec-client -s
* failed to open vchiq instance

アクセス権を変更変更

@raspberrypi:~ $ ls -al /dev/vchiq
crw-rw---- 1 root video 243, 0 8月 18 09:38 /dev/vchiq
@raspberrypi:~ $ sudo chmod 666 /dev/vchiq
@raspberrypi:~ $ ls -al /dev/vchiq
crw-rw-rw- 1 root video 243, 0 8月 18 09:38 /dev/vchiq

tvserviceが起動していてコマンド失敗

tvservice --offが必要

TV電源OFF:echo 'standby 0' | cec-client -s

PHPから実行

function tv_on_HDMI()
{
    exec("echo 'on 0' | cec-client -s -d", $output, $result);

    if ($result) {
        echo "echo 'on 0' | cec-client -s 成功", PHP_EOL;
    } else {
        echo "echo 'on 0' | cec-client -s 失敗", PHP_EOL;
        echo implode(PHP_EOL, $output);
	}
    return $result;
}

function tv_off_HDMI()
{
    exec("echo 'standby 0' | cec-client -s", $output, $result);

    if ($result) {
        echo "echo 'standby 0' | cec-client -s 成功", PHP_EOL;
    } else {
        echo "echo 'standby 0' | cec-client -s 失敗", PHP_EOL;
        echo implode(PHP_EOL, $output);
	}
    return $result;
}

tv_on_HDMI();
tv_off_HDMI();

参考にさせて頂いたサイト

Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する

RaspberryPi コマンドでテレビ電源をオンオフする(cec制御)echo 'on 0' | cec-client -s

Intel Neural Compute Stick 2 - NCS 2 ニューラル ディープラーニング USB スティック

Raspberry PiのCPUでは限界もあり、開発当初よりIntelのディープラーニング向けUSBアクセラレータの「Neural Compute Stick 2」を調べておりました。利用する機械学習のフレームワークややりたいことが定まってから、具体的にどの程度効果が出るのか見極めてからの導入と考えておりました。
Raspberry Piで利用か、Synologyの置き換えとして考えている常時電源ONサーバの追加機能として利用できるなど、利用シーンも様々です。特に、常時電源ONサーバは、GPUを搭載するスロット有りなしでサイズや電源が全く異なるので、このスティックで学習済みモデルのみ動作させることが出来たら便利だなと考えております。

NCS2は、USBタイプの外部演算装置となります。Movidius Neural Compute StickはIntelが開発したUSB接続タイプのディープラーニング用演算装置です。画像の認識や分析に特化したプロセッサ「Movidius Vision Processing Unit(Myriad 2)」が搭載され、ディープラーニングにおける解析処理の際に外部演算装置として使用できます。


USB接続なのでRaspberryPiなどの小型PCでも使えます。演算装置しか持たない環境でも、これを使えばデープラーニングを使った画像解析などが出来るようになります。

このサイトで開発を続けているめざましめざましじゃんけん結果検出システムですが、待ったなしの数十秒の生放送。フリーズしそうな速度で、もっさりと画像認識をしていては、結果取得失敗になる確率を上げてしまいます。

ソフトウェア的に解決を模索しておりますが、気になるハードでも有り、導入を考えてます。(この手の導入検討には波が出ますね)
導入によるメリットは、めざましじゃんけん結果検出時のメインマシンWindowsの完全停止です。

以下は、めざましじゃんけん時に取得したWEBカメラ画像を216枚で画像認識エンジンを動作させた際の性能比較です。52倍の時間差。

Windows(GPU未使用)
Core i7 6700/(Skylake) クロック周波数:3.4GHz
15秒
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
785秒
2019-08-14 20:34:48,460:202:INFO:ループ開始:D:\pic4ml\Janken_Target_Test\20190806_055717_102196_1.jpg 処理回数:1
2019-08-14 20:35:03,389:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
019-08-14 20:35:03,390:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
2019-08-15 12:11:10,292:202:INFO:ループ開始:/home/miki/cronScript/Janken_Target_Test/20190806_055717_102196_1.jpg 処理回数:1
2019-08-15 12:24:15,786:256:INFO:ジャンケン結果判定 Len(total_results): 3 List Values: 0,2,5
2019-08-15 12:24:15,787:289:INFO:ジャンケン結果:Chokiを出してLose、相手はGoo
Intel Neural Compute Stick 2

Raspberry PiなどIoT機器のセキュリティ対策

最低限のセキュリティ対策として必要なセキュリティパッチの自動適応。
ブートROMなどH/W的なセキュリティ対策もなく、処理能力も弱い。インターネットより隔離し堅牢に運用したいのだけど、IoT運用を考えると最低限のネットワーク利用は必要。
Linuxサーバーの構築などでは、必ず実施している「yum-cron」などアップデートパッケージの自動適応です。

Raspberry Piにおいて代表的な実施方法は以下の3つが見つかりました。

  1. 「unattended-upgrades」の利用
  2. 「crontab -e」の利用
  3. 「cron-apt」

「Unattended-upgrades」

Unattended-upgradesのインストールを行い、初期設定を行います。

@raspberrypi:~ $ sudo apt-get install -y unattended-upgrades
@raspberrypi:~ $ sudo dpkg-reconfigure -plow unattended-upgrades

「unattended-upgrades を設定しています」のダイアログで「<はい>」を選択。

「sudo dpkg-reconfigure -plow unattended-upgrades」を実行した際に表示される画面は、以下となります。

50unattended-upgrades設定ファイル変更

@raspberrypi:~ $ sudo vi /etc/apt/apt.conf.d/50unattended-upgrades
  • 管理者メールアドレス
    Unattended-Upgrade::Mail "xxx@xxx.com";
  • 不要ファイルの自動削除設定
    Unattended-Upgrade::Remove-Unused-Dependencies "true";
  • 必要時の自動リブート
    Unattended-Upgrade::Automatic-Reboot "true";
  • 自動リブート実行時間
    Unattended-Upgrade::Automatic-Reboot-Time "02:00";
// Unattended-Upgrade::Origins-Pattern controls which packages are
// upgraded.
//
// Lines below have the format format is "keyword=value,...".  A
// package will be upgraded only if the values in its metadata match
// all the supplied keywords in a line.  (In other words, omitted
// keywords are wild cards.) The keywords originate from the Release
// file, but several aliases are accepted.  The accepted keywords are:
//   a,archive,suite (eg, "stable")
//   c,component     (eg, "main", "contrib", "non-free")
//   l,label         (eg, "Debian", "Debian-Security")
//   o,origin        (eg, "Debian", "Unofficial Multimedia Packages")
//   n,codename      (eg, "jessie", "jessie-updates")
//     site          (eg, "http.debian.net")
// The available values on the system are printed by the command
// "apt-cache policy", and can be debugged by running
// "unattended-upgrades -d" and looking at the log file.
//
// Within lines unattended-upgrades allows 2 macros whose values are
// derived from /etc/debian_version:
//   ${distro_id}            Installed origin.
//   ${distro_codename}      Installed codename (eg, "buster")
Unattended-Upgrade::Origins-Pattern {
        // Codename based matching:
        // This will follow the migration of a release through different
        // archives (e.g. from testing to stable and later oldstable).
        // Software will be the latest available for the named release,
        // but the Debian release itself will not be automatically upgraded.
//      "origin=Debian,codename=${distro_codename}-updates";
//      "origin=Debian,codename=${distro_codename}-proposed-updates";
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";

        // Archive or Suite based matching:
        // Note that this will silently match a different release after
        // migration to the specified archive (e.g. testing becomes the
        // new stable).
//      "o=Debian,a=stable";
//      "o=Debian,a=stable-updates";
//      "o=Debian,a=proposed-updates";
//      "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
};

// Python regular expressions, matching packages to exclude from upgrading
Unattended-Upgrade::Package-Blacklist {
    // The following matches all packages starting with linux-
//  "linux-";

    // Use $ to explicitely define the end of a package name. Without
    // the $, "libc6" would match all of them.
//  "libc6$";
//  "libc6-dev$";
//  "libc6-i686$";

    // Special characters need escaping
//  "libstdc\+\+6$";

    // The following matches packages like xen-system-amd64, xen-utils-4.1,
    // xenstore-utils and libxenstore3.0
//  "(lib)?xen(store)?";

    // For more information about Python regular expressions, see
    // https://docs.python.org/3/howto/regex.html
};

// This option allows you to control if on a unclean dpkg exit
// unattended-upgrades will automatically run
//   dpkg --force-confold --configure -a
// The default is true, to ensure updates keep getting installed
//Unattended-Upgrade::AutoFixInterruptedDpkg "true";

// Split the upgrade into the smallest possible chunks so that
// they can be interrupted with SIGTERM. This makes the upgrade
// a bit slower but it has the benefit that shutdown while a upgrade
// is running is possible (with a small delay)
//Unattended-Upgrade::MinimalSteps "true";

// Install all updates when the machine is shutting down
// instead of doing it in the background while the machine is running.
// This will (obviously) make shutdown slower.
// Unattended-upgrades increases logind's InhibitDelayMaxSec to 30s.
// This allows more time for unattended-upgrades to shut down gracefully
// or even install a few packages in InstallOnShutdown mode, but is still a
// big step back from the 30 minutes allowed for InstallOnShutdown previously.
// Users enabling InstallOnShutdown mode are advised to increase
// InhibitDelayMaxSec even further, possibly to 30 minutes.
//Unattended-Upgrade::InstallOnShutdown "false";

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed. E.g. "user@example.com"
//Unattended-Upgrade::Mail "";
Unattended-Upgrade::Mail "xxx@xxx.com";

// Set this value to "true" to get emails only on errors. Default
// is to always send a mail if Unattended-Upgrade::Mail is set
//Unattended-Upgrade::MailOnlyOnError "false";

// Remove unused automatically installed kernel-related packages
// (kernel images, kernel headers and kernel version locked tools).
//Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

// Do automatic removal of newly unused dependencies after the upgrade
//Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

// Do automatic removal of unused packages after the upgrade
// (equivalent to apt-get autoremove)
//Unattended-Upgrade::Remove-Unused-Dependencies "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot "true";

// Automatically reboot even if there are users currently logged in
// when Unattended-Upgrade::Automatic-Reboot is set to true
//Unattended-Upgrade::Automatic-Reboot-WithUsers "true";

// If automatic reboot is enabled and needed, reboot at the specific
// time instead of immediately
//  Default: "now"
//Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

// Use apt bandwidth limit feature, this example limits the download
// speed to 70kb/sec
//Acquire::http::Dl-Limit "70";

// Enable logging to syslog. Default is False
// Unattended-Upgrade::SyslogEnable "false";

// Specify syslog facility. Default is daemon
// Unattended-Upgrade::SyslogFacility "daemon";

// Download and install upgrades only on AC power
// (i.e. skip or gracefully stop updates on battery)
// Unattended-Upgrade::OnlyOnACPower "true";

// Download and install upgrades only on non-metered connection
// (i.e. skip or gracefully stop updates on a metered connection)
// Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true";

// Verbose logging
// Unattended-Upgrade::Verbose "false";

// Print debugging information both in unattended-upgrades and
// in unattended-upgrade-shutdown
// Unattended-Upgrade::Debug "false";

以下インストール時のスクリーンログです。

@raspberrypi:~ $ sudo apt-get install -y unattended-upgrades
[sudo] パスワード:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  rpi.gpio-common
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  python3-distro-info
提案パッケージ:
  bsd-mailx default-mta | mail-transport-agent needrestart powermgmt-base
以下のパッケージが新たにインストールされます:
  python3-distro-info unattended-upgrades
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
86.9 kB のアーカイブを取得する必要があります。
この操作後に追加で 339 kB のディスク容量が消費されます。
取得:1 http://raspbian.raspberrypi.org/raspbian buster/main armhf python3-distro-info all 0.21 [7,896 B]
取得:2 http://raspbian.raspberrypi.org/raspbian buster/main armhf unattended-upgrades all 1.11.2 [79.0 kB]
86.9 kB を 2秒 で取得しました (38.8 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ python3-distro-info を選択しています。
(データベースを読み込んでいます ... 現在 143029 個のファイルとディレクトリがインストールされています。)
.../python3-distro-info_0.21_all.deb を展開する準備をしています ...
python3-distro-info (0.21) を展開しています...
以前に未選択のパッケージ unattended-upgrades を選択しています。
.../unattended-upgrades_1.11.2_all.deb を展開する準備をしています ...
unattended-upgrades (1.11.2) を展開しています...
python3-distro-info (0.21) を設定しています ...
unattended-upgrades (1.11.2) を設定しています ...

Creating config file /etc/apt/apt.conf.d/20auto-upgrades with new version

Creating config file /etc/apt/apt.conf.d/50unattended-upgrades with new version
Created symlink /etc/systemd/system/multi-user.target.wants/unattended-upgrades.service → /lib/systemd/system/unattended-upgrades.service.
Synchronizing state of unattended-upgrades.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable unattended-upgrades
man-db (2.8.5-2) のトリガを処理しています ...
systemd (241-5+rpi1) のトリガを処理しています ...


@raspberrypi:~ $ sudo dpkg-reconfigure -plow unattended-upgrades

パッケージの設定

 lqqqqqqqqqqqqqqqqqu unattended-upgrades を設定しています tqqqqqqqqqqqqqqqqqqk
 x                                                                           x
 x 更新の適用を頻繁に実施するのは、システムを安全に保つために重要なことです  x
 x 。標準の状態では、更新の適用はパッケージ管理ツールを使って手動で行う必要  x
 x があります。別のやり方として、セキュリティ更新を自動的にダウンロードして  x
 x インストールするよう、このシステムを設定するようにもできます。            x
 x                                                                           x
 x 自動的に安定版の更新をダウンロードしてインストールしますか?               x
 x                                                                           x
 x                    <はい>                      <いいえ>                   x
 x                                                                           x
 mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

パッケージを事前設定しています ...
以前に未選択のパッケージ python3-distro-info を選択しています。
(データベースを読み込んでいます ... 現在 143029 個のファイルとディレクトリがインストールされています。)
.../python3-distro-info_0.21_all.deb を展開する準備をしています ...
python3-distro-info (0.21) を展開しています...
以前に未選択のパッケージ unattended-upgrades を選択しています。
.../unattended-upgrades_1.11.2_all.deb を展開する準備をしています ...
unattended-upgrades (1.11.2) を展開しています...
python3-distro-info (0.21) を設定しています ...
unattended-upgrades (1.11.2) を設定しています ...

Creating config file /etc/apt/apt.conf.d/20auto-upgrades with new version

Creating config file /etc/apt/apt.conf.d/50unattended-upgrades with new version
Created symlink /etc/systemd/system/multi-user.target.wants/unattended-upgrades.service → /lib/systemd/system/unattended-upgrades.service.
Synchronizing state of unattended-upgrades.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable unattended-upgrades
man-db (2.8.5-2) のトリガを処理しています ...
systemd (241-5+rpi1) のトリガを処理しています ...

@raspberrypi:~ $ sudo vi /etc/apt/apt.conf.d/50unattended-upgrades

 

「crontab -e」

一番シンプルで手間をかけたくない場合は、一番良いと思います。

0 7 * * 1 apt update && apt upgrade -y

「cron-apt」

cron-aptを用いても、パッケージの自動更新が実施できます。

「cron-apt」インストール

apt-get install cron-apt

/etc/cron-apt/config を編集

以下、編集内容の例です。個人的には運用で使っていないので、環境に合わせて見直して下さい。

APTCOMMAND=/usr/bin/apt-get
ACTIONDIR="/etc/cron-apt/action.d"
MAILTO="root"
MAILON="upgrade"
SYSLOGON="upgrade"
RUNSLEEP=3600
OPTIONS="-o quiet=1"

/etc/cron-apt/action.d/3-download を編集

dist-upgrade の -d (ダウンロードのみでインストールしない) オプションが設定されているので、ダウンロードとインストールが実行されるように変更します。

変更前
autoclean -y
dist-upgrade -d -y -o APT::Get::Show-Upgraded=true
変更後
autoclean -y
dist-upgrade -y -o APT::Get::Show-Upgraded=true

/etc/cron.d/cron-apt を編集

0 4     * * *   root    test -x /usr/sbin/cron-apt && /usr/sbin/cron-apt

毎朝4時に実行の例。
その他、実行時間を朝8に変更したい場合などは、以下。

0 8 * * * root test -x /usr/sbin/cron-apt && /usr/sbin/cron-apt

動作確認

○ ログ
# tail /var/log/cron-apt/log
$ tail /var/log/syslog | grep cron-apt

 

  • /usr/sbin/cron-apt を実行し、受信メールまたはログを確認。
    # /usr/sbin/cron-apt
  • ログを確認:
    • /var/log/cron-apt/log
    • /var/log/syuslog | grep cron-apt
  • 自動アップデートが発生した際に送られてきたメールを見る

READMEファイル

@raspberrypi:~ $ sudo cat /usr/share/doc/cron-apt/README
cron-apt for Debian
-------------------

The intention of cron-apt is to automate the process to upgrade the Debian
GNU/Linux operating system. By default it only download packages which means
that the actual installation/upgrade must be done manually. It is possible
to fully update the upgrade procedure if you want but be aware that this
may break the installation in case something goes wrong.

Compared to cron script in APT:
-------------------------------

APT package has its own script /etc/cron.daily/apt, which can do:
* fancy auto-clean with rule
* check and download upgradable packages automatically
* automatic unattended upgrade
+ need to install unattended-upgrades package
+ aimed for security upgrade and have its blacklist capability
+ mail capability (The extent of this, i do not know for sure?)

These can be enabled via apt configuration variables (usually stored in
/etc/apt/apt.conf.d/02backup and 50unattended-upgrades).

If the above is what you need, then consider to use that instead of cron-apt.

General Configuration:
----------------------

All cron-apt configuration is placed in /etc/cron-apt. The structure of that
directory is as follows.

Main configuration:
- config
- action.d/
- config.d/
Additional configuration for logging:
- *msg.d/
- *msgs/

The general principle of cron-apt configuration is that actions are defined in
/etc/cron-apt/action.d/. Each action file can contain one or more lines to
execute. Each line in an action file is passed as an argument to apt-get
(or more precisely the command defined by the APTCOMMAND and OPTIONS
configuration variables). The actions are executed in alphabetical order and
line by line. Use a number from zero (0) to nine (9) to give a precise order.

The default actions are:
* 0-update: Updates the list of known packages
* 3-download: Downloads the updated packages but do not install them

The file /etc/cron-apt/config holds the main configuration data.

It is also possible to add extra configuration for each action (same syntax as
/etc/cron-apt/config) by naming the file /etc/cron-apt/config.d/<actionname>.
The configuration from one action is kept to the next action as well.

Configuration file syntax:
--------------------------

The configuration files (/etc/cron-apt/config and
/etc/cron-apt/config.d/<action>) consists of a number of variables that can be
set to values as outlined below. In addition they follow the POSIX /bin/sh
syntax which means that they can be used for hooks and simlar things as well
as simply setting variables. These variables are described below with their
default value.

APTCOMMAND=/usr/bin/apt-get (default)

The command used to execute all actions. By default apt-get is used and
this is also the recommended command to use. For more information see
above. Alternative settings can be:

APTCOMMAND=/usr/bin/aptitude
APTCOMMAND=/usr/bin/apt-file

OPTIONS="-o quiet=1"

General apt options that will be passed to all APTCOMMAND calls.
Use "-o quiet" instead of "-q" for aptitude compatibility.

You can for example add an additional sources.list file here.
OPTIONS="-o quiet=1 --no-list-cleanup -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
You can also set an alternative sources.list file here.
OPTIONS="-o quiet=1 --no-list-cleanup -o Dir::Etc::SourceList=/etc/apt/securi ty.sources.list -o Dir::Etc::SourceParts=\"/dev/null\""
If you want to allow unauthenticated and untrusted packages add the
following to your options directive.
OPTIONS="-o quiet=1 -o APT::Get::AllowUnauthenticated=true -o aptitude::Cmdli ne::ignore-trust-violations=yes"
To limit the bandwidth used use the following line. This example limit the
bandwidth usage to 25 kB/s.
OPTIONS="-o Acquire::http::Dl-Limit=25"

MAILON="error"

When to send email about the cron-apt results.
Value:
error (send mail on error runs)
upgrade (when packages are upgraded)
changes (mail when change in output from an action)
output (send mail when output is generated)
always (always send mail)
never (never send mail)
(else never send mail)

SYSLOGON="upgrade"

When to log the cron-apt results to syslog.
Value:
error (syslog on error runs)
upgrade (when packages is upgraded)
changes (syslog when change in output from an action)
output (syslog when output is generated)
always (always syslog)
never (never syslog)
(else never syslog)

RUNSLEEP=3600

The random sleep time in seconds. This is used to prevent clients from
accessing the APT sources all at the same time and overwhelming them.
Default is 3600 seconds which means one hour.

DONTRUN=""

Do not run the command, if there is an error in the previous run (default).
Value:
error (do not run if there is an error on last run)
(else always run, remove previous error file and run)

MAILTO="root"

The email address to send mail to.

MAILWIDTH="900"

Maximum characters per line in the outgoing mail message.
Wrapping occurs at whitespace.

DEBUG="output"

When to log to the cron-apt log file.
Value:
verbose (log everything)
always (always log)
upgrade (when packages is upgraded)
changes (log when change in output from an action)
output (log when output is generated)
error (log error runs only)
never (log nothing)
(else log nothing)

DIFFONCHANGES=prepend

What to do with the diff when *ON is set to 'changes'.
Value:
prepend (prepend to the output)
append (append to the output)
only (only show the diff, not the output itself)
(else do nothing)

REFRAINFILE=/etc/cron-apt/refrain

If this file exist cron-apt will silently exit.

HOSTNAME=""

If this is non-empty, it will be used as the host name in subjects of
generated e-mail messages. If this is empty, the output of uname -n
will be used.

SUBJECTPREFIX="CRON-APT"

The start string for the email subject line when reports are
sent by email.

The total subject line is
<SUBJECTPREFIX> error|completed on <HOSTNAME> [<CONFIG>]

DIFFIGNORE=""

Ignore lines matching this regexp to determine whether changes occurred
for MAILON="changes". If empty no lines will be ignored.

Suggested value for aptitude:
DIFFIGNORE="^\(Get:[[:digit:]]\+\|Hit\|Ign\|Del\|Fetched\|Freed\|Reading\)[[:space:]]"

Suggested value for apt-get:
DIFFIGNORE="^\(Get:[[:digit:]]\+\|Hit\|Ign\)[[:space:]]"

XHEADER*

Support for mail headers. You can add up to 9 headers to the mail sent.
This below example can be used for OTRS.
The default is no headers added.
XHEADER1="X-OTRS-Queue: updates"
XHEADER2="X-OTRS-Loop: true"
...

APT_CONFIG=/etc/apt/cron.apt.paths

Additional APT configuration file that is loaded first. This can be set in
order to use a completely different APT configuration for cron-apt. See the
/usr/share/doc/cron-apt/README and apt.conf(5) for details

export APT_CONFIG=/etc/apt/cron.apt.paths

PATH

A path is needed for cron-apt to work. The default PATH is as written
below.

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

MINTMPDIRSIZE=10

The minimum amount of disc space (in kB) that need to exist on the
device where temporary files are created (mktemp) to allow cron-apt
to run. If set to 0 it will always continue even if empty.

ACTIONDIR="/etc/cron-apt/action.d"

The directory where the actions is stored.

ACTIONCONFDIR="/etc/cron-apt/config.d"

The directory where configuration per action is stored. The message file
must have the same name as the action file.

MAILMSGDIR="/etc/cron-apt/mailmsg.d"

The directory where messages that will be prepended to the email that is
sent (per action) is stored. The message file must have the same name as
the action file.

SYSLOGMSGDIR="/etc/cron-apt/syslogmsg.d"

The directory where messages that will be prepended to text that is
sent (per action) to syslog. The message file must have the same name as
the action file.

ERRORMSGDIR="/etc/cron-apt/errormsg.d"

The directory where messages that will be prepended to the error message
(per action) is stored. The message file must have the same name as
the action file.

LOGMSGDIR="/etc/cron-apt/logmsg.d"

The directory where messages that will be prepended to the log (debug)
message (per action) is stored. The message file must have the same name as
the action file.

MAILONMSGSDIR="/etc/cron-apt/mailonmsgs"

The directory where messages that will be prepended to the mail message
(per MAILON type) is stored. The message file must have the same name as
the MAILON directive.

SYSLOGONMSGSDIR="/etc/cron-apt/syslogonmsgs"

The directory where messages that will be prepended to the syslog message
(per SYSLOGON type) is stored. The message file must have the same name as
the SYSLOGON directive.

NOLOCKWARN=""

Whether to warn about the fact that dotlockfile is not installed.
Value:
"" (warn if dotlockfile is not installed)
"nowarn" (don't give warning if dotlockfile not installed)

ERROR="/var/log/cron-apt/error"

The temporary file that contains error messages.

TEMP="/var/log/cron-apt/temp"

The temporary file that contains current run information when still running
the script.

LOGDIR="/var/log/cron-apt"

The directory to place temporary logs. A convenience copy of the
last mail message sent out is also placed here as
$LOGDIR/lastfullmessage to process in a .profile script or a monitoring
plugin.

LOG="$LOGDIR/log"

The temporary logfile (for debugging). Use syslog for normal logging.

MAIL="/var/log/cron-apt/mail"

The temporary file that contain information to be sent in email.

EXITON="error"

Whether to exit on errors or not.
Value:
error (exit on error only)
(else never exit)

UMASK_APT="022"

Umask for the files created by the APT command used. In all other cases
umask 077 will be used.

Alternative APT command:
------------------------

The APTCOMMAND configuration variable defines the APT command to use to execute
the actions. By default /usr/bin/apt-get is used and this is is also the
recommended command to use.

But you can actually use any program you like. Although aptitude is the
recommended tool for interactive upgrades, for cron-apt's purposes apt-get is
better and, for most configurations, the extra features of aptitude are not
relevant. If you insist on using aptitide, you will have to work around some
of its bugs.
OBSERVE that cron-apt is indended to use apt-get and tools like aptitude do not
have full support for noninteractive upgrades. You may have to tune options
to not create infinit logfiles for example.

Setting it to /usr/bin/aptitude (to use aptitude instead of apt-get) will
resolve changed Recommends (and Suggests as well, if aptitude is configured
so).

You can also set other utilities (especially useful for files in the config.d/
directory) to set some completely different tool.

Configuration for logging:
--------------------------

In addition to the main configuration it is possible to define extra
information to be logged at execution. The principle is that files in
<something>msg.d/ is logged for each action and files in <something>msgs/ are
logged for matching configuration directive.

The the below descriptions the following tag syntax is used: [TAG].
The tag means that this configuration is only used in case the TAG
configuration variable tell that logging should be done.

* /etc/cron-apt/errormsg.d/
Contains a file for each action to log in case an error occur in the
corresponding action. This is used in case any of the configuration
directive tells that logging should be done.
* /etc/cron-apt/logmsg.d/ [DEBUG]
Contains a file for each action to log to stdout.
* /etc/cron-apt/mailmsg.d/ [MAILON]
Contains a file for each action to prepend to the email sent.
* /etc/cron-apt/syslogmsg.d/ [SYSLOGON]
Contain files for each action to log in syslog.
* /etc/cron-apt/mailonmsgs/ [MAILON]
Contain files, with name corresponding to the MAILON configuration variable,
with text to prepend to the email sent.
* /etc/cron-apt/syslogonmsgs/ [SYSLOGON]
Contain files, with name corresponding to the SYSLOGON configuration
variable, with text to log to syslog.

For more details about this see 'Configuration file syntax' below.

Regular execution:
------------------

If you want this tool to be run even if you do not have it up at
04 in the morning you can create a symbolic link from /etc/cron.daily/cron-apt
to /usr/sbin/cron-apt. It will then be run every day (even if the computer is
not on at that time). Similar things can be done for each week, and so on.
You have to have anacron installed for this to work. If not, daily scripts
run 6 AM by crond.

ln -s /usr/sbin/cron-apt /etc/cron.daily/cron-apt

Observe that it is not always a good thing to update package information
and download files when the computer is started. This is especially true
if you do not have a good Internet connection.

You also need to disable the normal cron.d/cron-apt file if you do not want
it to be run twice.

Also note that anacron does not run anything while on battery power.
So in the event you want to run regular updates also when running on battery
only you need to change the anacron default setting.
For more information how to do that see /usr/share/doc/anacron/README.Debian.

Alternate sources.list file
---------------------------

If you just want to update security related things you can always use an
alternate sources.list files by giving this extra information to the OPTIONS
variable in the configuration file.

OPTIONS="-o quiet=1 --no-list-cleanup -o Dir::Etc::SourceList=/etc/apt/security.sources.list -o Dir::Etc::SourceParts=\"/dev/null\""

Alternatively you can use a separate APT configuration file as described
in the chapter below. You can for example point to a source list as follows:

Dir::Etc::SourceList "/etc/apt/security.sources.list";
Dir::Etc::SourceParts "/dev/null"

In that case you only need to update the OPTIONS variable to include the
'--no-list-cleanup' argument.

Alternate APT main configuration
--------------------------------

There are cases when you need the APT configuration for use with cron-apt to
differ substantially from your standard configuration. For example, cron-apt
will not work with the default configuration of APT, when apt-listbugs is
installed, because this adds a hook that expects keyboard interactivity.

Unfortunately, the apt-tools do not accept Dir::Etc::Main and Dir::Etc::Parts
settings on the command-line. In order to use different paths for them, you
have to create another APT configuration file containing eg:

Dir::Etc::Main "cron.apt.conf";
Dir::Etc::Parts "cron.apt.conf.d";

Then uncomment the following line in your cron-apt configuration file and
point it to your newly created APT configuration file:

export APT_CONFIG=/etc/apt/cron.apt.paths

Don't forget additional options you might have set in /etc/apt/apt.conf since
this file is no longer use when APT_CONFIG point to another conf file.

Development and documentation
-----------------------------

If you want more information about this software you can visit the homepage
at http://inguza.com/software/cron-apt/. You can find documentation,
development information and other things there.

Copyright information:
----------------------

Copyright (C) 2002-2018 Ola Lundqvist <ola@inguza.com>
Copyright (C) 2018 Sebastian Klamar <bug.cron-apt@sebastian.klamar.name>
Copyright (C) 2004,2007,2013,2016 Bob Proulx <bob@proulx.com>
Copyright (C) 2016 Bas Zoetekouw <bas@debian.org>
Copyright (C) 2016 Geoffroy Youri Berret <efrim@azylum.org>
Copyright (C) 2009 Edward Malone <edward.malone88@gmail.com>
Copyright (C) 2004-2011,2013,2017 Marc Haber <mh+debian-bugs@zugschlus.de>
Copyright (C) 2006 Felix Palmen <fmp@palmen.homeip.net>
Copyright (C) 2004 Marc Sherman <msherman@projectile.ca>
Copyright (C) 2004 David Weinehall
Copyright (C) 2003 Sean Finney <seanius@seanius.net>
Copyright (C) 2002 Marcel Kolaja <marcel@solnet.cz>

License terms
-------------

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program as the file COPYING; if not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301 USA.

参考にさせて頂いたサイト

Darknet/YOLOの独自学習に向けた画像準備

独自/オリジナルの1クラスを勉強させるのに多くの画像データが必要となります。WEBの記事では、1クラス数千枚と記載されておりました。このサイトで公開しているめざましじゃんけん画像検出も精度向上で画像追加を適時行っておりますが、サービス提供開始時点でトータル5000枚(4クラス合計)で開始しております。
インターネットからキーワードで画像データを探してくるツールや、機械学習向けのデータセットを公開しているサイトなどもあるようです。

機械学習向けデータセット公開サイト:ImageNet
80,000を超える対象のデータセットが準備されているようです。

Raspberry Piに接続したUSBカメラで機械学習向けデータセット準備

Raspberry PiにUSB接続のWEBカメラ導入
当初、扱いが楽なfswebcamを利用して実施しようとしましたが、結局は画像検出でも多用するOpenCVを利用した画像準備を実施しました。
めざましじゃんけんでは、結果表示時間が短いこともあり、短時間で多くの画像取得をする必要がありました。fswebcamはコマンドで閉じた画像取得ができるのがメリットとなりますが、カメラの準備や利用終了などが一連の流れとしてコマンド化されており、画像の連続取得には適しておりませんでした。Sleepなしで連続画像取得をした際に、Raspberry Piでは1画像/3−8秒必要となっておりました。このインターバルが不揃いであった点も利用に至らなかった要因です。

fswebcamインストールと機械学習向けデータセット

@raspberrypi: $ sudo apt-get install fswebcam
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libboost-system1.62.0 libboost-thread1.62.0 libreoffice-gtk2
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
fswebcam
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 43.5 kB of archives.
After this operation, 116 kB of additional disk space will be used.
Get:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf fswebcam armhf 20140113-2 [43.5 kB]
Fetched 43.5 kB in 1s (39.0 kB/s)
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "ja_JP.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("ja_JP.UTF-8").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: LC_ALL??????????????????: ??????????????????????
Selecting previously unselected package fswebcam.
(Reading database ... 151227 files and directories currently installed.)
Preparing to unpack .../fswebcam_20140113-2_armhf.deb ...
Unpacking fswebcam (20140113-2) ...
Setting up fswebcam (20140113-2) ...
Processing triggers for man-db (2.8.5-2) ...

画像取得時のコマンド

以下のコマンドで、画像保存を行いました。

/usr/bin/fswebcam -r 640x480 -F100 /mnt/synology/capture/`date "+%Y%m%d_%H%M%S"`.jpg

参考にさせて頂いたサイト

Webカメラでインターバル撮影

OpenCVインストールと機械学習向けデータセット

今後、Raspberry Pi上でのOpenCVインストール方法を記事にしますが、簡単な画像処理には、以下コマンドで入るOpenCVで特に問題は有りませんでした。

apt-get install python-opencv

OpenCVの利用方法

  1. OpenCVをインポート
    import cv2
  2. カメラデバイスを取得
    c = cv2.VideoCapture(0)
  3. カメラ起動待ち
    Sleepを少し入れるか、c.read()を画像取得なしで実行します
    ※ カメラ依存と思いますが、最初の画像が暗くなる傾向があります。
  4. readで画像をキャプチャ、imgにRGBのデータが入ってくる
    r, img = c.read()
  5. ファルへ保存
    cv2.imwrite('photo.jpg', img)

参考にさせて頂いたサイト

[Raspberry Pi]USBカメラをつなぎ、PythonのOpenCVで写真を撮る

python-opencvインストールログ

@raspberrypi:$ sudo apt-get install python-opencv
[sudo] パスワード:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libboost-system1.62.0 libboost-thread1.62.0 libreoffice-gtk2
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
gdal-data gfortran gfortran-8 libaec0 libarmadillo9 libarpack2 libcaf-openmpi-3 libcharls2 libcoarrays-dev
libcoarrays-openmpi-dev libdap25 libdapclient6v5 libdapserver7v5 libepsilon1 libevent-core-2.1-6 libevent-pthreads-2.1-6
libfreexl1 libfyba0 libgdal20 libgdcm2.8 libgeos-3.7.1 libgeos-c1v5 libgeotiff2 libgfortran-8-dev libgl2ps1.4 libhdf4-0-alt
libhdf5-103 libhdf5-openmpi-103 libhwloc-dev libhwloc-plugins libhwloc5 libibverbs-dev libkmlbase1 libkmlconvenience1
libkmldom1 libkmlengine1 libkmlregionator1 libkmlxsd1 liblept5 libmariadb3 libminizip1 libnetcdf-c++4 libnetcdf13 libnl-3-dev
libnl-route-3-dev libodbc1 libogdi3.2 libopencv-calib3d3.2 libopencv-contrib3.2 libopencv-core3.2 libopencv-features2d3.2
libopencv-flann3.2 libopencv-highgui3.2 libopencv-imgcodecs3.2 libopencv-imgproc3.2 libopencv-ml3.2 libopencv-objdetect3.2
libopencv-photo3.2 libopencv-shape3.2 libopencv-stitching3.2 libopencv-superres3.2 libopencv-video3.2 libopencv-videoio3.2
libopencv-videostab3.2 libopencv-viz3.2 libopenmpi-dev libopenmpi3 libpmix2 libproj13 libqhull7 libsocket++1 libspatialite7
libsuperlu5 libsz2 libtbb2 libtesseract4 liburiparser1 libvtk6.3 libxerces-c3.2 mariadb-common mysql-common ocl-icd-libopencl1
odbcinst odbcinst1debian2 openmpi-bin openmpi-common proj-bin proj-data
提案パッケージ:
gfortran-doc gfortran-8-doc libgfortran5-dbg geotiff-bin gdal-bin libgeotiff-epsg libhdf4-doc libhdf4-alt-dev hdf4-tools
libhwloc-contrib-plugins libmyodbc odbc-postgresql tdsodbc unixodbc-bin ogdi-bin openmpi-doc mpi-default-bin vtk6-doc
vtk6-examples opencl-icd
以下のパッケージが新たにインストールされます:
gdal-data gfortran gfortran-8 libaec0 libarmadillo9 libarpack2 libcaf-openmpi-3 libcharls2 libcoarrays-dev
libcoarrays-openmpi-dev libdap25 libdapclient6v5 libdapserver7v5 libepsilon1 libevent-core-2.1-6 libevent-pthreads-2.1-6
libfreexl1 libfyba0 libgdal20 libgdcm2.8 libgeos-3.7.1 libgeos-c1v5 libgeotiff2 libgfortran-8-dev libgl2ps1.4 libhdf4-0-alt
libhdf5-103 libhdf5-openmpi-103 libhwloc-dev libhwloc-plugins libhwloc5 libibverbs-dev libkmlbase1 libkmlconvenience1
libkmldom1 libkmlengine1 libkmlregionator1 libkmlxsd1 liblept5 libmariadb3 libminizip1 libnetcdf-c++4 libnetcdf13 libnl-3-dev
libnl-route-3-dev libodbc1 libogdi3.2 libopencv-calib3d3.2 libopencv-contrib3.2 libopencv-core3.2 libopencv-features2d3.2
libopencv-flann3.2 libopencv-highgui3.2 libopencv-imgcodecs3.2 libopencv-imgproc3.2 libopencv-ml3.2 libopencv-objdetect3.2
libopencv-photo3.2 libopencv-shape3.2 libopencv-stitching3.2 libopencv-superres3.2 libopencv-video3.2 libopencv-videoio3.2
libopencv-videostab3.2 libopencv-viz3.2 libopenmpi-dev libopenmpi3 libpmix2 libproj13 libqhull7 libsocket++1 libspatialite7
libsuperlu5 libsz2 libtbb2 libtesseract4 liburiparser1 libvtk6.3 libxerces-c3.2 mariadb-common mysql-common ocl-icd-libopencl1
odbcinst odbcinst1debian2 openmpi-bin openmpi-common proj-bin proj-data python-opencv
アップグレード: 0 個、新規インストール: 89 個、削除: 0 個、保留: 0 個。
69.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 280 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf gdal-data all 2.4.0+dfsg-1 [744 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgfortran-8-dev armhf 8.3.0-6+rpi1 [249 kB]
取得:4 http://raspbian.raspberrypi.org/raspbian buster/main armhf gfortran armhf 4:8.3.0-1+rpi2 [1,428 B]
取得:8 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf libarmadillo9 armhf 1:9.200.7+dfsg-1 [87.0 kB]
取得:3 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf gfortran-8 armhf 8.3.0-6+rpi1 [7,202 kB]
取得:5 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libaec0 armhf 1.0.2-1 [21.3 kB]
取得:6 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libarpack2 armhf 3.7.0-2 [83.1 kB]
取得:7 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libsuperlu5 armhf 5.2.1+dfsg1-4 [126 kB]
取得:11 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf libhwloc5 armhf 1.11.12-3+rpi1 [86.3 kB]
取得:9 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libevent-core-2.1-6 armhf 2.1.8-stable-4 [117 kB]
取得:10 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libevent-pthreads-2.1-6 armhf 2.1.8-stable-4 [47.6 kB]
得:12 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf ocl-icd-libopencl1 armhf 2.2.12-2 [35.7 kB]
取得:13 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libhwloc-plugins armhf 1.11.12-3+rpi1 [16.0 kB]
取得:14 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libpmix2 armhf 3.1.2-3 [423 kB]
取得:15 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopenmpi3 armhf 3.1.3-11+rpi1 [1,813 kB]
取得:30 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf proj-data all 5.2.0-1 [6,986 kB]
取得:16 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libcaf-openmpi-3 armhf 2.4.0-2 [31.3 kB]
取得:17 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libcharls2 armhf 2.0.0+dfsg-1 [52.0 kB]
取得:18 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libcoarrays-dev armhf 2.4.0-2 [29.1 kB]
取得:19 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf openmpi-common all 3.1.3-11+rpi1 [164 kB]
取得:20 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf openmpi-bin armhf 3.1.3-11+rpi1 [197 kB]
取得:21 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libcoarrays-openmpi-dev armhf 2.4.0-2 [29.2 kB]
取得:22 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libdap25 armhf 3.20.3-1 [470 kB]
取得:23 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libdapclient6v5 armhf 3.20.3-1 [185 kB]
取得:24 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libdapserver7v5 armhf 3.20.3-1 [127 kB]
取得:25 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libepsilon1 armhf 0.9.2+dfsg-4 [36.4 kB]
取得:26 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libfreexl1 armhf 1.0.5-3 [31.8 kB]
取得:27 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libfyba0 armhf 4.1.1-6 [97.8 kB]
取得:28 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgeos-3.7.1 armhf 3.7.1-1 [637 kB]
取得:29 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgeos-c1v5 armhf 3.7.1-1 [290 kB]
取得:31 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libproj13 armhf 5.2.0-1 [185 kB]
取得:32 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgeotiff2 armhf 1.4.3-1 [63.8 kB]
取得:33 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libhdf4-0-alt armhf 4.2.13-4+b1 [235 kB]
取得:34 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libsz2 armhf 1.0.2-1 [6,640 B]
取得:35 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libhdf5-103 armhf 1.10.4+repack-10 [1,259 kB]
取得:36 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libminizip1 armhf 1.1-8 [18.3 kB]
取得:37 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf liburiparser1 armhf 0.9.1-1 [39.4 kB]
取得:38 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libkmlbase1 armhf 1.3.0-7 [42.1 kB]
取得:39 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libkmldom1 armhf 1.3.0-7 [144 kB]
取得:40 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libkmlengine1 armhf 1.3.0-7 [67.4 kB]
取得:41 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libkmlconvenience1 armhf 1.3.0-7 [44.4 kB]
取得:42 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libkmlregionator1 armhf 1.3.0-7 [22.2 kB]
取得:43 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libkmlxsd1 armhf 1.3.0-7 [28.7 kB]
取得:44 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf mysql-common all 5.8+1.0.5 [7,324 B]
取得:45 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf mariadb-common all 1:10.3.15-1 [31.3 kB]
:46 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libmariadb3 armhf 1:10.3.15-1 [167 kB]
取得:47 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libnetcdf13 armhf 1:4.6.2-1+b1 [352 kB]
取得:48 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libodbc1 armhf 2.3.6-0.1 [186 kB]
取得:49 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libogdi3.2 armhf 3.2.1+ds-4 [194 kB]
取得:50 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libqhull7 armhf 2015.2-4 [175 kB]
取得:51 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libspatialite7 armhf 4.3.0a-5+b2 [1,231 kB]
取得:52 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libxerces-c3.2 armhf 3.2.2+debian-1+b1 [707 kB]
取得:53 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf odbcinst armhf 2.3.6-0.1 [47.6 kB]
取得:54 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf odbcinst1debian2 armhf 2.3.6-0.1 [70.8 kB]
取得:55 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgdal20 armhf 2.4.0+dfsg-1+b2 [5,065 kB]
取得:56 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libsocket++1 armhf 1.12.13-10 [35.2 kB]
取得:57 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgdcm2.8 armhf 2.8.8-9 [1,596 kB]
取得:58 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgl2ps1.4 armhf 1.4.0+dfsg1-2 [34.2 kB]
取得:59 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libhdf5-openmpi-103 armhf 1.10.4+repack-10 [1,306 kB]
取得:60 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libhwloc-dev armhf 1.11.12-3+rpi1 [142 kB]
取得:61 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libnl-3-dev armhf 3.4.0-1 [92.4 kB]
取得:62 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libnl-route-3-dev armhf 3.4.0-1 [145 kB]
取得:63 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libibverbs-dev armhf 22.1-1 [149 kB]
取得:64 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf liblept5 armhf 1.76.0-1 [804 kB]
取得:65 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libnetcdf-c++4 armhf 4.2-11 [28.3 kB]
取得:66 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libtbb2 armhf 2018~U6-4 [110 kB]
取得:67 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-core3.2 armhf 3.2.0+dfsg-6 [602 kB]
取得:68 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-flann3.2 armhf 3.2.0+dfsg-6 [85.5 kB]
取得:69 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-imgproc3.2 armhf 3.2.0+dfsg-6 [682 kB]
取得:70 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-imgcodecs3.2 armhf 3.2.0+dfsg-6 [80.8 kB]
取得:71 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-videoio3.2 armhf 3.2.0+dfsg-6 [82.0 kB]
取得:72 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf libopencv-highgui3.2 armhf 3.2.0+dfsg-6 [30.1 kB]
取得:73 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-ml3.2 armhf 3.2.0+dfsg-6 [195 kB]
取得:74 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-features2d3.2 armhf 3.2.0+dfsg-6 [188 kB]
取得:75 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-calib3d3.2 armhf 3.2.0+dfsg-6 [385 kB]
取得:76 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-objdetect3.2 armhf 3.2.0+dfsg-6 [131 kB]
取得:77 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-photo3.2 armhf 3.2.0+dfsg-6 [168 kB]
取得:78 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-video3.2 armhf 3.2.0+dfsg-6 [115 kB]
取得:79 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-shape3.2 armhf 3.2.0+dfsg-6 [59.8 kB]
取得:80 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-stitching3.2 armhf 3.2.0+dfsg-6 [152 kB]
取得:81 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-superres3.2 armhf 3.2.0+dfsg-6 [49.1 kB]
取得:82 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-videostab3.2 armhf 3.2.0+dfsg-6 [93.1 kB]
取得:83 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libvtk6.3 armhf 6.3.0+dfsg2-2+b6 [27.4 MB]
取得:84 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-viz3.2 armhf 3.2.0+dfsg-6 [107 kB]
取得:85 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libtesseract4 armhf 4.0.0-2 [1,032 kB]
取得:86 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopencv-contrib3.2 armhf 3.2.0+dfsg-6 [1,222 kB]
取得:87 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libopenmpi-dev armhf 3.1.3-11+rpi1 [964 kB]
取得:88 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf proj-bin armhf 5.2.0-1 [98.2 kB]
取得:89 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf python-opencv armhf 3.2.0+dfsg-6 [487 kB]
69.6 MB を 54秒 で取得しました (1,285 kB/s)
パッケージからテンプレートを展開しています: 100%
以前に未選択のパッケージ gdal-data を選択しています。
(データベースを読み込んでいます ... 現在 151245 個のファイルとディレクトリがインストールされています。)
.../00-gdal-data_2.4.0+dfsg-1_all.deb を展開する準備をしています ...
gdal-data (2.4.0+dfsg-1) を展開しています...
以前に未選択のパッケージ libgfortran-8-dev:armhf を選択しています。
.../01-libgfortran-8-dev_8.3.0-6+rpi1_armhf.deb を展開する準備をしています ...
libgfortran-8-dev:armhf (8.3.0-6+rpi1) を展開しています...
以前に未選択のパッケージ gfortran-8 を選択しています。
.../02-gfortran-8_8.3.0-6+rpi1_armhf.deb を展開する準備をしています ...
gfortran-8 (8.3.0-6+rpi1) を展開しています...
以前に未選択のパッケージ gfortran を選択しています。
.../03-gfortran_4%3a8.3.0-1+rpi2_armhf.deb を展開する準備をしています ...
gfortran (4:8.3.0-1+rpi2) を展開しています...
以前に未選択のパッケージ libaec0:armhf を選択しています。
.../04-libaec0_1.0.2-1_armhf.deb を展開する準備をしています ...
libaec0:armhf (1.0.2-1) を展開しています...
以前に未選択のパッケージ libarpack2:armhf を選択しています。
.../05-libarpack2_3.7.0-2_armhf.deb を展開する準備をしています ...
libarpack2:armhf (3.7.0-2) を展開しています...
以前に未選択のパッケージ libsuperlu5:armhf を選択しています。
.../06-libsuperlu5_5.2.1+dfsg1-4_armhf.deb を展開する準備をしています ...
libsuperlu5:armhf (5.2.1+dfsg1-4) を展開しています...
以前に未選択のパッケージ libarmadillo9 を選択しています。
.../07-libarmadillo9_1%3a9.200.7+dfsg-1_armhf.deb を展開する準備をしています ...
libarmadillo9 (1:9.200.7+dfsg-1) を展開しています...
以前に未選択のパッケージ libevent-core-2.1-6:armhf を選択しています。
.../08-libevent-core-2.1-6_2.1.8-stable-4_armhf.deb を展開する準備をしています ...
libevent-core-2.1-6:armhf (2.1.8-stable-4) を展開しています...
以前に未選択のパッケージ libevent-pthreads-2.1-6:armhf を選択しています。
.../09-libevent-pthreads-2.1-6_2.1.8-stable-4_armhf.deb を展開する準備をしています ...
libevent-pthreads-2.1-6:armhf (2.1.8-stable-4) を展開しています...
以前に未選択のパッケージ libhwloc5:armhf を選択しています。
.../10-libhwloc5_1.11.12-3+rpi1_armhf.deb を展開する準備をしています ...
libhwloc5:armhf (1.11.12-3+rpi1) を展開しています...
以前に未選択のパッケージ ocl-icd-libopencl1:armhf を選択しています。
.../11-ocl-icd-libopencl1_2.2.12-2_armhf.deb を展開する準備をしています ...
ocl-icd-libopencl1:armhf (2.2.12-2) を展開しています...
以前に未選択のパッケージ libhwloc-plugins:armhf を選択しています。
.../12-libhwloc-plugins_1.11.12-3+rpi1_armhf.deb を展開する準備をしています ...
libhwloc-plugins:armhf (1.11.12-3+rpi1) を展開しています...
以前に未選択のパッケージ libpmix2:armhf を選択しています。
.../13-libpmix2_3.1.2-3_armhf.deb を展開する準備をしています ...
libpmix2:armhf (3.1.2-3) を展開しています...
以前に未選択のパッケージ libopenmpi3:armhf を選択しています。
.../14-libopenmpi3_3.1.3-11+rpi1_armhf.deb を展開する準備をしています ...
libopenmpi3:armhf (3.1.3-11+rpi1) を展開しています...
以前に未選択のパッケージ libcaf-openmpi-3:armhf を選択しています。
.../15-libcaf-openmpi-3_2.4.0-2_armhf.deb を展開する準備をしています ...
libcaf-openmpi-3:armhf (2.4.0-2) を展開しています...
以前に未選択のパッケージ libcharls2:armhf を選択しています。
.../16-libcharls2_2.0.0+dfsg-1_armhf.deb を展開する準備をしています ...
libcharls2:armhf (2.0.0+dfsg-1) を展開しています...
以前に未選択のパッケージ libcoarrays-dev:armhf を選択しています。
.../17-libcoarrays-dev_2.4.0-2_armhf.deb を展開する準備をしています ...
libcoarrays-dev:armhf (2.4.0-2) を展開しています...
以前に未選択のパッケージ openmpi-common を選択しています。
.../18-openmpi-common_3.1.3-11+rpi1_all.deb を展開する準備をしています ...
openmpi-common (3.1.3-11+rpi1) を展開しています...
以前に未選択のパッケージ openmpi-bin を選択しています。
.../19-openmpi-bin_3.1.3-11+rpi1_armhf.deb を展開する準備をしています ...
openmpi-bin (3.1.3-11+rpi1) を展開しています...
以前に未選択のパッケージ libcoarrays-openmpi-dev:armhf を選択しています。
.../20-libcoarrays-openmpi-dev_2.4.0-2_armhf.deb を展開する準備をしています ...
libcoarrays-openmpi-dev:armhf (2.4.0-2) を展開しています...
以前に未選択のパッケージ libdap25:armhf を選択しています。
.../21-libdap25_3.20.3-1_armhf.deb を展開する準備をしています ...
libdap25:armhf (3.20.3-1) を展開しています...
以前に未選択のパッケージ libdapclient6v5:armhf を選択しています。
.../22-libdapclient6v5_3.20.3-1_armhf.deb を展開する準備をしています ...
libdapclient6v5:armhf (3.20.3-1) を展開しています...
以前に未選択のパッケージ libdapserver7v5:armhf を選択しています。
.../23-libdapserver7v5_3.20.3-1_armhf.deb を展開する準備をしています ...
libdapserver7v5:armhf (3.20.3-1) を展開しています...
以前に未選択のパッケージ libepsilon1:armhf を選択しています。
.../24-libepsilon1_0.9.2+dfsg-4_armhf.deb を展開する準備をしています ...
libepsilon1:armhf (0.9.2+dfsg-4) を展開しています...
以前に未選択のパッケージ libfreexl1:armhf を選択しています。
.../25-libfreexl1_1.0.5-3_armhf.deb を展開する準備をしています ...
libfreexl1:armhf (1.0.5-3) を展開しています...
以前に未選択のパッケージ libfyba0:armhf を選択しています。
.../26-libfyba0_4.1.1-6_armhf.deb を展開する準備をしています ...
libfyba0:armhf (4.1.1-6) を展開しています...
以前に未選択のパッケージ libgeos-3.7.1:armhf を選択しています。
.../27-libgeos-3.7.1_3.7.1-1_armhf.deb を展開する準備をしています ...
libgeos-3.7.1:armhf (3.7.1-1) を展開しています...
以前に未選択のパッケージ libgeos-c1v5:armhf を選択しています。
.../28-libgeos-c1v5_3.7.1-1_armhf.deb を展開する準備をしています ...
libgeos-c1v5:armhf (3.7.1-1) を展開しています...
以前に未選択のパッケージ proj-data を選択しています。
.../29-proj-data_5.2.0-1_all.deb を展開する準備をしています ...
proj-data (5.2.0-1) を展開しています...
以前に未選択のパッケージ libproj13:armhf を選択しています。
.../30-libproj13_5.2.0-1_armhf.deb を展開する準備をしています ...
libproj13:armhf (5.2.0-1) を展開しています...
以前に未選択のパッケージ libgeotiff2:armhf を選択しています。
.../31-libgeotiff2_1.4.3-1_armhf.deb を展開する準備をしています ...
libgeotiff2:armhf (1.4.3-1) を展開しています...
以前に未選択のパッケージ libhdf4-0-alt を選択しています。
.../32-libhdf4-0-alt_4.2.13-4+b1_armhf.deb を展開する準備をしています ...
libhdf4-0-alt (4.2.13-4+b1) を展開しています...
以前に未選択のパッケージ libsz2:armhf を選択しています。
.../33-libsz2_1.0.2-1_armhf.deb を展開する準備をしています ...
libsz2:armhf (1.0.2-1) を展開しています...
以前に未選択のパッケージ libhdf5-103:armhf を選択しています。
.../34-libhdf5-103_1.10.4+repack-10_armhf.deb を展開する準備をしています ...
libhdf5-103:armhf (1.10.4+repack-10) を展開しています...
以前に未選択のパッケージ libminizip1:armhf を選択しています。
.../35-libminizip1_1.1-8_armhf.deb を展開する準備をしています ...
libminizip1:armhf (1.1-8) を展開しています...
以前に未選択のパッケージ liburiparser1:armhf を選択しています。
.../36-liburiparser1_0.9.1-1_armhf.deb を展開する準備をしています ...
liburiparser1:armhf (0.9.1-1) を展開しています...
以前に未選択のパッケージ libkmlbase1:armhf を選択しています。
.../37-libkmlbase1_1.3.0-7_armhf.deb を展開する準備をしています ...
libkmlbase1:armhf (1.3.0-7) を展開しています...
以前に未選択のパッケージ libkmldom1:armhf を選択しています。
.../38-libkmldom1_1.3.0-7_armhf.deb を展開する準備をしています ...
libkmldom1:armhf (1.3.0-7) を展開しています...
以前に未選択のパッケージ libkmlengine1:armhf を選択しています。
.../39-libkmlengine1_1.3.0-7_armhf.deb を展開する準備をしています ...
libkmlengine1:armhf (1.3.0-7) を展開しています...
以前に未選択のパッケージ libkmlconvenience1:armhf を選択しています。
.../40-libkmlconvenience1_1.3.0-7_armhf.deb を展開する準備をしています ...
libkmlconvenience1:armhf (1.3.0-7) を展開しています...
以前に未選択のパッケージ libkmlregionator1:armhf を選択しています。
.../41-libkmlregionator1_1.3.0-7_armhf.deb を展開する準備をしています ...
libkmlregionator1:armhf (1.3.0-7) を展開しています...
以前に未選択のパッケージ libkmlxsd1:armhf を選択しています。
.../42-libkmlxsd1_1.3.0-7_armhf.deb を展開する準備をしています ...
libkmlxsd1:armhf (1.3.0-7) を展開しています...
以前に未選択のパッケージ mysql-common を選択しています。
.../43-mysql-common_5.8+1.0.5_all.deb を展開する準備をしています ...
mysql-common (5.8+1.0.5) を展開しています...
以前に未選択のパッケージ mariadb-common を選択しています。
.../44-mariadb-common_1%3a10.3.15-1_all.deb を展開する準備をしています ...
mariadb-common (1:10.3.15-1) を展開しています...
以前に未選択のパッケージ libmariadb3:armhf を選択しています。
.../45-libmariadb3_1%3a10.3.15-1_armhf.deb を展開する準備をしています ...
libmariadb3:armhf (1:10.3.15-1) を展開しています...
以前に未選択のパッケージ libnetcdf13:armhf を選択しています。
.../46-libnetcdf13_1%3a4.6.2-1+b1_armhf.deb を展開する準備をしています ...
libnetcdf13:armhf (1:4.6.2-1+b1) を展開しています...
以前に未選択のパッケージ libodbc1:armhf を選択しています。
.../47-libodbc1_2.3.6-0.1_armhf.deb を展開する準備をしています ...
libodbc1:armhf (2.3.6-0.1) を展開しています...
以前に未選択のパッケージ libogdi3.2 を選択しています。
.../48-libogdi3.2_3.2.1+ds-4_armhf.deb を展開する準備をしています ...
libogdi3.2 (3.2.1+ds-4) を展開しています...
以前に未選択のパッケージ libqhull7:armhf を選択しています。
.../49-libqhull7_2015.2-4_armhf.deb を展開する準備をしています ...
libqhull7:armhf (2015.2-4) を展開しています...
以前に未選択のパッケージ libspatialite7:armhf を選択しています。
.../50-libspatialite7_4.3.0a-5+b2_armhf.deb を展開する準備をしています ...
libspatialite7:armhf (4.3.0a-5+b2) を展開しています...
以前に未選択のパッケージ libxerces-c3.2:armhf を選択しています。
.../51-libxerces-c3.2_3.2.2+debian-1+b1_armhf.deb を展開する準備をしています ...
libxerces-c3.2:armhf (3.2.2+debian-1+b1) を展開しています...
以前に未選択のパッケージ odbcinst を選択しています。
.../52-odbcinst_2.3.6-0.1_armhf.deb を展開する準備をしています ...
odbcinst (2.3.6-0.1) を展開しています...
以前に未選択のパッケージ odbcinst1debian2:armhf を選択しています。
.../53-odbcinst1debian2_2.3.6-0.1_armhf.deb を展開する準備をしています ...
odbcinst1debian2:armhf (2.3.6-0.1) を展開しています...
以前に未選択のパッケージ libgdal20 を選択しています。
.../54-libgdal20_2.4.0+dfsg-1+b2_armhf.deb を展開する準備をしています ...
libgdal20 (2.4.0+dfsg-1+b2) を展開しています...
以前に未選択のパッケージ libsocket++1:armhf を選択しています。
.../55-libsocket++1_1.12.13-10_armhf.deb を展開する準備をしています ...
libsocket++1:armhf (1.12.13-10) を展開しています...
以前に未選択のパッケージ libgdcm2.8:armhf を選択しています。
.../56-libgdcm2.8_2.8.8-9_armhf.deb を展開する準備をしています ...
libgdcm2.8:armhf (2.8.8-9) を展開しています...
以前に未選択のパッケージ libgl2ps1.4 を選択しています。
.../57-libgl2ps1.4_1.4.0+dfsg1-2_armhf.deb を展開する準備をしています ...
libgl2ps1.4 (1.4.0+dfsg1-2) を展開しています...
以前に未選択のパッケージ libhdf5-openmpi-103:armhf を選択しています。
.../58-libhdf5-openmpi-103_1.10.4+repack-10_armhf.deb を展開する準備をしています ...
libhdf5-openmpi-103:armhf (1.10.4+repack-10) を展開しています...
以前に未選択のパッケージ libhwloc-dev:armhf を選択しています。
.../59-libhwloc-dev_1.11.12-3+rpi1_armhf.deb を展開する準備をしています ...
libhwloc-dev:armhf (1.11.12-3+rpi1) を展開しています...
以前に未選択のパッケージ libnl-3-dev:armhf を選択しています。
.../60-libnl-3-dev_3.4.0-1_armhf.deb を展開する準備をしています ...
libnl-3-dev:armhf (3.4.0-1) を展開しています...
以前に未選択のパッケージ libnl-route-3-dev:armhf を選択しています。
.../61-libnl-route-3-dev_3.4.0-1_armhf.deb を展開する準備をしています ...
libnl-route-3-dev:armhf (3.4.0-1) を展開しています...
以前に未選択のパッケージ libibverbs-dev:armhf を選択しています。
.../62-libibverbs-dev_22.1-1_armhf.deb を展開する準備をしています ...
libibverbs-dev:armhf (22.1-1) を展開しています...
以前に未選択のパッケージ liblept5 を選択しています。
.../63-liblept5_1.76.0-1_armhf.deb を展開する準備をしています ...
liblept5 (1.76.0-1) を展開しています...
以前に未選択のパッケージ libnetcdf-c++4 を選択しています。
.../64-libnetcdf-c++4_4.2-11_armhf.deb を展開する準備をしています ...
libnetcdf-c++4 (4.2-11) を展開しています...
以前に未選択のパッケージ libtbb2:armhf を選択しています。
.../65-libtbb2_2018~U6-4_armhf.deb を展開する準備をしています ...
libtbb2:armhf (2018~U6-4) を展開しています...
以前に未選択のパッケージ libopencv-core3.2:armhf を選択しています。
.../66-libopencv-core3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-core3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-flann3.2:armhf を選択しています。
.../67-libopencv-flann3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-flann3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-imgproc3.2:armhf を選択しています。
.../68-libopencv-imgproc3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-imgproc3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-imgcodecs3.2:armhf を選択しています。
.../69-libopencv-imgcodecs3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-imgcodecs3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-videoio3.2:armhf を選択しています。
.../70-libopencv-videoio3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-videoio3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-highgui3.2:armhf を選択しています。
.../71-libopencv-highgui3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-highgui3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-ml3.2:armhf を選択しています。
.../72-libopencv-ml3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-ml3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-features2d3.2:armhf を選択しています。
.../73-libopencv-features2d3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-features2d3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-calib3d3.2:armhf を選択しています。
.../74-libopencv-calib3d3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-calib3d3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-objdetect3.2:armhf を選択しています。
.../75-libopencv-objdetect3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-objdetect3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-photo3.2:armhf を選択しています。
.../76-libopencv-photo3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-photo3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-video3.2:armhf を選択しています。
.../77-libopencv-video3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-video3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-shape3.2:armhf を選択しています。
.../78-libopencv-shape3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-shape3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-stitching3.2:armhf を選択しています。
.../79-libopencv-stitching3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-stitching3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-superres3.2:armhf を選択しています。
.../80-libopencv-superres3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-superres3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopencv-videostab3.2:armhf を選択しています。
.../81-libopencv-videostab3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-videostab3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libvtk6.3 を選択しています。
.../82-libvtk6.3_6.3.0+dfsg2-2+b6_armhf.deb を展開する準備をしています ...
libvtk6.3 (6.3.0+dfsg2-2+b6) を展開しています...
以前に未選択のパッケージ libopencv-viz3.2:armhf を選択しています。
.../83-libopencv-viz3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-viz3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libtesseract4:armhf を選択しています。
.../84-libtesseract4_4.0.0-2_armhf.deb を展開する準備をしています ...
libtesseract4:armhf (4.0.0-2) を展開しています...
以前に未選択のパッケージ libopencv-contrib3.2:armhf を選択しています。
.../85-libopencv-contrib3.2_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
libopencv-contrib3.2:armhf (3.2.0+dfsg-6) を展開しています...
以前に未選択のパッケージ libopenmpi-dev:armhf を選択しています。
.../86-libopenmpi-dev_3.1.3-11+rpi1_armhf.deb を展開する準備をしています ...
libopenmpi-dev:armhf (3.1.3-11+rpi1) を展開しています...
以前に未選択のパッケージ proj-bin を選択しています。
.../87-proj-bin_5.2.0-1_armhf.deb を展開する準備をしています ...
proj-bin (5.2.0-1) を展開しています...
以前に未選択のパッケージ python-opencv を選択しています。
.../88-python-opencv_3.2.0+dfsg-6_armhf.deb を展開する準備をしています ...
python-opencv (3.2.0+dfsg-6) を展開しています...
libgfortran-8-dev:armhf (8.3.0-6+rpi1) を設定しています ...
mysql-common (5.8+1.0.5) を設定しています ...
update-alternatives: /etc/mysql/my.cnf (my.cnf) を提供するために自動モードで /etc/mysql/my.cnf.fallback を使います
libxerces-c3.2:armhf (3.2.2+debian-1+b1) を設定しています ...
proj-data (5.2.0-1) を設定しています ...
libcharls2:armhf (2.0.0+dfsg-1) を設定しています ...
libminizip1:armhf (1.1-8) を設定しています ...
libhwloc5:armhf (1.11.12-3+rpi1) を設定しています ...
gfortran-8 (8.3.0-6+rpi1) を設定しています ...
libproj13:armhf (5.2.0-1) を設定しています ...
libtbb2:armhf (2018~U6-4) を設定しています ...
libarpack2:armhf (3.7.0-2) を設定しています ...
libsuperlu5:armhf (5.2.1+dfsg1-4) を設定しています ...
proj-bin (5.2.0-1) を設定しています ...
libdap25:armhf (3.20.3-1) を設定しています ...
libqhull7:armhf (2015.2-4) を設定しています ...
libepsilon1:armhf (0.9.2+dfsg-4) を設定しています ...
libdapserver7v5:armhf (3.20.3-1) を設定しています ...
gfortran (4:8.3.0-1+rpi2) を設定しています ...
update-alternatives: /usr/bin/f95 (f95) を提供するために自動モードで /usr/bin/gfortran を使います
update-alternatives: /usr/bin/f77 (f77) を提供するために自動モードで /usr/bin/gfortran を使います
libgeos-3.7.1:armhf (3.7.1-1) を設定しています ...
libaec0:armhf (1.0.2-1) を設定しています ...
gdal-data (2.4.0+dfsg-1) を設定しています ...
libgl2ps1.4 (1.4.0+dfsg1-2) を設定しています ...
liblept5 (1.76.0-1) を設定しています ...
mariadb-common (1:10.3.15-1) を設定しています ...
update-alternatives: /etc/mysql/my.cnf (my.cnf) を提供するために自動モードで /etc/mysql/mariadb.cnf を使います
libgeotiff2:armhf (1.4.3-1) を設定しています ...
libgeos-c1v5:armhf (3.7.1-1) を設定しています ...
libmariadb3:armhf (1:10.3.15-1) を設定しています ...
libsocket++1:armhf (1.12.13-10) を設定しています ...
libodbc1:armhf (2.3.6-0.1) を設定しています ...
libtesseract4:armhf (4.0.0-2) を設定しています ...
libevent-core-2.1-6:armhf (2.1.8-stable-4) を設定しています ...
libhdf4-0-alt (4.2.13-4+b1) を設定しています ...
liburiparser1:armhf (0.9.1-1) を設定しています ...
libnl-3-dev:armhf (3.4.0-1) を設定しています ...
libfreexl1:armhf (1.0.5-3) を設定しています ...
ocl-icd-libopencl1:armhf (2.2.12-2) を設定しています ...
libfyba0:armhf (4.1.1-6) を設定しています ...
libkmlbase1:armhf (1.3.0-7) を設定しています ...
libdapclient6v5:armhf (3.20.3-1) を設定しています ...
openmpi-common (3.1.3-11+rpi1) を設定しています ...
libhwloc-dev:armhf (1.11.12-3+rpi1) を設定しています ...
libarmadillo9 (1:9.200.7+dfsg-1) を設定しています ...
libopencv-core3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-ml3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libsz2:armhf (1.0.2-1) を設定しています ...
libkmlxsd1:armhf (1.3.0-7) を設定しています ...
libopencv-imgproc3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libkmldom1:armhf (1.3.0-7) を設定しています ...
libspatialite7:armhf (4.3.0a-5+b2) を設定しています ...
libevent-pthreads-2.1-6:armhf (2.1.8-stable-4) を設定しています ...
libogdi3.2 (3.2.1+ds-4) を設定しています ...
libkmlengine1:armhf (1.3.0-7) を設定しています ...
libopencv-photo3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libkmlconvenience1:armhf (1.3.0-7) を設定しています ...
libcoarrays-dev:armhf (2.4.0-2) を設定しています ...
libhwloc-plugins:armhf (1.11.12-3+rpi1) を設定しています ...
libnl-route-3-dev:armhf (3.4.0-1) を設定しています ...
libgdcm2.8:armhf (2.8.8-9) を設定しています ...
libkmlregionator1:armhf (1.3.0-7) を設定しています ...
libhdf5-103:armhf (1.10.4+repack-10) を設定しています ...
libopencv-video3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-flann3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libpmix2:armhf (3.1.2-3) を設定しています ...
libopenmpi3:armhf (3.1.3-11+rpi1) を設定しています ...
libnetcdf13:armhf (1:4.6.2-1+b1) を設定しています ...
libibverbs-dev:armhf (22.1-1) を設定しています ...
libnetcdf-c++4 (4.2-11) を設定しています ...
libhdf5-openmpi-103:armhf (1.10.4+repack-10) を設定しています ...
libcaf-openmpi-3:armhf (2.4.0-2) を設定しています ...
libopencv-shape3.2:armhf (3.2.0+dfsg-6) を設定しています ...
openmpi-bin (3.1.3-11+rpi1) を設定しています ...
update-alternatives: /usr/bin/mpirun (mpirun) を提供するために自動モードで /usr/bin/mpirun.openmpi を使います
update-alternatives: /usr/bin/mpicc (mpi) を提供するために自動モードで /usr/bin/mpicc.openmpi を使います
libcoarrays-openmpi-dev:armhf (2.4.0-2) を設定しています ...
libopenmpi-dev:armhf (3.1.3-11+rpi1) を設定しています ...
update-alternatives: /usr/include/arm-linux-gnueabihf/mpi (mpi-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/openmpi/include を使います
odbcinst (2.3.6-0.1) を設定しています ...
odbcinst1debian2:armhf (2.3.6-0.1) を設定しています ...
libgdal20 (2.4.0+dfsg-1+b2) を設定しています ...
libopencv-imgcodecs3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libvtk6.3 (6.3.0+dfsg2-2+b6) を設定しています ...
libopencv-viz3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-videoio3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-superres3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-highgui3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-features2d3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-calib3d3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-objdetect3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-stitching3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-videostab3.2:armhf (3.2.0+dfsg-6) を設定しています ...
libopencv-contrib3.2:armhf (3.2.0+dfsg-6) を設定しています ...
python-opencv (3.2.0+dfsg-6) を設定しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...
man-db (2.8.5-2) のトリガを処理しています ...

初期検討時のシステム構想

機械学習どころか、プログラム言語Pythonも全く初めて、Raspberry PiやWEBカメラなどインフラ関係も知識なし。

めざましじゃんけん結果

WEBからの情報などで、こんな感じにしたいと思い描いたのが以下のシステム構想。

一般的なGeForce(GeForce GTX 960)ビデオカード搭載のWindowsメインマシン(Intel Core i7-6700 CPU)で機械学習・ニューラルネットワークを用いた学習モデルの作成。作成した学習モデルをRaspberry Pi 3
Model B+ へ移動し、Raspberry Piで画像検出を実施。

Raspberry Piでの画像検出結果により、じゃんけん結果をDBへ蓄積。蓄積したDBデータより、めざましじゃんけんの結果をホームページと速報としてTwitterで公開。

当初画像認識と画像検出の違いも分かっておらず、書籍などで紹介されていた画像認識を駆使したシステムを構築しようとしておりました。画像認識を試した時点ではRaspberry Piで処理可能に感じました。
画像認識・・・対象がアップ(画像一面)になっている画像の判定を行う
画像検出・・・対象が写り込んでいる画像より、対象を画像検出する

第一は、技術習得が1番のモチベーションであった、予期しないカメラのズレなどを考えても、画像検出のほうがシステムの安定稼働を望めるので、画像検出実装へ方針転換しました。実際には、画像認識は1日で実装出来たのですが、うまく動作せず、画像認識対象部分の画像切り取りなど、決め打ちの方式しか思いつかず、そうそうに画像検出に方針転換しました。他にも転用出来る素晴らしい技術に出会えたと思います。(Darknet、YOLO、Open CV、Python、DNN、ニューラルネットワーク)

V1での妥協と実装方式

本当は、リアルタイムでの画像検出を実装する予定でした。時間指定で動作するシステムよりもテレビさえ動いていれば、じゃんけんのスタートを自動検知し、結果を漏れなく収集するシステムを構想しました。
しかし、Raspberry Piの処理速度・信頼性より断念しました。画像検出中のRaspberry Piの発熱量など。
よって、V1ではめざましじゃんけん結果の判定の画像検出は、メインのWindowsマシンで実行しております。
めざましじゃんけんのみに特化して考えると、OpenCVの画像処理を駆使すれば軽くて高速なフィルタ作成も可能かなと考えています。

V1機能一覧と実装

機能名実装
画像検出フレームワーク準備学習データ収集Raspberry PiとWEBカメラで、めざましじゃんけん実施時の画面キャプチャー取得
学習データ整理メインのWindowsマシンで実施。
LabelImgで学習したい内容のラベル登録
学習メインのWindowsマシンでDarknetを用いて実施。
システム起動TV起動Raspberry PiよりNature Remo経由で実施。
TVチャネル変更Raspberry PiよりテレビREGZAのWEB APIを用いて実施。
じゃんけん時の「青」「赤」「緑」ボタン操作もRaspberry PiよりWEB APIを用いて実施。
メインマシン起動メインマシン(Windows)の起動をRaspberry Piより実施
画像検出画像蓄積Raspberry PiのWEBカメラを用いて目覚ましテレビの画像をキャプチャー
画像移動Raspberry PiでキャプチャーしたデータをWindowsのメインマインに移動
画像検出Windowsマシンで画像検出を実施。
検出結果結果をDB登録Windowsマシンより画像検出結果をSynology NASのSQL DBへ登録
情報発信WEBコンテンツSQL DB情報よりWEBコンテンツの更新。Synologyで実施。
Twitter発信WEBコンテンツ更新と同じタイミングでTwitter発信を実施。処理はSynologyで実施。

Raspberry Piからのメール送信

Raspberry Pi 3 Model B+の利用を開始すると、Raspberry Piの各種モジュールへ通知先のメールアドレスを設定することがあります。
パッケージのアップデートやログのローテーション処理時のエラーなどもメール通知することが可能です。

今回は、Raspberry Piへ「mailutils」を導入し、以前に構築したSynology SMTPを経由し、e-mailを送信できる環境の構築を行います。
SynologyでSMTP(メールサーバ)構築

「mailutils」「ssmtp」インストール

$ sudo apt-get install -y mailutils
$ sudo apt-get install ssmtp

ssmtp.confを編集。

$ vi /etc/ssmtp/ssmtp.conf
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=@SynologyIP@

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=raspberrypi.miki-ie.com

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

メール送信テスト

@raspberrypi:~ $ mail -s test aaaa@gmail.com -aFrom:miki@192.168.0.108
Cc:
Null message body; hope that's ok

送信は、「Ctrl + D」コントロール + Dで送信します。

参考にさせて頂いたサイト

@raspberrypi:~ $ sudo apt-get install -y mailutils
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
rpi.gpio-common
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
exim4-base exim4-config exim4-daemon-light guile-2.2-libs libgc1c2
libgnutls-dane0 libgsasl7 libkyotocabinet16v5 liblzo2-2 libmailutils5
libntlm0 libunbound8 mailutils-common
提案パッケージ:
exim4-doc-html | exim4-doc-info eximon4 spf-tools-perl swaks dns-root-data
mailutils-mh mailutils-doc
以下のパッケージが新たにインストールされます:
exim4-base exim4-config exim4-daemon-light guile-2.2-libs libgc1c2
libgnutls-dane0 libgsasl7 libkyotocabinet16v5 liblzo2-2 libmailutils5
libntlm0 libunbound8 mailutils mailutils-common
アップグレード: 0 個、新規インストール: 14 個、削除: 0 個、保留: 0 個。
10.4 MB のアーカイブを取得する必要があります。
この操作後に追加で 53.4 MB のディスク容量が消費されます。
取得:1 http://raspbian.raspberrypi.org/raspbian buster/main armhf libgc1c2 armhf 1:7.6.4-0.4 [212 kB]
取得:2 http://raspbian.raspberrypi.org/raspbian buster/main armhf exim4-config all 4.92-8 [323 kB]
取得:3 http://raspbian.raspberrypi.org/raspbian buster/main armhf exim4-base armhf 4.92-8 [1,131 kB]
取得:4 http://raspbian.raspberrypi.org/raspbian buster/main armhf libunbound8 armhf 1.9.0-2 [403 kB]
取得:5 http://raspbian.raspberrypi.org/raspbian buster/main armhf libgnutls-dane0 armhf 3.6.7-4 [314 kB]
取得:6 http://raspbian.raspberrypi.org/raspbian buster/main armhf exim4-daemon-light armhf 4.92-8 [492 kB]
取得:7 http://raspbian.raspberrypi.org/raspbian buster/main armhf guile-2.2-libs armhf 2.2.4+1-2 [4,914 kB]
取得:8 http://raspbian.raspberrypi.org/raspbian buster/main armhf libntlm0 armhf 1.5-1 [21.3 kB]
取得:9 http://raspbian.raspberrypi.org/raspbian buster/main armhf libgsasl7 armhf 1.8.0-8+b1 [196 kB]
取得:10 http://raspbian.raspberrypi.org/raspbian buster/main armhf liblzo2-2 armhf 2.10-0.1 [48.4 kB]
取得:11 http://raspbian.raspberrypi.org/raspbian buster/main armhf libkyotocabinet16v5 armhf 1.2.76-4.2+rpi1 [280 kB]
取得:12 http://raspbian.raspberrypi.org/raspbian buster/main armhf mailutils-common all 1:3.5-3 [689 kB]
取得:13 http://raspbian.raspberrypi.org/raspbian buster/main armhf libmailutils5 armhf 1:3.5-3 [810 kB]
取得:14 http://raspbian.raspberrypi.org/raspbian buster/main armhf mailutils armhf 1:3.5-3 [566 kB]
10.4 MB を 36秒 で取得しました (289 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ libgc1c2:armhf を選択しています。
(データベースを読み込んでいます ... 現在 143081 個のファイルとディレクトリがインストールされています。)
.../00-libgc1c2_1%3a7.6.4-0.4_armhf.deb を展開する準備をしています ...
libgc1c2:armhf (1:7.6.4-0.4) を展開しています...
以前に未選択のパッケージ exim4-config を選択しています。
.../01-exim4-config_4.92-8_all.deb を展開する準備をしています ...
exim4-config (4.92-8) を展開しています...
以前に未選択のパッケージ exim4-base を選択しています。
.../02-exim4-base_4.92-8_armhf.deb を展開する準備をしています ...
exim4-base (4.92-8) を展開しています...
以前に未選択のパッケージ libunbound8:armhf を選択しています。
.../03-libunbound8_1.9.0-2_armhf.deb を展開する準備をしています ...
libunbound8:armhf (1.9.0-2) を展開しています...
以前に未選択のパッケージ libgnutls-dane0:armhf を選択しています。
.../04-libgnutls-dane0_3.6.7-4_armhf.deb を展開する準備をしています ...
libgnutls-dane0:armhf (3.6.7-4) を展開しています...
以前に未選択のパッケージ exim4-daemon-light を選択しています。
.../05-exim4-daemon-light_4.92-8_armhf.deb を展開する準備をしています ...
exim4-daemon-light (4.92-8) を展開しています...
以前に未選択のパッケージ guile-2.2-libs:armhf を選択しています。
.../06-guile-2.2-libs_2.2.4+1-2_armhf.deb を展開する準備をしています ...
guile-2.2-libs:armhf (2.2.4+1-2) を展開しています...
以前に未選択のパッケージ libntlm0:armhf を選択しています。
.../07-libntlm0_1.5-1_armhf.deb を展開する準備をしています ...
libntlm0:armhf (1.5-1) を展開しています...
以前に未選択のパッケージ libgsasl7 を選択しています。
.../08-libgsasl7_1.8.0-8+b1_armhf.deb を展開する準備をしています ...
libgsasl7 (1.8.0-8+b1) を展開しています...
以前に未選択のパッケージ liblzo2-2:armhf を選択しています。
.../09-liblzo2-2_2.10-0.1_armhf.deb を展開する準備をしています ...
liblzo2-2:armhf (2.10-0.1) を展開しています...
以前に未選択のパッケージ libkyotocabinet16v5:armhf を選択しています。
.../10-libkyotocabinet16v5_1.2.76-4.2+rpi1_armhf.deb を展開する準備をしています ...
libkyotocabinet16v5:armhf (1.2.76-4.2+rpi1) を展開しています...
以前に未選択のパッケージ mailutils-common を選択しています。
.../11-mailutils-common_1%3a3.5-3_all.deb を展開する準備をしています ...
mailutils-common (1:3.5-3) を展開しています...
以前に未選択のパッケージ libmailutils5:armhf を選択しています。
.../12-libmailutils5_1%3a3.5-3_armhf.deb を展開する準備をしています ...
libmailutils5:armhf (1:3.5-3) を展開しています...
以前に未選択のパッケージ mailutils を選択しています。
.../13-mailutils_1%3a3.5-3_armhf.deb を展開する準備をしています ...
mailutils (1:3.5-3) を展開しています...
libgc1c2:armhf (1:7.6.4-0.4) を設定しています ...
liblzo2-2:armhf (2.10-0.1) を設定しています ...
libunbound8:armhf (1.9.0-2) を設定しています ...
libntlm0:armhf (1.5-1) を設定しています ...
mailutils-common (1:3.5-3) を設定しています ...
exim4-config (4.92-8) を設定しています ...
Adding system-user for exim (v4)
guile-2.2-libs:armhf (2.2.4+1-2) を設定しています ...
libgnutls-dane0:armhf (3.6.7-4) を設定しています ...
exim4-base (4.92-8) を設定しています ...
exim: DB upgrade, deleting hints-db
libkyotocabinet16v5:armhf (1.2.76-4.2+rpi1) を設定しています ...
libgsasl7 (1.8.0-8+b1) を設定しています ...
exim4-daemon-light (4.92-8) を設定しています ...
Initializing GnuTLS DH parameter file
libmailutils5:armhf (1:3.5-3) を設定しています ...
mailutils (1:3.5-3) を設定しています ...
update-alternatives: /usr/bin/frm (frm) を提供するために自動モードで /usr/bin/frm.mailutils を使います
update-alternatives: /usr/bin/from (from) を提供するために自動モードで /usr/bin/from.mailutils を使います
update-alternatives: /usr/bin/messages (messages) を提供するために自動モードで /usr/bin/messages.mailutils を使います
update-alternatives: /usr/bin/movemail (movemail) を提供するために自動モードで /usr/bin/movemail.mailutils を使います
update-alternatives: /usr/bin/readmsg (readmsg) を提供するために自動モードで /usr/bin/readmsg.mailutils を使います
update-alternatives: /usr/bin/dotlock (dotlock) を提供するために自動モードで /usr/bin/dotlock.mailutils を使います
update-alternatives: /usr/bin/mailx (mailx) を提供するために自動モードで /usr/bin/mail.mailutils を使います
systemd (241-5+rpi1) のトリガを処理しています ...
man-db (2.8.5-2) のトリガを処理しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...

@raspberrypi:~ $ sudo apt-get install ssmtp
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libgnutls-dane0 libunbound8 rpi.gpio-common
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
libgnutls-openssl27
以下のパッケージは「削除」されます:
exim4-base exim4-config exim4-daemon-light
以下のパッケージが新たにインストールされます:
libgnutls-openssl27 ssmtp
アップグレード: 0 個、新規インストール: 2 個、削除: 3 個、保留: 0 個。
368 kB のアーカイブを取得する必要があります。
この操作後に 3,377 kB のディスク容量が解放されます。
続行しますか? [Y/n] y
取得:1 http://raspbian.raspberrypi.org/raspbian buster/main armhf libgnutls-openssl27 armhf 3.6.7-4 [314 kB]
取得:2 http://raspbian.raspberrypi.org/raspbian buster/main armhf ssmtp armhf 2.64-8 [54.2 kB]
#
368 kB を 3秒 で取得しました (122 kB/s)
パッケージを事前設定しています ...
(データベースを読み込んでいます ... 現在 144153 個のファイルとディレクトリがインストールされています。)
exim4-daemon-light (4.92-8) を削除しています ...
exim4-base (4.92-8) を削除しています ...
exim4-config (4.92-8) を削除しています ...
以前に未選択のパッケージ libgnutls-openssl27:armhf を選択しています。
(データベースを読み込んでいます ... 現在 144019 個のファイルとディレクトリがインストールされています。)
.../libgnutls-openssl27_3.6.7-4_armhf.deb を展開する準備をしています ...
libgnutls-openssl27:armhf (3.6.7-4) を展開しています...
以前に未選択のパッケージ ssmtp を選択しています。
.../ssmtp_2.64-8_armhf.deb を展開する準備をしています ...
ssmtp (2.64-8) を展開しています...
libgnutls-openssl27:armhf (3.6.7-4) を設定しています ...
ssmtp (2.64-8) を設定しています ...
man-db (2.8.5-2) のトリガを処理しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...
miki@raspberrypi:~ $ sudo vi /etc/ssmtp/
revaliases ssmtp.conf
miki@raspberrypi:~ $ sudo vi /etc/ssmtp/
revaliases ssmtp.conf
miki@raspberrypi:~ $ sudo vi /etc/ssmtp/ssmtp.conf
miki@raspberrypi:~ $
miki@raspberrypi:~ $

めざましじゃんけん 画像検出システム

めざましじゃんけん結果

テレビ画像よりフジテレビ、めざましテレビ内で実施されるめざましじゃんけんの結果を蓄積します。めざましじゃんけんは、デジタル放送のコンテンツであり、B-CAS(ビーキャス)カードを用いた受信装置により、データ放送を画面表示させ、リアルタイムに参加する必要があります。番組録画しても、データ放送のコンテンツは録画することは出来ません。

  1. 環境準備(インストール)

  2. Darknet/YOLOで学習モデル準備

  3. システム実装と結果公開

  4. プログラム関連技術

本システム実装に関連した、プログラム関係のTips。

    • PHP
    • Python
  1. 【機械学習導入】ニューラルネットワークChainerフレームワーク

    • 導入方法
    • 機械学習
    • Out of Memoryへの対応
    • 学習モデルのRaspberry Piでの実行