コンテンツへスキップ

PythonのMySQLdbモジュール導入

PythonよりSQLを利用する際に、mysqlclinet ( MySQLdb ) モジュールを利用しています。
インストールされていないと、import MySQLdb時に、以下のエラーメッセージが出力されます。

ModuleNotFoundError: No module named 'MySQLdb'

pipコマンドで導入出来れば何も問題ないのですが、pip3でインストールしようとしたら、インストールに失敗しました。失敗時の出力は以下です。

$ pip3 install mysqlclient
Defaulting to user installation because normal site-packages is not writeable
Collecting mysqlclient
Downloading mysqlclient-1.4.6.tar.gz (85 kB)
|????????????????????????????????| 85 kB 1.7 MB/s
ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-xp5fjc04/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-xp5fjc04/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-sj8z3mc9
cwd: /tmp/pip-install-xp5fjc04/mysqlclient/
Complete output (12 lines):
/bin/sh: 1: mysql_config: not found
/bin/sh: 1: mariadb_config: not found
/bin/sh: 1: mysql_config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-xp5fjc04/mysqlclient/setup.py", line 16, in <module>
metadata, options = get_config()
File "/tmp/pip-install-xp5fjc04/mysqlclient/setup_posix.py", line 61, in get_config
libs = mysql_config("libs")
File "/tmp/pip-install-xp5fjc04/mysqlclient/setup_posix.py", line 29, in mysql_config
raise EnvironmentError("%s not found" % (_mysql_config_path,))
OSError: mysql_config not found
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

mysqlclinetの Pipインストール時エラーの対策

libmysqlclinet-devがインストールされていると、mysqlclinetのインストールが成功するようです。

aptコマンドを用いて、libmysqlclinet-devを導入し、mysqlclinetをpip3コマンドで導入します。

$ sudo apt install libmysqlclient-dev
$ pip3 install mysqlclient
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

OPENCV 4.2の DNN が NVIDIA Cuda に対応

OpenCV の4.2より、OpenCVのdnnが、NVIDIA のGPUに対応していたようです。
しかも、NVIDIAのJetson Nanoでも利用可能でした。

とても驚きのトピックでした。
早速、NVIDA Jetson Nanoに導入し、YOLO / Darknet の推論を動作させてみました。
少し、導入に癖があったので、導入時のメモを公開しておきます。

Led by dlib’s Davis King, and implemented by Yashas Samaga, OpenCV 4.2 now supports NVIDIA GPUs for inference using OpenCV’s dnn module, improving inference speed by up to 1549%!

Pythonから、NVIDIA GPUのCUDAを用いた、OpenCVのDNNを利用する際のコードはBackendとTargetを以下のようにCUDAに設定します。

net.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA)

導入した環境

2020/08/20追記:
JetPack4.4とOPENCV4.4.0でインストールできました。

  • JetPack 4.3 (4.4では、OPENCVコンパイル時に、CuDNNがうまくコンパイルできず)
    Jetpack 4.3 Archive
  • OPENCV 4.3.0 (4.2.0でもインストール出来ました)
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

導入方法

NVIDIA Jetson NanoのOpencvコンパイル用のスクリプトは、公式が公開したこともあり、各種エンハンスされ公開されています。
今回は、結構最近に公開されたとみられる、4.3.0向けのスクリプトを利用します。

Build OpenCV on Nvidia Jetson Nano

ポイントは、コンパイルオプションに以下を追加します。

  • WITH_CUDA
  • WITH_CUDNN

インストールスクリプト

コンパイルオプションを追加した、スクリプトを公開しておきます。

./Build_OpenCV.sh でインストールは完了します。
./Build_OpenCV.sh <version> で、指定したバージョンのOPENCVがインストール出来るようです。

実際にコンパイルした際の構成も公開しておきます。

NVIDIA CUDA: YES (ver 10.0, CUFFT CUBLAS FAST_MATH)
NVIDIA GPU arch: 53 62 72 -- NVIDIA PTX archs:
cuDNN: YES (ver 7.6.3)

-- General configuration for OpenCV 4.3.0 =====================================
--   Version control:               4.3.0
--
--   Extra modules:
--     Location (extra):            /tmp/build_opencv/opencv_contrib/modules
--     Version control (extra):     4.3.0
--
--   Platform:
--     Timestamp:                   2020-05-25T01:56:52Z
--     Host:                        Linux 4.9.140-tegra aarch64
--     CMake:                       3.10.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
--
--   CPU/HW features:
--     Baseline:                    NEON FP16
--       required:                  NEON
--       disabled:                  VFPV3
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ standard:                11
--     C++ Compiler:                /usr/bin/c++  (ver 7.5.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed
--     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          m pthread cudart_static -lpthread dl rt nppc nppial nppicc nppicom nppidei nppif nppig nppim nppist nppisu nppitc npps cublas cudnn cufft -L/usr/local/cuda/lib64 -L/usr/lib/aarch64-linux-gnu
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 alphamat aruco bgsegm bioinspired calib3d ccalib core cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hdf hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 cnn_3dobj cvv java js matlab ovis sfm ts viz
--     Applications:                apps
--     Documentation:               NO
--     Non-free algorithms:         YES
--
--   GUI:
--     GTK+:                        YES (ver 3.22.30)
--       GThread :                  YES (ver 2.56.4)
--       GtkGlExt:                  NO
--     OpenGL support:              NO
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                        /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11)
--     JPEG:                        /usr/lib/aarch64-linux-gnu/libjpeg.so (ver 80)
--     WEBP:                        build (ver encoder: 0x020f)
--     PNG:                         /usr/lib/aarch64-linux-gnu/libpng.so (ver 1.6.34)
--     TIFF:                        /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 / 4.0.9)
--     JPEG 2000:                   build Jasper (ver 1.900.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      YES (2.2.5)
--     FFMPEG:                      YES
--       avcodec:                   YES (57.107.100)
--       avformat:                  YES (57.83.100)
--       avutil:                    YES (55.78.100)
--       swscale:                   YES (4.8.100)
--       avresample:                YES (3.7.0)
--     GStreamer:                   YES (1.14.5)
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Lapack:                      YES (/usr/lib/aarch64-linux-gnu/liblapack.so /usr/lib/aarch64-linux-gnu/libcblas.so /usr/lib/aarch64-linux-gnu/libatlas.so)
--     Eigen:                       YES (ver 3.3.4)
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.5.1)
--
--   NVIDIA CUDA:                   YES (ver 10.0, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             53 62 72
--     NVIDIA PTX archs:
--
--   cuDNN:                         YES (ver 7.6.3)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /tmp/build_opencv/opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.17)
--     Libraries:                   /usr/lib/aarch64-linux-gnu/libpython2.7.so (ver 2.7.17)
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.13.3)
--     install path:                lib/python2.7/dist-packages/cv2/python-2.7
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.6.9)
--     Libraries:                   /usr/lib/aarch64-linux-gnu/libpython3.6m.so (ver 3.6.9)
--     numpy:                       /usr/local/lib/python3.6/dist-packages/numpy/core/include (ver 1.16.1)
--     install path:                lib/python3.6/dist-packages/cv2/python-3.6
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Install to:                    /usr/local
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

参考サイト

めざましじゃんけん を題材とした時系列予測

めざましじゃんけん広場に、TVのじゃんけん結果が取得可能なAPIを公開しました。
当初より、このチュートリアルを公開したかったのですが、システム自体の安定稼働や、それなりに時系列データが蓄積されてからと、公開が本日となりました。

機械学習、AI、人工知能分野の専門家ではございませんが、じゃんけんのようなランダムな結果となりそうな分野において、プロフェッショナルや趣味で機械学習を実施している人が、簡単な同じ題材で、予測精度の差分が楽しめたらと考えております。

テレビ放送、デジタルデータ通信という性質もあり、リアルタイムで楽しめます。
実際、このシステムを運用し、難しさがある反面、嘘もつけず、面白い部分でもあります。
また、平日4回、土曜日2回と実施回数が多いコンテンツで有ることも魅力だと思います。

是非、一人でも多くの方が、めざましじゃんけんのじゃんけん予測を実施して頂ければと思います。

公開コンテンツ

めざましじゃんけん を題材とした時系列予測

cupyの利用に関して

Windowsでchainerを利用とした際に、cupy関係のエラーがでました。
自身のCuda利用環境に合わせたCupyを導入する必要があるようです。

C:\Users\miki\Anaconda3\envs\Own-Project\lib\site-packages\chainer\backends\cuda.py:98: UserWarning: cuDNN is not enabled.
Please reinstall CuPy after you install cudnn
(see https://docs-cupy.chainer.org/en/stable/install.html#install-cudnn).
  'cuDNN is not enabled.\n'

cupyインストール

pip install cupyすると、CUDA-8.0をターゲットとしてしまうみたいです。
なので、下記コマンドでCUDA-9.0用のcupyをインストールしてください。
pip install cupy-cuda90
cupyに関してはこちらに書いてありました。
CUDA 10.1を利用する場合
$ pip install cupy-cuda101
(Own-Project) C:\WINDOWS\system32>pip install cupy-cuda101
Collecting cupy-cuda101
Using cached https://files.pythonhosted.org/packages/14/80/35f5cb9858c3e914824b2a8c72db4c7a522e7aace0acfe469875dc05eedb/cupy_cuda101-6.2.0-cp36-cp36m-win_amd64.whl
Requirement already satisfied: six>=1.9.0 in c:\users\miki\anaconda3\envs\own-project\lib\site-packages (from cupy-cuda101) (1.12.0)
Requirement already satisfied: fastrlock>=0.3 in c:\users\miki\anaconda3\envs\own-project\lib\site-packages (from cupy-cuda101) (0.4)
Requirement already satisfied: numpy>=1.9.0 in c:\users\miki\anaconda3\envs\own-project\lib\site-packages (from cupy-cuda101) (1.16.4)
Installing collected packages: cupy-cuda101
Successfully installed cupy-cuda101-6.2.0

利用環境に合わせたCupyを導入し、エラーがなくなりました。

Cupy、Chainerの動作環境

chainer.print_runtime_info()
print('GPU:', chainer.cuda.available)
print('cuDNN:', chainer.cuda.cudnn_enabled)
Platform: Windows-10-10.0.17134-SP0
Chainer: 5.3.0
NumPy: 1.16.4
CuPy:
  CuPy Version          : 6.2.0
  CUDA Root             : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
  CUDA Build Version    : 10010
  CUDA Driver Version   : 10010
  CUDA Runtime Version  : 10010
  cuDNN Build Version   : 7500
  cuDNN Version         : 7500
  NCCL Build Version    : None
  NCCL Runtime Version  : None
iDeep: Not Available
GPU: True
cuDNN: True

MacにPythonインストール

Mac BookでOpenCVを利用したくて、Python3とOpenCVをインストールしました。
普段は、Macでプログラム開発などをしていないので、Macの開発環境などは何も導入していない状態です。

テスト環境

macOS Mojave 10.14.6
導入されているPython 2.7.10 (python -V)

Python 3インストール

パッケージインストールかbrewインストールでPythonがインストール出来ます。
開発環境を入れていないので、パッケージインストールしました。
以下サイトより、MAC向けのインストトーラーをダウンロードし、Python3のインストールを実施しました。

Download the latest version for Mac OS X

OpenCVインストール

pip3コマンドで、「opencv-python」をインストールしました。

$ pip3 install opencv-python

必要に応じてPipをアップグレードします。

$ pip3 install --upgrade pip

Pipのアップグレードが必要な際は、以下のメッセージが表示されます。

You are using pip version 18.1, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

 

 

 

 

 

Windowsでは、pip でインストール出来ないmysqlclient

Linuxでは、問題なかった「mysqlclient」がWindowsではpipでインストールできませんでした。

mysqlclientをWindowsでインストール

インストールは、wheelパッケージをダウンロードし、ダウンロードしたファイルを用いて、pipコマンドでインストールします。

wheelパッケージは以下よりダウンロードします。
Unofficial Windows Binaries for Python Extension Packages

環境に合わせた、PythonのバージョンとOSのBit数別にファイルが準備されているので、環境に合ったファイルをダウンロードします。

Pipコマンドでinstall

pip install <ダウンロードファイル>

コマンド例: pip install mysqlclient1.3.13cp36cp36mwin_amd64.whl

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)

サンプルスクリプトPythonからメール送付

以下が、サンプルスクリプトになります。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formatdate

def send_email(to_adress, send_subject, send_message):
    from_address = 'xxx@xxx.com'
    charset = 'iso-2022-jp'
    msg = MIMEText(send_message, 'plain', charset)
    msg['Subject'] = Header(send_subject, charset)
    msg['From'] = from_address
    msg['To'] = to_adress
    msg['Date'] = formatdate(localtime=True)
    smtp = smtplib.SMTP('@@smtp_adress@@')
    smtp.sendmail(from_address, to_address, msg.as_string())
    smtp.quit()

send_email('aaa@bbbb.com', 'サブジェクト', 'メッセージ本文')

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

https://www.python-izm.com/advanced/mail_send/

Yolo3、Tiny-Yolo3での独自学習モデルをPythonに実装

画像検出に向けて、AlexeyAB Darknetを用いて、YOLO3、Tiny-YOLO3で作成した、独自学習モデルをPythonで実装します。

前提条件

YOLO2 Tiny-YOLO2 YOLO3 Tiny-YOLO3 をPythonで実装

学習済みモデル(weightsファイル)とコンフィグファイル(cfgファイル)

「darknet\build\darknet\x64\cfg\obj.data」ファイルのbackupに指定したフォルダに、学習モデル(weightsファイル)が出力されます。

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

独自学習に用いたコンフィグファイルは、「darknet\build\darknet\x64\cfg\」フォルダ内で作成していると思いますので、独自学習時に用いたcfgファイルとなります。

これらのファイルを、画像検出を実施するRaspberry PiやサーバーのPythonファイルが読み込み可能な場所にコピーします。

Python3での実装

  • net = cv.dnn.readNetFromDarknet(CFG, MODEL)
    • CFG:学習モデル(weightsファイル)
    • MODEL:独自学習時に用いたcfgファイル
  • net.setPreferableTarget
    • net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
      Raspberry PiやWindowsなどで動作させる際のTarget指定。
      現時点では、OpenCVのYOLO向けDNNでは、GPUはサポートされておりません。
    • net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)
      Intel Movidius Neural Compute Stick 2 (NCS2)を利用する際は、TargetにNCS2を指定することが出来ます。Raspberry Pi 3B +で動作確認済みとなります。

参考記事:Movidius Neural Compute Stick 2、OpenVINO™ toolkit for Raspbian* OS導入

Python3 ソースコード

サンプルスクリプトを掲載しておきます。

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

target_model = "yolov3-tiny-janken_final.weights"
target_config = "yolov3-tiny-janken.cfg"

import cv2 as cv
import numpy as np

MODEL = "./janken_cfg/" + target_model
CFG = "./janken_cfg/" + target_config
SCALE = 0.00392   ##1/255
INP_SHAPE = (416, 416) #input size
MEAN = 0
RGB = True

# Load a network
net = cv.dnn.readNetFromDarknet(CFG, MODEL)
net.setPreferableBackend(cv.dnn.DNN_BACKEND_DEFAULT)
##net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

confThreshold = 0.8 # Confidence threshold
nmsThreshold = 0.8  # Non-maximum supression threshold

class_names = ['active', 'goo', 'choki', 'pa', 'won', 'lose', 'draw']

def getOutputsNames(net):
    layersNames = net.getLayerNames()
    return [layersNames[i[0] - 1] for i in net.getUnconnectedOutLayers()]

def postprocess(frame, outs):
    frameHeight = frame.shape[0]
    frameWidth = frame.shape[1]

    def drawPred(classId, conf, left, top, right, bottom):
        left = int(left)
        top = int(top)
        right = int(right)
        bottom = int(bottom)
        # Draw a bounding box.
        cv.rectangle(frame, (left, top), (right, bottom), (0, 255, 0))

        label = class_names[classId] + '_%.2f' % conf

        labelSize, baseLine = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, 1)
        top = max(top, labelSize[1])
        cv.rectangle(frame, (left, top - labelSize[1]), (left + labelSize[0], top + baseLine), (255, 255, 255), cv.FILLED)
        cv.putText(frame, label, (left, top), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))

    layerNames = net.getLayerNames()
    lastLayerId = net.getLayerId(layerNames[-1])
    lastLayer = net.getLayer(lastLayerId)

    classIds = []
    confidences = []
    boxes = []

    if lastLayer.type == 'Region':
        classIds = []
        confidences = []
        boxes = []
        for out in outs:
            for detection in out:
                scores = detection[5:]
                classId = np.argmax(scores)
                confidence = scores[classId]
                if confidence > confThreshold:
                    center_x = int(detection[0] * frameWidth)
                    center_y = int(detection[1] * frameHeight)
                    width = int(detection[2] * frameWidth)
                    height = int(detection[3] * frameHeight)
                    left = center_x - width / 2
                    top = center_y - height / 2
                    classIds.append(classId)
                    confidences.append(float(confidence))
                    boxes.append([left, top, width, height])
    else:
        print('Unknown output layer type: ' + lastLayer.type)
        exit()

    indices = cv.dnn.NMSBoxes(boxes, confidences, confThreshold, nmsThreshold)
    for i in indices:
        i = i[0]
        box = boxes[i]
        left = box[0]
        top = box[1]
        width = box[2]
        height = box[3]
        drawPred(classIds[i], confidences[i], left, top, left + width, top + height)

c = cv.VideoCapture(0)
c.set(cv.CAP_PROP_FRAME_WIDTH, 640) # カメラ画像の横幅を1280に設定
c.set(cv.CAP_PROP_FRAME_HEIGHT, 480) # カメラ画像の縦幅を720に設定
c.read()

r, frame = c.read()

frameHeight = frame.shape[0]
frameWidth = frame.shape[1]
# Create a 4D blob from a frame.
inpWidth = INP_SHAPE[0]
inpHeight = INP_SHAPE[1]
blob = cv.dnn.blobFromImage(frame, SCALE, (inpWidth, inpHeight), MEAN, RGB, crop=False)
   
# Run a model
net.setInput(blob)
outs = net.forward(getOutputsNames(net))
   
##print(outs)
postprocess(frame, outs)
# Put efficiency information.
t, _ = net.getPerfProfile()
label = 'Inference time: %.2f ms' % (t * 1000.0 / cv.getTickFrequency())
cv.putText(frame, label, (0, 15), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))
#対象ファイルコピー保存
target_filepath = './result.jpg'
cv.imwrite(target_filepath, frame)

昨日投稿したGit Hubからソースコードをダウンロードして、OpenCV 3.4.4を導入と類似した内容なのですが、Raspberry PiへのOpenCVにぴったりの記事を見つけたので、紹介します。また、この記事を参考に最新のOpenCV4.1.Xを導入したので、記事にしておきます。

以下の記事を参考にインストールした内容となります。

Install OpenCV 4 on Raspberry Pi

Install OpenCV 4 on Raspberry Pi

他バージョンでもこの記事の手順でインストールして、問題なくOpen CVの導入が出来ております。

現時点の最新OpenCV(4.1.1)をGitHubよりソースコードをダウンロードしインストール

事前準備

システムのディスク容量の整理を行います。

sudo apt-get -y purge wolfram-engine
sudo apt-get -y purge libreoffice*
sudo apt-get -y clean
sudo apt-get -y autoremove

インストール対象のOpen CVバージョンを変数に設定します。

cvVersion="4.1.1"

インストールに利用するフォルダを作成します。

mkdir installation
mkdir installation/OpenCV-"$cvVersion"

カレントディレクトリを変数に入れます。

cwd=$(pwd)

導入パッケージのアップデートを行います。

sudo apt -y update
sudo apt -y upgrade

swapfileサイズ変更

この手順前後で、「free -m」コマンドでスワップメモリサイズを確認してください。
以下の手順で、スワップサイズを1GBに拡張します。

sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=1024/g' /etc/dphys-swapfile
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

必要パッケージのインストール

多くのパッケージを導入する必要があります。環境によっては、仮想Python環境に導入することをお勧めします。私は、Raspberry Piでは仮想環境を利用しておりません。
元の参考にしているサイトでは、一部のライブラリーを仮想環境に導入されております。

sudo apt-get -y remove x264 libx264-dev

## Install dependencies
sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm
sudo apt-get -y install git gfortran
sudo apt-get -y install libjpeg8-dev libjasper-dev libpng12-dev

sudo apt-get -y install libtiff5-dev

sudo apt-get -y install libtiff-dev

sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt-get -y install libxine2-dev libv4l-dev
cd /usr/include/linux
sudo ln -s -f ../libv4l1-videodev.h videodev.h
cd $cwd

sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default
sudo apt-get -y install libatlas-base-dev
sudo apt-get -y install libmp3lame-dev libtheora-dev
sudo apt-get -y install libvorbis-dev libxvidcore-dev libx264-dev
sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get -y install libavresample-dev
sudo apt-get -y install x264 v4l-utils

# Optional dependencies
sudo apt-get -y install libprotobuf-dev protobuf-compiler
sudo apt-get -y install libgoogle-glog-dev libgflags-dev
sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

# Install Python Libraries
sudo apt-get -y install python3-dev python3-pip
sudo -H pip3 install -U pip numpy
sudo apt-get -y install python3-testresources

sudo pip3 install numpy dlib

OpenCVのソースコード準備

Git HubよりOpenCVのソースコードをチェックアウト(ダウンロード)します。

git clone https://github.com/opencv/opencv.git
cd opencv
git checkout $cvVersion
cd ..

git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout $cvVersion
cd ..

OpenCVのビルドおよびコンパイル、インストール

この記事で示すコンパイルオプションは、オリジナルサイトのビルドオプションとは少し異なっております。各種ビルドオプションの説明や、失敗するビルドオプションなどは各種ブログに記載されております。個人的には、できる限りコンパイルが通りやすいビルドオプションとしております。

cd opencv
mkdir build
cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=OFF -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -D BUILD_EXAMPLES=ON -D ENABLE_MEON=ON ..

コンパイルです。

Raspberry Pi 3B +でコンパイル実施時は、4コアすべてを使ってコンパイルしても、6-8時間程度時間を要します。Raspberry Piの動作温度もコンパイル時間に大きく影響します。

make -j$(nproc)

コンパイルが無事に成功したら、インストールを実行してください。

make install

swqpfileサイズ変更(変更したサイズを元に戻す)

この手順前後で、「free -m」コマンドでスワップメモリサイズを確認してください。
以下の手順で、スワップサイズを拡張した1GBから100MBに戻します。

sudo sed -i 's/CONF_SWAPSIZE=1024/CONF_SWAPSIZE=100/g' /etc/dphys-swapfile
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

インストール後の確認

「python3」コマンドを実行し、「import cv2」「print(cv2.__version__)」で導入されたOpenCVのバージョンを確認します。

@raspberrypi:~ $ python3
Python 3.7.3 (default, Apr 3 2019, 05:39:12)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.1.1

最後に

当初は、結構苦労しましたが、慣れると簡単にコンパイル、インストール出来ます。OpenCVをガリガリ利用する人は、是非、自分でソースコードより導入することをお勧めします。新バージョン新バージョンでの進化が素晴らしいライブラリです。

現時点の私のRaspberry Piに導入しているOpenCVは、「4.1.1-openvino」となります。Movidius Neural Compute Stick 2、OpenVINO™ toolkit for Raspbian* OS導入