数値解析系

2019年6月16日 (日)

赤ちゃんの泣き声から正常・異常を聞き分けるAI

そんなものが開発されているそうです。

赤ちゃんの泣き声の意味をAIで聞き分けることが可能に - GIGAZINE

ノーザン イリノイ大学の研究チームが勧めているのが、赤ちゃんの泣き声の特徴から「正常」、「異常」を識別しようという試み。

実際、ある程度の熟練があれば、赤ん坊の泣き声からメッセージを聞き取れるようになるので、それを機械的に再現できないかというのがこの試みです。

そのために、線形予測ケプストラム係数(LPCC)、バーク周波数ケプストラム係数(BFCC)、メル周波数ケプストラム係数(MFCC)から特徴を取り出して・・・詳しくは、リンク先をたどってください(よくわかってない)。

私は今のところ、音声認識を使おうというところまでは考えてません(すでにOK Google、Siri等がありますからね)が、こういうアイデアを聞くと、何かありそうな気がしてきますね。少し勉強してみようかなぁ。

フリーソフトでつくる音声認識システム パターン認識・機械学習の初歩から対話システムまで

2019年6月 2日 (日)

Googleがリアルタイムに映像から人物を消し去る技術を開発

そういうアプリはすでにありますからね、あれの動画版といったところのようです。

Googleが映像からリアルタイムで動く人物を消し去る技術を開発、ムービーが公開中 - GIGAZINE 

ディープラーニングを用いて、人を消したり、あるいは別のオブジェクトに置き換えたりピントを変えたりできる技術のようですね。

ただ人物を認識し消すだけではなく、ちゃんと深度推定をして、その物体までの距離を把握したうえでの処理のようです。だから、オブジェクトの置き換えなどができるようですね。

そういえば、位置推定、深度推定というのも需要が上がりつつありますね。私の職場でもそういう需要があるので、ぜひトライしてみたいとは思っています。

Intel RealSense Tracking Camera T265

2019年5月29日 (水)

サイゼリアで1000円で最大何kcal取れるか?を計算する

いわゆる「最適化問題」ですが、それをSMTソルバーというものを用いて解くという試みをやっている記事があります。

 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をSMTソルバー(Z3)で解いてみた。 - Qiita

事前にメニュー情報(価格とカロリー)を入れないといけないようですが、無数の組み合わせから、カロリーが最大となる組み合わせを選び出すようです。

Satisfiability modulo theories (SMT) ソルバーというのは・・・うーん、読んでもよくわかりませんでした。要するに、100個程度の変数に対して最適解を得るにはかなり速く解が得られる手法のようです。

で、結論は、992円で1940kcal、だそうです。

ちなみに、ペヤングの超超超大盛GIGAMAXは、一つ400円ほどで2142kcal。ですが、入手困難なためか通販で買うと1000円ほどするので、これといい勝負なカロリー摂取量なようです。まあ、ペヤングと比べるのはいささか酷ではありますが・・・

にしても、こういう最適化手法は覚えておくと便利なことが多いと思われます。どういう順番で周ったら早く回れるか、とか、どういう組み合わせが一番安いか・・・なんて命題は、どこでもあるものと思われます。

ただし、いわゆる「巡回セールスマン問題」(47都道府県の市町村をどういう順番で周ると一番早く回れるか?)を求めるのは、やはり不可能と思われます。この辺は、量子コンピューターの実用化を待つしかなさそうですね。

サイゼリヤ おいしいから売れるのではない 売れているのがおいしい料理だ (日経ビジネス人文庫)

2019年5月27日 (月)

機械学習結果のグラフ化が捗るライブラリ「Yellowbrick」

今まで、MatplotlibやExcelでやってました。

が、この記事を読むと、楽にグラフ化できそうです。

 【Python】 機械学習の可視化が捗るライブラリ「Yellowbrick」 - フリーランチ食べたい

どうやら、グラフ化に必要な設定のかなりの部分を自動で解釈してやってくれるっぽいですね。

リンク先で書かれているコードでは、ヒートマップをたったの3行で書いてました。

書式が、ちょうどscikit-learnのような感じ。X,Y軸データを入れて”Fit”させているだけのようです。それでグラフが作れちゃうとか、ちょっと気になるツールですね。

今、独学でまさに時系列データから「異常検知」できないかとごちゃごちゃとトライしているんですけど、次元圧縮して2次元化したデータをk-meansでクラスタリングさせて分類した数値で色を変えたいというときに、Matplotlibで書かせようとするとうまくいかず、Excelではやりづらくて困っていました。

可視化って大事。最近そう思います。

会社で早速、導入してみようかと思ってます。一応、備忘録がわりにここに載せておきます。

機械学習エンジニアになりたい人のための本 AIを天職にする

2019年5月26日 (日)

東大松尾研の無償公開された機械学習用演習コンテンツ「DL4US」

まだ見てませんけど、この記事を読む限り、なかなか演習用としてはよさそうです。

 東大松尾研から新たに無償公開されたDeep Learning講座「DL4US」が良い、という話 - Qiita

公開元:DL4US コンテンツ公開ページ | 東京大学松尾研究室 - Matsuo Lab

keras+TensorFlowとscikit-learnなどの基本ライブラリで構成されたコードを使い、MNISTから画像認識、時系列データ、GAN(画像生成)、そして強化学習の基礎まで学べるというコンテンツのようです。

前半部分だけでも、十分すぎですね。ただし、講義内容は公開されていないようです。あくまでも、演習のみということのようで。

うちでもいよいよ機械学習講座っぽいものを始めようと考えているところなのですが、教材が手作りなものしかないんですよね・・・

こいつを応用すれば、捗りそうです。

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

2019年5月23日 (木)

Jetson Nanoが入荷した模様

確か、6月発売と聞いていましたが、もう市場には出ているようです。


NVIDIAの「Jetson Nano開発者キット」が店頭入荷、価格は12,800円 - AKIBA PC Hotline!



お値段は予告通り、開発キットが12800円(税別)。別途、ストレージとしてmicroSDカードが、そしてUSB電源が必要です。


4コアのARM Cortex-A57プロセッサに、128基のMaxwell世代のGPUコアを搭載しており、推論では十分な性能を発揮するこのJetson Nano。開発キットでは、Raspberry Piのように、GPIOを持っているのも特徴です。


NVIDIAからOSイメージをダウンロードして使うようです。TensorFlowやKerasあたりが使えるかどうかは分かりませんが・・・でもまあ、ディープラーニング用端末を謳うJetsonですから、当然使えると思われます。


Raspberry Piでは力不足を感じている方なら、心強いエッジ端末となってくれるものと思われます。何と言っても、価格性能比が格段に安い(ディープラーニング用としては)。思わず、欲しくなる一品です。


NVIDIA Jetson Nano Developer Kit - 強力 AI コンピュータ 開発者キット


2019年5月11日 (土)

グラフで嘘をつく!?

ビッグデータ時代、グラフによる可視化は重要ですが、こんなだましのテクニックがあることを知っておいた方がよさそうです。

「グラフでうそをつく方法」とは? - GIGAZINE 

同じ数値データでも見せ方によってこうも変わるものなんですね。上にあるコーン型・ピラミッド型は本当にひどい。緑がメジャーだと思いますよね、これじゃあ。

縦軸には、注意した方がよさそうです。

もっとも、それすら信用できない事例もあるようですが。

【ひどい】テレビ朝日ワイドショーが印象操作!偏向グラフを使って「おみくじは凶が多い」 : はちま起稿

う~ん、これは酷い・・・大吉と吉を足しても、凶にかなわない・・・って、えっ!?横軸おかしくない!?

正しく解釈した客観的データからしか真実は得られないし、それで一時のごまかしをしたところで、ためになりません。

ましてやネット時代ですから、こういう統計のごまかしはあっという間に気付く人が出てきます。

私もデータを扱う仕事をずっとやってますけど、ここまでひどくはないですが、確かに騙されそうになった覚えもあります。「結論ありき」な展開をする人には、要注意ですね。

といって、自分でも同じことをしていないか、自問自答しようかな。

Microsoft Excel 2019(最新 永続版)|オンラインコード版|Windows10/mac対応|PC2台

2019年4月17日 (水)

手軽に使えるMS製データセット作成ツール「VoTT」

私もTensorFlow+KerasでSSDを独自データで使えるようにしてみた: EeePCの軌跡最新の物体検出YOLO v3 (Keras2.2.0+TensorFlow 1.8.0)を独自データで学習できるようにしてみた: EeePCの軌跡で「AnnotationTool.exe」なるものを公開しておりますが。

Windowsでも使える、もっと便利なデータセット作成ツールがありました。

しかも、Microsoft製です。

 画像のデータセット作成が楽になる!Microsoft のアノテーションツール、VoTT のご紹介 | ソフトバンク・テクノロジー (SBT)

ダウンロード元:https://github.com/Microsoft/VoTT/releases

上のサイトに使い方が書かれています。Win、Mac、Linux版それぞれがありますね。

静止画の入ったフォルダと動画に対応(ただし、動画はmp4またはogg形式のみっぽいです)。

我が家でも試そうかと思ったんですが・・・なかなかダウンロードできません。

ちなみに、会社ではgithub.comのダウンロードサイト自体がブロックされてて、まったく使えません。困ったものです。

というわけで、まだ試せてませんが、特によく使われるPASCAL VOC形式に対応しているのはありがたいですね。

私の作った奴に比べて、はるかに使い勝手はよさそうです。動画にも対応してますし。

なんとか、会社で使えるようにしたいツールです。

オリジナルの画像認識AIを簡単に作ろう!

2019年4月12日 (金)

ディープラーニングの画像認識の精度を向上させる手法?な「BC(Between-Class) learning」を試してみた

ディープラーニング(CNN)を用いた画像認識では、それこそ1ラベル当たりたくさんの画像を用意するのがベストです。

が、曖昧な画像をうまく認識させるための手法として、「BC(Between-Class) learning」というのがあります。

例えば、「犬」と「猫」を識別する学習器を作ろうとすると、「犬」を0、「猫」を1というラベルを与えて、それぞれたくさんの画像を準備して学習させます。

が、BC learningでは、「犬」×0.7 + 「猫」×0.3というわざと曖昧な画像を作り、教師データとして用います。

すると、曖昧さに対して強固な学習器が生成できて、より精度が上がる・・・という手法のようなのです。

分かったような、分からないような手法ですが、早速試してみました。

ただし、この手法を使うには前提があります。

例えば、TensorFlowで”日本のお城”を識別させてみた: EeePCの軌跡の記事では、

「犬山城」=0、「熊本城」=1、・・・「大阪城」=6

のようなラベルの付け方をしてましたが、BC learningを使うためには、one-hot型の教師信号に変える必要があります。

具体的には

「犬山城」=[1,0,0,0,0,0,0]、「熊本城」=[0,1,0,0,0,0,0]、・・・「大阪城」=[0,0,0,0,0,0,1]

のようなラベルにする必要があります。

すると、例えば「犬山城」×0.7 + 「熊本城」×0.3という画像を作った場合の教師信号は

「犬山城」×0.7 + 「熊本城」×0.3 =[0.7,0.3,0,0,0,0,0]

てな感じに与えられます。

で、私自身も気づいてませんでしたが、以前TensorFlowの画像認識プログラムをKerasに書き換えてみた: EeePCの軌跡の記事で、画像認識コードをKeras化したときに、すでにone-hot型にしていました。

先のリンク先のコード中の「Y = np_utils.to_categorical(Y, NUM_CLASSES)」のところで、すでにone-hot型に変えております。

で、上の記事の学習用コード「cnn_keras_train_56.py」を改良した「cnn_keras_train_56_bc.py」というのを作りました。

【cnn_keras_train_56_bc.py】

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

import os
import sys
import cv2
import numpy as np
import tensorflow as tf
import tensorflow.python.platform
import random

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

path=os.getcwd()+'/data/'
checkDir=os.getcwd()+'/checkpoints/'
if not os.path.exists(checkDir):
          os.mkdir(checkDir)
class_count = 0
folder_list=os.listdir(path)

for folder in folder_list:

  class_count = class_count+1

NUM_CLASSES = class_count
IMAGE_SIZE = 56

batch_size = 20
epochs = 100

flags = tf.app.flags
FLAGS = flags.FLAGS

flags.DEFINE_string('label', 'label.txt', 'File name of label')

if __name__ == '__main__':

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

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

    f = open(FLAGS.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=(56,56)))
            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)

    #Make BC learning dataset

    add_image_bc = 100
    insert_count = 1

    for i in range(add_image_bc):
        get_index1 = int(random.random() * X.shape[0]) # First image
        get_index2 = int(random.random() * X.shape[0]) # Second image
        mix_rasio = random.uniform(0.2,0.8) # First X Second Mix

        temp_x1 = X[get_index1,:]
        temp_y1 = Y[get_index1,:]

        temp_x2 = X[get_index2,:]
        temp_y2 = Y[get_index2,:]

        if all(temp_y1 == temp_y2):
            print('Same Label,Skip!')
            continue
        else:
            temp_x = temp_x1 * mix_rasio + temp_x2 * (1.0 - mix_rasio)
            temp_y = temp_y1 * mix_rasio + temp_y2 * (1.0 - mix_rasio)

        X = np.insert(X,get_index1,temp_x,axis = 0)
        Y = np.insert(Y,get_index1,temp_y,axis = 0)
        print('Insert Mix image!' + str(insert_count))
        insert_count +=1

        # BC learning end
    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(Conv2D(32, (3,3), activation='relu', padding='same'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

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

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

    model.add(Flatten())
    model.add(Dense(1024, activation='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 = os.path.join(checkDir, 'model_.{epoch:02d}-{val_loss:.2f}.h5')
    cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss', verbose=1,
                            save_best_only=True, mode='auto')

    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)

    model.save('model.h5')

コード中の「#Make BC learning dataset」から「# BC learning end」の間が加わったくらいです(あと、乱数を使うために「import random」が追加されたくらい)。

実行はいつものように

> python cnn_keras_train_56_bc.py

で行けます。

Bcl01_1

とりあえず、このコード中では「add_image_bc」という変数がBC learningによって増やす画像の数を示してます。

が、同じラベルの画像を作っても仕方がないので、同じ画像を足そうとした場合はスキップするようになっています。

今回の場合、100枚作らせて、87枚加わっただけでした。

Bcl02

後はいつものように、学習を始めます。

終わったところで、「checkpoints」フォルダにある一番Loss値の小さいモデルを上の階層にあげて「model.h5」として

> python cnn_keras_app_56.py

と実行すれば、「analysis」フォルダ中の画像を推論してくれます。

あくまでも、model.h5の精度を上げるというのが目的の手法なので、推論側は特に変更するところはないです。

 

Bcl03

 

もっとも、あまり結果が変わってる感じはありませんが・・・会社で別のデータで試したところ、若干精度が上がりました。

それこそ、中間のデータを作り出すため、教師データを増やす手法の一つには違いありませんね。

ですが、例えばこのお城のデータの場合(383枚)、1000枚作らせてみた(同ラベルを消去して、900枚程度増)んですが、かえって精度が落っこちました。収束性も悪くなるため、やりすぎもよくないようです。

どうしても画像がたくさん揃えられない場合、この手法で画像を増やす、あるいは曖昧さをうまく区別させるために使う、という目的なら、有効な方法のようです。

深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト

2019年4月 7日 (日)

ミッキーが新旧どちらの顔かを見極めるAI

・・・を作ろうとした方の記事です。

私は知らなかったんですが、最近TDLでのミッキーの顔がちょっと変わったんですね。

【速報】ミッキーの顔がニューフェイスに変わった!ショーやグリーティング、旧フェイスに会えるのはどこ? 

でも、まだ新旧入り混じっているようなので、ニューフェースに出会えたかどうか、気になるところ。

で、それを判別する学習器の生成を試みたのが以下の記事。

ミッキーの顔が変わりました!機械学習モデルで分類にチャレンジ。 - Qiita

(左が新、右が旧だそうで)

で、新:660枚、旧:551枚で学習させたそうです。

結論から言うと、正答率7割だそうで。

記事の先のコードを観ましたが、解像度は256×256なものの、どうも層が少なすぎる気がしますね。

この解像度で、conv層3つ、Pooling層2つではちょっと足りないかと・・・

じゃあお前が作れといわれそうですが、教師データを集めるのが大変そうですね。

何よりも、TDLに行く機会がないですし。

でも、試みとしては面白いと思います。こうやって精度を上げていく題材を手に入れて、ノウハウというのはたまっていくものです。

私の場合は、未だにTensorFlowで”日本のお城”を識別させてみた: EeePCの軌跡のお城のデータを使っています。

最近、「BC(Bitween-Class) learning」なるものにチャレンジしたんですが、これもこのお城のデータを使いました。まあまあの精度アップが見られて、楽しかったものです。

そのあたりの記事を書こうかと思ったんですが、今、困ったことに我が家のディープラーニング環境が壊れてしまってまして(メインPC)。

修復が終わり次第、このBC learningについて書く予定です。でも、CUDAやドライバのインストールを受け付けなくて・・・本当に治るんだろうか・・・

玄人志向 ビデオカード GEFORCE GTX 1080Ti搭載 GF-GTX1080Ti-E11GB/OC/DF

より以前の記事一覧

当ブログ内検索

  • カスタム検索

スポンサード リンク

ブログ村

無料ブログはココログ