はじめに
先日、初めて自作のiOSアプリを公開しましたので、
その宣伝をかねた記事を書きたいと思います。
今回は概要ということで、あまり技術的粒度の細かい話には
なりませんが、もし興味がございましたらお付き合いください。
Qitaへの投稿自体初めてだったりするので、
いろいろ至らないところがあると思いますが、
何卒大目に見ていただければと思います。。
どんなアプリか
お題を見ながらその通りに絵を描き(デッサン)、
その結果が採点されるアプリです。
ステージクリア型のゲームとして遊ぶことができます。
追記:
appliv様でアプリをご紹介頂きました
https://app-liv.jp/1477734039/
技術的にはSwift/Objective-C(お絵描きアプリ) + OpenCV(画像加工) +
Dlib(機械学習) + SpriteKit, Scenekit(ゲーム的演出などのフロントサイド) +
firebase(バックエンド)
で構成しています。
正直、iOSアプリ初心者だった私個人でやるには機能を入れ過ぎ、
仕事しながらコツコツ進めて、一度ゲーム性の見直しで作り直しもして
開発作業のみで1年以上かかりました。
なぜ作ったか
一度個人制作のアプリを作ってみたかったのと、アイディアを形にしたかったからです。
下手の横好きではありますが、イラストを練習していた時期があり、
そのときにデッサンが上手くできると楽しかったため、
この感覚をホットな技術である機械学習を用いて表現したいと思いました。
(私自身が機械学習モデルを作れる訳ではありませんが。。)
苦労したところ
iOSアプリ開発経験が少なかったため、逐一Google先生に聞いて勉強しながら実装していきました。
しかし、検索してまとまった情報があるものは、開発当時のモチベーションが高かったために何とかなりました。やはり情報が少ないものは厳しかったです。今回のようにやりたいことをどうしたら実装できるか、技術選定から始める必要のある状況だとなおさらでした。なので特に苦労したところは、「機械学習を使い、画像の類似度を判定する」ところです。
技術検証の日々
docker上でPythonとOpenCVの検証環境を用意し、ORB,AKAZE,aHashなどの、検索して出てくる画像類似度の判定アルゴリズムを色々と試しました。しかし二次元モノクロ画像の比較に対して、どれも期待する精度が出ず。
libpuzzleというCラッパーのライブラリをxcode上でiOS用にビルドしましたが、
これも私の環境では上手くいきませんでした。でたらめに描いた絵も近似と判別してしまいました。
ディープラーニングは、残念ながら実装経験がありません。
一から勉強することを考えましたが、今回は諦め。
最終的に機械学習ライブラリの「Dlib」でhog特徴量での比較をしたところ、これが二次元画像の比較に高い精度を発揮してくれました!
hog特徴量の採用にあたってはこちらの記事を参考にさせていただきました。
HOG特徴量を用いたポケモンのアイコン画像判別
前処理として、画像同士の比率を保持し100px×100pxにリサイズした上で、特徴量同士の距離を出しました。二次元2値画像の比較にはこれが適しているようです。
あとでOpenCVのhog特徴量でも試してみましたが、Dlibに及ばないものの、これも精度はよかったです。
作って良かったこと
これからアプリがヒットするんで!とは言えない。。。
1年以上かけての開発だったため、アプリ開発のノウハウもたまり、
現在の会社ではiosアプリ開発業務に進んで参加しています。
自分はこれまでLL言語に比べて静的型付け言語の経験は少なかったのですが、
今回の開発を通して自信がつきました。Javaを最新の環境で組めるようになり, Kotlinも触っています。
個人開発をやりきることによる意識の変化、あなどれないです。
また自分の中のクリエイティビティを発散させることができました。
ある程度こだわりを入れることができたので、満足です。
おわりに
アプリはフリー素材を多用しており、提供者様のご厚意がなければ開発できませんでした。
プログラムについても同様です。そのことに大変感謝しています。
今回はコードもない概要になってしまいましたが、今後改めて、技術トピックを記事にしていきたいと思います。