数値解析系

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

2019年4月 6日 (土)

マイクロソフトが犯罪捜査に使えるAIを開発中!?

まあ、アメリカならではの話のようです。

 マイクロソフト、犯罪捜査に機械学習を使う特許出願--写真やビデオから銃火器を特定 - CNET Japan

まだアイデア特許の段階ですが、写真やビデオから、その武器である銃火器を特定するというものだそうです。

実際にこういうものを作るつもりで出した特許なのか、それとも別の思惑があるのかは謎ですが、日本ではあまり考えられないアイデアであることは確かですね。

一般市民も銃を持つという、銃社会ならではといったところでしょうか。

こういうのもAIの活用事例ってことになるのかもしれませんが、個人的にはあまり歓迎できるものではありませんね。抑止力になるのであれば大歓迎なんですが・・・

市民と武装 ―アメリカ合衆国における戦争と銃規制

2019年3月28日 (木)

ゼロから勉強して”ポリープ検出AI”を作った記事

検出には”YOLOv3”を使っているようです。

 

【Deep Learning入門】0から勉強して3ヶ月でポリープ検出AIをつくったった - Qiita

 

実際のポリープを確かに検出してますね。見落としが少なくなりそうで、医療分野としては心強いシステムになりそうです。

 

これをわずか3か月の勉強で習得したというのですから、大したものです。中を読んでみましたが、私には到底まねできません。

 

ここで、YOLOv3を採用した理由として、小型の物体検出にすぐれているという点を挙げています。

 

YOLOv3については、私も「最新の物体検出YOLO v3 (Keras2.2.0+TensorFlow 1.8.0)を独自データで学習できるようにしてみた: EeePCの軌跡」という記事で独自データを使えるようにする記事を書いてます。

 

が、最近、さらにすごい手法が出てきているらしいです。

 

最新最強の物体検出技術M2Det - Qiita

 

M2Detというらしいですが、より小型の物体検出も可能らしいですね。

 

残念ながら、まだPytouch版しか見当たらず、TensorFlowやKeras版はなさそうです。あれば、試してみるんですけどねぇ。

 

コンピュータも随時進化している中、ディープラーニングによる物体検出も進化し続けてます。個人レベルでも、相当な技術が使える時代になりつつありますね。

 

TensorFlowはじめました3 Object Detection ─ 物体検出 (NextPublishing)

2019年3月17日 (日)

GoogleのTPUがついに製品化!

長らくGoogle Cloudサービスでしか使えないハードウェアだったGoogleのTPUが、製品化されるそうです。

グーグルがエッジでAIを利用するためのワンボードコンピュータを発表 - CNET Japan

と言っても、推論用のハードとして売り出すようですね。ボード自体は150ドルほどで、MobilenetV2なら100fpsを叩き出せるほどのハードになるとの話もあります。

他にも、Intel MovidiusのようにUSBでつないで使う推論用デバイスも出るそうです。そっちは75ドルだそうで。

ただこのボード、あくまでも推論用で、学習にはGPUやクラウドをお使いくださいということのようですね。

確かに、学習だけ早くても、実際現場で使うエッジ端末側に高速なチップが乗っていないと使い物にになりません。現状はNVIDIAが独占気味なエッジコンピューティング用の推論チップですが、Googleの参入でどうなることやら。

個人的には、工場でも使える耐久性の高いやつがキボンヌ何ですけどねぇ。

気軽なエッジ端末は今のところ、Raspberry Piくらいしかありません。でも、Raspberry Piだけではちょっと不安ですよねぇ・・・

このTPUエッジ端末、ちょっと期待です。

TensorFlowはじめました 実践! 最新Googleマシンラーニング (NextPublishing)

2019年3月16日 (土)

SONY Neural Network Consoleを活用しよう!なスライド

ちょっとSONYのNeural Network Consoleにはまっております。

先日、こちらのブログでもSONY Neural Network Consoleで独自データの学習・推論をやらせてみた: EeePCの軌跡な記事を書かせていただきましたが、最近は画像認識だけでなく、異常検知をやらせるためにLSTMをやってみたりしました。

そんなSONY Neural Network Consoleをお勧めするSlideShareがこちら。

[2018/9/27(木): 三木会@大阪] プログラミング無しでここまでできる!Neural Network Console活用のススメ

まさに簡単、明快なNeural Network Consoleのススメが説かれております。

あまり、おおくは語りません。こちらをぜひご覧ください。

ただ、実用で使うには、まだまだTensorFlow、Kerasの方が上かなぁと感じますね。

というのも、下記の記事を参考に、LSTMを実装してみたんですが。

SONY Neural Network Console 未来を予測するニューラルネットワーク | cedro-blog

この記事、本当に分かりやすい。ここを参考に、とある波形の正常波形を学習させて、異常波形を入れると、それなりにうまく波形を予測できて、あとはその差を取るプログラムでも作れば異常検知ができそうなところまで来ました。

が、これを業務用アプリ化するには、やはりPythonコードにしないといけない。

で、先日のSONY Neural Network Consoleで独自データの学習・推論をやらせてみた: EeePCの軌跡の時と同様、Pythonコード化にチャレンジしたんです。

が、一つ大きな問題が。

PythonでNeural Network Consoleの機能を呼び出す「nnabla」には、LSTMどころか、RNNがまだ実装されていないとのこと。おかげで、LSTMのところでエラーが出て進みません。

今後のバージョンアップに期待ですが・・・うーん、中途半端ですねぇ。せっかくいいツールなので、このまま業務で活用できるようにしたいのですが。

C#ならできそうなことをどこかで見ましたけど、やっぱり近頃はPythonが主流。なんとか、LSTMをPythonで実装できるようにしてほしいところですよね。

しかし、学習用には最適なツールなことは間違いありません。機械学習を手軽に学んでみたいという方は、ぜひお試しください。

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

2019年3月 6日 (水)

AIで実在しない人物の画像を作り出すサイト”This Pearson Does Not Exist”

NVIDIAがまた面白い技術を利用したサイトを公開しているようです。

まるで本物--実在しない人の顔写真をAIで生成するウェブサイトが公開 - CNET Japan

This Person Does Not Exist

このサイトを訪れると、いきなり非実在人物の写真を作り出してくれます。

私が訪れた時は、男の子の画像が出てきました。ちょっと待たされます。

昨年末にも”Growing Progressive of GANs”という技術で、架空のセレブ画像を作り出していましたが、それをさらに発展した”StyleGAN”という技術を使っているようです。

もちろん、教師データ次第で架空の車、インテリアを作り出すことも可能。どれくらいの教師データが必要なんでしょうね?

デザインのヒントを探したいときには、例えば売れ筋の車の画像データを与えて、その特徴を持った画像を作り出す、という使い方が考えられますね。ちょっと使ってみたい技術です。

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

2019年2月27日 (水)

フェイクニュースを自動認識!?偽情報の言語パターンを特定したAIをMITが開発

フェイクニュースを見分けられるかどうかが、ネットリテラシーの指標の一つではありますが、それを自動で可能にするAIをMITが開発したというニュースです。

フェイクニュースの言語パターンを特定、MIT研究チームがAIモデルを開発:お手本選びが重要 - @IT

詳しくは、このリンク先をお読みください(無料会員登録が必要)。ともかく、一筋縄ではいかなかったようですね。

が、こういうものができると、大抵は対抗策が編み出されるのが常で、いたちごっこの様相を呈するだけのような気もしますね。

日本語のニュースでも対応してくれるんでしょうかね?でも、日本の場合はフェイクというより、印象操作ですからね。発言の切り取りや、それとなく悪い表現を織り交ぜるレッテル貼り。この手のAIでは見抜けないかもしれません。

それこそ、起こった事実だけを公平に伝えるAIってのは登場しないんでしょうかね?記者の想いが反映され過ぎて偏向してしまった部分を切り取って、普通の表現に戻してくれるようなAIくらい、何とかできそうな気がしますが・・・

お前が作れといわれそうですね。いや、本当に作れるものなら、作りたいんですけどね・・・

AI vs. 教科書が読めない子どもたち

2019年2月25日 (月)

AIに約6割が期待するも 不安や抵抗を抱く人も

直面している問題なので、よくわかります。

ASCII.jp:約6割がAIによる利便性向上に期待 一方で不安や抵抗を抱く人も

ジャストシステムが全国の17歳~69歳の男女1100名を対象としたAIに関する調査レポート(2018年1月~12月)を発表してます。

まあ、当然といえば当然ですが、期待するという人は多いですね。

一方で、5割の人が不安を抱いているという結果も。AIサービス利用時の個人情報提供に抵抗感」や「施設案内・警備ロボットに不安感」を持つ人が多いようです。

特に後者は私も感じますね。だから、そういうものを作れといわれても作らないつもりではいますが。

職場の態度や服装のチェックができるAIというのも、その気になれば作ることが可能です。でも、こういうのってすごく窮屈ですよね。

本来は、ブラック企業の環境を改善するために期待されるべき技術なのに、かえってブラック化に貢献するようでは本末転倒。あくまでも生産性の向上や、人の命を守るための仕組みに特化するべきだと思いますね。

その辺は、AIサイエンティストやエンジニアの心がけ次第。ただし、仕事をしないのに高給を貪るような方々の未来までは、保証しかねますけどね。

マンガでわかる!  人工知能 AIは人間に何をもたらすのか (Informatics&IDEA)

より以前の記事一覧

当ブログ内検索

  • カスタム検索

スポンサード リンク

ブログ村

無料ブログはココログ