あいぽんプログラマー

Iphoneを持っていますが、主にAndroid開発についての記事を書いています

転職して1年経ったので振り返ってみる

去年の8月に転職してから約1年がたったのでどんな1年だったか振り返ってみようと思います。

普段1年の振り返りとかやらないのでどういう軸で振り返っていくか迷いましたが、 転職先はAI系の受託をメインとしている会社のためプロジェクト単位で振り返っていきます。

顧客情報やプロジェクト内容についてはかなりぼやかしています。

8~12月

入社して最初の携わった案件は製造業のクライアントで、案件内容としてはクライアント先に導入されている外観検査システムのパラメータの自動チューニングでした。 僕が入社する前にパラメータの自動チューニングのアルゴリズム自体はすでに検証が完了し、これからシステム化するというところでアサインされました。 クラウドAWSで、システムの構成としてはざっくり

  • 自動チューニングのためのアノテーションUI
  • 自動チューニングを実行するワーカー
  • 上の2つをコントロールするコントローラ

の3つとなっており、僕はその中でも「アノテーションUI」「コントローラ」を担当しました。 使用技術としてはアノテーションUIはVue.js、コントローラはPython/Djangoとなっております。

前職ではGCPを使っていたためAWSは慣れておらず権限周りやS3やAPI Gateway、Lambdaとかの使い方や制約に苦戦していました。 また、Djangoもほぼ使ったことなかったため最初はDjangoに精通した同僚のエンジニアに質問しながら進めていったのを覚えています。 余談ですが、restframeworkとlocalstackってかなり便利ですね。

技術面でも慣れないことがたくさんあって大変でしたが、一番理解に時間がかかったのは「クライアント先に導入されている外観検査システム」の仕組みの理解でした。 自動チューニングシステムを実装していく上で「クライアント先に導入されている外観検査システム」を理解していないとおかしな実装になってしまうため、深く理解している同僚のエンジニアに何度も質問しまくっていました。

8月下旬〜9月

上の案件とは並行で製造業の異常検知の案件をメインで担当させてもらいました。 問題内容をざっくり言うと、正常であれば10個セットで入って次工程にいくが、何らかの問題で9個以下まま次工程にいってしまう異常ケースを画像から自動検知したいというものでした。

この案件では異常検知を行うための画像は無かったため製造ラインを撮影してデータセットを作成するところから始まりました。 製造ラインを撮影するためのカメラ選定も先方の方と一緒に「撮影の高さは最大○○cmぐらいだから、この△△度以上の視野角があるカメラじゃないと難しい」みたいなことをSlackで会話しながら決めていきました。先方の方もエンジニアの方(しかも元高専生)だったため、かなり意思疎通はスムーズに進めることができました(むしろ助けてもらってた)。

製造ラインを撮影してデータセットを作成した後はアノテーションをしていきますがココもけっこう大変でした。 アノテーション自体は、ちゃんと10個セットになっていたら正常、9個以下だったら異常と判断するだけと難易度的には低いため、僕含め社内の人の3人で同じデータセットアノテーションを進めていきました。

僕は初め難易度の低いアノテーションだから3人ともほぼ同じ結果となると思っていましたが、結果を見ると3人とも結構な数の異常を見逃してしまう結果となっていました。 アノテーション精度が低いと最終精度に意味を持たなくなってしまうため、アノテーションする人を外部にもお願いしアノテーションの質を高めることをしました。

アノテーションが終わってやっと、画像処理段階に入っていきます。 画像処理の手法としてはデータセットも豊富だったためCNNで進めていきました。 DeepLearningを使った画像処理はほぼやったことなかったため同僚のエンジニアに質問や手伝ってもらいながら実装を進めていった結果、 問題自体の難易度の低さとアノテーションの質の高さもあり結構良い精度のモデルを作ることができました。

11月

3つ目の案件はシステム開発でした。1つ目の案件とは違って0から作り上げていく担当ではなくすでに出来上がっているシステムの不具合の改修がメインでした。Python/Djangoで開発されていて、初めの案件の経験のおかげでフレームワーク自体には慣れていたのですが、システムの全体像を把握するのが大変でした。仕様書や設計書を見たり、テストを見たりして全体像を把握しつつissueに上がっている不具合の修正をやっていました。

不具合の改修がメインのこともあり

  • 不具合について調査
  • 不具合が再現するテストコードを追加
  • テストコードを通すようにコードを修正
  • p-r投げてマージ

のループが綺麗に回せていたので個人的には気持ちよく進めることができた案件でした。

1~4月

4つ目は動画に映っている人が所定の動作をしているかを検知する案件をメインで担当させてもらいました。 2つ目の案件と同じ様にこの案件もデータが無かったため、撮影してデータセットを作成する所から始まりました。 この案件ではモデルを開発し、開発したモデルをサーバではなく「Android上で動作させる」必要があったためかなり大変でした。

検知する動作が複合的な要素を持っていたため、モデルは1つのDeepLearningで完結させるやつではなくPoseNet等の複数のモデルを使用して特徴量を生成し 生成した特徴量をLightGBMで分類するというやり方で進めていきました。

開発したモデルをAndroid上で動作させるために必要な要素としては以下のものがありました

  • 動画を画像にデコード
  • DeepLearning系のモデルをTensorflow Lite形式にコンバート
  • LightGBMをAndroidで動かす

また、速度面やLightGBMにC++APIが存在していこともあり、Android NDKを使ってC++で開発していきました。

やっぱり初めてやることには想定外の問題が起きてしまうもので、 TensorFlow Lite形式にコンバートしたモデルはTensorFlow Liteの標準オペレーション以外が使われていたため実行時にエラーが起きてしまったり、 LightGBMはAndroidで使われているlibcがglibcではなくbionic libcとなっているためエラーが出たりと大変な開発でした。

5月~

今年の5月からは去年の11月にやっていたシステム開発に再度アサインされました。 やることは前回と同様バグ改修にプラスして、高速化や負荷テストを進めています。

最初にやった高速化の時は、プロファイルをしてボトルネックを見つけるところから始めていき、 DBのアクセスがボトルネックだったのが分かったためRedisにキャッシュするようにコードを変更し、変更によって問題が起きないかのテストコードを書いていくことをしていきました。

また、タスクが投げられたわけではないですが、dictでこねくり回しているようなところをデータクラスに置き換えたり、コピペをしているのかテストの前処理に似たようなコードが量産されていたのでfixtureに置き換えたり等のリファクタリングをしたりしてます。

まとめ

最初の1年は画像処理をやったりシステム開発をやったりAndroid NDKと戦ったりと自力を試される充実した1年でした。 特にAndroid NDKみたいな低レイヤーと戦っている時は、学生時代にちゃんとC言語を学んでてよかったという場面があったため過去の自分を褒めたいです。

今年はコロナの影響で会社として仕事が減るかもしれないという懸念がありましたが、 逆に仕事が多くて大変みたいな状況なので去年以上に会社に貢献していこうと思います。

「10年戦えるデータ分析入門」の感想

こんにちはgoya813です。
最近データエンジニア的な仕事をやるようになって、色々情報収集していたらクックパッドの青木峰郎さんの スライド「DWHに必要なこと〜1人で始めるCIO〜」を見つけ、そちらで紹介されていた本書に興味を持ち読み始めました。

著者について

著者の青木峰郎さんは現在はクックパッドに所属しており、ビッグデータ分析システム「たべみる」のアーキテクチャ設計から開発などをおこなっています。
本書以外にも「ふつうの〜」シリーズの本を出版されていたり、OSS界隈でも元Rubyコミッターであったりと幅広い分野で活躍されている方です。

要約

本書はSQLを使ったデータ分析と、そのためのデータ分析基盤構築について書かれた本です。
本の内容としては2部構成になっており
1部はプランナー向けにSQLというのはどういうものか、なぜ良いの、どうやって使うのかについて。
2部はエンジニア向けにデータ分析基盤の構築・運用方法についてとなっています。

印象に残った章

今回は特に印象に残った第8章と第11章、第13章について感想を書いていきます。

第8章

第8章は「ウィンドウ関数」について書かれている章です。 本書の中ではウィンドウ関数について

ウィンドウ関数(window function)は「分析関数」とも呼ばれる関数です。 たいへんざっくり言うと、group by節で作ったグループの中の行を見ながら、集約せずに計算することができます。

と説明しています。著者も「これだけだとまったく分からない」と書いていましたが、 僕も正直最初はまったく分からず、これがなんで分析関数と呼ばれるのだろうと思っていました。

しかし、この後にウィンドウ関数を使った「デシル分析」「時系列データの処理」などの具体的な例をクエリ交えての説明されており、そちらを読んでいくにつれて

  • なぜウィンドウ関数が分析関数と呼ばれるのか
  • なぜSQLでデータ分析をやるのか

がわかる章でした。

第11章

第11章は「データ分析基盤構築」について書かれている章です。

最近業務で「DWH」「データマート」という単語をよく聞くのですが、人によって違う認識を持っており、「何が正確なんだ!」と頭を悩ましていました。
そんな「DWH」「データマート」について本書では歴史と重要なポイントがまとめられているためとてもスッキリしました。
第2部は比較的エンジニア向けの内容となっていますが、個人的には第11章はエンジニアだけじゃなくプランナーの方にも読んでいただきたい章でした。

第13章

第13章は「SQLのバッチを作成するための仕組み」について書かれた章です。
僕も最近OLTPのRDBに溜まったデータを分析しやすい形に整形する仕事をやっていたので、まさに必要としていた情報でした。
データ整形をSQLでやる上での重要な考え方から、実際にどうやるのか、管理する為のソフトウェアについてなど全体をカバーしていたのでとても勉強になりました。
また

  • データを整形する際のクエリは細かく分解
  • 冪等性を持ったクエリにする

など、こうしたほうがいいだろうなと思ったことも書かれており、 自分の考えは悪くなかったんだなと安心できてよかったです。

SQLのテストもまさにどうしようかなと思っていたところだったので、 実際に設計・開発をする際に参考となる章でした。

最後に

本書はSQLを使ったデータ分析や基盤構築について深く書いているというよりは、なぜSQLなのか、データ分析の全体像はどうなるのかが多く書かれています。そのため、エンジニアとプランナー間の共通認識として活用できる本なのかなと感じました。

RaspberryPiでパトランプを光らしてみた

動画

作成したものの写真です

f:id:goya813:20160410024305p:plain:w300

使用したもの

回路図

f:id:goya813:20160410024618p:plain:w300

X1下にパトランプのプラス、X1上にパトランプのマイナス
X2下にRaspberryPiのGPIOアウト、X2上にRaspberryPiのGND

基板化

たまたま友人が自宅にフライス盤を持っていたので、基板をつくってみました。

f:id:goya813:20160410011146j:plain:w300

今後

今回はローカルでパトランプを制御したので
次回はインターネット越しに制御できるように改良したいと思います。

北海道楽しかった!

初めに

  • 今日まで北海道で生活をしていた老害OBです。
    m教授からのお願いがあったため ICT Advent Calendar 2015の25日目を書きたいと思います。
    (今日予定入ってないの? 等の質問は却下とします)

社会人はブラックなのか?

  • 皆さんはネットなどでブラック企業の記事(やm教授)などを見ているため、 会社に勤めることに不安を持っているのではないかと思います その為今回、老害OBの中でも珍しく進学ではなく就職をおこなった僕が 感じている社会人の良さについて挙げたいと思います。

1. 使えるお金が増える

  • これは当たり前ですが大きい違いです。学生時代では外食といえばMacがほとんどだった僕ですが、社会人になってからは少し高い焼肉屋、寿司屋など色々な飲食店でご飯を食べることが出来るようになりました。

2. 新しい知識を吸収できる

  • 学生時代でも新しい知識は吸収していました。しかし、会社に勤めると当たり前ですが自分より能力の高い先輩達がほとんどです。また、先輩たちは情報収集能力も高いため常に最新の技術に触れています。そのため、そのような先輩たちと接していると技術者としての基礎的な部分、最新の技術について吸収することができます。

3. 休日が休み

  • 学生は休日にレポート作成や研究を行うことも多々あると思いますが、
    社会人は平日は働きますが、休日は働かなくても大丈夫です(普通は)。 僕は北海道にいた時は休日に、余市旭山動物園、クマ牧場、スキーなどたくさん遊びにいきました!

終わりに

  • ICTの皆さんはこれからどんどん社会人になっていきますが、 社会人はとても楽しいので、社会人になることを楽しみにしていてください。

kotlinで簡単なアプリを作ってみた

kotlinで簡単なアプリを作ってみた

はじめに

前から使ってみようと思っていたkotlinを使って
今回はTODOアプリっぽいものを作ってみました!!

アプリ画面

f:id:goya813:20151122170647p:plain:w300

予定を入力して登録ボタンを押すとTODOに追加することができます。
また、TODOの右側にある赤い奴を押すと削除ができます。

ソースコード

今回作成したアプリのソースコード
https://github.com/goya813/TodayTodo
にあります!!

まだ、エミュレータでしか動作テストしていないので動かなかったらすいませんm(-_-)m

所感

まだ、kotlinライクな書き方が全然できてないので精進したいと思います!

参考にした記事

3次元再構成のやり方

3次元再構成

 マーカーレスARを行うための技術として3次元再構成というものがあります。今回は3次元再構成について書いていきたいと思います。
 

3次元再構成とはなにか

 3次元再構成を簡単に言うと複数の画像から奥行きを持った3次元データに拡張するという技術です。ここで重要なのが1枚の画像からは3次元再構成はできないという事です。  

3次元再構成の原理

 三角測量というものが3次元再構成の原理となっています。三角測量というのはある2点間の正確な距離がわかっている場合、測量したい点との距離は、2点との角度が知ることが出来たら、三角形の性質である「三角形の一辺とその両端角が分かれば三角形が確定する」を用いることによって求める事ができます。これを応用することによって3次元再構成を行うことができます。

f:id:goya813:20150305202307p:plain:w300

3次元再構成を行うための要素

 3次元再構成を行うためには以下のことをやる必要があります。
1.  カメラ間の位置関係の推定
2.  画像間の対応点検出
3.  3次元化

 1.のカメラ間の位置関係の推定についてですが、これはある2点間の距離と角度を求めることを指します。これは8点アルゴリズムという手法を用いて推定を行いました
 2.の画像間の対応点検出についてですが、これは測量したい点を探すことを意味します。これはSIFT特徴量を用いることによって検出しました。
3.は1,2から測量する点の奥行きを求めることを指します。  

実験

  • 用意した画像
    f:id:goya813:20150305201105j:plain:w300 f:id:goya813:20150305201107j:plain:w300
  • 画像間の対応点検出した図
    f:id:goya813:20150305202450p:plain:w600

  • 対応点を3次元再構成した図
    f:id:goya813:20150305201121p:plain:w300

  • 3次元データを元にAR行った図
    f:id:goya813:20150305201134p:plain:w300

まとめ

 最後の図を見るとマーカレスARっぽい事ができている事が解ると思います。  

参考にした本

この本はとても丁寧に説明しているので初心者でもわかりやすいと思います

Written with StackEdit.

goya813の高専生活

goya813の高専生活

この記事は17日目の記事として書かれたものです。

正直何を書いたらいいのか分からなかったため、高専の5年生までにやってきたことを書いていきたと思います。

1年生の時

 1年生の時にやったことは

  ・M教材
  ・epoch@松山
  ・JOI

 の3つです。
 1年生の初めの頃はひたすらM教材をやってました(今の自分からは信じられない)。その結果2ヶ月ぐらいでM教材が終わりました。
 epoch@松山はM教授や先輩からこんな大会があると言われたので出場しました。epoch@松山は2人1組で出場なのですがこの時にいた1年生は僕、@maruuusa83、@orisanoの3人だったのでじゃんけんでチーム分け行った結果僕は@maruuusa83とチームを組むことになりました。ちなみに取り残された@orisanoは今でもこのことを言ってきます。
  初めて出場したJOIでは本戦出場することができず悔しい思いをし、この時からAOJを解くようになりました。  

2年生の時

 2年生の時にやったことは

  ・高専プロコンの競技部門
  ・パソコン甲子園
  ・epoch@松山
  ・JOI

 の3つです。
 高専プロコンはくまさん、@marin72_com、@maruuusa83、@orisano、僕の5人で出場しました。この時の思い出は辛かったのかあまりないのですが、ひたすらバージョン管理がひどいと怒られたのを覚えています。多分このことがあって@maruuusa83はバージョン管理の必要性を皆に言っていると思っています。
 パソコン甲子園とepoch@松山は@maruuusa83と組んで頑張りました。
 1年目の時は本戦出場出来なかったJOIですが、2年生では本戦出場をすることができました!  

3年生の時

 3年生の時にやったことは

  ・高専プロコン 自由部門
  ・パソコン甲子園 モバイル部門
  ・ニフティ秋のアプリ発表会

 の3つです。
 高専プロコンとパソコン甲子園2つ同時で開発をしていて辛かったのですが、それ以上に辛かったのがこの開発を行うためにAndroid、HTML、CSSJavascriptpython,データベース、通信を全てやらないといけなかったことです。しかも2つの大会が終わったすぐにニフティの秋のアプリ発表会があり辛く、さらに学校のテストがあったので死ぬかと思いました。

4年生の時

 4年生の時にやったことは

  ・高専プロコン 競技部門

 の1つです。
 高専プロコンではシステムの設計とサイコロを画像認識で数えるということをやりました。サイコロの画像認識をやってる時は、なんでこんなことをやってるんだろうと思っていましたが、今になってみると楽しい思い出です。

 

  以上goya813の高専1〜4年生の話でした。
  明日はricry@o_re_juさんの記事となります。  

Written with StackEdit.