【Deeplearningでポケモン図鑑計画】pandasで世代図鑑を作成【その0?】

はじめに

こんにちは、がんがんです。今回は計画の中に書き忘れていたpandasによる前処理をまとめました。
内容的にはpandasの練習的な内容になります。

世代ごとのcsvファイルの作成

今回行ったのは、各世代ごとのcsvファイルの作成です。
ポケモンに関する資料はありがたいことに様々な方がまとめられています。

ポケモンの番号と名前のデータを探しているときにこちらの記事に出会いました。

www.absolute-keitarou.net

ありがたいことに、すべてのポケモンの番号と名前をまとめたjsonファイルをgithubの方へ公開されていました。
githubへのリンクも貼っておきます。

GitHub - keitarou/pokemon_zukan: TODO: one-line summary of your gem


学習・管理を行う際に、全種まとめて行うよりも世代ごとに行ったほうが簡単だと思います。
そのため、今回はpandasを用いて世代ごとに分割していきました。

コード

コードは以下のようになっています。なお、マシンはWindowsPython環境は3.6です。

import pandas as pd
import json
from pathlib import Path

#  RG:赤緑, GS:金銀, RS:ルビー・サファイア, DP:ダイアモンド・パール
#  BW:ブラック・ホワイト, XY:X・Y, SM:サン・ムーン
name_list = [ "RG","GS", "RS", "DP", "BW", "XY", "SM"]
num_list = [ 1, 152, 252, 387, 494, 650, 721]

"""
	メイン
"""
def main():
	#  空のデータフレームを作成
	df_origin = pd.DataFrame( index=[], columns=['number','name'])

	#  jsonファイルの読み込み
	dir_path = Path("./zukan/name_table.json")
	with dir_path.open( mode="r", encoding="utf-8") as f:
		json_dict = json.load(f)

	#  DataFrameに追加
	df_origin['number'] = list(json_dict.values())
	df_origin['name'] = list(json_dict.keys())

	#  世代に合わせて図鑑を分けていく
	#  最終世代のみexcept文で例外処理
	try:
		for i in range( 0, len(num_list)):
			st = num_list[i]-1
			ed = num_list[i+1]-1
			
			df = df_origin[st:ed].copy()
			print("--------------------------")
			print(df.head())
			#  csvファイルに保存
			df.to_csv("./zukan/" + name_list[i] + ".csv", index=False)

	except IndexError:
		df = df_origin[st:].copy()

if __name__ == '__main__':
	main()

まとめ

無事に世代ごとのcsvファイルが作成出来ました。その1の方ではここで分割したcsvファイルを使用しています。
やったことを1つずつ忘れずに書いていきます。

また、Githubについてもそろそろ使用して慣れていこうと思います。

【pandas × openpyxl × ダンス】ダンスイベントの事務処理まとめ

 

はじめに

皆さんこんにちは、がんがんです。

実は趣味で昔からダンスをしています。仲間たちと練習会を開いたり、イベントスタッフなどもしています。

イベントを運営するにあたり、エントリー管理や対戦表の作成、タイムスケジュールの作成など多くの事務処理を行う必要があります。

せっかくプログラミングを勉強しているのだから、この事務処理を可能な限り自動化できないかなと昔からずっと考えていました。

 

今年の8月、イベントのスタッフとして事務処理関係を任されました。イベントまで時間があったおかげで、ある程度の処理を自動化することが出来ました。

今回は、自分が忘れないためにもまとめておこうと思います。

 

前提と作成手順

まずは前提として

  •  Pythonを使用する
  •  pandasや前処理の勉強がしたかった

この2つが挙げられます。

私はよく使用する言語がPythonで、当時はDeep Learningの前処理関係をよく調べていました。ちょうどpandasについて勉強したいと思っていたので、今回はpandasを使用して処理を書きました。

 

今回は以下のような手順で作業を進めました。

  1. Googleフォームでエントリーフォームを作成。
  2. Googleスプレッドシートを加工し、csvファイルとしてダウンロードする
  3. pandasを用いてcsvファイルから必要情報を取得、欠落値などの処理
  4. sampleメソッドを用いてランダムサンプリング
  5. openpyxlを用いてエクセル上に情報を格納

前回のイベントでもGoogleフォームは使用していたので、今回新たに追加したのは2~5の工程です。

 

Googleスプレッドシートの加工

Googleスプレッドシートについては何度か使用したことがありますが、加工して使用したのは今回が初めてです。

エントリーフォームの入力は入力者の負担を減らすため、1度の入力で必要な情報をすべて取得する必要があります。そのため、編集者が編集しやすい形式とはなっていません。

今回の場合ですと、エントリーの選択欄に1on1、2on2、Wエントリーの欄が存在しており、これを1on1と2on2の2つのリストに分ける必要があります。

 

そこで、FILTER関数を用いてリストを分けることにしました。

FILTER関数の詳細については以下を参照ください。

Googleスプレッドシート:FILTER関数で条件にあったデータのみを表示させる。 | ひとりで.com

  

FILTER関数を用いて、

・Wエントリーまたは1on1のみ → 1on1のリスト

・Wエントリーまたは2on2のみ → 2on2のリスト
という風に分けることが出来ました。

 

Googleスプレッドシートは使ってみると面白かったので、時間があるときにいろいろ
遊んでみます。以下は参考記事です(この中のrow関数も今回使いました)。
linq.career-tasu.jp

 

pandasによる処理

今回やりたかった勉強のメインです。意外とサクサク進んだので、後述のopenpyxlのがメインっぽいですが。pandasでは以下の3つをやっていきます。

  1. pandasにてcsvファイルの読み込み
  2. NaN値の削除
  3. sampleメソッドを使用してランダムリストの生成

 

まずはpandas部分のコードを以下に示します。


	
	#  csvファイルの読み込み
	df_origin = pd.read_csv(csv_path, engine='python', encoding='utf-8', header=0)
	#  NaN値を削除
	df_origin = df_origin.dropna(thresh=2)
	print("Before List:\n{}".format(df_origin))

	#  sampleメソッドでランダムランプリング
	df_rand = df_origin.sample(frac=1).reset_index(drop=True)
	print("After List:\n{}".format(df_rand))

1.csvファイルの読み込み

csvファイルの読み込みにはread_csvを使用しています。read_csvの使い方についてはこちらを参考にしました。

pandasでcsv/tsvファイル読み込み(read_csv, read_table) | note.nkmk.me

普通にread_csvを使う場合はこちらのみでいいのですが、OSError: Initializing from file failedというエラーと文字化けが起こりました。

 

OSError: Initializing from file failedというエラーはPython3.6の場合に起こるようです。csvファイルの名前を変更すると管理がめんどくさいので、今回はengine='python'として解決しました。

詳しい対策方法はこちらの記事をどうぞ。

Python3.6のpandasで「Initializing from file failed」が起きた場合の対策 | 自調自考の旅

 

文字化けについては、 encoding='utf-8'とすることで解決しました。

 

2.欠損値NaNの除去

こちらを参考にしてコーディングしました。

pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出 | note.nkmk.me

 

Googleスプレッドシート上では、更新時に備えてあらかじめ40列用意していました。そのため、エントリー未登録の空白行が多くあります。これが全てNaN値として読み込まれるため、非常に邪魔でした。

手作業で消せば簡単ですが、それだと練習にならないので今回は pandasで消すことにしました。

 

NaNを消すだけであれば、df_origin = df_origin.dropna()で大丈夫です。

ただ、2on2において相方がわからないという場合は相方がNaNとなり、必要なエントリー情報まで消してしまうことになります。そのため、今回は

df_origin = df_origin.dropna(thresh=2)

と記述して、NaN値が2つ以上存在する場合に除去することにしました。

 

3.sampleメソッドを用いてランダムサンプリング

参考記事はこちらになります。

pandas.DataFrame, Seriesの行をランダムソート(シャッフル) | note.nkmk.me

 

前回のイベントではrandom関数により乱数を生成していましたが、それだと非常にめんどうでした。今回はSampleメソッドを用いることで非常に簡単にシャッフルすることが出来ました。

 

Excelによる処理

最後は印刷や管理を効率的に行うためにExcelに格納していきます。今回はpandasよりもopenpyxlの方が苦戦しました。openpyxlで行う処理は大きく分けて2つです。

  1. シートを読み込み、シャッフルなしのリストを格納
  2. シャッフルを行ったリストを格納

 

pandas同様、まずはコードを示します。こちらはソロバトルのコードです。



	"""
		Excelファイルの保存・処理
	"""
	print("-----------------------------------------------------------------")
	print("Open excel file:{}".format(ex_path))
	print("-----------------------------------------------------------------")
	wb = px.load_workbook(ex_path)
	sheetNames = list(wb.get_sheet_names())
	print("{}".format(sheetNames))

	#  Excelファイルに出力(受付用)
	ws = wb[sheetNames[0]]
	wb.active = wb.sheetnames.index(sheetNames[0])
	ws = wb.active				#  シートを取得
	print("0:{}".format(ws))

	for idx,row in enumerate(ws.iter_rows("B3:B33")):
		for cell in row:
			cell.value = df_origin.iloc[idx,1]
	for idx,row in enumerate(ws.iter_rows("C3:C33")):
		for cell in row:
			cell.value = df_origin.iloc[idx,2]


	#  Excelファイルに出力(受付以外)
	for cnt in range(1,4):
		ws = wb[sheetNames[cnt]]
		wb.active = wb.sheetnames.index(sheetNames[cnt])
		ws = wb.active				#  シートを取得
		print("{}:{}".format(cnt,ws))

		for idx,row in enumerate(ws.iter_rows("B3:B33")):
			for cell in row:
				cell.value = df_rand.iloc[idx,1]
		if cnt != 3:
			for idx, row in enumerate(ws.iter_rows("C3:C33")):
				for cell in row:
					cell.value = df_rand.iloc[idx,2]

	#  Excelの保存
	wb.save(ex_path)

受付の人はエントリー順のリスト、DJ・ジャッジ・MCの人はシャッフルしたリストの方がよいかなと思い、このようなコードなっています。

コードを別々に分ければ良かったとまとめていて気付きました。

 

openpyxlの使い方については以下のものがわかりやすく使用させてもらいました。

 Python openpyxlでExcelを操作

OpenPyXLで複数のセルの値を取得する方法

 

Excelの方はどちらも既存のファイルを使用しているため、本プログラムのようになった。

ソロバトルのExcelシートは「受付用、DJ用、ジャッジ用、集計用」、

2on2のExcelシートは「受付・DJ用、ジャッジ用、集計用」のシートをそれぞれ用意しました。

 

まとめ

今回の作成における課題としては

  • トーナメント表への反映が間に合わなかった
  •  Excel処理をもう少し綺麗にコーディングしたかった

この2つが挙げられるかなと思います。トーナメント表に反映させるところは今回断念したので次までの目標にしておきます。

また、GUIでトーナメントを作っても面白いかなと思ったので使う機会はないかもですが気が向いたら作ってみます。

【DeepLearningでポケモン図鑑計画】画像のクローリング【その1】

はじめに

こんにちは、がんがんです。今回はpokemon図鑑計画のその1です。
前回の計画まとめは以下を参照ください。

gangannikki.hatenadiary.jp

iCrawler

機械学習において画像を集めるというのは非常に大変な作業です。
調べてみると、requestを用いて自分でコーディグするか、GoogleやYahooのAPIを使用して集めるなどいろいろな集め方がありました。

今回は比較的簡単に集めたかったので、iCrawlerを参考にして画像集めを行いました。

sleepless-se.net


コード

コードは以下のようになっています。なお、マシンはWindowsPythonは3.6を使用しています。

import pandas as pd
from pathlib import Path

from icrawler.builtin import GoogleImageCrawler

image_path = "./image/"

def main():
	#  csvファイルを読み込み,図鑑を取り出す
	csv_path = Path(".") / "zukan" / "RG.csv"
	df1 = pd.read_csv(csv_path, engine="python", encoding='utf-8', header=0)

	#  番号のフォルダを作成
	#  100枚の画像をダウンロード
	i = 0

	while True:
		try:
			name = "image/" + str(i+1)
			print(df1[i:i+1])

			crawler = GoogleImageCrawler(storage={"root_dir":name})
			crawler.crawl(keyword=df1.iat[i, 1],max_num=100)

			i += 1
		except IndexError:
			break
		
if __name__ == '__main__':
	main()

全種類を一気に学習させるとテストなども大変となるため、まずは初代の151種類の画像をそれぞれ100枚ずつ集めました。

まとめ

今回は画像のクローリングを行っていきました。
iCrawlerを使えば比較的簡単に画像を集めることが出来ました。
次は学習に適さない画像のクレイジングを行い、転移学習をやっていきます。

また、各世代ごとのcsvファイルを作成したのでそちらも今後まとめていきます。

【ポケモン × Deep Learning】Pokemon図鑑を作ってみる【計画】

 

 はじめに

 こんにちは、がんがんです。随分と期間が空きましたが徐々に書いていこうと思います。

 

皆さんはポケットモンスターのゲームをやったことはありますか?1996年に「赤・緑」が発売されて以降多くの人に愛されている作品で、

私も一番初めて買ってもらったゲームがポケモンであり、人生で一番好きなものです。

ポケモンは多くの種類が存在し、現在は800種以上存在します。

ポケットモンスター - Wikipedia

Deep Learningの勉強を2017年からやっていますが、勉強を初めてからずっと思っていたことがあります。それは

【なぜDeep Learningポケモンの多クラス分類をしないのか】

です。

ポケモンは800種類以上いて、Deep Learningは画像の多クラス分類がよく例として取り上げられます。

では、なぜ誰もやってないのか?すごく疑問でした(検索不足)。

なので、自分の勉強としてやっていこうと思います。

 

関連記事

ポケモン図鑑の構想自体は今年の夏ごろからしており、その頃に見つけた記事を貼っておきます。自分が思い立つ一か月ほど前(5月ごろ)に行われたもののようです。

ラズベリーパイの調理法 ディープラーニングのポケモン図鑑を作ろう

こちらは日本語まとめなので、本家の方も貼っておきます。

www.pyimagesearch.com

やはり同じようなことを考えている方は居られるのですね。こちらの記事に感化され、自分も最終的にはRaspberry Piへ実装しようと思います。

 

コンセプトと作成手順

コンセプトとして、まずは図鑑を完成させていきます。そして、Raspberry Piの実装へと着手していきます。手順は以下のようになっています。

 

  1. 必要な画像をクローリング
  2. 学習画像のクレイジング
  3. 転移学習モデルにて学習
  4. テストプログラムを作成しテスト
  5. Raspberry Piによる実装

 

さいごに

現段階でクレイジングの作業をすでに始めているため、クローリングについて後日まとめていきます。

自分が悩んでいた問題を別手法にて先輩が簡単に解決したり、同期が努力してる姿を見ると自分も負けたくないなと思います。

日々少しでも成長できるようにがんばります。

 

【Raspberry PiでDarknet with NNPACKの導入】

 

はじめに

前回の記事はこちらから

gangannikki.hatenadiary.jp

 

 今回は前回の予告通りYOLOを導入していきたいと思います。

YOLOとは、You Only Lock Onceの略称、物体検出手法の1つです。物体検出の分野ではR-CNNと合わせてよく耳にするのではないでしょうか。最新バージョンはYOLO v3でこちらのサイトなどを参考にして試すといいです。

新しくなったYOLOv3を使ってみよう | Sosogu LLC.

この記事によると高精度かつ高速度の物体検出と言えます(2018.4時点)。

 

Googleでラズパイ + 物体検出を調べてみると結構いっぱい出てきました。 どの記事を見ても通常のYOLOでは遅すぎて話にならないと書いてありました(1枚の画像に5分かかったりする)。

今後の展望として、ロボットに積んで物体検出をしたりしたいのでなるべく高速になってくれるとうれしい…

さらにいろいろ調べてみるとこちらの記事に出会いました。

yagitsawa.github.io

この記事の通りならばかなり速度を出せそうですね!とりあえず、こちらを参考にしながら導入を進めていきたいと思います。

本家さまも参考までに貼っておきます。

github.com

 

1. Darknet with NNPACKのインストール

上記のサイトを参考に進めていきます。pip3、gitはともに最新版でした。

Install PeachPy and confu

pip3でそれぞれインストールしていきます。


    sudo pip3 install --upgrade git+https://github.com/Maratyszcza/PeachPy
    sudo pip3 install --upgrade git+https://github.com/Maratyszcza/confu
    
Install Ninja

    git clone https://github.com/ninja-build/ninja.git
    cd ninja
    git checkout release
    ./configure.py --bootstrap
    export NINJA_PATH=$PWD
    
Install clang

    sudo apt-get install clang
    
Install NNPACK-darknet

    cd ~
    git clone https://github.com/thomaspark-pkj/NNPACK-darknet.git
    cd NNPACK-darknet
    confu setup
    python3 ./configure.py --backend auto
    $NINJA_PATH/ninja
    sudo cp -a lib/* /usr/lib/
    sudo cp include/nnpack.h /usr/include/
    sudo cp deps/pthreadpool/include/pthreadpool.h /usr/include/
    
Build darknet-nnpack

    cd ~
    git clone https://github.com/thomaspark-pkj/darknet-nnpack.git
    cd darknet-nnpack
    make
    
Test

    wget https://pjreddie.com/media/files/yolov2-tiny-voc.weights
    wget https://pjreddie.com/media/files/yolov2.weights
    

2. 実行結果

実際にYOLO v2、 Tiny YOLO v2で実行した結果をまとめていきます。

YOLO v2


$ ./darknet detector test cfg/coco.data cfg/yolo.cfg yolov2.weights data/person.jpg
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32
    1 max          2 x 2 / 2   608 x 608 x  32   ->   304 x 304 x  32
    2 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64
    3 max          2 x 2 / 2   304 x 304 x  64   ->   152 x 152 x  64
    4 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128
    5 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64
    6 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128
    7 max          2 x 2 / 2   152 x 152 x 128   ->    76 x  76 x 128
    8 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256
    9 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128
   10 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256
   11 max          2 x 2 / 2    76 x  76 x 256   ->    38 x  38 x 256
   12 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512
   13 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256
   14 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512
   15 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256
   16 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512
   17 max          2 x 2 / 2    38 x  38 x 512   ->    19 x  19 x 512
   18 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024
   19 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512
   20 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024
   21 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512
   22 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024
   23 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024
   24 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024
   25 route  16
   26 conv     64  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x  64
   27 reorg              / 2    38 x  38 x  64   ->    19 x  19 x 256
   28 route  27 24
   29 conv   1024  3 x 3 / 1    19 x  19 x1280   ->    19 x  19 x1024
   30 conv    425  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 425
   31 detection
mask_scale: Using default '1.000000'
Loading weights from yolov2.weights...Done!
data/person.jpg: Predicted in 9050 ms.
person: 86%
horse: 82%
dog: 86%

今回の実行結果は約9秒となりました。参考サイトでは約16秒だったので、それよりも速い結果です。

通常のDarknetではかなり遅いものの、NNPACKにより最適化されたことによる速度の向上がよく分かりますね。

精度に関しても人、馬、犬を80%以上の精度で認識できています。

v2-person

Tiny YOLO v2

$ ./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg yolov2-tiny-voc.weights data/person.jpg
layer     filters    size              input                output
    0 conv     16  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  16
    1 max          2 x 2 / 2   416 x 416 x  16   ->   208 x 208 x  16
    2 conv     32  3 x 3 / 1   208 x 208 x  16   ->   208 x 208 x  32
    3 max          2 x 2 / 2   208 x 208 x  32   ->   104 x 104 x  32
    4 conv     64  3 x 3 / 1   104 x 104 x  32   ->   104 x 104 x  64
    5 max          2 x 2 / 2   104 x 104 x  64   ->    52 x  52 x  64
    6 conv    128  3 x 3 / 1    52 x  52 x  64   ->    52 x  52 x 128
    7 max          2 x 2 / 2    52 x  52 x 128   ->    26 x  26 x 128
    8 conv    256  3 x 3 / 1    26 x  26 x 128   ->    26 x  26 x 256
    9 max          2 x 2 / 2    26 x  26 x 256   ->    13 x  13 x 256
   10 conv    512  3 x 3 / 1    13 x  13 x 256   ->    13 x  13 x 512
   11 max          2 x 2 / 1    13 x  13 x 512   ->    13 x  13 x 512
   12 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024
   13 conv   1024  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x1024
   14 conv    125  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 125
   15 detection
mask_scale: Using default '1.000000'
Loading weights from yolov2-tiny-voc.weights...Done!
data/person.jpg: Predicted in 1302 ms.
dog: 53%
person: 73%
sheep: 60%
sheep: 39%

実行結果は約1.3秒となり、参考サイトよりも1秒以上速い結果となりました。

精度に関しては参考サイト同様に低下していることが分かります。

速度が最大限に求められ、かつ、人くらいしか認識しないのであればTiny-YOLOでも十分に使えそうです。

v2_tiny-person

3. YOLO v3の導入

YOLOの最新バージョンは2018.6時点ではYOLO v3です。せっかくなら、YOLO v2ではなく、より精度の向上したYOLO v3を試してみたいものです。Darknet with NNPACKでは weightファイルをダウンロードしてから実行テストをしています。

ということは、YOLO v3のweightファイルをダウンロードすればいいのではないでしょうか?

 

思い立ったが吉日ということで実際にやってみました。すると、以下のようなことに…


$ wget https://pjreddie.com/media/files/yolov3.weights
--2018-06-13 05:07:56--  https://pjreddie.com/media/files/yolov3.weights
pjreddie.com (pjreddie.com) をDNSに問いあわせています... 128.208.3.39
pjreddie.com (pjreddie.com)|128.208.3.39|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 248007048 (237M) [application/octet-stream]
`yolov3.weights' に保存中

yolov3.weights                          35%[=========================>                                                 ]  83.31M   437KB/s    in 71s     


`yolov3.weights' へ書き込めません(デバイスに空き領域がありません)。

ここに来て空き領域不足によりダウンロードできませんでした。

 

SDカードを仕方なく8GBにした弊害がさっそく現れました。これはつらい…

とりあえず、現状を確認してみましょう。こちらのコマンドを実行すると


    df -h
    

以下のような結果となりました。


ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root        5.4G  5.1G  6.9M  100% /
devtmpfs         434M     0  434M    0% /dev
tmpfs            438M   21M  418M    5% /dev/shm
tmpfs            438M  6.0M  432M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            438M     0  438M    0% /sys/fs/cgroup
/dev/mmcblk0p6    68M   22M   47M   32% /boot
tmpfs             88M  4.0K   88M    1% /run/user/1000
/dev/mmcblk0p5    30M  398K   28M    2% /media/pi/SETTINGS

今回は8GBのSDカードを使用しているのでまだまだ使えるところがありそうですね。

次回

今回はラズパイでYOLOが動くことが分かったのでとりあえず良しとしましょう。

次回までにSDカードの容量を増やして、YOLO v3のweightファイルが実行できるかを調査していきたいと思います。

また、動画像中のオブジェクトを検出できるのかも試みてみようと思います。

【Raspberry Piの導入~セットアップまで】

はじめまして

今日からブログをはじめていきます、がんがんと言います。電子工作とか人工知能とかを勉強してる工学部学生です。このブログは自分が何をしたか忘れないようにメモ程度に書いていきます。

間違っている点やコメントなどあればお待ちしております。あくまでメモ程度なのでよろしくお願いします。

1. Raspberry Piの準備

 ラズパイで物体検出をやってみたかったのでラズパイを用意しました。今回はRaspberryの準備・セットアップについてまとめます。

使用するRaspberry Piは「Raspberry Pi 3 Model B ver1.2」です。運よく研究室に余っていたものを拝借しました。

手元に電源とSDカードがなかったのでそちらを購入しました。

SDカードはkingston社製の32GBのMicro SDを購入。今回はRaspberry Pi 3を使用するため、5V 2.5AのUSB電源アダプタを購入。

 必要な物がすべて揃ったのでセットアップ開始!

2. Raspberry Piの環境構築

 まずはSDカードのフォーマット、Raspbianのインストールから行っていきます。

今回はこちらを参考にさせてもらいました。

 

deviceplus.jp

 SDカードフォーマッターを用いて無事にフォーマットし、Raspbianをインストールしていきます。

今回はとりあえずRaspbianをインストールし、今後ほかのOSも試していきます。

OSを無事にインストールし、完成後の環境はこんな感じです。

全体図

環境構築図

ケースがないのが残念ですがそこはおいおい追加していくこととしましょう。

さてOSのインストールをして遊んでいきたいと思います。OSは上記通りRaspbianを使用します。

無事にインストール完了しました(写真を撮り忘れました)。さっそくRaspbianを日本語化しようとして、いろいろいじっていると問題が発生しました…

なんとOS起動時の緑のランプが点灯せず、起動してくれません。SDが熱くなっているように感じて一度電源を落としたのですが、その際に電源コードをきちんと終了せずに抜いたようです…

慌ててSDカードを抜き差ししたりしてみましたがビクともしません。SDカードはやけどするわ!ってくらいに高熱になっていました。

 解決策をいろいろ調べたり、パソコンに接続して再インストールも試みましたがどれも出来ず…(SDカードがそもそも読み込めなくなった)

 

仕方なく、予備のSDカードにOSをインストールし直しました。はたしてついてくれるか…

デスクトップ画面

 よかったー!無事に起動してくれました。これで改めてセットアップを進めていきます。

3. Raspberry Piのセットアップ

 セットアップや日本語化などを以下のサイトを参考に行っていきます。

ai-coordinator.jp

 サイトを見ながら順調に手順を進めていきました。Picameraの手順を進めていくと無事に起動できました。うちのACアダプタちゃんもしっかりと映っています。

 しっかり起動も確認し、安心安心。さあ、続きの工程を進めていこうか…どう切るのかな?

プログラム上ではsleep(10)となっていたため、すでに元の画面に戻っていてもいい頃なのにまったく戻ってくれません。

電源を抜いたせいでSDカードが死んだことがトラウマにあるため、どうにかコマンドで解決できないかを捜索。

捜索すること30分…

sshを用いて別のPCから切ることが出来ると判明したものの、enableにしてないことを思い出し絶望しました…

仕方なく電源を抜き、再びつくことを全力で祈ります。

 

結果、つきましたー!コードを確認してみると、


    from picamera import PiCamera
    from time import sleep
    
    camera = PiCamera()
    
    camera.start_preview()
    sleep(10)
    camera.stop_preview
    

camera.stop_preview()の()を忘れてました。超絶凡ミス…。

()を修正して再びトライすると、無事についてくれて非常に安堵した午前2時半でした。

 残りのチュートリアルは気が向いたときにでもトライしていきます。

 

次回

次回は、ついにやってみたかったラズパイ + 物体検出(YOLO)をやっていきます。