物体検出+クラス分類で白のトイプードルの画像収集

やること

以下のようなことがやりたいです。

  1. 様々な画像がフォルダに含まれている

    f:id:wada0421514:20191102113725p:plain

  2. 白のトイプードルだけ取り出して保存する

    f:id:wada0421514:20191102113729p:plain

学習

学習用の画像準備

347枚の犬が写っている画像を集めました

各画像にラベルを付けました

  • 白のトイプードル : 164枚

  • それ以外 : 183枚

画像から犬部分を切り出す

犬が小さいと学習に使えないので、画像から犬部分を切り出します

学習済みの物体検出モデルYOLOv3を使いました

クラス分類モデルVGG16を学習する

集めた犬の画像で学習します

50epochで収束しました

バリデーションの精度は95%でした

推論

  1. テスト用の9枚の犬画像があります

    f:id:wada0421514:20191102195624p:plain

  2. 物体検出モデルYOLOv3に入力し、犬部分を切り出します

  3. 今回学習したクラス分類モデルVGG16に切り出した犬画像を入力します

  4. 白のトイプードルの画像のみ取り出すことができました

    f:id:wada0421514:20191102195631p:plain

コード

作成したコードは全てgithubに上げてあります。 github.com

参考文献

qiita.com

www.itd-blog.jp

サブサンプションアーキテクチャによる知的な振る舞いの創発

サブサンプションアーキテクチャの説明

以下の画像がわかりやすいです

 従来の知能ロボットの処理系は、モジュールが縦に並んでいます。センサからの情報をモジュールが1つずつ順に処理して、最後、アクチュエータにつながります。

 それに対して、サブサンプションアーキテクチャは、モジュールが横に並んでいます。複数のモジュールが、同時に、独立に、非同期に、動いている感じです。

f:id:wada0421514:20191003062539p:plain

 

やりたいこと

  • サブサンプションアーキテクチャを試せるシミュレーションソフト、SB-MASEを利用します
  • 知的な振る舞いをするエージェントを作りたいです。つまり、賢そう、複雑そう、考えてそう的な動きをするやつを作りたいです

 

SB-MASEの説明 

2枚目の画像がシミュレーション世界です。赤いやつがエージェントです。

1枚目の画像は、このエージェントの中身です。サブサンプションアーキテクチャでエージェントの動きを構築できます。

f:id:wada0421514:20191003062948p:plain

f:id:wada0421514:20191002174350p:plain

 

やったこと

  • サブサンプションアーキテクチャを1層ずつ重ねていく
  • 最終的に5層にして、「獲物がいないなら待機、直進を繰り返す。いるなら追いかける。見失っても数秒その方向に進む。エージェント」を作る

 

1層
  • WALK:ひたすら直進する

→ひたすら直進する

f:id:wada0421514:20191002174219p:plain

2層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける

→障害物を避けながら、ひたすら直進するf:id:wada0421514:20191002174238p:plain

3層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける
  • PROWL:獲物がいないなら待機。いるなら直進
  • STEER:獲物の方向に向き変更

→獲物がいないなら待機。いるなら追いかける

f:id:wada0421514:20191002174242p:plain

 

4層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける
  • PROWL:獲物がいないなら待機。いるなら直進
  • STEER:獲物の方向に向き変更
  • PROWLKEEP:見失っても、直進を数秒続ける

→獲物がいないなら待機。いるなら追いかける。見失っても数秒その方向に進む。

f:id:wada0421514:20191002174245p:plain

 

5層
  • WALK:ひたすら直進する
  • AVOID:障害物があったら避ける
  • PROWL:獲物がいないなら待機。いるなら直進
  • STEER:獲物の方向に向き変更
  • PROWLKEEP:見失っても、直進を数秒続ける
  • EXPLORE:直進、待機を繰り返す

→獲物がいないなら待機、直進を繰り返す。いるなら追いかける。見失っても数秒その方向に進む。

f:id:wada0421514:20191002174248p:plain

 

動画

以下のリンクで、5層サブサンプションアーキテクチャのエージェントの動きが確認できます。緑のやつです。

youtu.be

 

考察と結論

  • 賢そうな動きをするエージェントを作ることができました
  • 構造はかなりシンプル
  • 推論、記憶などは実現できるのか?
  • ハードウェアレベルで実装して身体性と絡めたい

2019年、学部3年、夏季休暇研究

自分で以下のテーマを設定しました

「夏季休暇の15日間を使って、研究っぽいことをしてください」

この結果についてまとめます。

 

1. やったこと、時間的な流れ

1-4日目

人工知能関連にしようと決めました。人工知能関連の論文を読みました。

その後、サブサンプションアーキテクチャ関連に絞りました。

 

5-8日目

サブサンプションアーキテクチャ関連の論文を読みました。

サブサンプションアーキテクチャを試せるシミュレーションソフト、SB-MASEを見つけました。

具体的なテーマを、「サブサンプションアーキテクチャによる知的な振る舞いの創発」に決めました。

 

9-10日目

SB-MASEで、サブサンプションアーキテクチャを構築、実装しました。

具体的な内容は後ほど、説明します。

 

11-13日目

人工知能学会誌を読みました。201905、201907、201909。

 

14日目

今後の展開について検討しました。

 

15日目

内容をパワポにまとめ、家族に発表しました。

 

2. 成果

・研究の難しさがわかった

・論文を読んだ

・情報収集のやり方がわかった

・研究テーマの実行:サブサンプションアーキテクチャによる知的な振る舞いの創発

 

・研究の難しさがわかった

研究テーマ決定が一番難しく、一番重要

  • 時間内で達成できる内容である必要がある
  • 意味のある研究である必要がある
  • 最終的な目的から、トップダウンに降ろしてくるのが難しい
  • 先行研究がどこまで進んでいるか把握する必要がある

 

・論文を読んだ

7本の論文と、2本の解説を読みました。

  • 論文:テーブル上の物体の片づけを促すためのロボットの振る舞い
  • 論文:医師国家試験自動解答プログラムの処方薬問題への拡張
  • 論文:感情表現を用いた説得対話システム
  • 論文:恒常性創発にむけた自発的同期に基づく振動子の集合体による自律制御
  • 論文:人間型ロボットのキャラクタ表現のための対話の振る舞い制御モデル
  • 論文:対話アンドロイドに対する主観的意見の帰属と対話意欲の関係
  • 論文:追加データを用いない未来の分類器学習法
  • 解説:サブサンプション・アーキテクチャ
  • 解説:サブサンプションアーキテクチャを用いたロボットの制御

 

・情報収集のやり方がわかった

  • 自分の過去の調べ学習を漁る
  • インターネットで検索する
  • 論文、特集、学会誌を読む
  • 人工知能学会、日本ロボット学会に入る
  • キーパーソンについて調べる
  • 海外の有名なコミュニティについて知る

 

・研究テーマ実行:サブサンプションアーキテクチャによる知的な振る舞いの創発

 

以下の記事で紹介します。

person.hatenablog.jp

 

3. 今後について

  • 4年の研究テーマはどうする?
  • 秋学期は何をする?
  • 脳をサブサンプションアーキテクチャでモデル化できる?
  • 方向性は、AGIの実現を目指す、で良いの?
  • 機械学習がビジネス的には強いけど、専門にしないの?

 

4. まとめ

  • 15日間で、情報収集、研究テーマ決定、研究、発表をやった
  • 研究テーマは、SAによる知的な振る舞いの創発
  • 論文を読んだ:論文7、解説2
  • 研究テーマ決定の難しさがわかった
  • 情報収集のやりかたがわかった

 

オススメの芸能人をレコメンドするアプリの実装

2択の質問に5回答えてもらい、その結果をもとにオススメの芸能人をレコメンドするWebアプリを作りました。

 

 

1:アプリの説明

2:実装について

3:感想

4:今後の展開

 

1:アプリの説明                     

STARTボタンを押して解答を始めます。

STARTボタンを押すと、図2のような2択から選択する画面に移動します。画像をクリックすることで選択することができます。5回選択してもらいます。

5回選択すると、図3のような画面に移動します。5回の選択をもとにオススメの芸能人をレコメンド結果を表示します。

 

f:id:wada0421514:20180813150759p:plain

図1 スタート画面

 

f:id:wada0421514:20180813150852p:plain

図2 2択選択画面

 

 

f:id:wada0421514:20180813150906p:plain

図3 レコメンド結果表示画面

 

2:実装について                     

芸能人の画像を集めて、それぞれの芸能人を表現するベクトルをオートエンコーダで学習して、Webページを作りました。

 

3:感想                      

画像を収集するのに苦労しました。WebAPIを使ったのですが、結構時間がとられました。

Webページの実装も手間取りました。レンタルサーバを使ったのですが、まともなWebページの制作は初めてだったので、やり方がさっぱりわからず試行錯誤しました。

ニューラルネットワーク関連の実装は学習や推論ではなく、その前後の準備、インターフェースなどに時間がかかるとよく言われていますが、自分の身をもって実感しました。

 

4:今後の展開                     

このWebアプリに関してやりたかったことがもっとありましたが、今回はこの辺で一旦、完成としました。今後やりたいことは以下です。

 

・レコメンドのアルゴリズムを改善する(現在はかなり単純)

・学習用の画像を増やす(現在は1人100枚前後)

・レコメンドされる芸能人を増やす(現在は500人前後)

・男性芸能人、犬猫など、他の対象にスケールする(現在は女性芸能人のみ)

スマホアプリ版を実装する(現在はWebアプリのみ)

・インターフェースをモダンにする(現在は最低限のみ)

・2択の回答回数を増やす100回などに増やす(現在は5回)

 

強化学習の手法まとめ

強化学習の有名な手法をまとめます。

強化学習とは、知能を、環境によって行動を決定するエージェントと見なして学習する、機械学習の1つです。

 

以前、強化学習の1つである、モンテカルロとQ-Learningは実装したので、そのリンクを貼っておきます。

 

person.hatenablog.jp

 

 

以下の順番で説明します。この他にも、SARSA、DDQN、DuelingDQN、PPOなどいろいろありますが、時間がないので割愛します。

 

1:Q-Learning

2:モンテカルロ

3:DQN

4:A3C

5:UNREAL

 

 

1:Q-Learning

 

Q-LearningはQ関数を利用する手法です。Q関数はある状態sにおける行動aによって決まり、Q(s|a)と表現されます。Q(s|a)はある状態sにおける行動aの適切さを示します。Q(s,a)が一番大きい行動をエージェントは行います。ですから、学習してQ関数の最適なパラメータを得ることで、エージェントは最適な行動がとれるようになります。Q関数は表で表現されます。取り得る状態が10種類、可能な行動が3種類である場合、(10*3)の表です。Q-Learningでは、Q関数は以下の式で更新されます。

Q(s,a)←(1-x)*Q(s,a)+x*(r+y*max(s',a'))

x,yは学習率などのハイパーパラメータです。この式で繰り返し更新することで、適切なQ関数を得ます。

 

2:モンテカルロ

 

Q-Learningと同様に、モンテカルロもある環境のある行動を評価する方法です。しかし、内容はかなり異なります。モンテカルロでは、ある行動を評価する時、実際にその行動が行われたと考えて、報酬が得られるまで、行動を続けます。その結果、得られた報酬をもとにある行動を評価します。オセロであれば、ある一手を評価するために、その一手を打ったとして決着がつくまでゲームをして、これを繰り返すことで勝率を出して、ある一手を評価します。

 

3:DQN(Deep Q-Network)

 

Q-Learningは表で表現されたQ関数を学習する手法です。しかし、表は有限であるため、できることに限りがあります。それを解決するために、Q関数を深層ニューラルネットワークで近似したのがDQNです。

 

4:A3C(Asynchronous Advantage Actor-Critic)

 

DQNにAsynchronous、Adavantage、Actor-Criticを加えた手法です。Adynchronousとは、複数のエージェントを並列に動かして、その結果を集めて学習する方法です。Advantageは数ステップ先まで考慮した報酬の計算方法です。Actor-Criticはある環境である行動をする確率と状態の価値の推定を独立に行うことで、行動が連続的でも対応できるようにする方法です。

 

5:UNREAL(UNsupervised REinforcement and Auxiliary Learning)

 

A3Cのネットワークに直接の目的とは異なる補助タスクを組み込むことで、学習をうまくさせる方法です。DeepMindから発表されたかなり新しい方法です。

 

 

参考にしたリンクを貼っておきます。

 

qiita.com

 

blog.brainpad.co.jp

 

以上、強化学習の手法まとめでした。アドバイス、改善点があればお願いします。

強化学習Q-Learningで最強のゲームAIの開発

ゲームの説明

1から順に交互に数字を言って10を言えた方が勝ちのゲームです

1ターンで数字は1つか2つ言えます。

プレイヤーは2人です。

このゲームは勝ちパターンがあるゲームです。勝ちパターンさえ把握していれば先行は必ず勝つことができます。

 

やること

3種類のAIを実装します。総当たりで戦わせ、最強のゲームAIを決定します。

 

ランダムプレイヤーの説明 

ランダムに行動を行います。

ランダムに1つ言うか2つ言うか選びます。

 

モンテカルロプレイヤーの説明

モンテカルロ法で行動を決定します。

モンテカルロ法とは、ある状態における行動を評価する方法です。自分がその行動をとったとして、そのまま最後までランダムプレイヤー同士にゲームを進めさせ、勝ったか負けたか記録します。これを何回も行い、勝率を計算して、その行動の良し悪しを評価するということです。

 今回は100回ランダム対戦させて行動評価します

 
Q-Learningプレイヤーの説明

強化学習の一種であるQ-Learningで学習し、行動を決定します。

Q-LearningではQ関数を学習します。

Q関数は、ある状態における、ある行動の評価値の配列で表現されます。今回は、状態が0から9の10種類、行動は1,2の2種類なので、Q関数は2*10の2次元配列です。

更新式は、Q(s,a)←(1-α)*Q(s,a)+α*(r+γ*maxQ(s',a'))です。sは状態、aは行動です。s'、a'は、sでaをして得られる状態s'と、そこでの行動a'です。詳しくは、以下のリンクを見てください。

qiita.com

 

対戦結果

100回対戦した結果は以下です。数値は後攻に対する先行の勝率です。

このゲームは、勝ちパターンさえ把握していれば先行が必ず勝てるゲームです。

Q-Learningは先行の時、全ての相手に対して勝率100%です。勝ちパターンをしっかり学習できています。

                                     表1 先行の勝率(%)

   後攻
先行
ランダム モンテカルロ Q-Learning
ランダム 48 19 11
モンテカルロ 80 71 64
Q-Learning 100 100 100

 

コード 

作成したコードは全てgithubに全て上げてあります。

github.com

 

感想 

ランダム、モンテカルロ、Q-Learningを実装しました。

簡単なゲーム設定ではありましたが、良い結果が得られたのでうれしいです。

kaggleチュートリアルtitanicに挑戦

kaggleは機械学習競技プログラミングみたいなやつです。これのチュートリアルtitanicをやります。機械学習によるデータ解析を実際に体験することが目的です。部屋の等級、性別、兄弟夫婦の人数、親子の人数、年齢層に対してカーネルSVMを使うことで精度82%まで行きます。

 

問題について公式の説明のリンクです。

Titanic: Machine Learning from Disaster | Kaggle

 

以下のリンクを参考にしました。英語ですが、かなりわかりやすいです。

EDA To Prediction(DieTanic) | Kaggle

 

描画のライブラリmatplotlibの解説はこれがわかりやすかったです。

bicycle1885.hatenablog.com

 

データを扱うためのライブラリpandasはこれがわかりやすかったです。

qiita.com

 

 

1:データを分析する

2:データを加工する

3:モデル選んで、学習して、精度確認

 

この3ステップでやります。

 

作成したプログラムは全てgithubに上げてあります。

github.com

 

         1:データを分析する

データを読み込みます。nullがあるデータを確認します。性別、年齢、共に乗った人、に順に注目してデータを可視化して分析しました。最後にtrain2.csvにデータを保存しました。analyze.pyです。

f:id:wada0421514:20180408105558p:plain

性別と生存率のグラフです。女性は生き残る確率が高く、男性は低いことがわかります。

f:id:wada0421514:20180408105731p:plain

部屋の等級と生存率のグラフです。上のクラスであればあるほど、生き残る確率が高いことがわかります。

f:id:wada0421514:20180408105840p:plain

まばらな感じですが、子供やお年寄りは生き残る確率が高く、中間層は低いことがわかります。

f:id:wada0421514:20180408110053p:plain

兄弟夫婦の人数は1人が生存率のピークです。0人でも生存率は下がります。また、多ければ多いほど、下がるようです。

f:id:wada0421514:20180408110420p:plain

親や子供の人数は1,2,3人だと生存率が高いです。0人だと下がります。4人以上で、かなり下がります。 

 

          2:データを加工する

年齢データ(Age)が連続値であるため、学習できないので 、年齢層で0から4の値を持つAge_bandに変換しました。性別データを0,1の数値データに変換しました。予測に必要のないデータを削除して、保存しました。convert.pyです。

f:id:wada0421514:20180408113153p:plain

 年齢層と生存率のグラフです。16歳以下の生存率が一番高いです。

 

 

         3:モデル選んで、学習して、精度確認

加工したデータを読み込みます。学習用にデータを変換します。カーネルSVMで学習して、精度確認して、終了です。精度は以下のようになりました。82%です。コードは1.pyです。

 

Accuracy(rbf SVM): 0.8208955223880597

 

 

以上、kaggleチュートリアルtitanicでした。kaggle、pandas、scikitlearn凄いです。

 

アドバイス、改善点、質問があればお願いします。