見出し画像

Pythonによる人工知能学習 その9 人工知能使ってみよう!

オリジナルのボイスチェンジャーを開発するための人工知能学習の記録です。今回から遂に人工知能っぽい機能を学んでいきます。

✔人工知能って?

今ブームになっている人工知能は、第3次人工知能ブームの「ディープラーニング」というものです。最初は推論探索システム。計算がめっちゃ早いという感じ。次はエキスパートシステム。用意した知識を用いて答えてくれるシステム。たとえば、色んな病気の情報と、その判定の仕方を情報として入れておくことで、症状を入れたら病名を教えてくれるというようなもの。情報を沢山入れないといけないので、とっても大変です。

ディープラーニングの特徴は、データを沢山入れれば、機会が勝手に学習してパターンを見つける。という感じです。プロセスを作る必要がないから、データをどんどん集めれば機械学習が進む。データを用意する大変さは、エキスパートシステムと変わらないのですが、それでもインターネットが出てきたお陰で、画像情報などの収集がとても楽になったので、このディープラーニングという方法が使える人工知能として人気が出てきたという感じです。

✔ディープラーニングを使ったボイスチェンジャーの目論見

と、言うわけで僕の目論見は、このディープラーニングの仕組みを活用したボイスチェンジャーを開発することです。リアルタイムに変換できればそれに越したことは無いですが、動画で使いたいと思っているので、処理に時間が掛かっても、品質を重視しています。

また、従来の、音の高さを変えるだけのボイスチェンジャーでは、目指している声に自分の声から変換することが出来ないため、自分の声から、理想の声に変換してくれるボイスチェンジャーを目指しています。

この方法をすでに試して、成果を出している人がインターネットでいましたので、自分も目指していこうと思いました。これから進めてみないと何ができて何ができないかはわかりませんが、成果が出たらいいなぁ・・・

✔画像データを使って機械学習するライブラリのインストール

●Scikit-learn(サイキット・ラーン):機械学習のライブラリ
画像データを使って学習して、与えられた画像を見て答えを予測する仕組みが入っています。

化学計算(scipy)のライブラリと、数値計算(numpy)のライブラリも合わせてインストールします。グラフ表示(matplotlib)のライブラリも。

pip3 install numpy
pip3 install scipy
pip3 install scikit-learn
pip3 install matplotlib

Macなので、pipは3で😊

✔機械学習できるサンプルプログラムを学ぶ

手書き文字を画像判定します。学習用のデータはsklearnにすでに用意されているものが使えるようです。

import sklearn.datasets
digits = sklearn.datasets.load_digits()
print("データの個数=",len(digits.images))
print("画像データ=",digits.images[0])
print("何の数字か=",digits.target[0])

このコードで、すでに用意されている数字画像のデータを1797個読み込んで、使う事が出来るようです。

画像1

なんとなく、数字が多いところが濃い色という事なので、0っぽい感じが見て取れます。これではわかりにくいのでmatplotlibを使って、画像で表示してみます。

import sklearn.datasets
import matplotlib.pyplot as plt
digits = sklearn.datasets.load_digits()
plt.imshow(digits.images[0], cmap="Greys") #数値データをグレーの濃淡画像に変換 
plt.show()

画像2

これが、このデータを書き出した時の情報です。8✕8の画像って結構ざっくりしている気がしますが、最適化してこういう感じでいいってことなんでしょうか。

画像3

こんな感じで色んな手書きデータが入っているようです。

✔画像ファイルから数字を予測するプログラム

import sklearn.datasets
import sklearn.svm
import PIL.Image
import numpy

# 画像ファイルを数値リストに変換する
def imageToData(filename):

   # 画像をグレースケールに変換(8✕8)
   grayImage = PIL.Image.open(filename).convert("L")
   grayImage = grayImage.resize((8,8),PIL.Image.ANTIALIAS)
   
   # 数値リストに変換
   numImage = numpy.asarray(grayImage, dtype=float)
   numImage = numpy.floor(16 - 16 * (numImage / 256))
   numImage = numImage.flatten()
   return numImage
   
# 数字を予測する
def predictDigits(data):

   # 学習用データを読み込む
   digits = sklearn.datasets.load_digits()
   
   # 機械学習する
   clf = sklearn.svm.SVC(gamma = 0.0001)
   clf.fit(digits.data, digits.target)
   
   #予測結果を表示する 
   n = clf.predict([data])
   print("予測=",n)
   
# 画像ファイルを数値リストに変換する
data = imageToData("moji.png")

# 数字を予測する
predictDigits(data)

人工知能らしく機械学習が始まりました。ただ・・・難しい。なかなか理解しにくくなってきましたね!実行するプログラムと同じフォルダにある「moji.png」を解析するプログラムです。

実行してみると・・・

画像4

あ・・・合ってる!すごい。これが機械学習の力か・・・

画像5

あえて、下手に書いてみましたが・・・合ってますね。素晴らしいです。

✔機械学習のポイント解説

機械学習処理のポイントを学ぶために解説します。

1.画像を数値に変換する

これはわかりやすいですね。解析するためには一度データにしないといけないようです。その際に、同じ形式にする必要があるから、8✕8のグレースケールに変換しているようです。カラーのデータなどを扱うときは、またそれに合わせたデータ変換が必要なんですね、おそらく。

2.機械学習をする

    # 機械学習する
   clf = sklearn.svm.SVC(gamma = 0.0001)
   clf.fit(digits.data, digits.target)

いよいよここが本題ですね。sklearn.svm.SVC(gamma = 0.0001) これが学習の準備処理。clf.fit(digits.data, digits.target)でデータを使って学習します。

サンプルはここまで。画像をパソコンから選択する方式に変えたり、結果をアプリに表示したりしたいですね。

✔アプリに組み込んで処理する

import tkinter as tk
import tkinter.filedialog as fd
import PIL.Image
import PIL.ImageTk
import sklearn.datasets
import sklearn.svm
import numpy

# 数字を予測する
def predictDigits(data):

   # 学習用データを読み込む
   digits = sklearn.datasets.load_digits()
   
   # 機械学習する
   clf = sklearn.svm.SVC(gamma = 0.0001)
   clf.fit(digits.data, digits.target)
   
   #予測結果をラベルに表示する 
   n = clf.predict([data])
   result = ("予測=", n)
   lbl.configure(text=result)
   
def imageToData(path):

   # 画像を読み込む
   # 画像をグレースケールに変換(8✕8)
   grayImage = PIL.Image.open(path).convert("L")
   grayImage = grayImage.resize((8,8),PIL.Image.ANTIALIAS)
   
   # 数値リストに変換
   numImage = numpy.asarray(grayImage, dtype=float)
   numImage = numpy.floor(16 - 16 * (numImage / 256))
   numImage = numImage.flatten()
   
   # そのイメージをラベルに表示する
   disp_image = grayImage.resize((300,300),resample=0)
   image_data = PIL.ImageTk.PhotoImage(disp_image)
   image_label.configure(image=image_data)
   image_label.image = image_data
   
   return numImage
   
def openFile():
   fpath = fd.askopenfilename()
   if fpath:
       # 画像ファイルを数値リストに変換する
       data = imageToData(fpath)
       # 数字を予測する
       predictDigits(data)
       
root = tk.Tk()
root.geometry("400x350")
btn = tk.Button(text = "ファイルを開く", command = openFile)
lbl = tk.Label(text = "予測=")
image_label = tk.Label()

btn.pack()
lbl.pack()
image_label.pack()
tk.mainloop()

画像6

なんとか動きました〜。予測結果の表示時に{7}と意図しない括弧が表示されていて、直せませんでした。いつか直したいですね。

次回からは、目的別の人工知能のサンプルを扱っていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?