個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Xamarin.iOS で Core ML を利用し画像判定を行う(1) Custom Vision Service での学習モデルの作成

はじめに


こんにちは、@hiro128_777です。

Xamarin.iOS で Core ML を触ってみたかったので試してみることにしました。

私は駅弁が大好きなので、弁当の写真を学習させ、駅弁と普通の弁当を判定させるサンプルを作成したいと思います。




学習モデルの作成


Core ML を利用するには、学習モデルである .mlmodel ファイルを作成します、作成方法はいろいろありますが、一番簡単なのは Azure の Custom Vision Service で学習モデルを作成し、エクスポート機能で .mlmodel ファイルを吐き出す方法です。



Custom Vision Service で学習モデルを作成


学習させるにはサンプルの画像を準備します。今回は駅弁の写真と普通の弁当の写真をそれぞれ30枚程度準備しました。

f:id:hiro128:20180221180232p:plain



Custom Vision Service のページを開き、ログインします。

f:id:hiro128:20180221180056p:plain



利用規約に同意します。

f:id:hiro128:20180221180249p:plain



プロジェクトを作成します。

f:id:hiro128:20180221180304p:plain



名前を入力し、Domains は General(compact) を選択します。

f:id:hiro128:20180221180316p:plain



駅弁の画像全部をアップロードします。

f:id:hiro128:20180221180335p:plain
f:id:hiro128:20180221180357p:plain



Ekibenというタグをつけます。

f:id:hiro128:20180221180409p:plain



画像が登録されました。同様に普通の駅弁の写真も登録します。
Trainをクリックし、学習をスタートします。

f:id:hiro128:20180221180437p:plain



学習が完了しました。
Exportします。

f:id:hiro128:20180221180457p:plain



iOSを選択します。

f:id:hiro128:20180221180508p:plain



ダウンロードします。

f:id:hiro128:20180221180537p:plain



.mlmodel ファイルが作成されました!!
非常に簡単です!!

f:id:hiro128:20180221180557p:plain




今回はここまでです。

2月10日(土)に、品川でXamarin.iOS 、Xamarin.Androidのハンズオンを開催いたしました!

こんにちは、@hiro128_777です。

2月10日(土)に、品川でXamarin.iOS 、Xamarin.Androidのハンズオンを開催いたしました!

jxug.connpass.com

今回は30名の方々にご参加いただきました。

f:id:hiro128:20180219145241j:plain

メンターにも強力な方に来ていただき非常に助かりました。この場をお借りして御礼申し上げます。本当にありがとうございました。

Androidの部は講師を@mishi_csさんがご担当されました。以下のレポートを参照ください。

rksoftware.hatenablog.com

私はiOSの部を担当しました。毎度のことながら躓きが多かったのが「実機デバッグの環境構築」でした。

今回は、

  • キーチェーンアクセスのパスワードがログインパスワードと違っており、しかもかからなくなってしまっているため、再度設定を行う必要があった。
  • 原因不明でビルドできなかったが、実機を抜き差しすることでうまくいった

など、のトラブルが発生しました。両者とも、Xamarin.iOSを触ってみた場合には自力解決が難しいものでしたので、ハンズオンで体験、解決できたのはよかったです。


いつも通り、コーディングではあまり躓きは少なかった印象ですが、「難易度が高い」との感想を持たれた方が多かったようです。

アンケート結果

ハンズオンを最後まで完了できたか

f:id:hiro128:20180219145057p:plain


今回、iOSでは全員の方がアプリ起動を確認できましたが、全体ではうまく動かなかった方がいらっしゃいました。
今後も全員がアプリを動かせるようにサポートしていきます。

難易度

f:id:hiro128:20180219145209p:plain


難易度についてですが、67%の方が「簡単」「ちょうどいい」とご回答され、28%の方が「難しい」とご回答されました。


割合としては、前回、前々回と同様の状況です。


確かにちょっと難しいですが、習得する価値がある内容ですので、今後もなるべくわかりやすくご説明できるよう改善していきますが、レベル感としては現状を維持したいと考えています。


時間

f:id:hiro128:20180219145222p:plain


時間ですが、94%以上の方が「ちょうどいい」とご回答されましたので、ボリューム的には今のままを続けたいと考えております。

ハンズオン自体は、休憩などを省くと正味3時間程度でした。集中力的にも3時間程度がちょうどいい長さだと考えております。


役に立ったか

f:id:hiro128:20180219145035p:plain


なんと94%の方に「役に立った」とご回答を頂けました!
主催者としては非常にうれしい結果となりました!
今後全員の方に「役に立った」と感じていただけるよう努力していきます。



その他のご感想

その他のご感想としては、

  • Xamarin.Androidは比較的簡単だが、Xamarin.iOSはSwiftの知識が必要で、ちょっと難しい

というご意見を挙げられた方が多かったです。
これは確かにその通りで、Xamarin.iOSの方がハマりどころやApple独自のエコシステムなどの面でもハードルが高いため、ハンズオンで一度ハマりを経験することがお役に立つのではないかと考えております。


また、

  • 独学でやるより全然テンポよく学習できた

というご意見もいただきました。

ハンズオンの目的がまさに「これ」ですので、主催者としては大変嬉しいご感想でした。

皆様のご意見を参考に今後も有意義なハンズオンを開催できるように精進いたします。



最後にお忙しい中休日にお時間を作ってご参加頂いた皆様、本当にありがとうございました!



懇親会はAzureもくもく会さまと合同で行い、とても楽しい時間を過ごせました!!



また、JXUGのイベントでお会いできるのを楽しみにしております!

Visual Studio for Mac で iOSの実機UIテストを実行する(1) テストプロジェクトの作成・実行

はじめに

こんにちは、@hiro128_777です。

2月10日(土)に、品川でXamarin.iOS 、Xamarin.Androidのハンズオンを開催いたします!

Swift, Objective-C のコードを Xamarin.iOS に移植する際のポイントについてのハンズオンまたは、java のコードを Xamarin.Android に移植する際のポイントについてのハンズオンを選んで受講できますので、ご興味がある方はぜひご参加下さい!

jxug.connpass.com



では本題に入りましょう。


テストプロジェクトの作成


iOSの実機UIテストを実行するために、まずは、テストプロジェクトを作成します。

今回は私のハンズオン用サンプル「AVCamSample」を題材にします。
ソースは以下から入手できます。

github.com


ソリューションの右クリックメニューから、追加 -> 新しいプロジェクトを追加 を選択します。

f:id:hiro128:20180131212524p:plain


テンプレートから「UIテストアプリ」を選択し、「次へ」をクリックします。

f:id:hiro128:20180131212542p:plain


テストアプリの名前を「AVCamSample.UITest」とし、「作成」をクリックします。

f:id:hiro128:20180131212557p:plain



パッケージのアップデート


Xamarin.UITest パッケージを最新版にアップデートします。
NUnitはバージョン2系に依存しているようなのでアップデートしないでください。

f:id:hiro128:20180131212615p:plain


Test.csの作成

Test.csのコードを以下のように書き換えてください。

using System;
using System.IO;
using System.Linq;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.iOS;
using Xamarin.UITest.Queries;

namespace AVCamSample.UITest
{
    [TestFixture]
    public class Tests
    {
        iOSApp app;

        [SetUp]
        public void BeforeEachTest()
        {
            app = ConfigureApp
                .iOS
                .EnableLocalScreenshots()
                .PreferIdeSettings()
                .InstalledApp("com.hiro128777.AVCamSample")// アプリのバンドル識別子
                .StartApp();
        }

        [Test]
        public void AppLaunches()
        {
            app.Screenshot("First screen.");
        }
    }
}


この時、下記のように「パッケージが見つからない」扱いになり、赤線が出るようであれば、

f:id:hiro128:20180131212631p:plain


一度ソリューションを閉じて開き直すと直ります。

f:id:hiro128:20180131212703p:plain


これで、テストプロジェクトが完成しました。


アプリ本体のプロジェクトに Xamarin.TestCloud.Agent パッケージを追加

アプリ本体のプロジェクトのパッケージの右クリックメニューから、「パッケージの追加」をクリックします。

f:id:hiro128:20180206143550p:plain


「TestCloud」で検索して、Xamarin.TestCloud.Agent パッケージを追加します。

f:id:hiro128:20180206143608p:plain


FinishedLaunchingメソッドにXamarin.TestCloud.Agentを起動するコードを追加します。

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
	// このコードを追加します
	#if ENABLE_TEST_CLOUD
	Xamarin.Calabash.Start();
	#endif
	// ここまで

	Window = new UIWindow(UIScreen.MainScreen.Bounds);

	var controller = new CameraViewController();
	var navController = new UINavigationController(controller);

	Window.RootViewController = navController;
	Window.MakeKeyAndVisible();
	Window.TintColor = UIColor.FromRGBA(1.0f, 1.0f, 0.0f, 1.0f);

	return true;
}

実機での起動を確認する

まずはテストプロジェクトを一度ビルドします。

単体テストのペインの「アプリのテスト」を右クリックし、「Add App Project」をクリックします。

f:id:hiro128:20180206143757p:plain


「AvCamSample」にチェックを入れ、「OK」をクリックします。

f:id:hiro128:20180206143820p:plain


ターゲットのデバイスに自分のiPhoneが表示されればOKです。

f:id:hiro128:20180206143833p:plain


これで実機テスト実行の準備が整いましたので、一度テストを走らせてみましょう。

「AvCamSample.UITest」 を右クリックし、「テストの実行」を選択します。

f:id:hiro128:20180206143843p:plain


テストが開始します。オールグリーンになればテスト成功です。

f:id:hiro128:20180206143935p:plain


成功すると、以下のようにスクリーンショットが撮れています。

f:id:hiro128:20180206144020p:plain


これで、実機テストが実行できるようになりました。



次回は実際のテストコードを記述してテストを作成していきます。

今回はここまでです。

Visual Studio for Mac に Apple ID でログインする

はじめに

こんにちは、@hiro128_777です。

2月10日(土)に、品川でXamarin.iOS 、Xamarin.Androidのハンズオンを開催いたします!

Swift, Objective-C のコードを Xamarin.iOS に移植する際のポイントについてのハンズオンまたは、java のコードを Xamarin.Android に移植する際のポイントについてのハンズオンを選んで受講できますので、ご興味がある方はぜひご参加下さい!

jxug.connpass.com



では本題に入りましょう。

Visual Studio for Mac でApple IDでログインする方法


Visual Studio for MacでiOSプロジェクトのinfo.plistを開くと「サインイン」ボタンがあります。

このボタンを押せば Apple ID でログインできるみたいなので試してみました。

「サインイン」ボタンをクリックします。

f:id:hiro128:20180130201034p:plain


「+」ボタンをクリックします。

f:id:hiro128:20180130201110p:plain


fastlaneをインストールしなさいと言われるのでインストールします。

f:id:hiro128:20180130201144p:plain


fastlaneのインストール


以下よりfastlaneをダウンロードして下さい。

https://download.fastlane.toolsdownload.fastlane.tools


「install」を実行します。

f:id:hiro128:20180130201416p:plain


「開発元が未確認のため開けません」と言われるので、

f:id:hiro128:20180130201430p:plain


システム環境設定のセキュリティとプライバシーを開き「このまま開く」をクリックします。

f:id:hiro128:20180130201446p:plain

f:id:hiro128:20180130201525p:plain


ターミナルが開いてインストールが始まります。

f:id:hiro128:20180130201551p:plain


まだインストールは続きます。

f:id:hiro128:20180130201539p:plain

すべて完了したら[プロセスが完了しました]と表示されるのでターミナルを閉じます。

これでインストールは完了です。

fastlaneの設定

インストール終了後.bash_profileにパスを書きます。

まず、.bash_profileが存在するかどうか確認します。

ls -la


存在しない場合、ファイル作成します。

touch .bash_profile


作成できたか確認しましょう

ls -la

f:id:hiro128:20180130201655p:plain


.bash_profileを開きます。

open ~/.bash_profile


テキストエディタが開くので下記を記述します。

export PATH="$HOME/.fastlane/bin:$PATH"


設定を反映させます。

source ~/.bash_profile


以上でfastlaneの設定が完了しました。

念のため、パスを調べてみましょう。

which fastlane

f:id:hiro128:20180130201741p:plain


正しくインストールパスが表示されれば成功です。

Apple ID でログインする


再度 Apple ID でログインします。

f:id:hiro128:20180130201836p:plain


パスワードを聞かれるので入力します。

f:id:hiro128:20180130202049p:plain


ところがサインイン完了しても何も起こりませんでした‥

試しにもういちどサインインしたら正常に表示されました。このあたりまだ不安定なのでしょうか。

f:id:hiro128:20180130202136p:plain


「詳細の表示」をクリックすると証明書、プロビジョニングプロファイル も認識されています。

f:id:hiro128:20180130210427p:plain


以上で、Visual Studio for Mac での Apple ID でのログインが完了しました。

これで、Visual Studio for Macでプロビジョニングプロファイルの設定ができます。

今回は以上です。

12月9日(土)に、大阪でXamarin.iOS のハンズオンを開催いたしました

こんにちは、@hiro128_777です。

12月9日(土)に、大阪でXamarin.iOS のハンズオンを開催いたしました!

jxug.connpass.com

今回は24名の方々にご参加いただきました。

メンター陣も東京開催に負けない強力な方に多数ご協力頂き非常に助かりました。この場をお借りして御礼申し上げます。本当にありがとうございました。

今回はiOSに特化したハンズオンでしたが、毎度のことながら躓きが多かったのが「実機デバッグの環境構築」でした。

今回は、

  • Xamarin.iOS とXcodeのバージョンが揃っていなくてビルドできない
  • 原因不明でビルドできなかったが、実機を抜き差しすることでうまくいった

など、原因はいろいろありましたが、なかなか初めてXamarin.iOSを触ってみた場合には解決が難しい内容が多かったので、ハンズオンで体験、解決できたのはよかったです。


いつも通りにコーディングではあまり躓きは少なかった印象です。

アンケート結果

ハンズオンを最後まで完了できたか

f:id:hiro128:20171214141021p:plain


今回、仕事の都合で環境を変更できず、ビルドできない方、Xamarin.iOS とXcodeのバージョンが揃っていないためバージョンアップに時間がかかり、再度までたどり着けなかった方がいらっしゃいました。


これについてはハンズオンの募集の時点で、推奨バージョンを指定することで、会場でのアップデートなどが発生しないように改善したいです。


難易度

f:id:hiro128:20171214141041p:plain


難易度についてですが、60%の方が「簡単」「ちょうどいい」とご回答され、40%の方が「難しい」とご回答されました。


Xamarin.iOSのハンズオンは題材的には多少難易度が高めですので、妥当な結果となりました。


確かにちょっと難しいですが、習得する価値がある内容ですので、今後も、実施していきたいと考えています。


時間

f:id:hiro128:20171214141116p:plain


時間ですが、85%以上の方が「ちょうどいい」とご回答されました。残りの方も「短い」とご回答いただいております。


ハンズオン自体は、休憩などを省くと正味3時間程度でした。集中力的にも3時間程度がちょうどいい長さだと感じました。短いという感想も目立ちましたので、今後はもう少し細かくご説明したいと感じました。


役に立ったか

f:id:hiro128:20171214141155p:plain


なんと93%の方に「役に立った」とご回答を頂けました!
主催者としては非常にうれしい結果となりました!



その他のご感想

その他のご感想としては、とにかく

  • もっと大阪でも開催してほしい

というご意見を挙げられた方が多かったです。
本当に切望されているのがわかりましたので、ご要望にお応えできるよう精進します!

また、

  • Webや本では分からないような勘所等が知れて良かった

というご意見もいただきました。

ハンズオンの目的がまさに「これ」ですので、主催者としては大変嬉しいご感想でした。

皆様のご意見を参考に今後も有意義なハンズオンを開催できるように精進いたします。

最後にお忙しい中休日にお時間を作ってご参加頂いた皆様、本当にありがとうございました!

大歓迎いただき懇親会も大盛り上がりで、とても楽しい時間を過ごせました!!

また、JXUGのイベントでお会いできるのを楽しみにしております!