コンテンツへスキップ

2

機械学習のトレーニング時に悩まされるメモリー不足

2019年8月個人向け深層学習・機械学習向けGPUの購入を考えたり、AlexeyAB / Darknet で独自学習(YOLO3 ,Tiny – YOLO 3)でもトレーニングパラメーターを調整したりして、メモリ不足を回避し学習を実施する必要があります。
Chainer利用時に、メモリ不足に困ったのですが、Unified Memoryという、CPUとGPUで共通のメモリ空間(=GPUメモリ+CPUメモリ)を使う方法です。
以下のパラメーターでOut of MemoryでNGとなった場合を考えると。
INPUT_WIDTH = 128
INPUT_HEIGHT = 128
GPU_ID = 0
BATCH_SIZE = 64
MAX_EPOCH = 20
BATCHI_SIZEを小さくして、Out of Memoryを回避して学習をすすめることも出来ます。
INPUT_WIDTH = 128
INPUT_HEIGHT = 128
GPU_ID = 0
BATCH_SIZE = 32
MAX_EPOCH = 20
または、GPUを利用せずにCPUで学習を進めることも出来ます。GPUを導入しているパソコンだと、メインメモリはそれなりの容量搭載されていると思います。
INPUT_WIDTH = 128
INPUT_HEIGHT = 128
GPU_ID = -1
BATCH_SIZE = 64
MAX_EPOCH = 20
#model.to_gpu(GPU_ID)

CPUとGPUメモリを合わせて利用 Unified Memory for CUDA

参考URL:
import cupy as cp

pool = cp.cuda.MemoryPool(cp.cuda.malloc_managed)

cp.cuda.set_allocator(pool.malloc)
Unified Memoryとは、CPUとGPUで共通のメモリ空間(=GPUメモリ+CPUメモリ)を使う方法となります。
以下、エラーメッセージの例となります。
Exception in main training loop: out of memory to allocate 134217728 bytes (total 816308736 bytes)
Traceback (most recent call last):
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\trainer.py", line 315, in run
    update()
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\updaters\standard_updater.py", line 165, in update
    self.update_core()
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\updaters\standard_updater.py", line 177, in update_core
    optimizer.update(loss_func, *in_arrays)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\optimizer.py", line 685, in update
    loss.backward(loss_scale=self._loss_scale)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\variable.py", line 981, in backward
    self._backward_main(retain_grad, loss_scale)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\variable.py", line 1061, in _backward_main
    func, target_input_indexes, out_grad, in_grad)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\_backprop_utils.py", line 109, in backprop_step
    target_input_indexes, grad_outputs)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\functions\activation\relu.py", line 75, in backward
    return ReLUGrad2(y).apply((gy,))
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\function_node.py", line 263, in apply
    outputs = self.forward(in_data)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\function_node.py", line 369, in forward
    return self.forward_gpu(inputs)
  File "C:\Users\user\Anaconda3\envs\Own-Project\lib\site-packages\chainer\functions\activation\relu.py", line 103, in forward_gpu
    gx = _relu_grad2_kernel(self.b, inputs[0])
  File "cupy\core\_kernel.pyx", line 547, in cupy.core._kernel.ElementwiseKernel.__call__
  File "cupy\core\_kernel.pyx", line 369, in cupy.core._kernel._get_out_args_with_params
  File "cupy\core\core.pyx", line 134, in cupy.core.core.ndarray.__init__
  File "cupy\cuda\memory.pyx", line 518, in cupy.cuda.memory.alloc
  File "cupy\cuda\memory.pyx", line 1085, in cupy.cuda.memory.MemoryPool.malloc
  File "cupy\cuda\memory.pyx", line 1106, in cupy.cuda.memory.MemoryPool.malloc
  File "cupy\cuda\memory.pyx", line 934, in cupy.cuda.memory.SingleDeviceMemoryPool.malloc
  File "cupy\cuda\memory.pyx", line 949, in cupy.cuda.memory.SingleDeviceMemoryPool._malloc
  File "cupy\cuda\memory.pyx", line 697, in cupy.cuda.memory._try_malloc
Will finalize trainer extensions and updater before reraising the exception.
---------------------------------------------------------------------------
OutOfMemoryError                          Traceback (most recent call last)
<ipython-input-24-041e2033e90a> in <module>
----> 1 trainer.run()

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\trainer.py in run(self, show_loop_exception_msg)
    327                 f.write('Will finalize trainer extensions and updater before '
    328                         'reraising the exception.\n')
--> 329             six.reraise(*sys.exc_info())
    330         finally:
    331             for _, entry in extensions:

~\Anaconda3\envs\Own-Project\lib\site-packages\six.py in reraise(tp, value, tb)
    691             if value.__traceback__ is not tb:
    692                 raise value.with_traceback(tb)
--> 693             raise value
    694         finally:
    695             value = None

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\trainer.py in run(self, show_loop_exception_msg)
    313                 self.observation = {}
    314                 with reporter.scope(self.observation):
--> 315                     update()
    316                     for name, entry in extensions:
    317                         if entry.trigger(self):

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\updaters\standard_updater.py in update(self)
    163 
    164         """
--> 165         self.update_core()
    166         self.iteration += 1
    167 

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\training\updaters\standard_updater.py in update_core(self)
    175 
    176         if isinstance(in_arrays, tuple):
--> 177             optimizer.update(loss_func, *in_arrays)
    178         elif isinstance(in_arrays, dict):
    179             optimizer.update(loss_func, **in_arrays)

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\optimizer.py in update(self, lossfun, *args, **kwds)
    683             else:
    684                 self.target.zerograds()
--> 685             loss.backward(loss_scale=self._loss_scale)
    686             del loss
    687 

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\variable.py in backward(self, retain_grad, enable_double_backprop, loss_scale)
    979         """
    980         with chainer.using_config('enable_backprop', enable_double_backprop):
--> 981             self._backward_main(retain_grad, loss_scale)
    982 
    983     def _backward_main(self, retain_grad, loss_scale):

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\variable.py in _backward_main(self, retain_grad, loss_scale)
   1059 
   1060                 _backprop_utils.backprop_step(
-> 1061                     func, target_input_indexes, out_grad, in_grad)
   1062 
   1063                 for hook in hooks:

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\_backprop_utils.py in backprop_step(func, target_input_indexes, grad_outputs, grad_inputs)
    107     else:  # otherwise, backward should be overridden
    108         gxs = func.backward(
--> 109             target_input_indexes, grad_outputs)
    110 
    111         if is_debug:

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\functions\activation\relu.py in backward(self, indexes, grad_outputs)
     73             return ReLUGradCudnn(x, y).apply((gy,))
     74         # Generic implementation
---> 75         return ReLUGrad2(y).apply((gy,))
     76 
     77 

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\function_node.py in apply(self, inputs)
    261                 outputs = static_forward_optimizations(self, in_data)
    262             else:
--> 263                 outputs = self.forward(in_data)
    264 
    265         # Check for output array types

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\function_node.py in forward(self, inputs)
    367         assert len(inputs) > 0
    368         if isinstance(inputs[0], cuda.ndarray):
--> 369             return self.forward_gpu(inputs)
    370         return self.forward_cpu(inputs)
    371 

~\Anaconda3\envs\Own-Project\lib\site-packages\chainer\functions\activation\relu.py in forward_gpu(self, inputs)
    101 
    102     def forward_gpu(self, inputs):
--> 103         gx = _relu_grad2_kernel(self.b, inputs[0])
    104         return gx,
    105 

cupy\core\_kernel.pyx in cupy.core._kernel.ElementwiseKernel.__call__()

cupy\core\_kernel.pyx in cupy.core._kernel._get_out_args_with_params()

cupy\core\core.pyx in cupy.core.core.ndarray.__init__()

cupy\cuda\memory.pyx in cupy.cuda.memory.alloc()

cupy\cuda\memory.pyx in cupy.cuda.memory.MemoryPool.malloc()

cupy\cuda\memory.pyx in cupy.cuda.memory.MemoryPool.malloc()

cupy\cuda\memory.pyx in cupy.cuda.memory.SingleDeviceMemoryPool.malloc()

cupy\cuda\memory.pyx in cupy.cuda.memory.SingleDeviceMemoryPool._malloc()

cupy\cuda\memory.pyx in cupy.cuda.memory._try_malloc()

OutOfMemoryError: out of memory to allocate 134217728 bytes (total 816308736 bytes)

2019年10月10日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2019年10月10日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
10月10日
(木曜日)
【4戦目】07時58分生じゃんけん!伊野尾慧パーソナリティ
【3戦目】07時35分ジュリエット・ビノシュさん
【2戦目】06時58分川﨑皇輝さん、ヴァサイェガ渉さん
【1戦目】05時58分まちかどじゃんけん

USBのブートディスクをSD Cardに変更

USBブート構成にしていたUSB HDDの領域をSD Cardにコピーしました。
通常の記事は、別方向(ノーマルのSD CardからUSB HDDへクローン作成)ですが、
この記事は、逆方向となります。
実は、Intel NSCが不安定だったり、USB Cameraカメラが不安定だったりと、実は、USB接続機器が不安定な事象が続きました。
この手順でSD Cardブート構成に戻すと安定稼働となりました。

Raspberry PiにSD Card Copierを導入し、ディスクコピー/クローンを作成しました。

  • 小さい容量のSDカードにコピー
  • USB HDDでブート中のシステムで実施(稼働中システムのブート領域をコピー)

コピー元ディスク(USB HDDディスク)

/sda1がブート領域、/sda2がルート領域です。

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: SPZX-00Z10T0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5d7437c0

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 194559 192512 94M c W95 FAT32 (LBA)
/dev/sda2 194560 976773119 976578560 465.7G 83 Linux

コピー先SDカード

Disk /dev/sdb: 119.1 GiB, 127865454592 bytes, 249737216 sectors
Disk model: Flash Reader
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00032c03

SD Card Copierでデータコピー実施

SD Card Copierを起動し、Copy From Device(コピー元)とCopy To Device(コピー先)を選択して、データコピーを行います。

コピー後のブート関係およびマウント関係のデバイスパス変更

コピーして作成した/dev/sdb1のcmdline.txtと、/dev/sdb2の /etc/fstabを変更。

cmdline.txt変更

root@raspberrypi:~# mkdir /mnt/temp_mnt
root@raspberrypi:~# mount /dev/sdb1 /mnt/temp_mnt/
root@raspberrypi:~# cd /mnt/temp_mnt/
root@raspberrypi:/mnt/temp_mnt# vi cmdline.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
変更前:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
変更後:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

/etc/fstab変更

root@raspberrypi:/mnt/temp_mnt# cd
root@raspberrypi:~# umount /mnt/temp_mnt
root@raspberrypi:~# mount /dev/sdb2 /mnt/newboot/
root@raspberrypi:~# cd /mnt/newboot/
root@raspberrypi:/mnt/newboot# vi /etc/fstab
変更前:
proc            /proc           proc    defaults          0       0
/dev/sa1        /boot           vfat    defaults          0       2
/dev/sda2       /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
変更後:
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that

bootしてこない場合などは、fstabの設定を確認してください。
上手く変更出来ていない事があるようです。

2019年10月09日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2019年10月09日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
10月09日
(水曜日)
【4戦目】07時58分酒主義久アナウンサー
【3戦目】07時35分平野紫耀 永瀬廉 髙橋海人 KingPrince HiHiJets 美少年 7MEN侍
【2戦目】06時58分劇団ひとりさん
【1戦目】05時58分まちかどじゃんけん

Jetson Nanoからのメール送信

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

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

ssmtpインストール

root@jetson:~# apt install ssmtp

ssmtp.confを編集。

root@jetson:~# 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=miki-ie.com

# The full hostname
hostname=jetson.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

PHP構成定義ファイル(php.ini)変更

php.iniのファイルパス確認

PHPの利用するコンフィグファイルを確かめます。
コマンドラインで実行する場合は、WEBサーバで利用するコンフィグファイルは、通常異なります。

root@jetson:~# php --ini
Configuration File (php.ini) Path: /etc/php/7.2/cli
Loaded Configuration File:         /etc/php/7.2/cli/php.ini
Scan for additional .ini files in: /etc/php/7.2/cli/conf.d
Additional .ini files parsed:      /etc/php/7.2/cli/conf.d/10-mysqlnd.ini,
/etc/php/7.2/cli/conf.d/10-opcache.ini,
/etc/php/7.2/cli/conf.d/10-pdo.ini,
/etc/php/7.2/cli/conf.d/20-calendar.ini,
/etc/php/7.2/cli/conf.d/20-ctype.ini,
/etc/php/7.2/cli/conf.d/20-curl.ini,
/etc/php/7.2/cli/conf.d/20-exif.ini,
/etc/php/7.3/cli/conf.d/20-curl.ini,
/etc/php/7.3/cli/conf.d/20-dom.ini,
/etc/php/7.3/cli/conf.d/20-exif.ini,
/etc/php/7.3/cli/conf.d/20-fileinfo.ini,
/etc/php/7.3/cli/conf.d/20-ftp.ini,
/etc/php/7.3/cli/conf.d/20-gd.ini,
/etc/php/7.3/cli/conf.d/20-gettext.ini,
/etc/php/7.3/cli/conf.d/20-iconv.ini,
/etc/php/7.3/cli/conf.d/20-imap.ini,
/etc/php/7.3/cli/conf.d/20-json.ini,
/etc/php/7.3/cli/conf.d/20-mbstring.ini,
/etc/php/7.3/cli/conf.d/20-mysqli.ini,
/etc/php/7.3/cli/conf.d/20-pdo_mysql.ini,
/etc/php/7.3/cli/conf.d/20-pdo_pgsql.ini,
/etc/php/7.3/cli/conf.d/20-pgsql.ini,
/etc/php/7.3/cli/conf.d/20-phar.ini,
/etc/php/7.3/cli/conf.d/20-posix.ini,
/etc/php/7.3/cli/conf.d/20-readline.ini,
/etc/php/7.3/cli/conf.d/20-shmop.ini,
/etc/php/7.3/cli/conf.d/20-simplexml.ini,
/etc/php/7.3/cli/conf.d/20-sockets.ini,
/etc/php/7.3/cli/conf.d/20-ssh2.ini,
/etc/php/7.3/cli/conf.d/20-sysvmsg.ini,
/etc/php/7.3/cli/conf.d/20-sysvsem.ini,
/etc/php/7.3/cli/conf.d/20-sysvshm.ini,
/etc/php/7.3/cli/conf.d/20-tokenizer.ini,
/etc/php/7.3/cli/conf.d/20-wddx.ini,
/etc/php/7.3/cli/conf.d/20-xmlreader.ini,
/etc/php/7.3/cli/conf.d/20-xmlwriter.ini,
/etc/php/7.3/cli/conf.d/20-xsl.ini

コマンドライン向けPHP構成ファイルphp.iniのsendmail_pathを変更

root@jetson:~# vi /etc/php/7.2/cli/php.ini

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = /usr/sbin/ssmtp -t

PHPのメール送信サンプルスクリプト

メールヘッダーにマルチバイト文字を利用する際は、mb_encode_mimeheaderを用いて、エンコーディングを行います。

php-mbstringをインストール

php-mbstringを導入していないと、エラーとなります。

PHP Fatal error: Uncaught Error: Call to undefined function mb_encode_mimeheader()

root@jetson:~# apt install php-mbstring 
<?php

function send_notice($title, $message){
$to = "kenichi.miki@gmail.com";
$headers = "From:". mb_encode_mimeheader("メール通知") ."<notice@192.168.0.108>".PHP_EOL;
if(mb_send_mail($to, $title, $message,$headers)){
echo "メールを送信しました";
} else {
echo "メールの送信に失敗しました";
}
}

send_notice("テストRaspi","メッセージテスト");
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

2019年10月08日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2019年10月08日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
10月08日
(火曜日)
【4戦目】07時58分生じゃんけん!阿部寛さん 吉田羊さん
【3戦目】07時35分生じゃんけん!山崎育三郎さん
【2戦目】06時58分A.B.C-Z
【1戦目】05時58分まちかどじゃんけん

Tensorflowのインストール

Tensorflowは、Kerasのバックエンドに使われていたり、各種機械学習のフレームワークを利用する際に、よく出てきます。
個人的には、GPU対応パッケージが準備されており、そのサポート範囲が広いので重宝しております。

使用できるパッケージ

  • tensorflow - 最新の安定版リリース、CPU のみ(Ubuntu、Windows 用)
  • tensorflow-gpu - 最新の安定版リリース、GPU サポートを含む(Ubuntu、Windows 用)
  • tf-nightly - ナイトリー ビルドのプレビュー、CPU のみ(不安定)
  • tf-nightly-gpu - ナイトリー ビルドのプレビュー、GPU サポートを含む(不安定、Ubuntu と Windows 用)

Pip/Pip3コマンドでTensorFlow/TnesorFlow-GPUをインストール

インストールコマンドのサンプルを記載しておきます。

# Current stable release for CPU-only
pip3 install tensorflow

# Preview nightly build for CPU-only (unstable)
pip3 install tf-nightly

# Install TensorFlow 2.0 Beta
pip3 install tensorflow==2.0.0-beta0

以下が、Windows環境にGPU対応版をインストールした場合です。

@windows>pip3 install tensorflow-gpu
...
Successfully installed setuptools-41.0.1 tensorflow-gpu-1.14.0

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

pip での TensorFlow のインストール

2019年10月07日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2019年10月07日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
10月07日
(月曜日)
【4戦目】07時58分生じゃんけん!ディーン・フジオカさん、岩田剛典さん
【3戦目】07時35分生じゃんけん!廣瀬俊朗さん
【2戦目】06時58分内山理名さん、桐谷美玲さん、高杉真宙さん、岡田健史さん
【1戦目】05時58分まちかどじゃんけん

UTF-8 のEmoji利用について

すっと昔は、通信キャリア毎でのコードの違いなどから、利用する際には独自にコード変換などをする必要があり、多くのユーザー環境を考えると、利用するにはそれなりの決断と覚悟が必要でした。

Unicodeで規格化され、日本のみならず全世界でEmojiが利用できるのですね。

あまり、細かいことを気にせずに利用出来そうです。

じゃんけんの、グー・チョキ・パーって、カタカナやアルファベットで書くよりも、やはり、絵文字✊✌✋が一番分かりやすい。

よって、まずはグーチョキパーがどの程度のクライアントでサポートされているのか気になり、調べてみました。

結論として、一番最初のEmoji規格である、Unicode6.0よりサポートされておりました。

Emoji のクライアント毎のサポートするUnicodeバージョン

Emoji Version 1.0は、Unicode 6.0として順次追加されて行きました。

パソコンやスマートフォンなどで世界的に対応されたことから日本国内だけでなく世界中で利用されるようになりました。

日本発信の文化であり、「Emoji」が正式名称となります。

Microsoft社 Windows 7より、Unicode 6.0 をサポート

Apple社 Mac OS X Lionより、Unicode 6.0 をサポート

Google社 Android 4.1より、Unicode 6.0 をサポート

現在は、Unicode 12.0

  • 2010年10月11日 Unicode 6.0.0 携帯電話の絵文字
  • 2014年6月16日 Unicode 7.0.0 約250字の絵文字追加。
  • 2016年6月21日 Unicode 9.0 72種類の絵文字追加
  • 2017年6月20日 Unicode 10.0 56種類の絵文字追加
  • 2019年3月5日  Unicode 12.0.0 59種類の絵文字追加、3019個の絵文字

Emoji入力について

日本語入力時の変換で、絵文字は出てきますね。

後は、コード直接よりも、以下の文字一覧を公開しているサイトからコピー&ペーストして利用するのも簡単だと思います。

https://lets-emoji.com/emojilist/

UnicodeのEmoji 12.0の一覧

http://unicode.org/Public/emoji/12.0/emoji-data.txt

NVIDIA Jetson Nano

NVIDIA CUDA Toolkit 10.0 に対応しcuDNN 7.3など、機械学習時にデファクトスタンダートとなっているライブラリやフレームワークが、利用可能になっています。
TensorFlow や PyTorch、Caffe、Keras、MXNet などの機械学習 (ML) フレームワークに対応しています。ネイティブにインストールすることができます。

Raspberry Pi with NCS2 VS Jetson

導入時に気になったのは、開発者コミュニティーです。
Raspberry Piは、歴史もあり、世界中の方々が同じような悩みを持ち、各種解決策がWEBに公開されています。一方で、NVIDIA Jetson Nanoは、どの程度このようなコアユーザーによる情報公開などがされているのか気になりました。

結論からするとNVIDIAの社員や関係者が協力にサポート、情報発信。
さすが、大手ですね、ハードの共有体制もRaspberry Pi と比べて感心しましたが、開発コミュニティーへの社員の書き込みが、本当にすごい。
オープンコミュニティの新しい形にも見えました。ハードでビジネスは成立し、技術者が率先して、コミュニティに参加。これは、弱点と感じた部分を、むしろ強み(正しい情報、責任感ある素早い対応)にしております。
あとは、ケースやファンなど、市場の大きさに合わせて、周辺のアクセサリーメーカーが追従してくれば、IoTにおけるローエンドエッジデバイスの筆頭になりそうです。
個人的には、Intel NCS2も引き続き注目して行きます。OpenCVのDNNに対応していたりと、まだまだ一長一短があるように感じます。
ただし、機械学習や推論を目的としたIoTデバイスの本命は、Jetson Nanoになりそうです。IntelのNCSはベアボーン系のミニPCかな。

関連記事:

NVIDIA Jetson Nanoで機械学習(推論)

Movidius Neural Compute Stick2とRaspberry Pi 3B +も利用しておりますが、GPU/推論向けデバイスが一体化されており、少しサイズは大きいです。
USB3.0などI/Fに差分もあるので、Raspberry Pi 4Bと比較したほうが良いかもしれません。ただし、Raspberry Pi 4B と NCS2を同時導入すると考えると、Jetson Nanoのほうがコストパフォーマンスが良いと思いますし、便利なフレームワーク利用により、開発時の手間(コスト)も考えると、機械学習にはNVIDIA Jetson Nanoがベストな選択と思います。NVIDIAですから。

Jetson Nano、Raspberry Pi 3B + with NCS2 速度比較

めざましじゃんけん時に取得したWEBカメラ画像を216枚で画像認識エンジンを動作させた際の性能比較です。
以前同じテストを用いて、NCS2(Movidius Neural Compute Stick 2)導入により十分高速化された結果となりました。今回は、その結果と比べても十分に魅力的なJetson Nanoの結果が出ました。

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

Windows(GPU未使用)
Core i7 6700/(Skylake) クロック周波数:3.4GHz
15秒 opencv.dnn
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
785秒 opencv.dnn
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
+  Movidius Vision Processing Unit(Myriad 2)
105秒 opencv.dnn
NVIDIA Jetson Nano
Quad-core ARM A57 @ 1.43 GHz
109秒 opencv.dnn
NVIDIA Jetson Nano
Quad-core ARM A57 @ 1.43 GHz
+ 128-core Maxwell
46秒 Keras-YOLO
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
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

関連記事:NVIDIA JETSON NANO

Intel Neural Compute Stick 2