マインド・エンジンの全貌　～第２回～

# 前回に引き続き

　マインド・エンジンがどのように名詞（クラス）や動詞（メソッド）を管理、処理しているのかを[前回](https://qiita.com/stk2k/items/98a5eadd574d50d43b9c)に引き続き解説します。


# 今回のテーマ：　【マインド・エンジン23】ＡＩ技術者が、見て見ぬふりをしてるものとは

　今回のテーマとなる動画は、[こちら](https://www.youtube.com/watch?v=JkvmiQh0i4g&t=2s)にて公開中です。

<iframe width="460" height="400" src="https://www.youtube.com/embed/JkvmiQh0i4g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 【ポイント】
- 物体を認識したからといって、その物体の状態や挙動の意味を理解できたわけではない
- 「見える」とか「ある」を感じるのは、意識があるから
- 今回のマインドエンジンでは、物体を認識した後、それらを「オブジェクト」として生成する
- 生成されたオブジェクトを専用スクリプト言語上で扱う
- 名詞概念と動詞概念の違い
- 今回のマインドエンジンでは、動詞の意味理解が可能になった


## 仮想世界とは

　仮想世界とは、マインド・エンジンの中核をなす考え方の１つです。それは、「意識は現実を直接認識せず、**仮想世界**という脳が作り上げた仮想空間を介して認識する」というものです。詳しくはロボマインドの[YouTubeチャンネル](https://www.youtube.com/channel/UCF7k8BrfIwPSennLMByxyuQ)または書籍『[普通に会話ができる ドラえもんの心のつくり方１](https://www.amazon.co.jp/dp/B08R3JZZ7W/)』をご参照ください。

## 前回のおさらい

- 名詞とは何か：　視界から切り出した「モノ」＝クラス
- インスタンス化するとは：　切り出した「モノ」の状態管理をするメモリ領域を確保（=new）すること
- 動詞とは何か： クラス（名詞）に実装されたメソッド。メソッドの実行によってオブジェクトの内部状態が変更される。

## 物体認識について、もう少し掘り下げてみる

　AIが視覚を処理して「誰が何をしているシーンか」を認識するタスクがあるとします。このタスクは

```mermaid
graph LR
    A["物体認識"] --> B["名詞（クラス）の判別"] --> C["インスタンス化"] --> D["モーション認識"] --> E["動詞の認識"]
```
　　　　　　　　　　　　　　　図１　シーンの認識タスク

　このように5つのサブタスクに分割されます。

　前回、物体認識の詳細には触れませんでしたが、物体認識には「エッジの抽出」というサブタスクがさらにぶら下がります。「エッジ」とはモノの輪郭のことです。つまり、リンゴの画像を見て「これはリンゴだ」とコンピュータが認識するには、まず画像から「リンゴの輪郭」を取り出す必要があるわけです。

　これは何故かと言いますと、画像にはリンゴ以外の画素（模様）が含まれている可能性があり、それらは明確に識別対象（この場合はリンゴ）と分けられている必要があります。

　例えば、リンゴのすぐ後ろにトマトとメロンが映っている写真があったとして、リンゴの部分のみを「リンゴ」と認識するには、どの画素がリンゴに属していて、どの画素がリンゴに属していないか明確に判定できなければ、「ここまでがリンゴの画素で、ここからはトマトの画素」と判別できず、そのあとの「この領域はリンゴ（Apple）」というクラスの判定ができなくなってしまいます。
　このように認識する対象の輪郭を検出することを「エッジ検出」と言います。

![apple_tomato_melon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17003/718b0d88-ebd5-2e6e-20f1-fa53d6941982.png)
　　　　　図２　リンゴ・トマト・メロンが置かれた机の画像

![apple_tomato_melon2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17003/d5c45e86-dfb7-af36-cd75-7f4bcbef92d0.png)
　　　　　　　　　　　　　図３　エッジ検出（黄色）


　厳密には、エッジを検出しなくても物体認識できるケースもあります。色や画素の位置関係などの特徴量を元に物体認識する場合です。ですが、人間の脳はどうやらエッジによって物体を認識する方法を主としているようです。

## エッジを検出した後にすること

　エッジを検出した後（もしくはエッジ検出と同時に）は、DL（ディープラーニング）等の技術を使い、事前に「リンゴ」に分類された画像とのマッチングを行います。類似度が一定割合を超えていれば、そのエッジ内の物体は「リンゴ(Apple)」である、と判定します。

　この作業は「ラベル付け」といったりします。

　ラベル付けにより、ただの画像に「オブジェクト（物体）の位置、種類、個数」の情報が付加されるということになります。

![apple_tomato_melon3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17003/09c169b6-221a-b914-9ef4-d1ee28714cc0.png)
　　　　　　　　　　　　　図４　ラベル付け

## 「モノ」を識別する

　ラベル付けによって、ただの画像から「モノ」を切り出すことができたわけですが、その際にその「モノ」を識別するために「名前」を付ける必要があります。

　単純に「リンゴ（Apple）」としてもいいのですが、そうすると認識できるオブジェクトの種類が増えてきたときに問題が出てくるケースがあります。

　例えば、「リンゴ」という名前の芸人さんもいますし、「リンゴ」という名前の自動車があるかもしれません。それらをすべて「Apple」としてしまうと誤認識の原因となります。

　そこで、マインド・エンジンでは「ドメイン」という考え方を持ちいてこの誤認識を避けています。

　　　　　　表１　ドメインとクラス名

| ドメイン | 名詞 | クラス名 | 説明 |
|:-:|:-:|:-:|:-:|
| フルーツ | リンゴ | Fruits.Apple  | 果物の「リンゴ」 |
| 芸人の名前 | リンゴ | Comedian.Apple  | 芸人の「リンゴ」  |
| 自動車の名前 | リンゴ | CarNames.Apple | 自動車名の「リンゴ」 |


## 名詞を管理する

　「モノ」の名前である「名詞」が増えてくると、それを管理する「仕組み」が必要になってきます。マインド・エンジンではこのような大量データを簡易データベースシステムである「**SQLite**」を利用しています。

　そして、この名詞データベースを保守する専用ツールも持っています。下図５は、マインド・エンジンの名詞データベースを管理するツール、「**OntologyClient**」です。

![ontology_client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17003/3deadbf9-3b68-270c-cb1b-5c5600e3a8f8.png)
　　　　　　　　　　図５　名詞（オントロジー）管理ツール／OntologyClient

　「名詞」は単独の情報、つまり「りんご」であれば「りんごはどういう性質（属性）を持っているか」といった情報のほか、「どういうグループ（名詞の仲間）に所属しているか」や「ある名詞が他の名詞を含んでいる（包含関係）」といった情報も持っています。そういった名詞どうしの関係を定義したものを「**オントロジー**」と言います。マインド・エンジンのオントロジーデータベースを扱うのが、OntologyClientというわけです。

## 関連(**Relation**)とは

　名詞どうしの関係性を「**関連(Relation)**」といいます。表２はマインド・エンジンのオントロジーデータベースで定義可能な関連の一覧です。

| 関連名 | 関連キー | 説明 |
|:-:|:-:|:-:|
| 継承 | is-a | AはBを継承している　例）りんごは果物を継承している |
| 所有 | has-a  | AはBを所有している　例）自動車はエンジンを所有している |
| 属性 | has-attribute | AはBという属性を持っている　例）物体は「重量」という属性を持っている |
| 同値 | equals | AはBと同じ意味である　例）「りんご」と「リンゴ」「林檎」は同じ意味である |
| 動作 | can | AはBをすることができる　例）自動車は走ることができる  |

　この中で「動作」については名詞と**動詞**の関係になっていますので他と少し違います。**動詞**については別の回でまとめて説明します。

　果物の「リンゴ」は果物の一種ですから、「**果物**」クラスを「**継承**」していると言えます。これを図にすると以下のようになります。

```mermaid
classDiagram
    果物 <|-- リンゴ
```
図６　果物クラスとリンゴクラスの関係

またリンゴの構造を細かく見ていくとヘタと実の部分に分かれますから

```mermaid
classDiagram
    果物 <|-- リンゴ
    リンゴ *-- へた
    リンゴ *-- 実
```
図７　リンゴの構造

このように「**コンポジション**(◆から伸びている線)」で表すことができます。
マインド・エンジンでは「集約」「コンポジション」は区別せずに「has-a」関連として定義しています。

このような感じで、名詞、および名詞どうしの関連をオントロジーデータベースに定義することで「**クラスファイルの自動生成**」が可能になります。

クラスの自動生成は少し複雑なので別の回で説明することにします。
ここでは、オントロジー編集ツールで設定した名詞（クラス）の属性や関連から、以下のようなソースコードを生成できると思ってください。

```csharp
class Fruits.Apple extends Fruits.Fuits
{
    field stalk:Stalk;
    firld mesocarp:Mesocarp;
}
```

「Stalk」は「へた」、「Mesocarp」は「実」の部分と思ってください。
このクラスはマインド・エンジンスクリプトにおける「**クラスファイル**」になります。
クラスファイルには

- クラス名（class以降）
- 継承元(extends以降）
- フィールド（field以降）
- メソッド（method以降）

がテキストで記述されます。
このクラスファイルを見ると、Fruits.Appleすなわち「リンゴ」はFruits.Fuits、すなわち「果物」から継承しており、「へた（Stalk）」と「実（Mesocarp）」をそれぞれ１つずつ持っていることが分かります。

このクラスファイルにはメソッドは定義されていませんが、もしメソッドがある場合はそれをスクリプトから呼び出すことでそのクラスのオブジェクトまたは他のオブジェクトの状態を変化させることができます。
（これが動詞の意味となります。別の回にて解説）

## まとめ

- 物体認識には「エッジ検出」と「ラベル付け」のタスクに分けられる
- ラベル付けの後、モノを正確に識別するために細分化されたクラス名を使用する
- 名詞そのものの情報（属性など）と名詞どうしの関連を定義したデータベースを「オントロジー」という
- オントロジーからクラスファイルを自動生成し、利用する

## 最後に

　株式会社ロボマインドではこれまでにないAI、『マインド・エンジン』の制作に一緒に携わっていただける開発者の方を募集しています。下記に興味または実績がある方はふるってご応募ください。お待ちしています！

- ディープラーニングの知識または技術をお持ちの方
- ディープラーニングに詳しくなくても、AIの開発に興味のある方
- 自然言語処理の知識または技術をお持ちの方
- AI技術の応用（メタバースやロボット等）に関心のある方
- C#、Java等オブジェクト指向プログラミングの経験のある方

 ご応募は会社の[採用応募フォーム](https://robomind.co.jp/saiyoujouhou/)または私の[Twitter](https://twitter.com/stk2k)までDMをお願いします。

### 次の記事

https://qiita.com/stk2k/items/9608b08a331960835d32

### 前の記事

https://qiita.com/stk2k/items/98a5eadd574d50d43b9c