あいぽんプログラマー

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言語を学んでてよかったという場面があったため過去の自分を褒めたいです。

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