【Curious Vehicle 技術ネタ】

『Raspberry Pi を使用してスマホ操作可能なロボットを作成する』

みなさまご無沙汰しております。makino です。

  • 今回は少しRaspberry Piでお仕事させていただく機会があり、こんな小さいなら動くLinuxマシンを作ろうと『Raspberry Pi を用いたロボット作成』についてこちらで発表させていただきます!

Raspberry Pi 001

– 今回は初回なので簡単に目的を含め設計周りの説明をしたいと思います

[その1] 目的を考える

  • ただ動くRaspberry Pi を作っても面白くないので、動くための目的を考えます。
  • 今回は個人的な趣味性を強め 周りの人を『イラッ』とさせることを目的としたジョークロボットを作ろうと思います。

[その2] デザイン

  • クレパスで挫折した私にデザインというのは一番ハードルが高かったですが、木材で囲っとけばなんとなるんじゃないかとデザインはほぼ考えずホームセンターに売っている木材で積み木のように組み立てることとします

[その3] 機能を考える

  • 動きは『イラッ』っとする動きをしてくれないといけないですが、逃げ足も速くなくてはすぐに壊されるのである程度のスピードで狭いところに逃げ込むため小回りが利くくように左右別駆動の動力とします
  • 『イラッ』っとさせたのを遠くから細く微笑んで見ていたいのでロボットにストリーミング用のWebカメラも必要です
  • 動きだけでなく『イラッ』っとさせるしゃべりもしたいので、スピーカをつけてしゃべれるようにします
  • 音が出せないところだと困るのでLEDをチカチカさせて『イラッ』とさせる機能も必要です
  • ついでにディスプレイなどを消して逃亡するため赤外線機器を操作する赤外線LEDも追加します
  • コントロールはNode.js経由でスマートフォンから操作できるようにします

Raspberry Pi Mogura Robot

  • こんな感じのものが出来上がりました
  • キーボードしか叩かないひよっ子にはこれが限界でした

Raspberry Pi 003

  • 中身はこんな感じになっています

続きについて

  • 続きとしてはハードウェア編とソフトウェア編の2つを予定しています
  • 無理やりですがSolrを用いた会話機能も考えているので期待してください

こんにちは、Curious Vehicle中鉢です。

本日、弊社サービスのCLOUDSOLR上に
位置情報検索紹介用のページを作成しました。
Solrのみではなかなか視覚的にわかりづらいため、
位置情報をGoogle MapのAPIを利用して地図上にプロットし
視覚的に位置情報検索をわかりやすくしてあります。
ぜひ一度位置情報検索がどのようなものかご覧になってみてください。

https://solr.jp/map

さて、本日は上記の位置情報検索紹介用ページで利用されている
SolrのSpartial Searchという機能の説明をさせていただこうと思います。

Solrにはspartial searchという位置情報を検索するための機能があり、
その機能を使うことで

特定の地点から一定の距離の範囲内にある位置情報検索する。

といった位置情報を利用した機能を実装することができるようになります。

それでは、solr側でどういう設定をして、どういったデータをインデキシングし、
クライアント側からはどう検索できるのか、というのを順を追って説明していきます。

  1. schema.xmlの設定
    まずはSolr側の設定です。
    これはSolrのexample/solr/collection1/conf/schema.xmlの設定を
    そのまま利用しますので、すでに定義されている場合は
    飛ばしてしまってかまいません。

    <!-- locatoinというfieldTypeと
     *_p、*_coodinateというdynamicFieldを設定します -->
    <!-- example/solr/collection1/conf/schema.xml には
    すでに定義されているので、そこから変えていなければ
    追加する必要はありません。 -->
    
    <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
    <fieldType name="location"
     subFieldSuffix="_coordinate"/>
    
    <!-- Type used to index the lat and lon components for the "location" FieldType -->
    <dynamicField name="*_coordinate"
     type="tdouble"
     indexed="true"
     stored="false" />
    ・
    ・
    ・
    <dynamicField name="*_p"
     type="location"
     indexed="true"
     stored="true"/>
    
  2. データのインデキシング
    次に「*_p」のダイナミックフィールドに対して緯度経度のデータを
    投入します。ここでは「point_p」というフィールドに対して
    東京駅、有楽町駅、銀座一丁目駅、京橋駅、大手町駅の
    緯度経度データをインデキシングしています。以下のinput.xmlを新たに作成し、
    その下のcurlコマンドでインデキシングしましょう。input.xml

    <add>
      <doc>
        <field name="id">東京駅</field>
        <field name="point_p">35.680777,139.766969</field>
      </doc>
      <doc>
         <field name="id">有楽町駅</field>
         <field name="point_p">35.67506,139.763312</field>
      </doc>
      <doc>
        <field name="id">銀座一丁目駅</field>
        <field name="point_p">35.674529,139.766777</field>
      </doc>
      <doc>
        <field name="id">京橋駅</field>
        <field name="point_p">35.676664,139.770092</field>
      </doc>
      <doc>
        <field name="id">大手町</field>
        <field name="point_p">35.684786,139.766065</field>
      </doc>
    </add>
    

    curlでインデキシング

     $ curl "http://localhost:8983/solr/collection1/upadte?commit=true" --data-binary @input.xml -H 'Content-type: text/xml; charset=utf-8'
    
  3. 検索方法
    最後にクライアント側からインデキシングされたデータを検索します。
    今回は東京駅から1km圏内の位置情報を検索するというクエリを投げてみます。

    http://localhost:8983/solr/collection1/select?q=*:*&fq=%7B!geofilt%20sfield%3Dpoint_p%7D&pt=35.68096041340794,139.76710081100464&d=1 

    上手くいくと5件データがヒットするはずです。
    渡されたパラメータについて詳しく見ていくと以下のようになっています。

      q  *:* インデキシングされた全件検索を指定
      fq  {!geofilt sfield:point_p} 距離によるフィルタ、フィールドはpoint_pを使用
      pt  35.680??,139.767?? 検索の基準となる位置情報、緯度、経度をカンマ区切りで指定。
      d  1 検索の基準となるptパラメータの位置からこのパラメータに与えられた数値km範囲内の位置情報を検索

上記のようにSolrからは
非常に簡単に位置情報の検索ができるようになっています。
自社で位置情報をたくさん持っているというところがあれば
面白いサービスを提供できるかもしれません。

 

それではまた!

 

【12/10】 追記

位置情報検索を実施する上で設定が必要なフィールドが足りなかったため、「*_coordinate」のダイナミックフィールドの記述を追記しました。

 

 

 

 

 

 

 

【Curious Vehicle 第14回 勉強会ネタ】

『Solrを利用した画像検索について』 Part2

また2週間ほど空いてしまいました。お疲れ様です.makino です。

* 今回は先日の第11回 Solr勉強会でお話しさせていただいた『Solrを用いた画像検索システム』について継続して共有をさせていただきます。

* 今回は特徴情報をSolrのIndexデータとしてまとめる部分についてご説明いたします!

【解説】Solrで画像を検索するための3ステップ Part2
Solrによる画像検索-2 001

・Part1で行った画像データの特徴情報化だけでは情報量が多くまた計算量も増えてしまうため、『特徴情報のクラスタリングによるWORD化』を行います。

クラスタリングアルゴリズム:K平均法クラスタリング(K-means)

  • クラスタリングアルゴリズムとしてK平均法クラスタリングを簡単にご紹介します
  • K-means は 入力データを k個のクラスタに分類する単純な分類機アルゴリズムです
  • ランダムに振り分けたクラスタから各クラスタの重心を測定し、重心に近い座標で 再度重心計算とクラスタリングを繰り返すクラスタリング手法です

Solrによる画像検索-2 002

  • 上記の図はクラスタリング数を2として 重心計算を20回繰り返した結果を示しています

K平均法クラスタリングによるクラスタリング処理の流れ

  • 前回の復習も含め どのように動くか流れを見てみます!
    1. 解析用の画像を準備します

    Solrによる画像検索-2 003

      今回は画像の特徴量情報を検索軸として利用するため、色情報をカットします

    Solrによる画像検索-2 004

      SIFT特徴量アルゴリズムを実施し、特徴が検出された地点にプロットしています

    Solrによる画像検索-2 005

      K平均法クラスタリングを利用し画像の特徴情報のクラスタリングを行います

    Solrによる画像検索-2 006

      クラスタリング結果をヒストグラム化し、SolrのWORD情報として切り出します

    Solrによる画像検索-2 007

* これらのクラスタリング処理も検索画像すべてに実施します
* 勉強会の際はクラスタリング数を全画像100固定でクラスタリングを行っています
* この状態でやっとSolrに投入できる状態のデータが出来上がりましたので、『Solrによる画像情報の検索』へ進みたいと思います

Tips:Solr勉強会以降の進展について

その1:特徴量とクラスタリングの数のチューニングについて

  • 前回、特徴量の数に比例させk-meansによるクラスタ数を変化させるようなチューニングでは検索精度の向上という部分とは紐づかなかったと書かせていただきました
  • こちらの改善として精度向上が見られた点を共有したいと思います
  • Part1でのTipsにも書きましたが、検索精度が低い画像は総じて特徴情報の量が少ない傾向がありました。
  • 情報量が少ない画像は画像加工処理を追加し画像を回転させて再度特徴情報を取得することである程度安定した特徴量の抽出が行え、検索精度の高い向上が見られました
  • Sift特徴量のアルゴリズムでは、特徴が発生した座標やアングル情報を持っていますが今回の画像検索では汎用性という意味でこちらの情報を利用せず特徴情報のみで類似検出を行っているためこのような結果につながっていると思います
  • 用途が絞られるような画像検索であればもっとピンキーなチューニングにより精度向上が狙えると思うのですが、汎用性を踏まえ検証したところでは上記のようなチューニングで高い効果の確認ができました
  • 作業量の多そうな検証を省いたわけでなありません!たぶん!
【Curious Vehicle 第14回 勉強会ネタ】

『Solrを利用した画像検索について』

みなさまご無沙汰しております。makino です。

* 今回は先日の第11回 Solr勉強会でお話しさせていただいた『Solrを用いた画像検索システム』についてこちらで発表させていただきます!

* テキストデータの検索ツールであるSolrで画像検索も行えたら今までとは違うインターフェースやサービスを作れるのでは!?
* Solr勉強会で話をさせていただいた時よりも改善を加えていますのでお付き合いいただければと思います!

【解説】Solrで画像を検索するための3ステップ
Solrによる画像検索 001

・画像情報はそのままでは検索が行えないので、Solrが得意なテキスト形式に画像データを加工していきます。
・そのファーストステップとして、『画像の特徴情報の抽出』を行います。

特徴点抽出アルゴリズム:SIFT特徴点解析

  • まず特徴点抽出アルゴリズムとしてSIFTの概要をご紹介します
  • SIFTアルゴリズムは画像内の特徴点の検出を行い、座標やスケールなどの情報を応答として抽出します
  • SIFTでは各特徴点毎に以下の情報が取得できます
    1. x座標
      y座標
      スケール
      回転角度
      対応する128の記述子

SIFT特徴点解析による特徴点抽出の流れ

  • どのように動くか流れを見てみます!
  • Solr勉強会の際は、著作権的にNGな画像を多量に使ってしまいましたが、今回は弊社のロゴで許してください
    1. 解析用の画像を準備します

    Solrによる画像検索 002

      今回は画像の特徴量情報を検索軸として利用するため、色情報をカットします

    Solrによる画像検索 003

      SIFT特徴量アルゴリズムを実施し、特徴が検出された地点にプロットしています

    Solrによる画像検索 004

      特徴のベクトルをサークルの大きさで表示しています

    Solrによる画像検索 005

      実際は各特徴点ごとに以下のような情報が数値化されて取得できます

    Solrによる画像検索 006

* これらの解析処理を検索画像すべてに実施します
* この状態ではまだSolrのword情報(Term)としては少し情報が荒いため、『特徴情報のクラスタリングによるWord化』へ進みたいと思います
* 勉強会の際にお見せしたデモサイトも近いうちに公開したいと思います。よろしくお願いします!

Tips:Solr勉強会で質問いただいた点について
質問1:特徴量とクラスタリングの数のチューニングについて

  • 今回はクラスタリング数をを100固定としてしまいましたが、今回の検索精度を上げるための1番のチューニングポイントだったのでまず検証を進めました
  • 結果からとなりますが、特徴量の数に比例させk-meansによるクラスタ数を変化させましたが、検索精度の向上という部分とは紐づきませんでした
  • ただこちらを調べているうちに特徴点の数が画像によりだいぶ検出数が異なっていることを確認しこちらを改善することで検索精度の大きな向上が見られました
  • k-meansは計算量を減らすためのアプローチとして利用していますが、検索精度という意味でのアプローチではないため、DeepLearningや教師有り的なアルゴリズムへ次はチャレンジしようと思います

質問2:tf-idfにより画像の特徴がロストしてしまわないか

  • 画像の特徴から作り出したTerm情報の頻度分布を見てみましたが、小さい特徴の塊が6~7割の割合を占め大きな特徴情報がうまくロングテールとなり検索精度の向上に繋がっているように見られました

※ 質問いただいた方とは、先日のトレジャーデータさんの懇親会でまたお会いしました。まさかトレジャーの方だったとは

こんにちは、Curious Vehicle中鉢です。

前回はSolrCellを経由してHTMLの内容をインデキシングしてみました。

今回はその他いろいろなファイルをインデキシングしたり、

パラメータによってSolrへのインデキシングの内容を

制御したりしてみようと思います。

いろいろなファイルを読み込ませてみる

前回はHTMLファイルを読み込ませてみて

  • title
  • links
  • content-type
  • content
  • _version_
といった内容のデータが取れることがわかりました。
今回はそのほかのOffice、PDFといったファイルを読み込ませてみようと思います。
とりあえずはTikaのSupported Document Formatsのページから適当に
いくつかピックアップして読み込ませてみました。
【Curious Vehicle 第12回 勉強会ネタ】

『遺伝的アルゴリズムについて』

みなさま初めまして。makino です。

それでは今回のネタですが、『アルゴリズム』として『遺伝的アルゴリズム』を取り扱います。

そうアルゴリズム!魅惑の響きですね。最近まったくそういった響きとは離れた作業ばかりしていますが、面白い技術を広く書き連ねていきたいと思ってます!

【解説】遺伝的アルゴリズムについて

  • 遺伝的アルゴリズムは、生物の進化をプログラムで表現するAIアルゴリズムの1種です
  • 生物の進化は世代交代を繰り返すごとに染色体の情報をクロスオーバし、環境などに適用するよう常に進化します
  • この動きをアルゴリズムとして表現したものが遺伝的アルゴリズムとなります

遺伝的アルゴリズム 001

  • ある一定の確率で突然変異を発生させるアルゴリズムも必要です
  • 突然変異の必要性は後半にあるサンプルを確認してみてください

遺伝的アルゴリズム 001

  • アルゴリズムフローは 以下の2~3を繰り返し進化を行います

遺伝的アルゴリズム 001

    1. 第1世代の作成 (初期化)
    2. 適応性の評価
    3. エリートの選択
    4. 進化 (新世代の作成)
  • 世代交代を繰り返すことで徐々に徐々にこちらが求める水準まで各ゲノムが進化していきます!

【サンプル】 遺伝的アルゴリズムサンプル

  • では非常に見ずらく申し訳ないのですがSampleでもご覧ください
  • このサンプルは、以下の表にある条件で繰り返し実行します
  • サンプルなので、各染色体の値が1となる(合計50となる)ゲノムが優秀として評価する単純な評価で進めます

遺伝的アルゴリズム sample 004

1. 第1世代作成 (初期化)

    • 初期化として、第1世代となるゲノム因子をランダムにて作成します
    • 適応値についても20前後の低い値のゲノムが揃っています

遺伝的アルゴリズム sample 001

2. いきなりですが、80世代目まで経過しました

    • 適応性も 20前後だったのが、40台まで成長しています
    • ココで注目していただきたいのは、赤でくくられた 全世代が “0” の の染色体があります
    • 通常のクロスオーバでは、この染色体はいつまでたっても、“0” のままですが ...。

遺伝的アルゴリズム sample 001

3. またまた飛びますが 100世代目

    • 親が “0” の因子しかもっていなかった要素に “1” を持つゲノムが発生しています
    • 突然変異(1%) により、絶対生まれてこない条件で必要な”1″の因子が発生しているのがわかります
    • 今回では約 100世代 目で 必要な 50の適正値を持つゲノムが発生しました

遺伝的アルゴリズム sample 003

【まとめ】 遺伝的アルゴリズムとは

  • 統計アルゴリズムではありますが、AI的なアルゴリズム
  • 問題の予測が難しい場合 などに有用 (サンプルは単純すぎますが...。)
  • EC系でも、ロングテイルではなく優良顧客に特化した情報パターンを検出したい場合などに有用
  • ゲノムごとに分散が可能なので、MapReduceなどとも相性がよさそうです
こんなところで今回はまとめとさせていただきます!!

はじめまして。Curious Vehicleの中鉢と申します。

本日よりCurious Vehicleの技術ブログを書くことになりました。

個人的に興味のあることや、いただいたお仕事を通じて

身に着けた技術、またハマった点などを

つらつらと書き綴っていこうかと思っています。

さて、本日は弊社でもコンサルティングを行っている

Apache Solrの一機能であるSolrCellについて

少し調べてみましたのでその調査内容なんぞを書いていきたいと考えています。

SolrCellとは

PDFやMSOffice文書のようなバイナリファイルや画像、音声のファイル等から

テキストデータ、メタデータなどを抽出しSolrのインデックスデータを作成、

更新する機能となります。

テキストデータの抽出にはApacheプロジェクトのTikaというソフトウェアを

利用しており、抽出できるファイルの種類もTikaのものに準じることになります。

※サポートしているフォーマットはTikaのサイトを参照ください。

http://tika.apache.org/1.2/formats.html

Read on »