« 2021年1月 | トップページ | 2021年3月 »

2021年2月27日 (土)

Raspberry Pi × 画像認識 で「後出しじゃんけん機」作ってみた

久しぶりの、Raspberry Piネタです。

今日は、どちらかというと「教育用」なネタです。

Raspberry Piと画像認識を応用した「後出しじゃんけん機」なるものを作ってみました。

なんじゃそら?という名前ですが、簡単に言うと、

(1) グー、チョキ、パー をラズパイカメラで撮影して記録 (各30枚づつくらい)

(2) 上の写真を用いて深層学習(CNN)を実施

(3) できたモデルを使い、カメラで撮影した「手」を推論する

(4) 推論結果に対し、勝つ手の画像を表示する

……という、Raspberry Piを使った一種のAIです。

これ、要するに、身近なもので画像認識AIを体感しよう!って趣旨の工作&プログラムです。

通常なら、Raspberry PiとPCを組み合わせるところですが、この両者の行き来が煩わしいので、学習用のデータ取りから学習、そして推論までを、すべてRaspberry Pi上でできるようにしてます。

まず、準備ですが、以下の3つのコードをコピペして持って行ってください。

「1_camera.py」


import glob
import time
import os
import io

# for Raspberry Pi
import RPi.GPIO as GPIO
import picamera

GPIO.cleanup()

#for Raspberry Pi
GPIO.setmode(GPIO.BCM)
port1 = 17 # gu
port2 = 27 # choki
port3 = 22 # pa

GPIO.setup(port1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(port2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(port3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

count = 1
flag = 0

# File remove
file_list = glob.glob('./data/0_gu/*')
for file in file_list:
    os.remove(file)
file_list = glob.glob('./1_choki/*')
for file in file_list:
    os.remove(file)
file_list = glob.glob('./data/2_pa/*')
for file in file_list:
    os.remove(file)

print('Ready!')

try:
    while True:
        sc = str(count)
        ssc = sc.zfill(4)
        #GPIOの17,27,22がオンになったら、画像を取り込んで認識を開始
        if GPIO.input(port1):
            label = '0_gu'
            flag = 1
        elif GPIO.input(port2):
            label = '1_choki'
            flag = 1
        elif GPIO.input(port3):
            label = '2_pa'
            flag = 1
            
        if flag ==1 :
            print(ssc + ':' + label)
            with picamera.PiCamera() as camera:
                    camera.resolution = (12896)
                    camera.start_preview()
                    camera.capture('./data/'+label+'/'+label+ssc+'.jpg')
            count +=1
            flag = 0

        time.sleep(0.01)

except KeyboardInterrupt:
    GPIO.cleanup()

「2_train.py」


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
from keras.callbacks import ModelCheckpoint

# ======= hypter param =====
batch_size = 10
epochs = 50
# ==========================

path=os.getcwd()+'/data/'

class_count = 0
folder_list=os.listdir(path)

for folder in folder_list:

  class_count = class_count+1

NUM_CLASSES = class_count
IMAGE_SIZE = 28

# Loss
def plot_history_loss(fit):
    # Plot the loss in the history
    axL.plot(fit.history['loss'],label="loss for training")
    axL.plot(fit.history['val_loss'],label="loss for validation")
    axL.set_title('model loss')
    axL.set_xlabel('epoch')
    axL.set_ylabel('loss')
    axL.legend(bbox_to_anchor=(10), loc='lower right'borderaxespad=1fontsize=10)

# Accurascy
def plot_history_acc(fit):
    # Plot the loss in the history
    axR.plot(fit.history['acc'],label="loss for training")
    axR.plot(fit.history['val_acc'],label="loss for validation")
    axR.set_title('model accuracy')
    axR.set_xlabel('epoch')
    axR.set_ylabel('accuracy')
    axR.legend(bbox_to_anchor=(11), loc='upper right'borderaxespad=1fontsize=10)

if __name__ == '__main__':

    count=0
    folder_list = sorted(os.listdir(path))

    train_image = []
    train_label = []
    test_image = []
    test_label = []
    X = []
    Y = []

    label = 'label.txt'
    
    f = open(label, 'w')
    for folder in folder_list:
        subfolder = os.path.join(path,folder)
        file_list = sorted(os.listdir(subfolder))

        filemax = 0

        i = 0

        for file in file_list:

            i = i + 1

            img = img_to_array(load_img('./data/' + folder + '/' + file,target_size=(28,28)))
            X.append(img)
            Y.append(count)
        
        label_name = folder + ' ' + str(count) + '\n'
        f.write(label_name)

        count +=1

    X = np.asarray(X)
    Y = np.asarray(Y)
    X = X.astype('float32')
    X = X / 255.0

    Y = np_utils.to_categorical(Y, NUM_CLASSES)

    train_image, test_image, train_label, test_label = train_test_split(X,Y,test_size=0.20)
    
    f.close()
    print(u'画像読み込み終了')

    input_shape = (IMAGE_SIZE, IMAGE_SIZE, 3)

    model = Sequential()
    model.add(Conv2D(32,kernel_size=(3,3),
                     activation='relu',
                     padding='same'
                     input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Conv2D(64, (3,3), activation='relu'padding='same'))
    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Flatten())
    model.add(Dense(512activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(NUM_CLASSES, activation='softmax'))

    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adadelta(),
                  metrics=['accuracy']
                  )

    chkpt = './model_28.h5'
    cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss'verbose=1
                            save_best_only=Truemode='auto')

    history = model.fit(train_image, train_label,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(test_image, test_label),
              callbacks=[cp_cb],
              )

    model.summary()

    score = model.evaluate(test_image, test_label, verbose=0)

    fig, (axL, axR) = plt.subplots(ncols=2figsize=(10,4))

    plot_history_loss(history)
    plot_history_acc(history)

    fig.savefig('./loss_acc.png')
    plt.close()

「3_atdashi.py」


#!/usr/bin/env python

import os
import sys
import numpy as np
import tensorflow as tf

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
import time

import RPi.GPIO as GPIO
import picamera

i = 0
label_name = []

label = 'label.txt'

f = open(FLAGS.label,'r')
for line in f:
  line = line.rstrip()
  l = line.rstrip()
  label_name.append(l)
  i = i + 1

NUM_CLASSES = i
IMAGE_SIZE = 28

if __name__ == '__main__':
    test_image = []
    
    # model read
    model = load_model('./model_28.h5')
    model.summary()
    
    # for Raspberry Pi

    GPIO.cleanup()

    #for Raspberry Pi
    GPIO.setmode(GPIO.BCM)
    port1 = 24 # switch

    GPIO.setup(port1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    print('Ready!')
    try:
        while True:
            if GPIO.input(port1):
                with picamera.PiCamera() as camera:
                    camera.resolution = (12896)
                    camera.start_preview()
                    camera.capture('./tmp.jpg')
                
                img = img_to_array(load_img('./tmp.jpg' , target_size=(28,28)))
                test_image.append(img)
                test_image = np.asarray(test_image)
                test_image = test_image.astype('float32')
                test_image = test_image / 255.0
    
                predictions = model.predict_classes(test_image)
    
                print(label_name[predictions[0]], u'です。')
                
                test_image = []
            
            time.sleep(0.01)

    except KeyboardInterrupt:
        GPIO.cleanup()

事前に、TensorFlow、Keras、numpyなどのライブラリをpip3コマンドで取り込んでおいてください。

(なお、TensorFlowは1.14、kerasは2.2.4 を推奨)

で、Raspberry Piの回路図は以下の通り。4つのタクトスイッチを使います。

Atdasi01

ちょっとわかりにくいですが、各タクトスイッチにつながる線で、黒は「GPIO24」、青は「GPIO17」、黄は「GPIO27」、緑は「GPIO22」、そして赤は「3.3V」につながってます。

あ、Raspberry Pi用のカメラも当然、つないでおきます。

で、先の3つのプログラムコードを、一つのフォルダに入れます。

Atdashi02

また、同じフォルダ内に「data」という名前のフォルダを作り

Atdashi03

その下に、上のような「グー」「チョキ」「パー」に当たる3種類のフォルダを作っておきます。

Img_0159

で、我が家のRaspberry Piで組んでみました。

Img_0164

こんな感じに、4つのタクトスイッチとつないでます。

なお、カメラは5インチ液晶の裏に両面テープで張り付けておきました。

これで、準備完了です。

(1) グー、チョキ、パー をラズパイカメラで撮影して記録 (各30枚づつくらい)

まず、自分の手を使って、「グー」「チョキ」「パー」の手を集めます。

Raspberry Pi上でターミナルを開き、

> python3 1_camera.py

と入力し、実行。

ターミナル上に「Ready!」と表示されたら、準備完了です。撮影を開始します。

Raspberry Piのカメラの前で「グー」「チョキ」「パー」の3種類の手を構えて、先の回路図にあるボタン「グー」「チョキ」「パー」で、手にあったものを選んで押します。

Img_0162

すると以下のような感じに、各フォルダ内に画像がたまっていきます。

Atdashi04

各ラベルごとに、20~30枚づつくらい撮影してください。

なお、合計が100枚を超えると、Raspberry Pi 3B+ではメモリーが飛ぶっぽいです(うちは飛びました)。

(2) 上の写真を用いて深層学習(CNN)を実施

(1)で教師データができたので、学習を実行します。同じフォルダ内で、

> python3 2_train.py

と実行します。

デフォルトでは、50エポックほど流れます。大体5分くらいで終わります。

なお、この50エポック内の最良のモデルのみが保存される仕組みになっているため、学習が終わればそのまま(3)へと移行します。

が、その前に、学習の状況を確認しておきましょう。

作業フォルダー中に、「loss_acc.png」という画像ファイルができているはずです。

Loss_acc

その名の通り、Loss(損失)値とAccuracy(精度)値のグラフが出てきます。Loss値は0に近いほど、Accuracyは1に近いほど、高精度なモデルができている目安になります。

が、よく見るとどちらも2色あります。これは、学習用データでの検証値(Train)と、評価用データでの検証値(Val)となります。

簡単に言うと、上の画像のようにLoss、Accuracy共に、この両者がほぼ同じところに収束していれば、学習としてはまずまずです。

これがTrainとValとが離れていると、いわゆる”過学習”と呼ばれる状態になります。その場合は汎用性が落ちているので、パラメータを変更するなり、(1)からやり直すなりして、再学習する必要が出てきます。

(例えば、batchの値を10→20に変えてみる 等)

単純に、何も変えずにもう一度実行するだけでよくなることもあります。何度実行しても改善されないときのみ、パラメータをいじるか、あるいは写真の撮り直しを実行してみてください。

グラフを確かめてから、(3)へ行きます。

(3) できたモデルを使い、カメラで撮影した「手」を推論する

ここでは、「3_atodashi.py」を使います。

> python3 3_atodashi.py

と実行したのち、

Img_0163

こんな感じに、カメラの前で手を構えます。

もし、写真のようにチョキを出しているときに、プロンプト上で

 > 2_choki

と表示されたら、推論成功です。

グーやパーだと勘違いしていたら、学習に失敗している可能性があります。

(1)か、(2)あたりからやり直してください。

あるいは、手が近すぎる or 遠すぎることもあります。何度か実験した経験での話ですが、ちょっと動かしてみると、精度が上がる距離がどこかにあることが多いです。

さて、画像認識としてはここまでで終了ですが、これではまだ「後出しじゃんけん機」ではありませんね。

(4) 推論結果に対し、勝つ手の画像を表示する

Raspberry Piに後出しじゃんけんをさせるために、「3_atodashi.py」を以下のコードに置き換えます。


#!/usr/bin/env python

import os
import sys
import numpy as np
import tensorflow as tf
import cv2

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
import time

import RPi.GPIO as GPIO
import picamera

i = 0
label_name = []

label = 'label.txt'

f = open(label,'r')
for line in f:
  line = line.rstrip()
  l = line.rstrip()
  label_name.append(l)
  i = i + 1

NUM_CLASSES = i
IMAGE_SIZE = 28

if __name__ == '__main__':
    test_image = []
    
    # model read
    model = load_model('model_28.h5')
    model.summary()
    
    # for Raspberry Pi

    GPIO.cleanup()

    #for Raspberry Pi
    GPIO.setmode(GPIO.BCM)
    port1 = 24 # switch

    GPIO.setup(port1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    print('Ready!')
    try:
        while True:
            if GPIO.input(port1):
                with picamera.PiCamera() as camera:
                    camera.resolution = (12896)
                    camera.start_preview()
                    camera.capture('./tmp.jpg')
                
                img = img_to_array(load_img('./tmp.jpg' , target_size=(28,28)))
                test_image.append(img)
                test_image = np.asarray(test_image)
                test_image = test_image.astype('float32')
                test_image = test_image / 255.0
    
                predictions = model.predict_classes(test_image)
    
                print(label_name[predictions[0]], u'です。')

                #後出し処理
                if predictions[0] == 0# 「グー」だった時
                    reac = "pa.png" # 「パー」を返す
                elif predictions[0] == 1# 「チョキ」だった時
                    reac = "gu.png" # 「グー」を返す
                else# 残り、すなわち「パー」だった時
                    reac = "choki.png" # 「チョキ」を返す

                img = cv2.imread(reac)
                cv2.imshow("reaction",img)
                key = cv2.waitKey(1000
                cv2.destroyAllWindows()
                
                test_image = []
            
            time.sleep(0.01)

    except KeyboardInterrupt:
        GPIO.cleanup()

「#後出し処理」というコメント行がある後ろ当たりに、その後出しじゃんけんの処理が追加されてます。

また、画像表示にはOpenCVを用いてますので、pip3コマンドでOpenCVをインストールしておいてください。

> pip3 install python-opencv

で、このほかに画像が3枚、つまり、グー、チョキ、パーの画像をそろえる必要があります。

私はいらすとやで落としましたが、なんでもいいです。

Atodashi05

こんな感じに「グー」「チョキ」「パー」それぞれ「gu.png」「choki.png」「pa.png」として、Raspberry Pi上のプログラムコードの入った同じフォルダに入れておいてください。

で、この状態で(3)と同様に動かすと、推論の直後に、Raspberry Piが勝つと思う手を表示してきます。

Img_0205

こんな具合です。

(3)でそこそこの精度が出るモデルであれば、正しい「勝ち手」を出してくれるはずですね。

はい、以上が「後出しじゃんけん機」を作るまで、です。

(2)で使う「Train.py」という学習用コードを読めばわかる通り、28×28の画像で学習、推論させてます。この解像度じゃないと、Raspberry Piでは学習できません。

かなり低い解像度ですが、案外この解像度でも、じゃんけんくらいは認識できるようです。

もっとも、一筋縄ではいかないところもありますね。背景に依存しちゃったり、あるいは過学習で現実の手をうまく認識しなかったり……その辺りは、トライアンドエラーで実験してみるのがよいかと思います。

今回入れてませんが、Grad‐Camを使ったりして、モデルの確からしさを調べるのもいいですね。実際、会社にある同じコードでは、Grad-Camを組み込んでます。

どちらかというと、画像認識の理屈よりも、それを実際に使ってみてノウハウっぽいものを学ぶというのが狙いのプログラムコード。やってみると、思ったよりも精度は出ることもあるし、思い通りにいかないこともあります。

もちろん、ここに書いただけでは不十分な話が多いです。パラメータまで含めたら、一介のブログ記事では書ききれないほどいろいろあります。

このほか、精度におけるカメラと手の距離の依存性が高いので、HC-SR04などの距離センサーと組み合わせて撮影させてみるなど、電子工作の題材にもぴったりですね。

とまあ、我ながらうまい仕掛けを作ったものだと思っていたんですが。

これを作り上げた後に、「人気ブロガーからあげ先生のとにかく楽しいAI自作教室」(日経BP)という本にも、同じようにじゃんけんの手を学習させるというコードがあることが判明。

で、Kindle版で購入してみてみたんですが……あちらはRaspberry Pi上ではなく、しかも画像セットはあらかじめ準備されたものを使用、かつ、Google Colab上で動かすというものでした。いやはや、幸いにもこちらのやってることとは、かぶってませんでしたね。

まあ、似たようなことは皆さん、考えるものですね。

ちなみにこの本、画像だけでなく、自然言語など、幅広いカテゴリーの話が載っていたりと、なかなか面白い本です。買って損はありません。

著者のからあげ氏のブログは、Raspberry Pi関係のコードではとてもお世話になってますね。私もよく、参考にさせてもらってます。

以上、「画像認識を体で覚える」仕組みを作ってみた、というお話でした。


人気ブロガーからあげ先生のとにかく楽しいAI自作教室

2021年2月26日 (金)

IIJが20ギガで1880円のプラン

キャリアに対抗して、ついにMVNOも大胆な価格の大容量プランを提示してきました。

格安SIM/格安スマホのIIJmio|新プラン【ギガプラン】登場!

Iij01

IIJが20GBで1880円というプランを提示してきました。

しかもこれ、音声付きでこの値段です。もちろん電話代は別ですが、しかし……20GBですよ?

音声なしのデータ通信のみだと、さらに100円安いですね。

受け付けはオンライン上で4月1日から、既存ユーザーの場合は、早くても5月1日から適用ということになります。

てことは、IIJを使っているイオンモバイルも当然、変更あるかも?

といっても、4GBすら使いきれないので、私は4GBのままでしょうかね。

ということで、個人的には気がかりなニュースですね。


【初期費用3,300円(税込)が無料】IIJmioえらべるSIMカード エントリーパッケージ 月額利用(音声通話/SMS/データ)[ドコモ・au回線]・プリペイド(データ)[ドコモ回線]IM-B100

2021年2月22日 (月)

座椅子の上でSurface Goを使うときは……

やはり、クラムシェル端末じゃないと不便なことって、多いですね。

何が言いたいかというと、元々はタブレットな端末であるSurface Goって、使う場所を選ぶということです。

いくら背面に自立スタンドがついているといっても、ヒンジがないから、下が平らな場所でない限り安定しないんです。

このため、座椅子に座っているときには使い辛いなぁと思っていたんですが。

Img_0206

ああ、そうか、この背面のスタンド、こうやって使えばいいんだ。

と、今さらながら気づきました。はい。

ただし、やはりキーボードがちょっと不安定ですが……使えないことはないですね、使えないことは。

現に今、座椅子の上で、Surface Goにてこの記事を書いてます。

とまあそれだけの話ですが、これでSurface Goの稼働率が一気に上がりました。相対的に、MacBook Airの活躍の場が減りましたけど。

やはり、Windowsの方が便利なことって多いんですよね。

ブログ記事は、どうしてもMacBook AirのSafariじゃ書きづらいんです。写真の編集はWindows上のソフトの方が慣れてますし。もうEeePC以来ずっと、Paintshop Pro 7を使い続けてますからね。

それに、ちょっと今、長文のブログ記事を書いてまして……Raspberry Pi、Python関係なんですが、Paintshopだけでなく、TeratermにVSCodeまで総動員。ああいう記事は、MacBookじゃ書けないです。

まあ、こればかりはしょうがないかなぁと。

しかも、せっかくこいつ用にモバイルバッテリーも買ったことだし、使い倒さなきゃもったいないと思った次第。

でもまあ、つくづく思うんですが、今度この手の端末を買うときは、今であればSurface Laptop Goにしようかと思ってます。やっぱりWindowsのクラムシェル端末、最高ですわ。


マイクロソフト Surface Laptop Go 12.4インチ Office H&B 2019 搭載 / 第 10 世代インテル・ Core・ i5-1035G1 / 8GB /128GB / アイス ブルー THH-00034

2021年2月21日 (日)

AUKEY製バッテリー&充電器、ケーブル2本到着

Amazonの置き配で届きましたが、こんな真冬での21時前の置き配っていうのは、この手の商品の場合、何とかしてもらいたいなぁ……気づいたからよかったですけど。

Img_4416

はい、4つの品が入ってました。前日の夜に頼んだら、翌日の夜に到着。

Img_4419

まずは、メインの品から。これはAUKEY製10000mAhのバッテリーです。

Img_4420

特徴は、18W出力のUSB-Cコネクターを備えていること。ちなみにこのUSB-Cから充電も可能です。

なお、両脇のUSB端子も18WのPD仕様。合計出力も最大18Wなので、3台つないでしまうと6Wづつになってしまいます。

まあ、そんな使い方は想定してませんが。

Img_4421

お次はこれ。こちらもAUKEY製で、USB充電器。

USB-Cからは20W、USBは12W、計32Wの出力に対応。

Img_4417

3つ目は、USB-C to USB-Cなケーブル。長さは30cm。65Wまで対応のAnker製です。

で、4つ目の品ですが……

Img_4418

一方がUSB-C、で、もう一方が……わかりますかね、この端子。

Img_4422

はい、今回の品、すべてこいつ向けなんです。

去年買った、Surface Goです。

こいつを出張対応な完全モバイル仕様にするため、これら一式を購入。

Surface Goですが、使ってるとやはり、バッテリーの持ちが不安要素です。自宅で使う分には問題ないんですが、外ではちょっと不安ですね。

普通に使うと、4時間ほどで切れちゃいます。もうちょっと踏ん張ってほしいところ。

てことで、こいつのモバイル性を補完すべく、モバイルバッテリー等を購入したというわけです。

うちにもモバイルバッテリーはあるんですが、既存のバッテリーはすべてダメでした。最低でも15Wはないと、こいつに給電できないようで。

そういえば、iPhone 12もこのUSB-C充電器を使えば急速充電にも対応できるので、それも兼ねてUSB-Cの充電器も買ったというわけです。

この4つに、USB-C to Lightningケーブルも加えれば、宿泊先でiPhone 12も充電できますね。

もっとも今のご時勢、宿泊出張がないので、それがいつ活かせるかわかりませんが。

Img_4427

さて、気を取り直して、最初にSurface用の充電ケーブルをモバイルバッテリーにつないで、充電テスト。

Img_4428

ちょっと接触悪いですが、何とか充電できます。

Img_4423

なお、Surface GoはUSB-Cからも充電できます。で、さっきのUSB-Cケーブルでモバイルバッテリーとつないでみると

Img_4429

同じく、充電できました。ただし、Surface用コネクターの充電完了時間と比べると5分ほど長い。

同じ出力ではないのか?いや、もしかするとUSB-Cからの充電は少し遅いのかも。

Img_4430

で、こういう使い方もできます。

20W出力のアダプターからバッテリーを充電。一応、普通のUSBとUSB-Cのケーブルが付属しているので、それを使うことも可能。が、こっちの方が充電時間は短いそうです。

そういえばこのバッテリー、側面にバッテリー充電専用のmicroUSB端子もついてます。このため、バッテリーを充電しながらほかの機器を充電することも可能。もっともその場合、充電より放電の方が上回るでしょうが。

なんとなく、勢いで買ってしまいました。

これを発揮する出張が予定されているわけではないですが、やはり出かけられない鬱憤がたまってきたためか、それが物欲を背中から押してしまったようです。

でも、これが発揮されるのはいつの日か……早くこいつらを活躍させられる日が訪れることを願うばかりです。


モバイルバッテリー AUKEY 大容量 10000mAh 軽量 小型 18W PD & Quick Charge 3.0 3台同時充電可能 USB-C出入力ポート 2USBポート スマホ充電器 残量表示 iPhone 12/ iPhone/ iPad/ Android / docomo / softbank / au 各種機種対応 [正規メーカー2年保証] PB-N73S【PSE認証済 & USB A to C ケーブル付き】

2021年2月20日 (土)

自分の新型コロナワクチン接種はいつ?を予測するアプリ??

……なんてアプリがあると聞いたので、思わずダウンロード。

新型コロナワクチン、自分はいつ接種できる? NewsDigestのAIワクチン接種予測で調べる | できるネット

上の記事から、iOS版、Android版を入手できます。

NewsDigestsという、いわゆるニュースアプリなんですが、そのアプリの一機能としてこのコロナワクチン接種予測が入ってます。

さっそく、使ってみた。

Img_2449

以下のような質問が出てきて、それに答えるだけで予測時期が出てきます。

Img_2450

ちなみに職業ですが、ほぼ”その他”になろうかと思います。

で、結果は……

Img_2451

はい、ずっと先です。基礎疾患もなければ、医療従事者でもないので、当然でしょうね。

当面は、今のような警戒を緩めるわけにはいかなさそうです。

ところで、最近はワクチンの危険性に関する報道も少なくなりましたね。全くないとは言えませんが、どちらかというと、ワクチン接種開始の遅れを指摘する方が増えた感じ。

ですが、マスクでもそうでしたが、いきなり増産できるものでもないですから、しょうがないでしょうね。

ワクチンを接種したからと言って、それで安心というわけでもないですし。なにせインフルエンザ予防接種なんて、打っていてもかかることがありますからね。絶対安心というものではない以上、しばらくはこの状況、続くでしょうね。

早いこと通常の生活に戻ることを願います。

週刊文春 新型コロナ完璧サバイバルガイド ワクチンのすべてがわかる!2021最新版(文春ムック) (文春e-book)

2021年2月12日 (金)

iPhone 12のバッテリー極減り事件その後……

バッテリー消費が多過ぎて、多過ぎて、多過ぎて、辛いよぉ~!

……という報告を先日、しましたが。

iPhone 12のバッテリー消費が多過ぎて: EeePCの軌跡

その後、どうなったのか?

こうなりました。

Img_0158

対策前と後が、くっきりとわかりますね。

この間、やったことはポケモンGoを消したことと、再起動したことくらい。

で、特に画面オフ時の消費が劇的に減りました。薄い水色の部分がそれですね。履歴から見る限り、そのほとんどがポケモンGoでした。

丸1日以上経ちましたが、その後は何の問題もなく、夕方になっても残量は80%前後です。

つまり、結論としては……

ポケモンGoを消して大正解!

ということのようで。

今までこんなことなかったんですけど、何があったんでしょうかね……?

とはいえ、今さら戻す気もないですし、これを機会にすっぱり切れてよかったのではないかと思うことにします。

以上、その後のiPhone 12の話でした。

Jackery ポータブル電源 240 大容量67200mAh/240Wh 家庭アウトドア両用バックアップ電源 小型軽量 PSE認証済 純正弦波 三つの充電方法 AC(200W 瞬間最大400W)/DC/USB出力 車中泊 キャンプ アウトドア 地震停電 防災グッズ 停電時に非常用電源 ソーラー充電 環境にやさしい 省電力 24ヶ月保証

2021年2月11日 (木)

68000と挿し替えて使うCPUアクセラレーター

念のために申し上げておきますと、現代の話です。

68000と挿し替えて使えるCPUアクセラレータ「Buffy Acellerator」 - PC Watch

モトローラ製のMPUである68000と挿し替えて使えるCPUアクセラレーターを作ろうというプロジェクトが進行中だそうです。その名も、Buffy Acellerator 。「吸血鬼殺し」という意味だそうで。

Amiga 500/1000/2000などの68000を引っこ抜いて挿し替えるだけで、高速化が望めるそうです。

ちなみにこの狭い基盤の上に、1GHzのCotex-A8のプロセッサーがのっかっており、さらに512MBか1GHzのメモリーが、そしてフラッシュメモリーに68000のエミュレーターが載っていて、高速化された68000相当のふるまいをしてくれるそうです。大体、400MHz相当だとか。最大でも20MHz程度だった68000からすれば、相当速いです。CPU部分だけは。

昔、286や386の上からかぶせて使う486相当のCPUアクセラレーターなんてものが流行りましたが、あれを彷彿とさせるブツですね。

なお、我が家にも68000をのっけたマシンが存在しますね。Macintosh Plusっていうんですが……ただこいつははんだ付けされているため、ちょっとこれは使えませんね。

今どきのテクノロジーを惜しみなく投入した、力技感が満載のハードウェアアクセラレーション技術。こういう話題、私は好きですね。

そういえば、PC-9801DXでMNISTで学習した畳み込みニューラルネットワークの推論を走らせるという暴挙(?)に出たツイートがありましたね。

いやあ、こんなマシンでも走るんですね、CNN。感動しました。

にしても、オールドパソコンユーザーって、どうしてこう無茶するんでしょうか?


X68000パーフェクトカタログ (G-MOOK)

2021年2月10日 (水)

iPhone 12のバッテリー消費が多過ぎて

実は前日にiOS 14.4にアップしたんですが、翌日になって、こんなことに。

Img_0156

いやあ……全然使ってないのに、なんという減りよう。めずらしく、真っ逆さまです。こんなにストレートに減るのも、珍しいですね。

大抵なら夕方でもまだ70%ほど残量が残っているはずのiPhone 12の残量が、この日はなんと20%まで減少。

で、よく見ると、画面オフの時間の消費量が異様に多い。

そういえば、妙に本体が熱かったなぁと思っていたんですが、まさかここまでとは……

で、バッテリー消費の多いアプリを見ると、トップが「ポケモンGo」で、51%。2位が「接触通知」で、23%でした。

Img_0157

てことで、速攻、ポケモンGoを消しました。

ほとんどやってないんですよね、このアプリ。この際だから、これを機に消してやろうかと。

もう一つの接触通知は、消しようがないですね。たいして役に立たないアプリならば、これもたたっ消してやりたい気分です。

iOSのバージョンアップをきっかけにバッテリー消費が増えることはありますが、今回は特段に増えましたね。どうなってるんでしょう?

そういえば、Big SurにアップしたMacBook Airもバッテリー消費が増えてます。

最近のAppleはちょっと、たるんでませんかね?バッテリー消費増やしてどうするのよ、と。

まあ、Appleのせいばかりともいえませんけど、何も使っていないときにバッテリー消費が増えるのは勘弁してほしいものです。

Anker PowerCore Essential 20000 (モバイルバッテリー 超大容量 20000mAh) 【USB-C入力ポート/PSE認証済/PowerIQ/低電流モード搭載】iPhone iPad Android 各種対応 (ブラック)

2021年2月 9日 (火)

Apple Watchにパスコードを設定

大した話ではありませんが、うちのApple Watch Series 1にパスコードを設定してみました。

Img_0138

で、手首から外すと、いきなりロックがかかります。

Img_0140

この通り、パスコードを求められます。

が、設定後にこれを1日つけてみましたが、手首検出をオンにしておけば、腕にはめている限り、パスコードを求められません。

思ったより、煩わしさはありません。

なぜ、これを設定したかと言われれば、下記の記事にある通りです。

iOS 14.5ではApple Watch併用でマスクしたままでの顔認証iPhoneのロック解除が楽になる!?: EeePCの軌跡

近々配信されるであろう、iOS 14.5の顔認証iPhoneでマスク顔ロック解除に備えてのことです。

SULさんから頂いたコメントによれば、それほど煩わしくないということだったので試してみました。いや、これで顔認証がマスク付きでクリアできるなら、こんな楽なことはないわぁ。

まだマスク顔の認証がサポートされたわけではありませんが、とりあえず先行して備えてみました、というお話です。

そういえば、ここ日本でもApple Watch Series 4以降に搭載された心電図機能が使えるようになりました。

Apple Watchを買う理由が、徐々に増えつつありますね。

最新 Apple?Watch Series 6(GPSモデル)- 44mmスペースグレイアルミニウムケースとブラックスポーツバンド

2021年2月 8日 (月)

15インチノートPC用バッグ購入

通勤用のバッグを変えました。

Img_0150

御覧の通り、何の変哲もないPC用のバッグです。

近所のららぽーとにあるエディオンで購入。お値段は2千円ちょっと。

Img_0151

外にポケットが一つ、そして、メインの方は15.6インチのノート型まで収納可能です。

Img_0152

試しに、Surface Goを放り込んでみましたが……なにこれ、余裕過ぎ!?

Img_0153

ということで、うちのMacBook Airと、GALLERIA(With 2.5インチUSB HDD)も放り込んでみました。電源さえ入れなければ、入りますね。

と、いうわけで、

Img_0154

カバンの中の雑多なもの(筆入れ、タオル、携帯傘、マスク、ティッシュなど)を外付けポケットに、

Img_0155

そしてメインにはPC(会社のSurface Go 2)と手帳、電源を入れてみた。

カバンを変えた理由ですが、まさに上の写真にある通りなのですが。

最近、在宅勤務が増えて、会社のPCを持ち帰ることが増えました。

すると、今までのカバンではギリギリ過ぎて、ちょっと不便だったんです。Surface Go 2を入れるともうめいっぱいで、それ以外に何かあるともう入れられないという……いや、いくらなんでも不便すぎ。

一気に容量が増えたので、これで在宅勤務でも安心です。

まあ、そのためにカバンを買い替えるというのもなんですけど。

でも今の時代、そういう需要は多いんじゃないでしょうかね?Webカメラやヘッドセット、LEDライトも売れてるようですし。カバンも結構、売れ筋のものは少なかったですね。

しかしまあ、出張用ならともかく、自宅に会社のPCを持ち帰るためにカバンを買い替えるなんて、つい1年前には想像すらしてませんでしたよね。コロナ禍というやつは、いろいろな影響を与えてくれましたよね。ほんとに。

Voova 14-15.6インチ パソコンケース 防水 パソコンバッグ 衝撃吸収 ノートパソコン ケース ラップトップ スリーブ バッグ ショルダーストラップ付き PCケース 通勤 通学 パソコン ビジネス 手提げカバン 男女兼用 コンピューターバッグ MacBook Pro (Retina) 15.4” / Surface Book 2 15” / Dell / Lenovo / Acer / Asus / 富士通 /東芝 保護用インナーバッグ 多機能 (グレー)

2021年2月 7日 (日)

自撮り用LEDクリップ

近所のららぽーとにあるAWESOME STOREという店で売っていたので、思わず購入。

Img_0142

いかにもスマホ用のLEDライト。

Img_0143

こんな感じです。一応、充電式で、自撮り用のLEDライトといったところ。

Img_0145

以前にも百均で似たようなものを買いましたが、あれとの違いは光が分散しており、てかりが起こりにくいこと……なのかな?

Img_0146

ちなみに、暖色系にもなり

Img_0147

両方まとめて光らせることも。

ちなみにこれ、結構明るいです。

Img_0148

なお、充電用のコネクターはこのクリップの奥にあって

Img_0149

こんな感じに充電。充電中は赤色のLEDが光ります。

自撮りというより、どちらかというとブログの物体撮影用に買ったんですが、果たして使えるのやら使えないのやら……

ところで、これのもっと大きい輪っかのようなLEDライトが、在宅ワーク用照明として売られてますね。最近、そういう需要も多いのかも。

Selvim 2in1 進化版6インチ 外径16センチ リングライト 電気スタンド クリップ式 ビデオ通話用 自撮りスタンド 補光 自撮りLEDライト 美白効果 スマホスタント付き 360度回転可能 10階段調光

2021年2月 6日 (土)

iPhone 7のバッテリー交換

妻のiPhone 7のバッテリーが、いきなり寿命を迎えました。


Img_0130


てことで、いつものDIGIFORCEのバッテリーを注文。お値段、約2千円。


Img_0132


別に工具はいらなかったんですが、付いてきちゃいました。


Img_0134


で、SIMとねじを外し、いつも通りディスプレイを吸盤で持ち上げようとするんですが……


持ち上がらない


そういえばiPhone 7から、防水のために全周べったり接着剤がついているんでした。


Img_2433


と、いうことで、もう一つの小道具を注文。


こいつに、iOpenerという、熱で接着剤を緩める道具が入ってます。


Img_2434


にしてもこれ、新品だというのに、あちこちかすれてます。なんだこの箱は?


Img_2435


まあ、それはともかく、中をあけます。


正直、いらない道具が多いですが、


Img_2436


こいつです、こいつ。これを使います。


以前にもiPadをあけるときにもほしかったですが、とうとう買いました。しかし、そのために4500円ほど払ってしまいましたが……


Img_2437


これを電子レンジで30秒ほど温めてから、iPhoneの上に載せます。


が、結論から言うと、あまり効かなくて結局ドライヤーも持ち出してようやく接着剤をクリア。


このiOpenerよりも、これについてた吸盤の方が役に立ちましたね。取っ手に力を入れても、指が痛くなりません。


Img_2439


で、やっとの思いで割腹。


Img_2440


Img_2441


Img_2442


あとはせっせと分解です。


先に買ったDIGIFORCEの箱に、分解マニュアルがついているので、それに従い分解してます。


Img_2443


あのゆっくり引っ張らないと途中でブチ切れる両面テープをもクリアし、難なくバッテリーを取り出し。


Img_2444


新たなバッテリーを入れます。


Img_2446


で、元に戻して起動。


Img_2447


無事、バッテリーが復活しました。


が、やはり防水処理済みのiPhoneは大変ですね。


この次に寿命を迎えるとすれば、iPhone 7 Plusですかねぇ。その次は、iPhone X。ディスプレイが大きいだけに、もっと大変そうです。


DIGIFORCE for iPhone 7 バッテリー 互換 PSEマーク表示 説明書 工具付 T2


2021年2月 4日 (木)

iOS 14.5ではApple Watch併用でマスクしたままでの顔認証iPhoneのロック解除が楽になる!?

ついにマスクしたままの顔での認証が可能になるのか!?

iPhoneがマスクしたままFace IDロック解除に対応、ただしApple Watch必須 (設定方法) - Engadget 日本版

こちらの記事によれば、iOS14.5での顔認証(Face ID)付きiPhoneでのマスク対応が言及されています。

ただし、そのためにはApple Watchが必要で、Watch側にもロック設定がされていて、そのロックが解除された状態のApple Watchがある状態においてマスク付きの顔の認証を可能とするようです。

てことは、結局はApple Watchでのロック解除が必要で、それってつまりあの小さい画面で4桁の番号を入力しなきゃいけないってこと?

あんまり便利になった気がしませんが……もっとも、Apple Watchのロック解除は、手首検出をしている間は不要となるので、Apple Watchをつけたままである限りは、マスク顔の認証が行えるってことでしょうか?知らんけど。

うちのApple Watchはパスコードロックは設定していないため、今のままでは使えませんね。設定してみようかしらん?ただ、あの小さい画面での数字の入力のしんどさは経験済みなので、やっぱり止めちゃうかもしれません。

便利になるのやらならないのやら……という話題でした。

最新 Apple?Watch Series 6(GPSモデル)- 44mmブルーアルミニウムケースとディープネイビースポーツバンド

« 2021年1月 | トップページ | 2021年3月 »

無料ブログはココログ

スポンサード リンク

ブログ村