その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

API Diffsから見るiOS 14の新機能 - ML・画像・音声編 #WWDC20 #iOS14

本日からはじまったWWDC 2020、明日から始まるセッションに備え、ドキュメントからAPIの差分をみて気になったものをピックアップしていきます。

数時間前に投稿した新規追加フレームワーク編に続き、本記事では既存フレームワークのうち、機械学習(ML)、画像、音声関連のものを見ていきます。

f:id:shu223:20200623162859p:plain

Vision

めちゃくちゃ機能追加されてます。

class VNDetectHumanBodyPoseRequest

人体の姿勢推定。ついに標準機能として入ったわけですね。

qiita.com

class VNDetectHumanHandPoseRequest

手の姿勢推定。これが必要でMediaPipeを試したりしたこともありましたが、もう必要なくなるのでしょうか?

class VNRecognizedPointsObservation

上の姿勢推定の結果はこの型で返ってくるようです。

サンプルもセッションもあるので、深堀りしてマガジンに書いていきます。

Core ML, Core ML Tools(coremltools)

ここはピックアップせずともしっかり見るつもりなので、本記事では割愛。

Create ML

テンプレートめっちゃ増えてます。NDA遵守のためベータアプリケーションのスクショは貼らないでおきますが、「Create MLのテンプレート」といってもピンとこない人もいるかもしれないので、代わりに現行版のテンプレート選択画面(の一部)のスクショをはっておきます。

f:id:shu223:20200623155402p:plain:w300

ここから4つのテンプレートが追加されています。

個人的な感想:

  • 動画用モデル(Action Classification)がおもしろそう。
  • Style Transferはいまさら感(Turi Createにはだいぶ前からあったのになぜ今になって?)
  • Soundカテゴリに追加がなかったのが本当に残念
  • MotionカテゴリにActivity Classificationに加えてAction Classificationも追加。これもApple Watchで試したい

Metal Performance Shaders

機械学習系のAPIはML Computeも出たし個人的にはこのレイヤーで組むことはしばらくなさそうなのでフィルタ系だけを見ていく。

MPSImageEuclideanDistanceTransform

A filter that performs a Euclidean distance transform on an image.

"Euclidean distance transform (EDT)"なる変換を適用するフィルタ。知らないのでググってみたところ、以下の記事がヒット。大変にわかりやすい。

medium.com

応用例も書かれていて、セマンティックセグメンテーションの誤差のメトリクスとして使われることがあるらしい。またErosion / Dilationを計算する手法としても利用されるらしい。ちなみにErosion / Dilationはそれぞれ孤立点の除去、不連続な点の接続と穴埋めのために利用される。

ちなみにここまで書いて気付いたが、このAPIはiOS 11.3からあるもので、新APIは

var searchLimitRadius: Float

というプロパティでした。これはEDTの計算手法を知っていれば名前で利用法がわかる。

MPSImageCanny

今度こそiOS 14の新クラス。ドキュメントには何も書いてないが、名前からいってCanny法によるエッジ検出を行うフィルタだと思われる。

f:id:shu223:20200623172504p:plainWikipediaより)

MPSImageEDLines

iOS 14の新クラス。MPSKernelを継承。ドキュメントに説明なし。

Natural Language

NLTaggerクラスに新しいメソッドが2つ

@nonobjc func tagHypotheses(at index: String.Index, unit: NLTokenUnit, scheme: NLTagScheme, maximumCount: Int) -> ([String : Double], Range<String.Index>)

Finds multiple possible tags for a given linguistic unit, for a single scheme, at the specified character position.(指定された文字位置で、指定された言語単位について、単一のスキームについて、複数の可能性のあるタグを見つけます。)

func tokenRange(for: Range<String.Index>, unit: NLTokenUnit) -> Range<String.Index>

Finds the entire range of all tokens of the specified linguistic unit contained completely or partially within the specified range.(指定された範囲内に完全または部分的に含まれる、指定された言語単位のすべてのトークンの範囲全体を検索します。)

NLEmbeddingクラスに4つの新クラスメソッド

class func sentenceEmbedding(for: NLLanguage) -> NLEmbedding?

Retrieves a sentence embedding for a given language.(指定された言語の文の埋め込みを取得します。)

class func sentenceEmbedding(for: NLLanguage, revision: Int) -> NLEmbedding?

Retrieves a sentence embedding for a given language and revision.(与えられた言語とリビジョンのための文の埋め込みを取得します。)

class func currentSentenceEmbeddingRevision(for: NLLanguage) -> Int

Retrieves the current version of a sentence embedding for the given language.

class func supportedSentenceEmbeddingRevisions(for: NLLanguage) -> IndexSet

Retrieves all version numbers of a sentence embedding for the given language.

NLModelクラスに2つのメソッド

func predictedLabelHypotheses(for: String, maximumCount: Int) -> [String : Double]

Predicts multiple possible labels for the given input string.(与えられた入力文字列に対して,複数の可能性のあるラベルを予測します.)

func predictedLabelHypotheses(forTokens: [String], maximumCount: Int) -> [[String : Double]]

Predicts multiple possible labels for each string in the given array.(与えられた配列内の各文字列に対して,複数の可能性のあるラベルを予測します.)

・・・試してみないとピンとこないので、試してみます。あとこのフレームワークはiOS 12の頃に試して以来な気がしていて、当時は日本語をサポートしている機能は一部だけだった気がします。今一度日本語のサポート状況をみてみたいなと。

Final Cut Pro X

期待していたが更新がなかったフレームワーク

事前に予想、というより期待することを書いていたのですが、見事に外れたものから書いていきます。

note.com

AVAudioEngine

SoundAnalysis

Speech

標準の翻訳アプリが入ったことで、音声認識フレームワークであるSpeechフレームワークも強化されているかと期待しましたが、あてが外れました...

Speechの音声認識、デモとして試すとそこそこうまくいく気がするのですが、いざ実運用しようとすると全然ダメなんですよね。しかし音声認識は汎用性が高いのでどうにかしてほしいなぁと。実はAPIが更新されてないだけで内部的には刷新されているのではとまだ期待しています。

公式配布の学習済みCore MLモデル

昨年はWWDCの会期中に新しいモデルが複数個追加されてテンションあがったのですが、今年は何もなし。

しかしちょっと前にPoseNetモデルが追加されています。

まとめ

本記事では既存フレームワークのうち、ML・画像・音声に関連する気になるAPIをピックアップしました。次はこれら以外の既存フレームワークの更新を見ていきます。

そしてそのあとは、サンプルやセッションを見てもっと具体的に実装方法や何ができて何ができないのかといったところを探っていきます。

昨年はそれらの知見を書籍にまとめましたが、今年はnoteの有料マガジンにまとめていきたいと思います。

note.com

まだ記事がないので今ならたったの500円です。サブスクではなく買い切り価格です。記事が充実してきたら価格改定していきたい所存です。

API Diffsから見るiOS 14の新機能 - 新フレームワーク編 #WWDC20 #iOS14

本日からはじまったWWDC 2020、まだ基調講演しか見てないのですが(SOTUも後で見ます)、ドキュメントは公開されたので、明日から始まるセッションでどのあたりをチェックするか当たりをつけるべく、例年通りAPIの差分を見て気になった新APIをピックアップしていきます。

f:id:shu223:20200623092201p:plain

まずは新フレームワークから。今年の新規追加フレームワーク1は21個。

ML Compute

ニューラルネットワークの学習とバリデーションを行うためのフレームワーク、とのこと。

Accelerate training and validation of neural networks using the CPU and GPUs.

macOS用かな?と思いきやiOSでも利用可

ML Compute utilizes the high performance BNNS primitives made available by the Accelerate framework for the CPU and Metal Performance Shaders for the GPU.

『ML Computeは、CPU用のAccelerateフレームワークとGPU用のMetal Performance Shadersによって利用可能になったハイパフォーマンスなBNNS primitivesを利用しています。』

とのことでこれらのラッパー的な位置づけっぽい。Core MLもBNNSとMPSをラップしており、iOS 13ではモデルの更新も可能になったが、あくまで学習済みモデルを更新するもの。こちらはレイヤークラス群も定義されてるので、PyTorchやTensorFlowみたいにネットワークを実装してiOSやmacOSのGPU/CPUを駆使して学習をまわせる、というものかと。

ちなみにMLCDeviceというクラスがあったのでもしやと思い見てみたが、Neural Engineを指定できるようにはなっていなかった。

https://developer.apple.com/documentation/mlcompute/mlcdevice?changes=latest_major

Metal Performance Shaders Graph

TensorFlowのように多次元テンソルのグラフを構築し、コンパイル、実行するフレームワークらしい。

Build, compile, and execute customized multidimensional compute graphs for linear algebra, machine learning, computer vision, and other similar domains.

f:id:shu223:20200623085100p:plain:w500

(画像は"Build customized ML models with the Metal Performance Shaders Graph"セッションのサムネ)

以前からあったMPSCNNとはどういう関係になるのか、またML Computeを使う場合はこのレイヤー(MPSフレームワーク)を気にする必要はないのか、それともここまで潜る必要があるのか、といったあたりをセッションでチェックする。

ちなみにサンプルコードもある。

Nearby Interaction

名前と一行説明からして、バックグラウンドでのすれ違い通信系(待望)かなと第一印象では思ったが、

Locate and interact with nearby devices using distance, direction, and identifier.

距離、方向、識別子を使用して、近くのデバイスの位置を特定し、対話することができます。(by DeepL)

リファレンスページみたら懐かしのBumpみたいなイラストが載っていて、

f:id:shu223:20200623085821p:plain:w500

なんだ?と思ってOverviewを読んでみると、

Use NearbyInteraction (NI) in your app to acquire the position of nearby iPhones with a U1 chip, such as iPhone 11 or later. To participate in an interaction, devices in physical proximity run an app and consent to share their position and device tokens that uniquely identify their device. When the app runs in the foreground, NI notifies the interaction session of the peer’s location by reporting the peer’s direction and distance in meters.

アプリでNearbyInteraction(NI)を使用して、iPhone 11以降などのU1チップを搭載した近くのiPhoneの位置を取得します。インタラクションに参加するには、物理的に近くにいるデバイスがアプリを起動し、位置情報とデバイスを一意に識別するデバイストークンを共有することに同意します。アプリがフォアグラウンドで実行されると、NIは、相手の方向と距離をメートル単位で報告することで、相手の位置をインタラクションセッションに通知します。

Devices that share their positions using the high frequency of the U1 chip enable a fluid, interactive session in which peer positioning within the physical environment becomes a primary driver of the user experience. For example:

U1チップの高周波数を使用して位置を共有するデバイスは、物理環境内でのピアの位置がユーザ体験の主要なドライバーとなる流動的なインタラクティブセッションを可能にします。例えば、以下のようなものです。(Translated by DeepL)

なんと、U1チップ使うやつだった!これはぜひ試したい。

ちなみにサンプルもある: "Implementing Interactions Between Users in Close Proximity"

SensorKit

ありそうでなかった、その名も「センサーキット」。

Retrieve data and derived metrics from an iPhone’s sensors, or from a paired Apple Watch.

これまで加速度センサーやジャイロetc.のセンサー類を扱う存在だったCore Motionはdeprecatedになるのかなと思ったがまだ現役だった。こちらのフレームワークではペアリングしてるApple Watchのセンサー値も取れるのが違いか。

扱えるセンサー一覧:

static let accelerometer: SRSensor
static let ambientLightSensor: SRSensor
static let gyroscope: SRSensor
static let onWristState: SRSensor
static let pedometerData: SRSensor
static let visits: SRSensor

App Clips

iOS 14の目玉新機能のひとつであるApp Clips、これは新しいUI/UXだけに何がどこまで実現できるのかを把握するためにも要チェック。

Create an app clip to make some of your app’s functionality available to users who don’t have the full app installed.

f:id:shu223:20200623091704p:plain:w450

WidgetKit

同じくiOS 14の目玉新機能のひとつであるウィジェット。これも専用フレームワークが新規で追加されたとなると当然要チェック。

Show relevant, glanceable content from your app on the iOS Home screen or macOS Notification Center.

f:id:shu223:20200623092105p:plain:w450

StoreKit Test

Create and automate tests in Xcode for your app’s subscription and in-app purchase transactions.(アプリのサブスクリプションとアプリ内購入トランザクションのためのテストをXcodeで作成し、自動化します。 by DeepL)

個人的にはここ最近はアプリ内課金の実装をする機会がないのだけど、これはかなり助かるやつでは...!

System

大層な名前に惹かれたが、中身を見てみたらちょっと期待したものと違った。

Perform low-level file operations using type-safe APIs.

Cの低レベルなファイル操作をSwiftでタイプセーフに書ける、というものらしい。

close ⟶ close()

lseek ⟶ seek(offset:from:)

open ⟶ open(_:_:options:permissions:)

pread ⟶ read(fromAbsoluteOffset:into:retryOnInterrupt:)

pwrite ⟶ write(toAbsoluteOffset:_:retryOnInterrupt:)

read ⟶ read(into:retryOnInterrupt:)

write ⟶ write(_:retryOnInterrupt:)

その他の新フレームワーク

(翻訳はby DeepL)

  • Accessibility
    • Make your apps accessible to everyone who uses Apple devices.(Appleデバイスを使用しているすべての人がアプリにアクセスできるようにしましょう。)
  • App Tracking Transparency
    • Request user authorization to access app-related data for tracking the user or the device.(ユーザーやデバイスを追跡するために、アプリ関連のデータにアクセスするためのユーザー権限を要求します。)
  • Apple Archive
    • Perform multithreaded lossless compression of directories, files, and data.(ディレクトリ、ファイル、データをマルチスレッドでロスレス圧縮します。)
  • Automatic Assessment Configuration
    • Prevent users from accessing specific system features during high-stakes assessment activities, such as administering an exam.(試験の実施など、高額な評価活動中にユーザーが特定のシステム機能にアクセスできないようにします。)
  • Developer Tools Support
    • Expose custom views and modifiers in the Xcode library.(Xcodeライブラリでカスタムビューとモディファイアを公開します。)
  • Exposure Notification
    • Implement a COVID-19 exposure notification system that protects user privacy.(利用者のプライバシーを保護するCOVID-19曝露通知システムを導入する。)
  • Kernel Management
    • Manage the loading and unloading of system extensions in the kernel.(カーネル内のシステム拡張のロードとアンロードを管理します。)
  • Media Setup
    • Enable configuration and account management of media services for use on HomePod.(HomePodで使用するメディアサービスの設定とアカウント管理を有効にします。)
  • Paravirtualized Graphics
    • Add limited graphics acceleration to your guest driver stack.(ゲストドライバスタックに限定されたグラフィックスアクセラレーションを追加します。)
  • Screen Time
    • Share and manage web-usage data and observe changes made by a parent or guardian.(ウェブ利用データを共有・管理し、保護者の変更点を観察することができます。)
  • Uniform Type Identifiers
    • Unified type information for files and data transfer.(ファイルやデータ転送のための統一された型情報。)
  • Wallet Passes
    • Create, distribute, and update passes for the Wallet app.(ウォレットアプリのパスを作成、配布、更新します。)
  • xcselect
    • A function that finds the path to a macOS SDK version on disk.(ディスク上の macOS SDK バージョンのパスを検索する関数です。)

まとめ

APIリファレンスの差分から見て気になる新APIをピックアップするシリーズ、新フレームワーク編でした。次は既存フレームワークの更新を見ていきます。

そしてそのあとは、サンプルやセッションを見てもっと具体的に実装方法や何ができて何ができないのかといったところを探っていきます。

昨年はそれらの知見を書籍にまとめましたが、今年はnoteの有料マガジンにまとめていきたいと思います。

note.com

まだ記事がないので今ならたったの500円です。サブスクではなく買い切り価格です。記事が充実してきたら価格改定していきたい所存です。


  1. https://developer.apple.com/documentation/technologies?changes=latest_majorのリストに載っている単位をここでは便宜的に「フレームワーク」と呼んでいますが、厳密にはフレームワークではないのも混じっています。

月額500円のオンラインサロンを始めました

今月の中旬頃、オンラインサロンを始めました。

f:id:shu223:20200525110314p:plain

エンジニアと人生コミュニティ - CAMPFIRE (キャンプファイヤー)

5/13に募集開始し、翌日には100名の募集枠が埋まりました。今は定員いっぱいで新規で入っていただくことはできない状態ですが、自分にとって非常に新鮮な試みなので、初心を忘れないうちにそのコンセプトやねらいについて書いておこうと思います。

オンラインサロン=胡散臭い?

という認識を持っている方も結構多いのではないでしょうか。

  • 基本的にサブスク課金
  • 原価のかかるものを売るわけでもない
  • サロン主の拘束時間が明確に決まっているわけでもない

といったところから「労力をかけずにチャリンチャリンなビジネスモデル」を期待してオンラインサロンを始めてしまうインフルエンサーも多い1ため、こういうイメージが蔓延している2のかもしれません。

では弊サロンはどうかというと、掲げているサロンの「売り」が、

フリーランスiOSエンジニア堤修一と語り合うサロンです。Zoomミーティングでキャリア相談、フリーランス関連相談、技術的な相談etc.ができます。

と、基本的に「堤に相談できます」だけなので、あまりスケールしません。相談者の数に比例してかけるべき時間も増えるので、チャリンチャリンビジネスどころか本質的には時給モデルと変わりません。3

始めた動機

ではなぜ始めたのか?何が狙いなのか?

一番目の理由は、「そもそも僕が相談されたい」からです。

この動画でも言ってるように、そもそも僕は「自分の考えをもっと話したい」「でも誰からも聞かれてもないのにペラペラ語り始めるのは恥ずかしい」という(めんどくさい)ジレンマをかかえています。

youtu.be

なので、自分のポッドキャスト/Voicyでゲストが100個も質問を考えてきてくれたときは嬉々として回答したりもしました。

voicy.jp

そういうのもあって、昔々に「タイムチケット」というサービスで30分500円で相談にのっていたことがあり、 僕自身も楽しかったし、わりと好評だったのですが、

www.timeticket.jp

しかし仕事をふくむ自分のすべての活動は時間を原資とするため、さすがに500円では長くは続けられませんでした。(時間を仕事以外の何かに投入することは自分の時給を自分で払うことに等しい)

note.com

そんなわけで、

  • 「相談を受ける」という自分自身も楽しいことをやって、
  • しかもタイムチケット時代よりは収益になる!

というのが本サロンをやる一番の動機です。

始めたきっかけ

話が前後しますが、「相談を受けるだけ」というコンセプトを思いつく以前、KBOY氏のFlutter無料講座 + オンラインサロンサポートのモデルに深く感銘を受け、自分でも入ってみたりしつつも、自分がオンラインサロンをやるイメージはまったくありませんでした。

  • Flutterのように需要のある技術を教えられるわけではない
  • 自分の得意領域であれ、そもそも初学者向けに噛み砕いて技術を教えることには興味がない4
  • コミュニティやSNSコミュニケーションも苦手な自分が「価値のあるコミュニティ構築・運営」なんてできるわけがない

そんなこんなで、1000円や3000円を自分に払ってもらうモデルはまったく見えないなと。5

しかしふと閃いたのが、

「100円だったらどうだろう?」

というアイデアです。

  • タイムチケットで30分500円でやっていたことなので、×100人で1万円ももらえるなら御の字
  • コロナ禍でオンラインミーティングが世の中的に当たり前になっている
  • オンラインミーティングはアーカイブをメンバー限定コンテンツとして後からも見れるようにすることで、リアルタイム参加できなかった人からも不満が出にくい(KBOY氏のサロンに参加しての気付き)
  • しかもアーカイブはコンテンツの蓄積にもなる
  • 可処分時間の不足をずっと感じている中で、子供が寝て奥さんとゆっくり話した後の22時ぐらいからの時間をイマイチ有効活用できていない
  • 技術顧問業は独占的・クローズドに相談にのる⇔サロンでの相談はパブリック/顧問業の相談は即レス⇔サロンでのレスポンスは隔週、といった点で、相談業としてのコンフリクトはしないはず
  • etc...

いろんなピースがカチッとハマった感じがしたのです。あれ、これいいんじゃない?と。

思いついてすぐにTwitterアンケートを取りはじめてみたのが5/12、

(「入らない」が圧倒的1位なのはご愛嬌

当日のうちに500円 or moreの合計が120名を超えたので、需要は確認できたのでやるしかない

→ 鉄は熱いうちに打て、というわけでアンケート翌日の午前中にCAMPFIREコミュニティでサロンをつくって申請

→ 即日審査通過して募集開始

という経緯でほとんど一夜にして一気に事が進んだのでした。

なぜ500円なのか

「なぜ500円なのですか?安すぎませんか?」と聞かれることもあるのですが、 上述したようにそもそも自分が1000円とかで人を集められるイメージがなく、

「100円ならいけるのでは?」

からスタートして、アンケートの結果「500円でもいけそう」となった、という経緯があります。

自分の開発時給がいくらであれ、「現時点での自分のサロンの価格」としては妥当かなと。

(追記)その他のモチベーション

「コンバージョン先」が欲しい

YouTubeチャンネルを持っていて、今のところ購読者数は約700、各動画の再生数は300〜1kぐらいなのですが、 基本的にエンジニア向け、しかもわりとシニア向け(初学者に刺さる内容はほとんどない)であることから、 超人気チャンネルになって再生数がものすごく伸びて広告収入で稼げる、みたいなことはないと思うわけです。

それはそれで、何らかの自分の別のプロダクトにコンバージョンさせればいいわけですが、

  • フリーランス案件をいただいても時間がないし、
  • 本はニッチすぎるので宣伝してもなぁという気がするし

...というわけでコンバージョン先が存在しない、という状態でした。

「エンジニアと人生チャンネル」を見て、僕の考え方や経験に興味を持ってくれた人が「エンジニアと人生サロン」に入ってくれる、というのはなかなか良いコンバージョンなのでは、と。

弊YouTubeチャンネルは趣味/ライフワークとしての一面もありましたが、これでビジネスとしての役割も得たので、時間を投入しやすくなります。

第1回Zoomミーティング

すぐに定員がいっぱいになったので、早速その週末に第1回のZoomミーティングを行いました。以下の相談に回答しました。

  • 相談1

転職である程度ネームバリューがある会社(某M社)に入る際に、iOSだとこれくらいのスキルがあったら良い、こんなアプリが作れるくらいならいい!というような目安やスキルセットが知りたいと思っております。 今は、swiftに加えてfirebaseをメインに開発、勉強進めています。今年からエンジニアとして活動を始めたのでフォーカスする分野なども探っている段階です 転職に関してアドバイス宜しくお願い致します。

  • 相談2

今、カメラと自作AIを使ったアプリのプロトタイプを作ろうとしているのですが、もともと僕pythonのスクリプトでしかプログラムを組んだことがなく、swift、iOS SDK、Xcodeの使い方もよくわかっていないのが現実です。 AIの動作確認だけできればいいため、そこまで難易度高い本はいらんとは思っていたのですが、Xcodeがしょっちゅう更新されるため、どの本読めばいいかわかっていません。 もし、日本語でアプリ開発についておすすめの本ありましたら、おしえていただけると助かります。

  • 相談3

今、linkedin経由でgithubに上げたスクリプトをパーソナライズしてほしいで言われているので、フリーで仕事を受ける場合のtodoとnot todoついて伺いたいです。 フリーでやっていらっしゃる方も結構いらっしゃるようなので、他の方の意見も併せて伺えれば、嬉しいです。

  • 相談4

現在バックエンドエンドエンジニアをしていて、pythonでMLを学習しようと思っています。 クライアント側と少し考え方は異なるかもしれませんが、堤さんがMLの基礎学習に用いた教材やドキュメント等があれば教えていただきたいです。

  • 相談5

最初に海外で働いたときの始まり方と戻ってきてからの海外案件の仕事のとり方についてお聞きしたいです!

  • 相談6

フリーランスに興味がある会社員エンジニアがフリーランスになる良いタイミングについて、皆さんに聞いてみたいです

毎回のZoomミーティングは録画され、相談別に分けられてアーカイブされます。メンバーになるとアーカイブにもアクセスできます。

今後の改善点

本サロンの良くもあり悪くもあるかもしれない特徴が、

  • MetalやCore MLといった技術の話をしたい人たち(→技術面に興味)
  • iOSエンジニアをこれから目指す人たち(→遅咲きエンジニア面に興味?)
  • iOSとは違う分野のエンジニアの人たち(→働き方や考え方に共感)
  • 海外で働いている/働きたい人たち
  • フリーランスとしての働き方に興味がある人たち

と、技術レベルも興味のある点もバラバラ、というあたりです。上の相談リストを眺めてもその傾向はわかっていただけるかと思います。

僕としてはミーティングは途中入退室自由だし、オンラインなので作業しながら聞いててもいいわけだし、アーカイブもされるので、興味のないトピックがあれば聞き流すなり別の作業をするなりしてくれればいいかなーと軽く考えていたのですが、 匿名アンケートをとってみたところ思った以上にこのあたりの不満も散見されたため、次のように改善することにしました。

「専門的すぎる技術の話」問題へのソリューションとして、次回は次のようにしてみます:

  • 「技術の話」とその他の「一般的な話」とをそれぞれ固める(相談1〜3は一般的な話、4〜6は技術の話、みたいに)
  • 技術の話は長くなりそうであれば(何分までとかより話の深さで判断したい)いったん止めて一通りの議題がおわってから続きをやる

あと、僕に相談したいことが具体的にあって入ってきてくれた方は、相談してしまうともうサロンに入り続ける意義がなくなってしまうかもしれません。 また最初は僕の意見を新鮮に感じてくれている人も、だんだんワンパターンに思えてくるかもしれません。(根っこが同じ問題は答えも同じになってしまう)

そんなわけで、本サロンのLTV(Life Time Value)は結構低い気がしてます。まだ1ヶ月目なのでわかりませんが。

とくに後者の問題は「僕自身が同じ回答ばかりする自分に耐えられなくなる」という状況が容易に想像できるため、ゲストを呼んだり、調べつつメモを書いてそれをブログ記事にする実演だったり、案件依頼とそのコミュニケーションについてパネルディスカッションしたり6といったこともやりたいなぁと。

まとめ

オンラインサロンを開設したねらいについて書きました。 もし興味を持ってくれた方がいたら、 以下のページで「お気に入り」に登録しておいていただくと、退会者が出て枠が空いたたときに通知がくると思います。(今のところ2人の方が退会されています)

community.camp-fire.jp

引き続き「エンジニアと人生サロン」(仮)をお願いいたします。


  1. 要出典

  2. 要出典

  3. 実際のところ弊サロンにはそれぞれ自身のチャンネルで有名だったり凄腕フリーランスだったりする人もいて、そういった方々がSlackで質問に回答してくれたりとか、わりとニッチな技術者同士の分科会ができたりとか、頻繁にもくもく会が開催されてたりとかのコミュニティ的なところも良かったりするのですが、それらは「たまたま」の産物であって、僕があらかじめサロンの設計として組み込んだものではないので、オフィシャルには「うちのサロンはこういうところがいいよ」とは掲げていません。

  4. 自分の勉強をアウトプットドリブンで進めるのはよくやります。本とかはその産物。

  5. (2020.9.10追記)2回目の募集からは1000円になりました。今後も価格は変わる可能性があります。

  6. 100名のうち実に18名が現役フリーランス

ドラッグ&ドロップでCore MLモデルを試せる「MLModelCamera」で物体検出モデルをサポートしました

Create MLによって画像分類モデル(Image Classifier)をドラッグ&ドロップでつくれるようになったので、

shu223.hatenablog.com

そのモデル(.mlmodel)をドラッグ&ドロップするだけでリアルタイム画像認識アプリとして試せるOSSをつくりました(2年前に)。

github.com

で、最近1、Create MLが物体検出2モデル(Object Detector)の学習もサポートしたので、

f:id:shu223:20200411151704p:plain

拙作MLModelCameraでも物体検出モデルをサポートしました。

Create MLで学習させた物体検出モデルやAppleが配布しているYOLOv3、coremltools公式リポジトリに変換サンプルのあるSSDといった物体検出モデルをmodelsフォルダ配下に置いてビルドするだけで試せます。

f:id:shu223:20200411151837p:plain:w300

バウンディングボックスの可視化の実装はサイズの換算とか地味に面倒だし既存実装を探すのも面倒、ということでmlmodelを自作する際には非常に便利かと思います。(自分でよく使っています。)


  1. WWDC 2019で発表

  2. Appleのモデル配布ページの日本語では「オブジェクト検出」と訳してたが、ディープラーニングの分野ではこっちの方が一般的だと思われる。

Core ML Tools実践入門に「mlmodelファイルフォーマット」の章を加筆しました #技術書典

拙著「Core ML Tools実践入門」に加筆した新版を公開しました。

shu223.hatenablog.com

BOOTH、技術書典 応援祭コンカで電子版をご購入の方は新版を無料でダウンロードしていただけます。

mlmodelファイルフォーマットについて知ると何が嬉しいのか?

知ると嬉しいというより、知らないと損している、といっても過言ではないと思っています。

iOS開発にたとえるのであれば、APIリファレンスの読み方がわからず開発をしているようなものかと。たとえばこの章に書いてあることを理解していないと、たとえば画像分類(Image Classification)を行う.mlmodelモデルでクラスラベルの一覧を出力したいと思ってもどのように出力するのか、そもそも可能なのかといったことがわからないわけです。

クラスラベル一覧はほんの一例で、mlmodelのファイルフォーマットについて理解しておくと、mlmodelの持つあらゆる情報にアクセスできるようになります。coremltoolsを用いてモデルを自作する際、デバッグや最適化に大いに役立つことでしょう。

「Core ML Tools実践入門」という本を書きました #技術書典

iOS×機械学習といえばCore ML。既製のCore MLモデルを扱うのは非常に簡単なのですが、

  • TensorFlowやKeras等の機械学習ツールで作成した独自モデルをCore MLモデルに変換したい
  • モデルサイズを小さくしたい
  • 複数サイズの入力をサポートしたい
  • オンデバイスで更新できるようにしたい

等々、つまり 自分でCore MLモデルをつくりたい・カスタマイズしたい場合にはCore ML Tools(coremltools)を使いこなすことが不可欠 です。

が、こんなに重要なツールなのに意外にも情報が少なく、日本語情報どころか英語の公式ドキュメントすら全然網羅的ではありません

というわけで自分で勉強しつつ書いた本がこちらです1

f:id:shu223:20200309090337j:plain

Core ML Toolsの利用方法を実践形式でさまざまなモデルをつくりながら学んでいきます。最初はわずか2行のコードで変換することからはじめてCore ML Toolsに入門しつつ、もっと高度な変換方法や、モデルのサイズを縮小する方法、パイプラインを構築する歩法、オンデバイスで学習できるようにする方法等も解説していきます。

また巻末には「逆引きリファレンス」も収録しています。開発の現場で「どう書くんだっけ?」となったときに大いに役立つことでしょう。

A5版、150ページ。サンプルコードはGitHubよりダウンロード可能です。普段は電子版だけで2300円のところ、3月いっぱい開催される「技術書典 応援祭」期間中のみ紙+電子セット2000円で販売しています。40部しかないのでお早めに!

techbookfest.org

目次

第1章 準備

  • 1.1 Core ML Toolsとは
  • 1.2 Kerasとは
    • 1.2.1 KerasとCore ML Tools
    • 1.2.2 tf.kerasとスタンドアロン版Keras
  • 1.3 Keras/TensorFlow/Core ML Toolsの環境構築

第2章 Core ML Toolsはじめの一歩

  • 2.1 2行のコードで学習済みモデルをロードする
  • 2.2 2行のコードでCore MLモデルに変換する
  • 2.3 変換したモデルを.mlmodelファイルとして保存

第3章 Core MLモデル作成の基礎

  • 3.1 HDF5ファイルを読み込む
  • 3.2 Core MLモデルに変換する
  • 3.3 Core MLモデルの入力の型を変更する
  • Core MLモデルから自動生成されるSwiftコード
  • Visionはどのように画像分類モデルを判定するか?

第5章 オンデバイス学習 - UpdatableなCore MLモデルの作成

  • 5.1 モデルのパーソナライゼーション
  • 5.2 ベースとなるモデルの作成
  • 5.3 Updatableなモデルに変換する
  • 5.4 損失関数をセットする
  • 5.5 最適化アルゴリズムをセットする
  • 5.6 エポック数をセットする
  • 5.7 モデルを保存する

第6章 オンデバイス学習 - iOSで学習

  • 6.1 MLUpdateTask
    • 6.1.1 mlmodelc
    • 6.1.2 MLBatchProvider, MLArrayBatchProvider
    • 6.1.3 MLTask
    • 6.1.4 オンデバイスモデル更新タスクの全体感
  • 6.2 学習データの準備
  • 6.3 学習タスクの実行
  • 6.4 オンデバイスで学習したモデルを保存する / MLUpdateContext, MLWritable
  • 6.5 推論処理の実行

f:id:shu223:20200309090819g:plain

第7章 TensorFlowモデルの変換 - 基礎編

  • 7.1 tfcoreml
  • 7.2 tfcoremlを用いたCore MLモデルへの変換(最小実装)
    • 7.2.1 学習済みモデル(.pbファイル)を読み込む
    • 7.2.2 出力テンソルの名前を取得する
    • 7.2.3 tfcoremlを用いて変換する
  • 7.3 より扱いやすいCoreMLモデルに変換する
    • 7.3.1 クラスラベルを指定する
    • 7.3.2 入力の型を画像に変更する
  • 7.4 iOSで推論を実行
  • 7.5 入力画像の前処理を指定する

第8章 TensorFlowモデルの変換 - 画風変換モデル

  • 8.1 学習済みモデルからグラフ定義を読み込む
  • 8.2 変換に必要なグラフの情報を取得する
    • 8.2.1 入力テンソルの名前を取得する
    • 8.2.2 出力テンソルの名前を取得する
  • 8.3 tfcoremlを用いて変換する
    • 8.3.1 入力テンソルのshapeを指定する
  • 8.4 Core MLモデルの出力の型を変更する
  • 8.5 iOSで画風変換を実行
    • 8.5.1 複数の入力を持つCore MLモデルをVisionで使う
    • 8.5.2 出力画像を取得する

f:id:shu223:20200309090946g:plain

第9章 Flexible Shape - 超解像モデル

  • 9.1 Flexible Shapeとは/使いどころ
  • 9.2 超解像モデルをCore MLモデルに変換する
  • 9.3 Flexible Shapeを適用する
  • 9.4 iOS側での推論処理の実行

第9章 Core MLモデルのサイズを小さくする

  • 9.1 本章で利用する感情認識モデルについて
  • 9.2 重みを16ビット化する
    • 9.2.1 16ビット化が推論結果の精度に与える影響
    • 9.2.2 Core MLモデルを16ビット化する手順
  • 9.3 クォンタイズ
  • 9.4 iOSでの推論結果の比較
  • 9.5 さらなるモデルサイズ削減
    • 9.5.1 ルックアップテーブルを利用した量子化
    • 9.5.2 モデルの一部を共通化

第10章 パイプラインモデルとリンクモデル(Linked Model)

  • 10.1 パイプラインの構築
    • 10.1.1 coremltools.models.pipelineモジュール
    • 10.1.2 PipelineClassifierオブジェクトの生成
    • 10.1.3 パイプラインにモデルを追加
    • 10.1.4 MLModel オブジェクト生成
  • 10.2 リンクモデル(LinkedModel)
    • 10.2.1 リンクモデルとは/リンクモデルを使用するメリット
    • 10.2.2 パイプラインとリンクモデル
    • 10.2.3 リンクモデルの作成方法
  • CreateMLのモデルはなぜ小さいのか
    • CreateMLとパイプライン
    • Vision FeaturePrint

第11章 モデルの可視化

  • 11.1 Netron
  • 11.2 coremltoolsのvisualize_spec
  • 11.3 TensorBoard
    • 11.3.1 TensorFlowモデルのグラフを可視化
    • 11.3.2 Kerasでの学習状況を可視化
  • 11.4 Kerasのplot_model

付録A coremltools逆引きリファレンス

  • A.1 MLModelオブジェクトを生成する
    • A.1.2 .mlmodelファイルから生成する
    • A.1.1 Specから生成する
  • A.2 モデルのSpecを取得する
    • A.2.1 .mlmodelファイルから取得する
    • A.2.2 MLModelオブジェクトから取得する
  • A.3 .mlmodelファイルの保存・読み込み
    • A.3.1 .mlmodelファイルを読み込む
    • A.3.2 .mlmodelファイルとして保存する
  • A.4 NeuralNetworkBuilderを生成する
  • A.5 モデルの中身を調べる
    • A.5.1 モデルを可視化(ビジュアライズ)する
    • A.5.2 モデルのバージョン(Specification Version)を確認する
    • A.5.3 Specをログに出力する
    • A.5.4 ネットワークの情報をログに出力する
    • A.5.5 NeuralNetworkBuilderでモデルの入力・出力形式を確認する
    • A.5.6 モデルのレイヤー一覧を出力する
    • A.5.7 モデルの中間層の入出力形式を調べる
  • A.6 Core MLモデルにクラスラベルを与える
    • A.6.1 ラベル文字列の配列を渡す
    • A.6.2 クラスラベルファイルのパスを渡す
  • A.7 モデルの入力・出力をカスタマイズする
    • A.7.1 入力・出力名を指定する
    • A.7.2 変換時に入力の型を画像型にする
    • A.7.3 変換済みモデルの入力・出力の型を画像型にする
    • A.7.4 入力テンソルのshapeを指定する
    • A.7.5 入力画像の前処理を指定する
  • A.8 モデルサイズを圧縮する
    • A.8.1 重みを16ビット(半精度)化する
    • A.8.2 重みをクォンタイズする
  • A.9 オンデバイス学習関連
    • A.9.1 モデルがUpdatableかどうかを調べる
    • A.9.2 Updatableなレイヤー一覧を出力
    • A.9.3 Updatableなモデルに変換する
    • A.9.4 学習で使用する損失関数をセットする
    • A.9.5 損失関数のサマリを確認する
    • A.9.6 学習で使用する最適化アルゴリズム(オプティマイザ)をセットする
    • A.9.7 最適化アルゴリズムを確認する
    • A.9.8 エポック数をセットする
  • A.10 FlexibleShape関連
    • A.10.1 FlexibleShapeの適用可否を確認する
    • A.10.2 入力・出力の画像サイズを範囲で指定する
    • A.10.3 入力・出力に複数の画像サイズを指定する
  • A.11 misc.
    • 利用中のcoremltoolsのバージョンを確認する

付録B Kerasでカスタムモデル作成

  • B.1 モデルのネットワークを定義する
    • B.1.1 Sequential モデル(とKeras functinal API)
    • B.1.2 Conv2D
    • B.1.3 MaxPooling2D
    • B.1.4 Dropout
    • B.1.5 Flatten
    • B.1.6 Dense
    • B.1.7 モデルのサマリを確認
  • B.2 モデルのコンパイル
    • B.2.1 損失関数
    • B.2.2 最適化アルゴリズム
    • B.2.3 評価関数
  • B.3 モデルの学習
  • B.4 評価
  • B.5 モデルの保存

  1. 日本語でのCore ML Tools専門書は初ですし、今後も出てこないと思います。

フリーランスのお仕事まとめ2019

2020年に入って既に10分の1ほど過ぎてしまいましたが、2019年にやったお仕事のまとめです。

機械学習×iOS

  • とある有名アプリへの機械学習モデル組み込み実装
    • 実稼働中
    • 実績公開OKか未確認なので控えておく
  • 「まごチャンネル」の子供写真検出

  • とある広告案件向けのプロトタイプ
    • 個人的には関われてめちゃくちゃ嬉しいし内容もおもしろいのだけどまだまだ公開できない

ARKit, Metal, デプス, カメラ, 画像処理関連

  • とある海外のアプリの動画向けエフェクト
    • 渡航費や滞在費は先方持ちで1週間海外に滞在
    • MetalやARKit 3を用いた動画エフェクトの実装
  • とあるカメラアプリへのデプス関連機能実装
    • watchOSも使用
  • アプリで3Dスキャン -> 3Dプリントデータ作成(プロトタイプ)
  • とある雑誌×AR案件(プロト)
    • ARKitも他のARライブラリも使わないAR
  • とある海外案件でのデプス機能実装(その機能だけを実装したサンプルが成果物)

BLE関連

  • とあるIoTプロダクトを利用した実証実験用プロト開発
    • とある業界向けソリューションで、別の業界の現場に行けるのは楽しかった
  • とあるスマートロック
    • BLEのパフォーマンス改善・・・起動〜利用開始までの所要時間が数分の1に短縮された(結局要因はBLEだけではなかったが)

展示系

  • ニューヨークのポスター美術館「Poster House」のサイネージ向けmacOSアプリ(BASSDRUM)

(9月には義母が手伝いに来てくれて、念願かなってNYに実際に見に行くことができた)

  • 「不思議な宿」のiPadアプリ(ブルーパドル)

www.youtube.com

技術書の執筆

2019年のひとつのテーマは「技術発信のマネタイズ」だったが少しずつ結実してきた。

新刊

  • Keras & Core ML Tools
    • 今一番力をいれて更新しています
    • 「詳解Core ML Tools - coremltools, Keras, TensorFlow」に改題予定

既刊の更新

その他発信活動

  • 「三重県立桑名工業高校」での講演

note.com

  • noteの有料マガジン
    • 有料バリアにより心理的安全に守られつつ日々の勉強メモを気軽に投稿するための場
    • 合計143本書いた(←マガジン外の記事も含む)

  • 単価公開note
    • めちゃくちゃ売れた...技術書は3ヶ月フルコミットで書いて印税の合計50万いかないぐらいだったが、これは書くのに1時間もかかってなくてたぶん100万ぐらい売れた
    • しかしこれは自分の文章力とかじゃなく10年間ひたすらものをつくり行動し発信してきた結果なので再現性はまったくないと思っている

note.com