2020/05/14

「AI CORE XスターターキットとOpenVINO™ですぐに始めるディープラーニング推論」シリーズの3回目記事です。
このシリーズは、「ディープラーニングとは何か」から始まり、「各種ツールの使い方」「プログラミング基礎」「プログラミング応用・実践」までをステップバイステップでじっくり学び、自分で理解してオリジナルのAIアプリケーションが作れるようになることを目指しています。
第3回目から実際にプログラミングを開始します。
まずは全ての基礎となるPythonについて学びます!
Pythonは、たくさんあるプログラミング言語の中でも、非常にシンプルに記述できて分かりやすく使いやすいです。
ちなみに、Python(パイソン)という名前の由来はイギリスのコメディ番組「空飛ぶモンティ・パイソン」ですが、Pythonはニシキヘビという意味なので、アイコンにはヘビのイラストが使われています。

Pythonの特徴をあげると以下の3つです。
「スクリプト言語」とは、C言語やJAVAのようにコンパイルやビルドが不要で、プログラムを書いたら即実行が可能という意味です。
Pythonは、今回のようにディープラーニングや機械学習などに多く使われていますが、組込み分野やWebアプリケーション分野にも使われています。
構文のまとまりにカッコを使わず、インデント(字下げ)で表現するのが特徴的です
本シリーズで扱うPythonは主に以下の3つに分類できます
今回の記事では「Python基礎プログラミング」を取り扱います。その他につきましては次回以降取り扱います。なお、読み進めるにあたり、実際にコードを書いて実行しながら学習することを推奨します。
第2回目でも既にPythonを実行していますが、改めて説明したいと思います。
コードを記述するソフトは引き続きText Editorを使い、コードを実行するソフトは引き続きTerminalを使います。
今回から作業場所はホームディレクトリ直下ではなく、workspaceというフォルダを作って、その中で行います
Filesアイコンでホームディレクトリを開きます。

空いているスペースで右クリックからNew Folderを選択し、workspaceという名前で作成します。
続いてText Editorを立ち上げます

図に番号を書きましたが、主に使うのはこの3つだけです
初回のみ、コードのすぐ左横に行番号を表示する設定を行います。行番号を表示しておくとエラー箇所を見つける際に便利です。右下にも行番号表示は出ていますが、コードの左横に表示した方が分かりやすいです。

トップバーのText EditorからPreferencesを選択し、ViewタブからDisplay line numbersにチェックを入れればOKです。フォントや背景色などを変更したい場合はFont & Colors タブから色々と設定可能です。

では試しにコードを書いて実行してみます。
以下のコードを打ち込んでください。コードの内容については後ほど説明します。
print('hello, OpenVINO')print(AI)
打ち込み終わったら保存します。名前は例えばtest.pyなどにしますが、拡張子が.pyであれば自由に付けてもらって構いません。保存する場所はworkspaceの下を選んでください。
ターミナルを立ち上げ、以下のコマンドを実行します。
# cd wまで打ちこんでTABでもOKcd workspacepython3 test.py
以下のように表示されると思います
hello, OpenVINOTraceback :File "test.py", line 2, in <module>NameError: name 'AI' is not defined
これはエラーが発生しているという意味です。line 2、つまり2行目でエラーが出ているのが分かります。
エラーの内容は NameError: name 'AI' is not defined 、つまり、AIという変数名は定義されていないという意味です。
先ほどのコードを以下のように修正してください。変更点は2行目の記号追加のみです。
print('hello, OpenVINO')print('AI')
これで保存して、ターミナルで↑キー+Enterキーで再び実行してみると今度は以下のように表示され、エラーがなくなったと思います
hello, OpenVINOAI
このシリーズではこんな感じでプログラミング学習を進めて下さい。ファイルは新規作成しても良いですし、test.pyに追記や上書きでも良いです。
なお、コードの入力は自分で打ち込んでも良いですが、コピー&ペーストしても良いと思います。特に後のコンテンツでは、同じコードをちょっと変更した少し長いコードがたくさん出てきますので、毎回打ち込むのは大変です。単純に打ち込む行為よりも、ここをこう変えたらどうなるんだろう?という疑問を持って色々と改造して実行して、たくさんのエラーにぶち当たってエラーを解決していくことが上達に繋がります。
#記号を書くことで、それ以降から行の終わりまでがコメント文になります。
コメント文とは、プログラム実行時に無視されるということです。主にプログラムに関する注釈を記述するために使用します。
#This is a comment
当然ですが、これを実行してもターミナルには何も表示されません。
文字列はシングルクォート ' 、もしくは ダブルクォート " で囲みます。本シリーズではシングルクォートを使うことで統一します。文字列を表示するには以下のような形でprintを使います。
print('hello deep learning')
変数の型宣言は不要です。整数も小数も文字列も同じように扱えます。代入は他のプログラミング言語同様 = を用いて、左側に右側の値を代入します。
a = 2020b = 3.14159c = 'deep learning'print(a)print(b)print(c)
なお、=の前後に半角スペースを入れているのはコードを見やすくするためで、文法的には必須ではありませんが、入れることをお勧めします。=以外のスペースや空白行についても同様です。
記号 +, -, *, / を用いれば四則演算可能です。
a = 100 + 200b = 24 - 8c = 10 * 3.14159print(a)print(b)print(c)
以下の2行目のような書き方も良く使われます。自分自身に100を加え、結果的に600になります
a = 500a = a + 100print(a)
「ある変数に数値を足して、結果を同じ変数に代入する」という書き方は良く使われますので覚えておいてください。 a = a + 1 など 1 を足す場合は "インクリメント" と呼ばれます。
ここではprintの応用例を紹介します。
気づいた方もいると思いますが、printは表示した後に必ず改行されます。
実はカンマ, を使うことにより複数の変数を一括で表示させることが可能です。
a = 2020b = 3.14159c = 'deep learning'print(a, b, c)
表示結果は、変数と変数の間にスペースが1つ空きます。
頻繁には使いませんが、以下のような書き方で、改行無し かつ スペース無し で表示させることも可能です
a = 2020b = 3.14159c = 'deep learning'print(a, end=')print(b, end=')print(c, end=')
型を変更させる必要がある場合は、intやfloatなどを使って型変換を行う必要があります。
例えば、文字列から数値の小数に変更させる例です。floatを使います。
a = '3.14159'b = 10 *print(b)
こちらは小数から整数に変更させる例です。intを使います。
a = 3.14159b = 10 *print(b)
どのプログラミング言語にも必ずあるif文を使って条件分岐を行います。Pythonでの注意点はコロン:とインデントです。コロンはifの行の最後に書きます。インデントとは字下げのことで、以下のコードの場合はprint文の行です。半角スペースが4つで1つのインデントを表します。
以下のコードは、変数tの値を見て、8より大きい場合はprint文で表示を行い、それ以外の場合は何もせずプログラムを終了します。
t = 10if t > 8:print('Good sleep time')
ifと半角スペースの後に書かれているt > 8は条件式と呼ばれる部分です。条件式が合っていれば、その下のインデントされたブロックが実行されます。
条件式には>などの比較演算子が使われます。比較演算子は他に、< <= >= == != などがあります。
以下の例でtの値を変更してみて、条件式が合っているとき・合っていないときで、どのブロックが実行されているのか確認してください。
t = 6if t < 8:print('Lack of sleep')print('Get some sleep, please')print('Thank you')
ブール型と呼ばれる変数がありifとよく絡めて使われるので覚えておきましょう。ブール型はTrueとFalseのどちらかしか持てない変数のことです。
以下のコードでは、ブール変数sleepyの値がTrueのときにprint文を表示しています。
sleepy = Falseif sleepy == True:print('Have a good sleep!')
インデントとは字下げのことで、半角スペースが4つと紹介しましたが、実は4つでなくてもエラーにならずに動作します。TABでも動作しますが非常に大きな空白が挿入されます。また、異なるスペース数やTABが混ざるとエラーになります。
いづれにしても、毎回4つスペースを打つのは面倒です。
Text Editorにはこれを楽にしてくれる設定がありますので、ご紹介します。
トップバーのText EditorからPreferencesをクリックします

Editorタブを選択し、以下の3つの変更を加えます
Tab widthを8から4へInsert spaces instead of tabsにチェックEnable automatic indentationにチェック
これで、TABキーを押すことでスペースが4つ打ち込まれます。
また、インデント行でEnterキーを押した後もインデントが継続されます。インデントを戻したい場合はshift+TABを入力します。
また、複数行を選択してからの、一括インデントや一括インデント戻しも可能ですので、ご活用ください。
リストは他のプログラミングでいうところの配列にあたります。
簡単に言うと、一つの値ではなく、一連の値を格納できる変数です。
代表的な使い方を見てゆきます
このように各要素をカンマで区切り、カッコ[ ]内に記述します。
a =
リスト名[n]でリストのn + 1番目の要素にアクセスできます
Pythonでは要素番号は 0 から始まります。例えば n が 5 の場合は 6番目 の要素をアクセスすることになります。
a =b =print(b)
今回は、リストの中身を整数値にしましたが、小数や文字列など他の変数も扱うことも可能です。
Pythonの辞書は一言で言うと「キーワード付きのリスト」です。WEBプログラミングを経験したことがあれば、、JSON形式という用語を聞いたことがあるかもしれませんが、ほぼそれに近いです。
では、実際にコードを書いて実行してみてましょう。以下は果物の値段を変数に格納して参照する例です。リストで取り扱うことも可能ですが、辞書を使うことにより分かりやすくなります。
# 辞書の初期化a =# 辞書の参照b =# 表示print(b)
特徴的なのは、初期化のときに{ }を使うことと、キーワード:値というセットで格納することです。
リスト同様、キーワードと値は整数値以外も取り扱うことが可能です。ただし、キーワードに関しては文字列を使うことが一般的です。
タプルとは要素を変更できないリストです。初期化時のカッコの形が( )であり、リストや辞書と異なります。一方で参照時はリストと同じように[]を使います。
a = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100)b =print(b)
本シリーズでは主に、座標(X・Y)、画像の大きさ(幅・高さ)、色情報(青・緑・赤)などに使われます。
関数とは、入力値を受け取り、処理を行った後、出力値を結果として返すものです。
入力値を「引数(ひきすう)」、出力値を「戻り値」と呼びます。
具体例として、半径を引数とし、円周を求める処理を行い、円周値を戻り値として返す関数 circle を作ってみましょう。
関数は def で定義します。def 関数名(引数): を記述した後にインデントを行い、処理をブロックに書きます。
円周の公式は 2 × π × r なので、変数 l に対して l = 2 * 3.14159 * r で代入を行っています。return 戻り値 で結果を返すことができます。
l = 2 * 3.14159 * rreturn l
これだけで実行しても何も起きませんので、関数を呼び出す処理を加えます。以下は引数に 10 を入れて呼び出す例です。
l = 2 * 3.14159 * rreturn lval =print(val)
関数の引数や戻り値は1つではなく複数でもOKです。
以下は、半径と円周率を引数として円周と円の面積を返す関数の例です。
l = 2 * pi * rs = pi * r * rreturn l, sval1, val2 =print(val1)print(val2)
これまでの関数の引数は、順番を一致させることにより受け渡しをしていました。(例えば上のコードの例では、rに10を渡し、piに3.14159を渡す)
関数呼び出し時に名前(キーワード)を付けることにより、順番に関係なく引数渡しを行うことができます。
l = 2 * pi * rs = pi * r * rreturn l, sval1, val2 =print(val1)print(val2)
順番は逆ですが、先ほどと同じ結果になったと思います。
このような引数の書き方を「キーワード引数」と呼びます。
Pythonではimportを使って、OpenCVやNumPyなど様々な「パッケージ」や「モジュール」を読み込みます。
目的はモジュールの中にある複数の「関数」を活用するためです。
モジュールの読み込み方法は主に3通りです。timeモジュールのsleepという関数を使用する場合を例に説明します。sleepは引数に指定した秒だけプログラムを一時停止する関数です。戻り値はありません。
一番分かりやすい読み込み方法です
関数を使う場合は モジュール名.関数名 で使います
import timeprint('start')timeprint('end')
as を加えれば、モジュール名を別名にして取り扱うことができます
以下の例ではモジュール名をtとして取り扱っています
import time as tprint('start')tprint('end')
特定の関数しか使わない場合、この形式で書くことにより、関数使用時にモジュール名が不要になります
from time import sleepprint('start')print('end')
どの読み込み方法でも同じ結果です。
while True:を使うことで、ブロックに対し、無限ループで実行させることができます。ifのときと同様にブロックはインデントする必要があります。
以下は無限ループで変数numの値を表示する例です。sleep関数で1を指定しているので1秒毎の表示となります。ブロックの最後でnumの値はインクリメントされているため、徐々に数値が増えてゆきます。
無限ループなのでプログラムは終了しません。ターミナル上でCtrl+Cキーで強制終了してください。
import timenum = 0while True:print(num)timenum = num + 1
無限ループから抜け出すためのbreakも良く使われます
以下はifを使って、numの値が5以上になったらループを抜けてプログラム終了する例です。
import timenum = 0while True:print(num)timeif num >= 5:breaknum = num + 1
continueはそれ以降のブロックをスキップしてブロック先頭に戻る処理を行います。
以下の先ほどのプログラムのbreakをcontinueに変更した例です。numが5以上になるとインクリメント部がスキップされて処理を繰り返します。
import timenum = 0while True:print(num)timeif num >= 5:continuenum = num + 1
次に紹介するforもwhile同様に繰り返し処理ですが、主に無限ループ以外の用途で使います。
対象から要素を一つずつ取り出し、なくなったら終了するという使い方です。
リストから順に値を取り出して変数に代入し、ブロック部の処理を繰り返します。
fruits =for x in fruits:print(x)
0 ~ n-1 までの値を 変数 に代入してブロック部の処理を繰り返します。
例えば 5 回繰り返し処理を行いたいというときは、以下のようなコードになります。
for num in :print(num)
range(5)は、0, 1, 2, 3, 4 という要素で構成されていて、そこから1つずつ取り出しているとイメージしてください。
次回は、画像を扱うOpenCVです。プログラミングの結果が画像として現れるので面白いです。お楽しみに!
以上、「Python基礎プログラミング」でした。