iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

車検って何をしているのか知らなかったので調べてみた

TCDのタキヤマです

半年前くらいに更新した時は2018年のダイビングについてでしたね。
2019年は宣言通り伊豆で潜ってきましたが、沖縄と比べてしまうと…といった感想です。

さて、今回は趣味から離れて車の話にしてみようと思います。
というのも、弊社は車関連の案件に関わることも多いのですが、私自身まったく車に興味がありません。

自分の車を持っていますが、当時周りの人がそこそこ乗ってる車と一緒でいいや
で選んだ車に乗り続け、先日15年目の車検を通したところです。
不具合が出てないからまだいけるかなとも思いつつ、そろそろ買い換えも検討しないといけないんだろうけど、乗りたくない車は数あれど、乗りたい車はこれといって無い
とぐだぐだしているうちに車検の時期が来てしまったのですが…。

ということで、今回は車に興味が無いと分からない車検で出てきた見積もりについて、
分からない人目線で調べてみました。

続きを読む

そろキャン▽

新年あけましておめでとうございます。
本年もよろしくお願い致します。

どうも、インドア派のオタク、三浦です。
インドア派、とはいうものの別に体を動かすのが嫌いなわけではなく、ハマればちゃーんと外に出ますとも。
以前にもボーリングやらサバゲーやらバドミントンやらにハマっていた時期もありますので。8:2か9:1でインドアが好きってだけです。


と、いうことで今回は、2年ほど前に放送されたアニメの影響でソロキャンプに行ってきたお話です。
自分に限らず多くのオタク達をアウトドアに駆り立てた某アニメの影響を受け、アニメ放送後から常々キャンプに行ってみたいと思っていましたが去年の10月末に遂にソロキャンデビューしてきました。
世間では即位の礼とかで賑やかだった裏で。
f:id:ipx-writer:20200108231345j:plain

続きを読む

UE4で強化学習環境を動かし、学習状況を可視化する(Part2)

はじめに

ご無沙汰しております。iPXのabikoです。
あれよあれよという間に、気がつけば年の瀬が近づいて参りました。
皆さまお体に気をつけて、よいお年をお迎えください。

前回までのあらすじ

前回強化学習の学習状況の可視化をやってみようとUnrealEnginePythonを導入しました。
そして、UnrealEnginePython付属のPythonEditorでコードを実行し、いつものアニメーションが再生するところまで確認できました。

今回はUE4内にオブジェクトを作成して、学習中のカートの位置・ポールの角度を反映し、実際に可視化まで行っていきます。
※前回に引き続き、学習自体は行いません。可視化がメインです。
 強化学習環境にはOpenAI Gymを使用し、行動はランダムで与えます。

では、張り切っていきましょう!

続きを読む

東京モーターショーに行ってまいりました

こんにちは、chibaです。
タイトル通り東京モーターショーの話を少ししたいと思います。
もう開催からだいぶ経過し今更ではありますが、2年に1度の催事を取り上げないのももったいないというもの。
ごゆるりと。

続きを読む

SKKについて

近況

ひさしぶりの投稿になります。砂子です。年の瀬の、寒さの身にしみる季節となりました。12/09に本社の引越しがあり、真新しいオフィスでの勤務に励んでおります。 さて、皆様は日本語を入力する際にどのIMEを使用しているでしょうか?OSに標準で備わっているIMEを使ている方が多いはずですが、メジャーなところでは以下のような選択もあります。

本記事では私がEmacsで使用してる入力方式SKKの簡単な紹介とその機構の一部である辞書サーバの実装を試みたのでその紹介を行います。

SKKとは

SKKとは Simple Kana to Kanji conversion program の略となります。詳細はWikipediaなどに譲るとしてその大きな特徴はかなと漢字の区切りをユーザが指定することでしょう。

具体例でみてみましょう。「猫が部屋で寝ている。」という文章をWindowsIMEで入力することを考えます。打鍵するキーを英字(a-zA-Z)とスペース(␣)で表すと下記のようになります。(変換は一回で完了とする)

nekogaheyadeneteiru.␣

SKKでは下記のようになります。

Neko␣gaHeya␣deNeTeiru.

SKKの打鍵には所々に大文字の英字があります。これは2つの規則によるものです。一つ目の規則は漢字の始まりであることです。「猫が部屋で寝ている。」では漢字「猫」、「部屋」、「寝」の始まりのかな「ね(猫)」、「へ(部屋)」、「ね(寝)」に対応しています。2つ目の規則は漢字の送り仮名の始まりであることです。「猫が部屋で寝ている。」では「て」に対応します。

このようにして漢字とかなの境界を明示的に入力することで変換を行うときに曖昧さがなくなり変換する文節を間違えることはありません。SKK以外であると文を入力後に形態素解析などの技術を利用して文節を推測するため時には予期しない変換が行われていることがあります。

ちなみにSKKは入力方式の名称で具体的なIMEとしては下記のようなものがあります。 * AquaSKK(Mac) * SKK日本語入力FEP(Windows)

DDSKKとは

DDSKK(Daredevil SKK)はEmacsで専用のIMEです。つまり、Elispで実装されたEmacsでの日本語入力のみを実現するためのIMEです。

なぜOS標準のIMEを使わず、そんなIMEが使うのか?Emacsは非常に古いソフトウェアであるせいか、OSのIMEでの入力がダメな場合があるためです。いままでFedora、Arch、Manjaro、UbuntuのさまざまなLinuxディストリビューションでインストールされたEmacsIMEを使いました。しかし、Emacs内で日本語の入力を試みると変換候補があらぬ位置に表示されたり、そもそも反応しないことも多々ありました。さらに最近ではWindow10上でWSL+X410でEmacsを使っていますが、全角/半角キーを押すと`(バッククオート)が入力される始末です。

以上の理由からElispで実装されEmacsのみに依存しているDDSKKを使用しています。

辞書サーバ(SKKserv)

IMEは辞書が必要です。入力されたかなに対応する漢字を保持するためです。設定なので会社固有のキーワードを登録したり、外部の辞書をインポートして使用している方もいるかと思います。

SKKにも辞書がありファイル形式で配布されてます。しかし、もう一つの方式としてTCP通信を利用してサーバからかなに対応する漢字の候補を取得するこというものがあります。 なぜ、こんな機能があるかといえば恐らくですが昔のPCのスペックが悪い、Emacsがマルチスレッドに対応していないなどが理由と推測します。

SKKservのクライアントとの通信プロトコルは公開されており、下記ページにも記載があります。 * https://ja.osdn.net/projects/pysocialskkserv/wiki/SKKServ

これをRust言語で実装し、EmacsのDDSKKと通信を試みます。

SKKServ Rust実装

辞書を作るなどは難しいので「えんしゅうりつ」を変換すると実際の値「3.14159265359」を変換候補として返却するSKKservの実装です。

主に気をつけるのはクライアントとの文字列のやり取りがEUC_JPであることです。

use encoding_rs::*;
use std::convert::From;
use std::io;
use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};

fn handler(mut stream: TcpStream) -> Result<String, io::Error> {
    println!("Connection from {}", stream.peer_addr()?);
    let mut buffer = [0; 1024];

    let _nbytes = stream.read(&mut buffer)?;
    let (cow, _, _) = EUC_JP.decode(&buffer[..]);

    let msg = String::from(cow);

    let command = msg.chars().next().unwrap();

    let mut response = "".to_string();

    match command {
        '0' => {}
        '1' => {
            if msg[1..].starts_with("えんしゅうりつ") {
                response = format!("1/{}/\n", 3.141_592_653_59f64);
            } else {
                response = "4\n".to_string();
            }
        }
        '2' => response = "Software Name.Major.Minor".to_string(),
        '3' => response = "localhost:127.0.0.1:".to_string(),
        '4' => {
            if msg[1..].starts_with("えんしゅうりつ") {
                response = format!("1 {}\n", 3.141_592_653_59f64);
            } else {
                response = "4\n".to_string();
            }
        }
        _ => {}
    }

    let (cow, _, _) = EUC_JP.encode(&response);
    let _ = stream.write_all(&cow);
    stream.flush()?;

    Ok(command.to_string())
}

fn main() -> io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8001")?;

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                handler(stream).unwrap();
            }
            Err(e) => eprintln!("{}", e),
        }
    }

    Ok(())
}

通信

実際にEmacsのDDSKKと通信するためにEmacsに書き設定を追加し、上記実装を実行しました。

(setq skk-server-host "127.0.0.1")
(setq skk-server-portnum 8001)

結果「えんしゅうりつ」が「3.14159265359」に変換することを確認できました。

結び

令和になってもEmacsネタです。令和が終わるころまでにはVisualStudioCodeに移行しようと考えています。

普段使っているツールの仕組みを知るのも面白いものですね。ではまた。

高次元写像を見る

とある朝のこと。
いつものようにスマホのアラームが鳴っていた。
そしていつものように私はスマホの画面をスワイプしてアラームを止めようとした。
いつもと違うのは、スワイプしてもアラームが鳴り止まなかったこと。
私は「これはここからじゃないと止められない」と咄嗟に思った。

・・・・・ここ?

私はいつもと違う次元に写像されていた。
”ここ”は「高次元」領域だった。
いつもの「現実次元」に戻り、
いつものようにスマホの画面をスワイプしてアラームを止めた。



機械学習に取り組まれている方ならわかるだろう。
状態を高次元領域へ特徴量として写像し観測することが起きていたのだ。



実に興味深いと思った方へ。
是非見ていただきたいアニメ作品がある。
正解するカド」という作品だ。
この作品で、多次元に自身を写像するシーンが存在する。
きっと、私のこの経験を容易に想像できると思う。


それでは良い高次元ライフを。

iPX TCD
郡 伴興[Tomooki Koori]
IFRIT

【OpenCV】K-meansクラスタリングを用いた色の量子化【Python】

 こんにちは。
 最近読んだ論文の要約を書こうとしましたが挫折しました、安藤です。
 そういうことってよくありますよね、はは。


 今回はOpenCVライブラリのK-means法を使って色の量子化を行いたいと思います。
 量子化というとむずかしく聞こえてしまいますので、はじめにどのような画像をつくれるのか見てみましょう。

 目標はこんな感じの画像を作ることです。

f:id:ipx-writer:20191206174514j:plain
出典:http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_ml/py_kmeans/py_kmeans_opencv/py_kmeans_opencv.html
 左上が元画像、それ以外の画像はK個の色のみになるように量子化を行っています。簡単に言うと、似ている色をひとつのまとまりに分けて色付けをし直すことです。それぞれのクラスタに分類された領域には、その領域内の平均の色を割り当てています。画像のノイズ除去なんかにも使えそうですね。

  • K-meansとは

 機械学習分野における教師なし学習で、クラスタリングを行うアルゴリズムです。くわしい説明は下記のリンクなんかがわかりやすかったので、こちらを参照してみてください。
k-meansとk-means++を視覚的に理解する~Pythonにてスクラッチから~ - 医療職からデータサイエンティストへ

 入力データとして1ピクセルあたりのRGB値を1データ(3次元ベクトル)として、K-meansクラスタリングを行いました。

  • 実装

 ここの最後の項のコードを基本にして、コメントを付け加えた形です。クラスタ数を2,4,6,8で設定した際の画像を出力します。

import numpy as np
import cv2 as cv


"""
画層の読み込みから前処理
"""
# 画像の読み込み
img = cv.imread('lena.jpg')
# 画像を2次元配列にreshape(row:ピクセル数、col:3(RGB))
img_1d = img.reshape((-1, 3))

# np.float32に型変換
img_1d = np.float32(img_1d)


"""
K-meansの実行
"""
# オプションフラグ
# ここではエポックごとのクラスタ中心移動量に対する閾値と最大エポック数を指定
criteria = (cv.TERM_CRITERIA_MAX_ITER + cv.TERM_CRITERIA_EPS, 10, 1.0)

# k : 分割したいクラスタ数(2,4,6,8)
for k in range(2, 9, 2):

    # K-meansの実行
    # label  : 入力データに対するクラスタ番号配列
    # center : クラスタ中心 この場合ではK個の3次元配列が出力される
    _, label, center = cv.kmeans(img_1d, k, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)


    """
    出力の変換
    """
    # クラスタ中心になるRGB値をnp.uint8型に変換
    center = np.uint8(center)
    # 出力ラベルが2次元配列になっているので1次元にreshape
    label = label.flatten()
    # クラスタ番号にひもづくクラスタ中心RGB値を割り当て
    output_img = center[label]
    # 元画像と同じshapeになるようにreshape
    output_img = output_img.reshape((img.shape))


    """
    出力画像の表示と保存
    """
    # 表示するウィンドウの名前
    window_name = 'output_img_K{}'.format(k)
    # 表示するウィンドウの設定
    cv.namedWindow(winname = window_name, 
                   flags   = cv.WINDOW_NORMAL)
    # 画像の表示
    cv.imshow(winname = window_name, 
              mat     = output_img)
    cv.waitKey()
    cv.destroyAllWindows()

    # 出力画像の名前
    output_img_name = "result_K{}.png".format(k)
    # 画像の保存
    cv.imwrite(filename = output_img_name,
               img      = output_img)
  • 結果

無処理

f:id:ipx-writer:20191209114543j:plain
入力画像(無処理)
K = 2
f:id:ipx-writer:20191209114018p:plain
K = 2
K = 4
f:id:ipx-writer:20191209114021p:plain
K = 4
K = 6
f:id:ipx-writer:20191209114023p:plain
K = 6
K = 8
f:id:ipx-writer:20191209114027p:plain
K = 8

これをつかえば映える画像も作れるかもしれませんね!

  • 参考

labs.eecs.tottori-u.ac.jp