ラベル お試し の投稿を表示しています。 すべての投稿を表示
ラベル お試し の投稿を表示しています。 すべての投稿を表示

2019年5月10日金曜日

Jetson Nano で MNISTをラズパイカメラから動かしてみる

あれから、MNIST関係色々見てました。
詳しいことはよくわからなかったけど、層をたくさん経由すると「deep」になるとのこと。
だから、前回のはディープラーニングではないようです。
とはいっても、根本的な意味はよくわかっていないので、今後の課題とします。
ざっくりとした理解だけれども、今回の教師あり学習に関して言えば、画像から分布を作って(学習)、その分布に当てはめて近い値が出たらそれが答えだ!的な感じっぽい。
ディープの部分は写経なんだけれども、学習データ保存して、読込して、カメラから画像取得して読み込んだ学習データに照らし合わせてリアルタイムに数字認識するプログラムを書いてみた。
参考にしたサイトのリンク貼っておきます。

http://blog.brainpad.co.jp/entry/2016/02/25/153000

https://qiita.com/JUN_NETWORKS/items/6514e017e89b9adbfb8d

https://qiita.com/tsutof/items/2d2248ec098c1b8d3e32

ソース見たほうが早いかな。

import tensorflow as tf
import numpy as np
import os,sys
import cv2
from PIL import Image, ImageEnhance,ImageDraw

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

def conv2d(x, W):
  return tf.nn.conv2d(x,W,strides=[1, 1, 1, 1],padding='SAME')

def max_pool_2x2(x):
  return tf.nn.max_pool(x,ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1],padding='SAME')

x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])

# 画像をリシェイプ 第2引数は画像数(-1は元サイズを保存するように自動計算)、縦x横、チャネル
x_image = tf.reshape(x, [-1, 28, 28, 1])
print(x_image)

### 1層目 畳み込み層
# 畳み込み層のフィルタ重み、引数はパッチサイズ縦、パッチサイズ横、入力チャネル数、出力チャネル数
# 5x5フィルタで32チャネルを出力(入力は白黒画像なので1チャンネル)
W_conv1 = weight_variable([5, 5, 1, 32])
# 畳み込み層のバイアス
b_conv1 = bias_variable([32])
# 活性化関数ReLUでの畳み込み層を構築
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

### 2層目 プーリング層
# 2x2のマックスプーリング層を構築
h_pool1 = max_pool_2x2(h_conv1)

### 3層目 畳み込み層
# パッチサイズ縦、パッチサイズ横、入力チャネル、出力チャネル
# 5x5フィルタで64チャネルを出力
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)

### 4層目 プーリング層
h_pool2 = max_pool_2x2(h_conv2)

### 5層目 全結合層
# オリジナル画像が28x28で、今回畳み込みでpadding='SAME'を指定しているため
# プーリングでのみ画像サイズが変わる。2x2プーリングで2x2でストライドも2x2なので
# 縦横ともに各層で半減する。そのため、28 / 2 / 2 = 7が現在の画像サイズ

# 全結合層にするために、1階テンソルに変形。画像サイズ縦と画像サイズ横とチャネル数の積の次元
# 出力は1024(この辺は決めです) あとはSoftmax Regressionと同じ
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

# ドロップアウトを指定
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

### 6層目 Softmax Regression層
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

### 訓練 ###
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


saver = tf.train.Saver()

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.visible_device_list="0"
with  tf.Session(config=config) as sess:
  sess.run(tf.initialize_all_variables())

  os.makedirs("./model_2",exist_ok=True)

  ckpt = tf.train.get_checkpoint_state('./model_2')
  if ckpt:
    saver.restore(sess, ckpt.model_checkpoint_path)
  else:
    for i in range(1500):
      batch = mnist.train.next_batch(50)
      if i%100 == 0:
        train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1],keep_prob: 1.0})
        print("step %d, training accuracy %g"%(i, train_accuracy))
      train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

    saver.save(sess, "./model_2/model.ckpt")

  num_test = len(mnist.test.labels)
  sum_accuracy = 0
  for i in range(0, num_test, 50):
    sum_accuracy = sum_accuracy + accuracy.eval(feed_dict={x: mnist.test.images[i:i+50], y_: mnist.test.labels[i:i+50], keep_prob: 1.0})
  print("test accuracy:", sum_accuracy/(num_test/50))


  GST_STR = 'nvarguscamerasrc \
      ! video/x-raw(memory:NVMM), width=320, height=240, format=(string)NV12, framerate=(fraction)10/1 \
      ! nvvidconv ! video/x-raw, width=(int)320, height=(int)240, format=(string)BGRx \
      ! videoconvert \
      ! appsink'
  WINDOW_NAME = 'Camera Test'

  cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)

  while True:
    ret, img = cap.read()
    if ret != True:
      break

    pilImg = Image.fromarray(np.uint8(img))
    #print(pilImg.format, pilImg.size, pilImg.mode)
    img_width, img_height = pilImg.size
    draw = ImageDraw.Draw(pilImg)
    draw.rectangle(((img_width - 150) // 2,
                         (img_height - 150) // 2,
                         (img_width + 150) // 2,
                         (img_height + 150) // 2), outline=(255, 255, 255))

    mnistImg = Image.fromarray(np.uint8(img))
    mnistImg = mnistImg.crop(((img_width - 150) // 2,
                         (img_height - 150) // 2,
                         (img_width + 150) // 2,
                         (img_height + 150) // 2))
    mnistImg = mnistImg.convert("L")
    color = ImageEnhance.Color(mnistImg)
    mnistImg = color.enhance(1.5)
    contrast = ImageEnhance.Contrast(mnistImg)
    mnistImg = contrast.enhance(1.5)
    brightness = ImageEnhance.Brightness(mnistImg)
    mnistImg = brightness.enhance(1.5)
    sharpness = ImageEnhance.Sharpness(mnistImg)
    mnistImg = sharpness.enhance(1.5)
    mnistImg = mnistImg.resize((28, 28), Image.LANCZOS)
    #print(mnistImg)
    mnistImg = map(lambda x: 255 - x, mnistImg.getdata())
    mnistImg = np.fromiter(mnistImg, dtype=np.uint8)
    mnistImg = mnistImg.reshape(1, 784)
    mnistImg = mnistImg.astype(np.float32)
    mnistImg = np.multiply(mnistImg, 1.0 / 255.0)
    # print(mnistImg)
    for i in range(len(mnistImg[0])):
      num=mnistImg[0][i]
      if num<0.4:
        print('    ', end="")
      else:
        print('%03d ' % (num*1000), end="")
      if i % 28 == 0:
        print('\n')

    #学習データと読み込んだ数値との比較を行う
    pred = sess.run(y_conv, feed_dict={x:mnistImg, y_: [[0.0] * 10], keep_prob: 1.0})[0]
    # print(pred)
    if not np.max(pred) < 0.5 :
      print(np.argmax(pred) ,np.max(pred))
      draw.text((10,10),f'{np.argmax(pred)} {round(np.max(pred)*100,2)}%')


    imgArray = np.asarray(pilImg)
    cv2.imshow(WINDOW_NAME, imgArray)

    key = cv2.waitKey(10)
    if key == 27: # ESC 
      break
起動すると、ウインドウが開いてカメラの画像が出ます。
真ん中の白枠に手書きの文字を入れると、上に値が出るってわけ。
認識率悪くて、コントラスト上げたり、明度あげたり、色々やってみてる。
コンソールに、プログラムからみたテンソルを表示しています。

色々やってて思ったのが、Jetson Nanoだと、何するにしてもメモリ不足で死にます。
これは、僕の書き方の問題なのかもしれないけど、いろいろシンドかった。
学習するにしても、バッチサイズ減らしてやらないと落ちるし、学習データの読み込みでも、ブラウザは落としておかないと死ぬ。
こういったあたりも、今後調べていきたい。
次は、自分で教師データ作って学ばせてあげたい。
できるかな?

2019年4月24日水曜日

Jetson Nano に TensorFlow版のOpenpose入れてみる

連日のお試しシリーズ、リアルタイムOpenposeの2FPSをもうすこしなんとかならないかなと思って、TensorFlow版のOpenposeでやってみることにしました。
というのも、CPUでも2FPS位出るみたいな記事を見かけたので、GPUにしたらもちょっと出るんじゃないかなという単純な発想です。


セットアップ


セットアップは、これらやった前提で。
https://toramamma.blogspot.com/2019/04/jetson-nano-darknet.html
https://toramamma.blogspot.com/2019/04/jetson-nano-openpose.html


インストール



tf-pose-estimationのインストール


とりあえず言われるまま入れてみます。

https://github.com/ildoonet/tf-pose-estimation

ただ、この通りにやると失敗するもんで、先に必要なライブラリを入れたほうが良いです。
ものっそい時間かかるので、コレを先に・・・

$ pip3 install --upgrade cython
$ sudo apt-get -yV install libopenblas-dev
$ sudo apt-get -yV install liblapacke-dev
$ sudo apt-get -yV install gfortran
$ sudo apt-get -yV install llvm-7*
$ echo 'export PATH="/usr/lib/llvm-7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

参ります。

$ git clone https://github.com/ildoonet/tf-pose-estimation.git
$ cd tf-pose-estimation
$ pip3 install -r requirements.txt

失敗したログしかないけど、正しくできてれば、Failedがないものが出力されると思います。
Successfully built dill fire matplotlib numba psutil pycocotools scikit-image msgpack numpy pyzmq tabulate termcolor kiwisolver PyWavelets networkx pillow
Failed to build scipy llvmlite
Installing collected packages: argparse, dill, six, fire, cycler, setuptools, kiwisolver, numpy, pyparsing, python-dateutil, matplotlib, llvmlite, numba, psutil, pycocotools, urllib3, idna, chardet, certifi, requests, PyWavelets, pillow, imageio, decorator, networkx, scipy, scikit-image, slidingwindow, tqdm, msgpack, msgpack-numpy, pyzmq, tabulate, termcolor, tensorpack

次はコレをやれというので

https://github.com/ildoonet/tf-pose-estimation/tree/master/tf_pose/pafprocess
$ cd tf_pose/pafprocess
$ sudo apt install swig
$ swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace

素直に実行。


TensorFlowのインストール


で、ここでTensorFlow入れてないの思い出して、入れてみます。

$ pip3 install tensorflow-gpu
Could not find a version that satisfies the requirement tensorflow-gpu (from versions: )

嘘だろ。。
※ サックっとスルーしますが、ここで相当ヤラレタ。。

色々漁ってたら、ぴったりな記事あったので参考に。

https://qiita.com/tsutof/items/77b49f71ed81344b9d16

$ sudo apt-get install libhdf5-serial-dev hdf5-tools
$ sudo apt-get install python3-pip
$ sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev
$ sudo pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor
$ sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu

で、TensorFlowの動作確認まで。

$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> print(tf.__version__)
1.13.1
>>>exit()


学習済みモデルのダウンロード


次は、学習済みモデルをダウンロード。
見出しと同じことをもう一度書くスタイル。

$ cd ~/tf-pose-estimation
$ cd models/graph/cmu
$ bash download.sh


実行


やっと実行ですが、ライブラリ足りず落ちたのでコレを先に。

$ pip3 install tqdm
$ pip3 install slidingwindow
$ pip3 install pycocotools

※ でもコレ最初の pip3 install -r requirements.txt で入ってるっぽいんだけどな。。
  ここに来るまでTensorFlow関連で色々いじったので普通にやってれば再現しないかも。

やっと実行!!!

$ python3 run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=1

ガーン!!
動いたけど・・・まさかの2FPS。
パフォーマンス変わらず。。。

まだだ、諦めるのは早い!
モデルを「mobilenet_v2_small」に変えてみよう!

$ python3 run_webcam.py --model=mobilenet_v2_small --resize=432x368 --camera=1

でたーっ!3.5FPS!
なかなか良いね!




お前の力はこんなモンじゃないはずだ。
前回のOpenposeに読み込み画像サイズを合わせてみよう。

$ python3 run_webcam.py --model=mobilenet_v2_small --resize=320x176 --camera=1

出ました。
7〜8FPS!


でも、精度だいぶ落ちるんよね〜

あと、--camera=1はラズパイカメラ同居しているので、ロジクールのを使う設定です。
通常は0です(だと思います)


感想


サイズ合わせて3.5倍達成しました。
精度重視でも1.5倍は早くなりました。
労力はこの比ではありませんでしたw

でも、折角TensorFlow入れたので、ネタが増えました。
サンプルたたきマンでももう少しなにか出来るかな。

Virtualenv?知らん、何かあればイメージ焼き直す!!


メモ


TensorFlow入んなくて、ほんと色々イジったので、メモ程度に現状残しておく。

$ pip3 list --format=columns
Package                       Version            
----------------------------- -------------------
absl-py                       0.7.1              
apt-clone                     0.2.1              
apturl                        0.5.2              
asn1crypto                    0.24.0             
astor                         0.7.1              
beautifulsoup4                4.6.0              
blinker                       1.4                
Brlapi                        0.6.6              
certifi                       2019.3.9           
chardet                       3.0.4              
cryptography                  2.1.4              
cupshelpers                   1.0                
cycler                        0.10.0             
Cython                        0.29.7             
defer                         1.0.6              
devscripts                    2.17.12ubuntu1.1   
dill                          0.2.9              
distro-info                   0.18ubuntu0.18.04.1
feedparser                    5.2.1              
fire                          0.1.3              
gast                          0.2.2              
gpg                           1.10.0             
graphsurgeon                  0.3.2              
grpcio                        1.20.0             
h5py                          2.9.0              
html5lib                      0.999999999        
httplib2                      0.9.2              
idna                          2.8                
Keras-Applications            1.0.7              
Keras-Preprocessing           1.0.9              
keyring                       10.6.0             
keyrings.alt                  3.0                
kiwisolver                    1.0.1              
language-selector             0.1                
launchpadlib                  1.10.6             
lazr.restfulclient            0.13.5             
lazr.uri                      1.0.3              
llvmlite                      0.28.0             
louis                         3.5.0              
lxml                          4.2.1              
macaroonbakery                1.1.3              
Mako                          1.0.7              
Markdown                      3.1                
MarkupSafe                    1.0                
matplotlib                    3.0.3              
mock                          2.0.0              
numpy                         1.16.3             
oauth                         1.0.1              
oauthlib                      2.0.6              
olefile                       0.45.1             
PAM                           0.4.2              
pbr                           5.1.3              
Pillow                        5.1.0              
pip                           9.0.1              
portpicker                    1.3.1              
protobuf                      3.7.1              
psutil                        5.6.1              
py-cpuinfo                    5.0.0              
pycairo                       1.16.2             
pycocotools                   2.0.0              
pycrypto                      2.6.1              
pycups                        1.9.73             
pygobject                     3.26.1             
PyICU                         1.9.8              
PyJWT                         1.5.3              
pymacaroons                   0.13.0             
PyNaCl                        1.1.2              
pyparsing                     2.4.0              
pyRFC3339                     1.0                
python-apt                    1.6.3+ubuntu1      
python-dateutil               2.8.0              
python-debian                 0.1.32             
python-magic                  0.4.16             
pytz                          2018.3             
pyxdg                         0.25               
PyYAML                        3.12               
requests                      2.21.0             
requests-unixsocket           0.1.5              
scipy                         1.2.1              
SecretStorage                 2.3.1              
setuptools                    41.0.1             
simplejson                    3.13.2             
six                           1.12.0             
slidingwindow                 0.0.13             
ssh-import-id                 5.7                
system-service                0.3                
systemd-python                234                
tensorboard                   1.13.1             
tensorflow-estimator          1.13.0             
tensorflow-gpu                1.13.1+nv19.4      
tensorrt                      5.0.6.3            
termcolor                     1.1.0              
tqdm                          4.31.1             
ubuntu-drivers-common         0.0.0              
uff                           0.5.5              
unattended-upgrades           0.1                
unidiff                       0.5.4              
unity-scope-calculator        0.1                
unity-scope-chromiumbookmarks 0.1                
unity-scope-colourlovers      0.1                
unity-scope-devhelp           0.1                
unity-scope-firefoxbookmarks  0.1                
unity-scope-manpages          0.1                
unity-scope-openclipart       0.1                
unity-scope-texdoc            0.1                
unity-scope-tomboy            0.1                
unity-scope-virtualbox        0.1                
unity-scope-yelp              0.1                
unity-scope-zotero            0.1                
urllib3                       1.24.2             
wadllib                       1.3.2              
webencodings                  0.5                
Werkzeug                      0.15.2             
wheel                         0.30.0             
xkit                          0.0.0              
zope.interface                4.3.2       

2019年4月23日火曜日

Jetson Nano でラズパイカメラリトライ

Jetson nano 届いたって嬉しくてラズパイカメラ買ったのに、動かなくて(うごいてるけどただのカメラ)、悔しいからOpenCVの顔認識で使ってみる。

とはいっても、出来合いのサンプルたたきマンですけど。

https://www.jetsonhacks.com/2019/04/02/jetson-nano-raspberry-pi-camera/

$ git clone https://github.com/JetsonHacksNano/CSI-Camera.git
$ cd CSI-Camera
$ python face_detect.py


はいコレで無駄にはなってない。

2019年4月22日月曜日

Jetson Nano に Openpose 入れてみる

jetson nano 買ったからにはガンガン使わなくてはという謎の使命感から、僕でも知ってる超有名シリーズ「nightmare」「yolo」に続き、「Openpose」を入れてみることにしました。


セットアップ


セットアップは、こっちの前半に書いてあります。

https://toramamma.blogspot.com/2019/04/jetson-nano-darknet.html


インストール


基本はここを参考に、実際に打ったコマンドを書き残しておくスタンス。

https://qiita.com/myoshimi/items/cf64c91cd22c516bb49b


cmakeをインストール


$ sudo apt-get install qtbase5-dev build-essential gdebi libopencv-dev
$ wget https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4.tar.gz
$ tar xzvf cmake-3.13.4.tar.gz
$ cd cmake-3.13.4
$ ./configure --qt-gui
$ ./bootstrap
$ make -j6
$ sudo make install


GPGPU関連


GPGPU関連のセットアップは終わってるものとしてスルー


Openposeのビルド


今までのもHome直下に入れてるので、若干パスをいじって入れる。

$ git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose
$ cd openpose
$ sudo bash ./scripts/ubuntu/install_deps.sh
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ sudo make install


実行


まずはサンプル動画をやってみまあす

$ cd ~/
$ ./build/examples/openpose/openpose.bin --write_json outputJSON/ --display 0 --model_folder ./models --video "./examples/media/video.avi" --write_video outputVideo.avi
OpenPose demo successfully finished. Total time: 1198.628352 seconds.

20分かかりました(汗)


では、リアルタイムをば・・・

$ ./build/examples/openpose/openpose.bin --model_folder ./models
Starting OpenPose demo...
Configuring OpenPose...
Starting thread(s)...
Auto-detecting camera index... Detected and opened camera 0.
Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0.
Gtk-Message: 12:50:18.435: Failed to load module "canberra-gtk-module"

なんか、落ちたのでライブラリ入れます。

$ sudo apt install canberra-gtk*

実行してみます。

$ ./build/examples/openpose/openpose.bin --model_folder ./models

出ました!
0.2FPS!!

メモリ食いつぶしてますね。


解像度を下げてやってみます。

$ ./build/examples/openpose/openpose.bin --model_folder ./models --net_resolution 320x176

これで、2.3FPS達成!!
このくらい出ると、まあまぁ遊べるかな。


ホネホネが自分に合わせて動くサマを見ていると、あらためてすごい技術だなぁと思いました。

ちなみに、--face と --hand はリアルタイムでは動作しませんでした。
というのも、--face_net_resolution、--hand_net_resolutionを低めに設定しないと読み込まれず、低くすると精度悪くて検出できないようです。

次は何動かしてみようかな。

2019年4月19日金曜日

Jetson Nano 買ったので darknet で Nightmare と YOLO を動かすまで

巷で話題のJetson Nanoが届いたので、僕でも知ってる超有名シリーズ「darknet」入れて「nightmare」「yolo」あたりを動かしてみたいと思います。


準備



■ 周辺機器揃える


せっかくなので、はりきって電源は5V4Aで、ファンもつけました。


※追記 Jetson Nanoのファン購入に気をつけろ!
コチラの記事にあるように、5Vのファンじゃないと回らない(回りにくい?)ようなのでファンのリンクを追記しました。


一応こっちでも回ってます。



買ったものはこんなところか。
※ 良い子は技適は守ろう。

キーボードやマウス、ディスプレイは、そのへんに転がっているものでOK!!


■ セットアップ


https://dev.classmethod.jp/hardware/nvidia-jetson-nano-setup/

Etcherを使ってイメージを焼く。


■ 刹活孔を突く



・ フルパワー化


https://www.jetsonhacks.com/2019/04/10/jetson-nano-use-more-power/
$ sudo nvpmodel -m 0 
$ sudo jetson_clocks


・ スワップ作成


https://www.jetsonhacks.com/2019/04/14/jetson-nano-use-more-memory/

https://github.com/JetsonHacksNano/installSwapfile
$ cd installSwapfile
$ ./installSwapfile


・ カメラの確認


https://www.jetsonhacks.com/2019/04/02/jetson-nano-raspberry-pi-camera/

基本指すだけ
動いてるか確認する。

$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e


実践



■ CUDAサンプルとVisionWorksのサンプルの動作確認


https://gihyo.jp/admin/serial/01/ubuntu-recipe/0563?page=4


・ CUDA


$ cp -a /usr/local/cuda-10.0/samples/ ~/
$ cd ~/samples
$ make

すげー時間かかるので気長に待つ。
個別buildの方法もリンク先に書いてある。

ここにビルドされてるので、移動してそれっぽいやつ実行確認。

$ cd bin/aarch64/linux/release
$ ./deviceQuery
$ ./oceanFFT
$ ./smokeParticles
$ ./nbody


・ VisionWorks


$ /usr/share/visionworks/sources/install-samples.sh ~/visionworks/
$ cd ~/visionworks/VisionWorks-1.6-Samples/
$ make

時間かかるので気長に待つ。
ここにビルドされてるので、移動してそれっぽいやつ実行確認。

$ cd bin/aarch64/linux/release/
$ ./nvx_demo_hough_transform
$ ./nvx_demo_motion_estimation

ここまで動けば、環境的には何の問題もないはず。


本題



■ DARKNETインストール


http://takesan.hatenablog.com/entry/2019/04/09/001852
真ん中あたり、DARKNET(YOLO)のインストール


・ makefileの修正

makefileの修正で、-gencodeもコメントしないとダメでした。

GPU=1 # 修正
CUDNN=1 # 修正
CUDNN_HALF=1 # 修正
OPENCV=1 # 修正
AVX=0
OPENMP=0
LIBSO=0
ZED_CAMERA=0

# set GPU=1 and CUDNN=1 to speedup on GPU
# set CUDNN_HALF=1 to further speedup 3 x times (Mixed-precision on Tensor Cores) GPU: Volta, Xavier, Turing and higher
# set AVX=1 and OPENMP=1 to speedup on CPU (if error occurs then set AVX=0)

DEBUG=0

ARCH= -gencode arch=compute_30,code=sm_30 \
            -gencode arch=compute_35,code=sm_35 \
            -gencode arch=compute_50,code=[sm_50,compute_50] \
            -gencode arch=compute_52,code=[sm_52,compute_52] \
           # -gencode arch=compute_61,code=[sm_61,compute_61] # 修正

OS := $(shell uname)

# Tesla V100
# ARCH= -gencode arch=compute_70,code=[sm_70,compute_70]

# GeForce RTX 2080 Ti, RTX 2080, RTX 2070, Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Tesla T4, XNOR Tensor Cores
# ARCH= -gencode arch=compute_75,code=[sm_75,compute_75]

# Jetson XAVIER
# ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]

# GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4
# ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61

# GP100/Tesla P100 - DGX-1
# ARCH= -gencode arch=compute_60,code=sm_60

# For Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - uncomment:
ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]  # 修正

# For Jetson Tx2 or Drive-PX2 uncomment:
# ARCH= -gencode arch=compute_62,code=[sm_62,compute_62]
  :


・ make


$ PATH=/usr/local/cuda/bin:$PATH make

気長に待つ。


・実行


ビルドできてれば以下が出力されるはず。

$ ./darknet
usage: ./darknet <function>


■ Nightmare


$ wget http://pjreddie.com/media/files/vgg-conv.weights
$ ./darknet nightmare cfg/vgg-conv.cfg vgg-conv.weights data/scream.jpg 10


なんだか、結果がポクない。。
なにか間違えたか?


■ YOLO


$ wget https://pjreddie.com/media/files/yolov3.weights
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg


リアルタイムは、raspi camera 繋がってるんだけど、camera stopedとかなって終わった。

$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

引き続き実験。


--------- 追記 ----------------------------------------

$ sudo apt-get install libv4l-dev v4l-utils
$ v4l2-ctl --list-devices
vi-output, imx219 6-0010 (platform:54080000.vi:0):
 /dev/video0
$ v4l2-ctl -d /dev/video0 --all
Driver Info (not using libv4l2):
 Driver name   : tegra-video
 Card type     : vi-output, imx219 6-0010
 Bus info      : platform:54080000.vi:0
 Driver version: 4.9.140
 Capabilities  : 0x84200001
  Video Capture
  Streaming
  Extended Pix Format
  Device Capabilities
 Device Caps   : 0x04200001
  Video Capture
  Streaming
  Extended Pix Format
Priority: 2
Video input : 0 (Camera 0: no power)
Format Video Capture:
 Width/Height      : 640/480
 Pixel Format      : 'RG10'
 Field             : None
 Bytes per Line    : 1280
 Size Image        : 614400
 Colorspace        : sRGB
 Transfer Function : Default (maps to sRGB)
 YCbCr/HSV Encoding: Default (maps to ITU-R 601)
 Quantization      : Default (maps to Full Range)
 Flags             : 

Camera Controls

                     group_hold 0x009a2003 (bool)   : default=0 value=0 flags=execute-on-write
                    sensor_mode 0x009a2008 (int64)  : min=0 max=0 step=0 default=0 value=0 flags=slider
                           gain 0x009a2009 (int64)  : min=0 max=0 step=0 default=0 value=16 flags=slider
                       exposure 0x009a200a (int64)  : min=0 max=0 step=0 default=0 value=13 flags=slider
                     frame_rate 0x009a200b (int64)  : min=0 max=0 step=0 default=0 value=2000000 flags=slider
                    bypass_mode 0x009a2064 (intmenu): min=0 max=1 default=0 value=0
                override_enable 0x009a2065 (intmenu): min=0 max=1 default=0 value=0
                   height_align 0x009a2066 (int)    : min=1 max=16 step=1 default=1 value=1
                     size_align 0x009a2067 (intmenu): min=0 max=2 default=0 value=0
               write_isp_format 0x009a2068 (bool)   : default=0 value=0
       sensor_signal_properties 0x009a2069 (u32)    : min=0 max=0 step=0 default=0 flags=read-only, has-payload
        sensor_image_properties 0x009a206a (u32)    : min=0 max=0 step=0 default=0 flags=read-only, has-payload
      sensor_control_properties 0x009a206b (u32)    : min=0 max=0 step=0 default=0 flags=read-only, has-payload
              sensor_dv_timings 0x009a206c (u32)    : min=0 max=0 step=0 default=0 flags=read-only, has-payload
               low_latency_mode 0x009a206d (bool)   : default=0 value=0
                   sensor_modes 0x009a2082 (int)    : min=0 max=30 step=1 default=30 value=5 flags=read-only

カメラ生きてるっぽいよね。

----------------------------------------


--------- 追追記 ----------------------------------------

Logicool HD c270なら動きました。


これの無地のやつ。
メモリ使い切って死ぬ寸でしたが・・・
スワップ作っといてよかった。

$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights


terminalの方見るとわかりますが、2FPSとかです。
実用には耐えません^^

----------------------------------------


--------- 追追追記 ----------------------------------------

tiny yolo v3なら、15FPS位出てラズパイで初めてLチカしたときくらいの満足感が得られました。

$ wget https://pjreddie.com/media/files/yolov3-tiny.weights
$ ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights

----------------------------------------

ということで、一応 Darknet 動かすところまでできました。
そもそもこの手の情報なにもない素人レベルでしたが、動かすだけなら割と簡単にできました。

お熱があるうちに、遅ればせながら機械学習のお勉強でも始めようかな。

2013年5月14日火曜日

[最前面アプリモニター]とそれを利用したアプリ(杏マナー)


最前面アプリをモニタリングするアプリを作りました。
ここ(http://toramamma.blogspot.jp/p/blog-page.html)に詳しく書いてあります。


最前面アプリモニター
https://www.dropbox.com/s/efm9muad1vyust6/ForegroundMonitor.apk




ユーザ補助から有効にしてください。





せっかくなんで、アプリ毎に音量を切り替えるアプリを作りました。

杏マナー
https://www.dropbox.com/s/vlqbzpbp0zbyf9q/AnzManner.apk








どんなアプリかっていうと、そのままなんですが、アプリ毎に音量を切り替えます。
自分が普段、基本マナーモードで使っているんで、無駄に音量が変わらないように強制マナーアプリを自分で作って使っていました。
ステータスバーから強制マナー解除トグルする感じのアプリなんですけど。
最初はこれで満足だったけど、youtube見たりするときにだけ自分で強制解除しなきゃいけないのがちょっと鬱陶しかった。
なので、作ってみました。

デフォルト音量を決めてもらって、アプリは基本デフォルト音量で動きます。
指定アプリのみ指定の音量になります。

そのほかに強制マナーモードもあります。
これは何があろうとマナーモードにします。
ボリュームボタンを押そうが、それを検知してマナーにします。

そのほかに強制マナーだけど指定アプリ音量は有効にするっていうモードもあります。
指定アプリの時だけ強制マナーモードが解除されて音量を変更できるようになります。

最前面アプリモニターが無いとマーケットに飛ぶようにしてありますが、マーケットにはアップしていないので野良を入れてください。
最前面アプリモニターのユーザ補助がONじゃないと設定画面に飛ぶようにしてありますので、ONにしてください。

またm最前面アプリが切り替わると、問答無用で音量を変更してしまうので、音楽プレイヤー等に利用している場合は挙動がおかしくなるかもしれません。


こんな使い方できますって感じで。
マーケットに登録するのがめんどくさいから野良でおいておきます。

2013年4月2日火曜日

[GoogleIME+ON/OFF]ほいっ


とりあえずできましたが、キートップ画像の入れ替えはとてもめんどくさいので、やめました。

なので、マーケットにはアップしません。
キートップ画像が無いのでのっぺらぼうですが、ここに置いておきますね。
https://www.dropbox.com/s/j4ax3f8ran6j729/MozcPlusOnOff.apk

チョット時間見つけてやるかもしれないし、やらないかもしれません。

Google日本語入力のオープンソース版Mozc(モズク)をちょっと弄ってビルドしただけです。
チョット弄った内容は、キーボードが表示されたときと消えた時にブロードキャストインテントを投げるようにしました。
分かりやすく言うと、今キーボード消えたよ~とかキーボード表示されたよ~とかって教えてくれる機能を埋め込みました。

ちょっと具体的に書くと
キーボード表示時:"open.android.intent.action.DISP_KEYBOARD"
キーボード非表示時:"open.android.intent.action.HIDE_KEYBOARD"

なんでこんなことをやっているのかというと、オーバーレイ系ランチャーの問題の中で鬱陶しいのが、文字入力中にアプリが起動しちゃう、いわゆる「誤爆」問題です。
「誤爆」が鬱陶しいので、せめてキーボード表示中だけでもマーカーが消えてほしいっていう要望(これは僕もだけど)からいろいろ工夫して作っていました。

僕の作った類似アプリで、キーボードON/OFFモニターってのがあるんですけど、これはアクセシビリティサービスっていうのを使って判断してます。
たとえば、今テキストボックスにフォーカスが当たっている=キーボードが出ている
テキストボックス以外にフォーカスが当たっている=キーボードが消えた

でも、これだと疑似的に判断しているだけなので、精度が悪いんです。
なので、チョコチョコ個別対応をしていました。

やっぱり、キーボードの状態はキーボードが発信するのが一番。
他のオープンソースのIME等にも実装していたんですが、IMEが変更されるストレスっていうのがものすごい有ってすぐに使うのやめちゃいいました。

で、でで、このたび、僕のメインIMEであるGoogle日本語入力がオープンソース化されたので、いろいろやってたってわけ。
キートップ画像が無いので、いろいろ試してたんだけど、数時間で出来る代物ではなさそうなので、ちょっとあきらめようかと思ってます。

ていうか、別にキーボードに文字書いてなくても普通に使えるし、僕的には何ら問題ないんですね。
なんと、この前のSwipeStarterのアップデートでマーカー毎のON/OFFが出来るようになったので、「キーボード表示時に下半分だけマーカーを消す」なんてことも可能!

素晴らしい。

良かったらのっぺらぼうだけど使ってみてください。
もしかしたら忘れたころにキーを貼り付けて公開するかもしれないけど。

SwipeStarter4.3から正式対応です。

2012年9月7日金曜日

自分用にいくつか作った


もろパクリだから公開予定はないんだけど、こんなアプリを作ってみた。

[強制マナーアプリ]
Androidのマナーモードは着信にしか反映されないから、マナーモードにしてても、youtubeとか見ると音が出ちゃう。
ずっとこれが嫌で、アプリ2個くらい入れて対応してたんだけど、ちゃんと動かなくなったのを機に自分で作ろうかなぁと思って。
ついでに、近藤さんのも取り込んで、間違えて音量ボタン押しても、強制的にマナーになるように。
※基本マナーモード運用なので、これは必須だった。

*機能*
マナーモードの定義を設定
 |マナーモードになったとき、どの音量をOFF(音量0)にするのか
 | ・着信音量
 | ・メディア音量
 | ・通知音量
 | ・アラーム音量
 | ・システム音量
 └バイブレーション あり/なし
強制マナーモードの設定
強制マナーをショートカットでトグル切り替え

自分の希望通りには動いている。
※例によって強制マナー以外をあまりテストしていないが。。


[電池消費削減アプリ]
巷でJuiceDefenderがやたらと流行っているようで(RSSにものすごい頻度で流れてくる)、入れてみようと思ったけど、主に3G?みたいな印象を受けた。
私はWimax運用につき、基本3Gは端末でOFFってるので、あまり意味がないかなぁと思った。
あと、あの過剰な権限付与に不信感しか覚えなかったので、導入は断念した。
でも、ディスプレイOFF時の通信を遮断するっていうのは、とても効果がありそうな気がしたので、ちゃっちゃと作ってみた。

*機能*
ディスプレイOFF時にWifiを切断し、指定時間のインターバルでWifi接続
定期ON間隔の設定
画面OFF後、定期WifiON後のWifi有効時間の設定


15分間隔でWifiをONして30秒間有効の設定でしか確認してないけど、端末スタンバイ(DeepSleep)になるし、Gmailも受信する。
(Spmodeは知らん。普段使ってないから。)

昨日作ったから、省電力に貢献しているかどうかはわからないけど、もうちょっと常用してみようと思う。
何度かメール受信はしてるけど通知をしない時があって、これは標準Gmailアプリの問題かなぁと放置している。

--雑談----------------------------------------
JuiceDefenderのコメントで「超改善しました!」みたいなのをよく見るけど、今までどんだけ裏通信アプリインストールしてんだよと思う。
と同時に、何も知らない人たちに、ここまでわかりやすい「改善結果」を見せる事の有効性を改めて考えさせられた。(考えただけで、見習おうとは思わないけど。。そもそも、僕のターゲットはちょっと詳しい人を狙ってるから。)
このあぷりがすごいんじゃなくて、お前らの使い方が・・・(なんでもありません)
コメント見る限り、そこそこ自分でいじくってる人とかには効果が薄いんだろうね。「逆に・・・」みたいなのも見かけるし。
通信切るわけだから、メールもリアルでは来なくなるしね。

でも、通信遮断の省電力効果を試してみたくなっちゃう。そう、開発者ならね。
--雑談----------------------------------------

あ、話題がずれましたけど、上記アプリ欲しかったらあげます。メールください。
欲しい人が多くなったら、どこかに野良アップします。

2012年6月27日水曜日

[SwipeStarter]キーボード表示/非表示時のブロードキャストについて


すごいの思いついたからためしに作ってみた。
今調べてみたけど、まだこういったアプリは無いはず。

今日以降、類似アプリがアップされたらパクリねw
オレが一番最初~!

EditTextをモニタしてEditTextにフォーカスが来た場合IMEが表示されているものとして、先のブログで定義したブロードキャストを投げるっていうもの。
アプリ自体は以下リンクにアップして有ります。
https://github.com/ToraMamma/EditTextMonitor

上記リンクからAPKダウンロードしてインストール後、「端末の設定画面」→「ユーザ補助」→「EditTextMonitor」をチェック。
人柱結果報告 or 改善要望ある方は、メールで報告してください。


簡単に言うと、アクセシビリティサービスのフィードバックを元にキーボードの表示/非表示を判断するっていうものなんだけど、問題がいくつか。

①フォーカスがあたった際のViewオブジェクトが名前しか取れないため、カスタムView使われると判定できない。
→もうちょっと調査。
Twiccaでばっちり動くことを確認。
SPモード動かないことを確認。
②たぶん、電池ものっそい食べる気がする。
→今日から1週間とか使ってみて改善予定。

常用に耐えうる値をたたき出したらば、マーケットにあげようかな。

今のところ、結構いい感じの動きしてるw
お試しアレ!

2012年6月21日木曜日

[SwipeStarter]IME表示時のなんちゃら


IME作ったけどショボイからボツって言うの、欲しいって人が何人かいるみたいだから公開します。
マーケットに上げるほどでもないんでココに↓
https://github.com/ToraMamma/OpenWnnKai

えーーーーーっと、ままOpenWnnですw
IME部分は何も弄ってません。

最新のSwipeStarter V2.89(まだマーケット更新していないけど(汗))では、コレの確認が出来るはず。
→今日も端末を忘れて確認できない為、明日アップしようかな。

このIMEの場合、IMEが表示されればSwipeStarterがOFFになってIMEが非表示になればIMEがONになるって言う動作をします。

出来ればこの実装を各IME作成者さまさま方に入れてもらえると、とっても嬉しいんだけど、IMEの表示・非表示のたびにブロードキャスト投げるので、コレを悪用されると、とっても鬱陶しいアプリが出来上がってしまうから無理かなぁw
あ、、でもそもそもブロードキャストを悪用すれば既存のままでも十分鬱陶しいのできるか。


さておき。

すべてのIMEにコレが実装されることを祈って、ソースコード書いておきます。

public class OpenWnn extends InputMethodService {

 ~略~

 @Override
 public void onWindowShown() {

  Intent i = new Intent();
  i.setAction("open.android.intent.action.DISP_KEYBOARD");
  i.addCategory(Intent.CATEGORY_DEFAULT);
  sendBroadcast(i);

  super.onWindowShown();
 }

 @Override
 public void onWindowHidden() {

  Intent i = new Intent();
  i.setAction("open.android.intent.action.HIDE_KEYBOARD");
  i.addCategory(Intent.CATEGORY_DEFAULT);
  sendBroadcast(i);

  super.onWindowHidden();
 }
}

祈ってはみたものの、IME表示状態を取得する必要があるのってオーバレイ系アプリだけの気がするから、まぁ、実装はされないんだろうね。
っていうか、このブログの認知度ww

まぁ気が向いたら、上のOpenWnnちょっと弄ろうかなぁとも思うけど、やり始めたらキリがなさそうなのでたぶん放置すると思います。