アプリ開発の最近の記事

はじめに

iOSネイティブアプリと機械学習を組み合わせたいと思い、Appleが提供してくれているフレームワークCore MLとVision、事前に訓練したInception v3モデルを使用し、ドラマのSilicon Valleyに出たthis is not hot dogアプリを作ってみました。 
this is not hot dog とは、撮影された画像がホットドッグかどうかを認識するアプリです。YouTube動画がありますのでご覧ください。
YouTubeより Silicon Valley: Season 4 Episode 4: Not Hotdog (HBO)

目次

はじめに
作成手順
まとめ
ソースコード


環境

  • プロセッサ Intel Core i7-5557U 3.1 GHz
  • メモリ 16GB 1867 MHz DDR3
  • Apple Swift version 4.2.1
  • Xcode Version 10.1 (10B61)


Core MLとは

Core ML is the foundation for domain-specific frameworks and functionality
日本語に訳すと学習モデル等をiOS / macOS上で利用する際に、開発者が専門的な知識を必要とせずに扱えるように補助するフレームワークです。

主に下記の2つ機能があります。
1.Load a Pre-Trained Model
 事前学習済みModelをロードでする
2.Make Predictions
 予測する

Visionとは

コンピュータビジョンの機械学習機能を容易にAppに組み込むことができます。
フェイストラッキング、顔検出、ランドマーク、テキスト検出、矩形検出、バーコード検出、オブジェクトトラッキング、画像レジストレーションなどの機能に対応しています。

Inception v3はCore MLモデルのひとつです。 
木、動物、食べ物、乗り物、人々など、1000のカテゴリセットから画像に存在する主なオブジェクトを検出することができます。

作成手順

1.Xcodeにてプロジェクトを作成する
2.下の画像のようなUIをつくる
Xcode作成画面 3.こちらのリンク からInception v3をダウンロード
4.ダウンロードしたものをプロジェクトに入れる
5.モデルの作成

guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else {
  fatalError("Loading Core ML Model Failed.")
}

6.リクエスト(VNCoreMLRequest)の生成とハンドラ処理

 let request = VNCoreMLRequest(model: model){( request,error) in
             guard let results = request.results as? [VNClassificationObservation] else{
                 fatalError("Model failrd to process image")
             }

7.受け取ったrequestのfirstでhotdogかどうかを判断し、結果はnavigationItemに渡す(一個目のrequestは精度が一番高いため、下記のように94%ぐらいで判断された) 

6A29C419-EB06-4321-BC25-8A7220368DC8, revision 1, 0.942064 "hotdog, hot dog, red hot",
if let firstResult = results.first {
   if firstResult.identifier.contains("hotdog") {
       self.navigationItem.title = "Hotdog!"
   } else {
       self.navigationItem.title = "not Hotdog!"
   }
}

8.CIImageへの変換

guard let ciimage = CIImage(image: userPickedImage) else {
    fatalError("Could not convert UIImage into CIImage")
}

9.ハンドラの生成と実行

let handler = VNImageRequestHandler(ciImage: image)
do {
   try! handler.perform([request])
}
catch{
   print(error)
}

10.画像のようなアプリが完成。
hotdogだと...。 Core MLとVision、Inception v3モデルを使ったiOSアプリ

画面上にhotdogの判定があります! 

hotdog以外だと...・ Core MLとVision、Inception v3モデルを使ったiOSアプリ

きちんとNot hotdogの判定がされました。

まとめ

いかがでしょうか?
数行のソースコードでこのように作成できて楽しかったです。
Appleさんは他のモデルも用意してくれているので、ぜひ使ってみてください!

アクセルユニバース株式会社 (以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。

当社のインターン生は機械学習論文解説を書いたり、実際に実装したりしています。
随時紹介していくので是非ご覧ください!

定期的にメルマガでも情報配信予定なので、問い合わせページに「メルマガ登録希望」とご連絡ください。


ソースコード

class ViewController: UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate {


    @IBOutlet weak var imageView: UIImageView!
    let imagePicker = UIImagePickerController()

    var classificationResults : [VNClassificationObservation] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        imagePicker.delegate = self
        imagePicker.sourceType = .camera
        imagePicker.allowsEditing = true

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        if let userPickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.image = userPickedImage

            guard let ciimage = CIImage(image: userPickedImage) else {
                fatalError("Could not convert UIImage into CIImage")

            }
            detect(image: ciimage)
        }

         imagePicker.dismiss(animated: true, completion: nil)
    }

    func detect(image: CIImage){

        guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else {
            fatalError("Loading Core ML Model Failed.")
        }

        let request = VNCoreMLRequest(model: model){( request,error) in
            guard let results = request.results as? [VNClassificationObservation] else{
                fatalError("Model failed to process image")
            }

            print(results)

            if let firstResult = results.first {
                if firstResult.identifier.contains("hotdog") {
                    self.navigationItem.title = "Hotdog!"
                } else {
                    self.navigationItem.title = "not Hotdog!"
                }
            }
        }

        let handler = VNImageRequestHandler(ciImage: image)

        do {
            try! handler.perform([request])
        }
        catch{
            print(error)
        }
    }

    @IBAction func cameraTapped(_ sender: UIBarButtonItem) {
        imagePicker.sourceType = .camera
        imagePicker.allowsEditing = false

        present(imagePicker, animated: true, completion: nil)
    }
}

はじめまして。アクセルユニバース株式会社でインターンをしている中村と申します。

これまでこの会社でAndroidアプリ開発、RubyやPHPを使ったWeb開発などに携わってきました。
MicrosoftからHoloLensが日本で発売されたので、弊社でも早速購入し、アプリケーションを作っております。

そこで、この記事ではMicrosoft HoloLensの開発環境を作り、簡単なアプリを作成したことを報告します。
今回は、実機を用いて開発するため、エミュレータはインストールしません。
では、早速Microsoft HoloLensの開発環境構築から見ていきましょう。

必要なツール

・Unity 5.5
・Visual Studio 2015 Update 3

上記のツールは、エディションはどれを選んでも構いません。

OS

Windows 8以降
(注意)
エミュレータを使う場合は、Windows 10 (Homeを除く)が必要となります。
また、Windows 10 でない場合は、Windows 10 SDK で使えない機能があります。

環境構築手順

1.Visual Studio 2015 Update 3 をダウンロードする
https://www.visualstudio.com/ja/downloads/
2.Visual Studio をインストールする
ユニバーサルWindowsアプリ開発ツールで、下記の項目を有効にしておく。
・ツール (1.4)
・Windows 10 SDK (10.0.10586)

3.Unity 5.5 をダウンロードする
https://unity3d.com/jp/get-unity/download
4.Unity のインストールをする
5.Unity アカウントを作成する
https://id.unity.com/
6.Unity の初期設定をする

サンプルアプリの作成手順

Unity

プロジェクトを作成する

1.3Dを選択する

HoloLens_2.png

メインカメラの座標を設定する

メインカメラの座標がユーザーの初期位置となります。
1.Hierarchy パネルの Main Camera を選択する
2.Inspector パネルの Transform で、Position を (X: 0, Y: 1, Z: -10) から (X: 0, Y: 0, Z: 0)へ変更する

背景色を変更する

背景に現実の物が見えるように、背景色を透明にします。
1.Main Camera が選択されている状態で、Inspector パネルの Camera で Clear Flags の値を Skybox から Solid Color へ変更する
2.Background のカラーピッカーから、RGBA を (0, 0, 0, 0)へ変更する

Clipping Planes を設定する

ユーザとホログラムの距離が近くなりすぎないように、レンダリングの開始位置を変更します。
1.Main Camera が選択されている状態で、Inspector パネルの Camera で Clip Plane の Near を 0.3 から 0.85 へ変更する

HoloLens_12.png

ホログラムを作成する

ユーザーの前方に、傾いた立方体を設置します。
1.Hierarchy パネルの Create から、3D Object > Cube を選択する

HoloLens_4.png2.Hierarchy パネルの Cube を選択する
3.Inspector パネルの Transform で下記のように設定する
Position : (X: 0, Y: 0, Z: 2)
Rotation : (X: 45, Y: 45, Z: 45)
Scale : (X: 0.25, Y: 0.25, Z: 0.25)

HoloLens_5.png4.File > Save Scene で、名前をつけてシーンを保存する


パフォーマンスの設定をする

1.Edit > Project Settings > Quality を選択する
2.Windows Store ロゴの下の三角から、Fastest を選択する

HoloLens_6.png


ビルドの設定をする

1.File > Build Settings... を選択する
2.Platform から Windows Store を選択する
3.SDK を Universal 10 にする
4.UWP Build Type を D3D にする
5.Unity C# Projects を選択する
6.Add Open Scenes からシーンを追加する

Windows ホログラムのエクスポートの設定をする

1.Build Settings... のウィンドウの Player Settings... を選択する
2.Settings for Windows Store のタブを選択する
3.Other Settings の項目を選択する
4.Rendering の Virtual Reality Supported を選択する

HoloLens_7.png

Visual Studio のソリューションをエクスポートする

1.Build Settings... のウィンドウで build を選択する
2.新規に App という名前のフォルダを作成する
3.App フォルダを選択し、Select Folder を選択する

HoloLens

開発者モードを有効にする

1.Settings > Update & Security > For developers を選択する
2.Developer mode を選択する
3.Device Portal を有効にする


Windows HoloLens を開発機とUSB接続する

Visual Studio

1.App フォルダの Visual Studio ソリューションファイル(拡張子 .sln)から、Visual Studioを起動する

ビルドの対象を変更する

1.Package.appxmanifest を右クリックし、View Codeを選択する

HoloLens_8.png2.TargetDeviceFamily の行で下記のように変更する
Name="Windows.Holographic"
・MaxVersionTested="10.0.10586.0"

HoloLens_9.png3.Package.appxmanifest を保存する

ビルドとデプロイをする

1.上部のツールバーで、Debug を Release へ、ARM を X86 へ変更する
2.デプロイ対象が Device になっていることを確認する

HoloLens_10.png3.Debug > Start without debugging を選択する
4.PIN 入力を求められたら、HoloLensで Settings > Update > For Developers を選択し、Pair をタップしたときに出る値を入力する


HoloToolkit-Unity でのビルドとデプロイ

筆者の環境では、デプロイ時にエラーが出てしまいました。

Error DEP6957 : Failed to connect to device '127.0.0.1' using Universal Authentication. Please verify the correct remote authentication mode is specified in the project debug settings.
0x8007274D: The network event being waited on triggered an error.

そのため、HoloToolkit-Unity を用いてビルドとデプロイを行いました。
この方法では、Visual Studio を使わずにビルドからデプロイまでできます。

Windows Device Portal の初期設定

1.Windows HoloLens をUSB接続する
2.ブラウザで http://127.0.0.1:10080 を開く
3.ペアリングをする

PINは、HoloLensで Settings > Update > For Developers を選択し、Pair をタップしたときに出る値を入力する


Unity

1.HoloToolkit-Unity をダウンロードする
https://github.com/Microsoft/HoloToolkit-Unity
2.HoloToolkit-Unity の Assets フォルダの内容を、Unityプロジェクトの Assets フォルダにコピーする
Assets フォルダ内でコピーすべきものは以下のものとなります。
・HoloToolkit/
・HoloToolkit.meta
・mcs.rsp
・mcs.rsp.meta
この操作で、Unity の上部メニューに HoloToolkit が追加されます。
3.Unity で HoloToolkit > Build Window を選択する
4.Build Window の Deploy で、Windows Device Portal で作成した Username と Password を入力する
5.Build Window で、Build SLN, Build APPX, then Install を選択する

Windows Device Portal でのデプロイ

Windows Device Portal を用いてもデプロイができます。
ただし、Visual Studio や HoloToolkit-Unity よりも手間がかかります。

Visual Studio

1.Solution Explorer から、<プロジェクト名>(Universal Windows)を右クリックし、Store > Create App Packages... から App Package を作成する

HoloLens_11.png

Windows Device Portal

1.HoloLens をUSB接続する
2.ブラウザで http://127.0.0.1:10080 を開く
3.左のメニューの SYSTEM > Apps を選択する
4.App package で App\<プロジェクト名>\bin\x86\Release にある .appx ファイルを選択する
5.Dependency で App\<プロジェクト名>\AppPackages\<プロジェクト名>_Test\Dependencies\x86 にある .appx ファイルを選択する
6.Deploy の Go を選択する

以上で環境構築およびサンプルアプリデプロイが完了となります。
今後もWindows HoloLensだけでなく色々な情報を発信していきますので、よろしくお願い致します。

参考

Install the tools
https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

Holograms 100
https://developer.microsoft.com/en-us/windows/holographic/holograms_100

デバイスを開発用に有効にする
https://docs.microsoft.com/ja-jp/windows/uwp/get-started/enable-your-device-for-development

Using Visual Studio
https://developer.microsoft.com/en-us/windows/holographic/Using_Visual_Studio.html

Using the Windows Device Portal
https://developer.microsoft.com/en-us/windows/mixed-reality/using_the_windows_device_portal

前の更新から時間が経ってしまいましたが、 今回は、「テスト」について書きたいと思います。

「テスト」って聞くと、すごい嫌なイメージをされる方も多いと思います。
しかし、システム開発で行うテストはただのテストではなく『バグ探し』と呼ばれています。

システム開発で実施するテストは

①単体テスト
②結合テスト
③総合テスト

と様々なテストがあります。

テストは、品質を担保するために行います。
いざ使ったら、バグだらけなんて嫌ですもんね。

ここで、各テストがどういう役割を担っているのか見ていきます。

①単体テスト

作成したシステムの一つひとつの機能に問題がないかを確認するテストになります。

②結合テスト

複数のテストを結合して動作を確認するテストになります。

③総合テスト

開発したシステムが要件を満たしているかを全体を総合して確認するテストになります。

この『バグ探し』という認識が、私には最近までありませんでした。 ただ、テストを進めていく、問題がなければ大丈夫と思っていました。

しかし、困るのはシステムをご利用するお客様です。 納品後、バグが大量発生すると、お客様側と会社側との信頼関係が失われてしまうかもしれません。

一見面倒な作業ですが、とても大事な作業であると、今では思っています。
また、いかに効率良くテストを進めていくかが今後の課題であると思います。

はじめまして、アクセルユニバース システム部の今村と申します。

弊社では業務システムからスマートフォンアプリまで、所謂「なんでも」開発します。
Webアプリケーションも作成します。
直近では、 Ruby On Rails (以下、Railsと記載します) を用いた開発を多く実施してきました。

今回は、弊社で経験した マルチテナント環境でのRailsアプリケーション におけるちょっとしたTipsを紹介いたします。

1. マルチテナントとは

http://e-words.jp/w/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88.html

上記のページに説明されている通りです。
同じWebアプリケーションを複数のアカウントで共有します。

弊社の開発において、Railsを用いたマルチテナント環境の場合は、1つのデータベース(PostgreSQLを利用)内にアカウント単位のスキーマを用意しています。
スキーマを分けることで、各アカウント単位のデータが混在する状態を防いでいます。

どのスキーマのアカウントからのアクセスなのかを判別するのには、サブドメインを用いています。

あるサービスのURLが「https://foobar.com/」であり、アカウントが「imamura」である場合、「imamura」用のURLは「https://imamura.foobar.com/」となるように設計しています。

ちなみに、これらの仕掛けはゼロから構築したのではなく、Apartmentというgemを使用しています。

http://qiita.com/kakipo/items/a584d24771dff019d3a9

2. rake db:migrate

Railsを用いたアプリ開発ではよく使うコマンドだと思います。
Railsにおけるマイグレーションの実行コマンドですね。

2-1. マイグレーションとは

念のため、マイグレーションについて簡単に説明しておきます。

Railsでは、データベースの操作(テーブルの追加、カラムの更新・変更・削除等)を、 マイグレーション と呼ばれる機能を使って行います。

通常、データベースの操作はSQLを実行すると思います。
これをマイグレーションで実施する場合は、マイグレーションスクリプトと呼ばれるスクリプトファイルを作成して、コマンドを実行するだけで済みます。

このコマンドが、上述の rake db:migrate になります。

参考:
http://railsdoc.com/references/rake%20db:migrate

2-2. マイグレーションの実行について

本記事では、 マルチテナント環境における マイグレーションと題しています。


この環境でマイグレーションを行った時、困ったことがありました。それは

rake db:migrate コマンドは、publicスキーマにしか実行されないということです。

前述の通り、マルチテナント環境は、同じテーブル構成を持つ複数スキーマを、それぞれのサブドメイン環境で使い分けて実現しています。

つまり、何かしらのデータベース定義の変更が必要となった場合、 追加したマイグレーションスクリプトの内容を、全てのスキーマに 適用させる必要が有ります。

3. マルチテナント環境でのdb:migrate

弊社で初めてRailsでのマルチテナントアプリを構築した場合、上述の問題については、意外と情報が見つけられず、困りました。
ですが、(本当にちょっとしたコトですが、)以下のオプションをコマンドに付け加えることで、publicスキーマ以外のスキーマにも、マイグレーションスクリプトの内容を反映できました。

$ DB=foo rake db:migrate

これだけです。DB=スキーマ名

もちろん、db:migrate実行時の他のオプション(RAILS_ENVup down など)も実行できます。


あまり大した内容ではありませんでしたが、マルチテナント環境に限らず、public以外の別スキーマにマイグレーションしたい!という方の参考になればと思います。

今後

DB=スキーマ名 オプションで、各スキーマへのマイグレーション実行できるのは良いのですが、アプリの更新時に、全スキーマの数だけコマンド実行するのが大変面倒です。

一括で実行できるスクリプトでも作って対応しようと思います。

このアーカイブについて

このページには、過去に書かれた記事のうちアプリ開発カテゴリに属しているものが含まれています。

前のカテゴリは機械学習です。

次のカテゴリはPardotです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。