Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2015-06-22

【iOS9】Core Image の新機能:文字認識/追加フィルタ47種

先日、Gunosy さん主催の勉強会「WWDC Afterparty Roppongi」にて標題の発表をさせていただきました。



タイトルの通り、iOS 9 の Core Image の新機能について紹介&デモ *1 しました。


概要

大きく分けて、文字認識、新フィルタの紹介の2つ。


文字認識

WWDC初日に書いた下記記事でもわりと反響の大きかった機能。


で、OCR的なものを期待していたわけですが、リファレンスで CIFeatureTypeText を見ると、認識結果の文字列が入ってくるプロパティはないので、文字の「内容」を認識するのではなく、文字の「領域」を検出するものでした、という話。

class CITextFeature : CIFeature {
    
    var bounds: CGRect { get }
    var topLeft: CGPoint { get }
    var topRight: CGPoint { get }
    var bottomLeft: CGPoint { get }
    var bottomRight: CGPoint { get }
}

いわゆる「顔認識」も、「誰の顔か」を認識するのではなくて、顔の「領域」を検出するものがほとんどなのと同様ですね。


それはそれとしてOCRの前処理とかに便利だと思います。実装は非常に簡単で、顔認識とかとほぼ同じです。

let image  = CIImage(CGImage: imageView.image!.CGImage!)

let detector = CIDetector(
    ofType: CIDetectorTypeText,
    context: nil,
    options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])

let features = detector.featuresInImage(image)

for feature in features as! [CITextFeature] {
    // 認識結果の矩形を描画する処理
}

NDAのため iOS 9 での実行結果スクショを貼るのは自粛しますが、デモでは以下の2種類の画像について試し、


f:id:shu223:20150622065519p:image:w450



f:id:shu223:20150622065439j:image:w320


  • 前者は文字領域を完璧に検出
  • 後者はGitHub マークのある黒地に白文字の "shu223" というものしか認識されず

という結果になりました。わずかなパースや陰影(後者のような「写真」画像は、人間には均一に見える部分でも、二値化してみると結構色に偏りがあったりする)で認識精度がガクッと落ちるようです。


新フィルタ

CIFilter は

CIFilter(name: filterName, withInputParameters: params)

っていう感じでフィルタ名を文字列で指定する形式なので、API Diffs とかには新規追加フィルタは表記されない(Filter Reference というドキュメントもあるけど更新が遅い)ため、次のようにビルトインフィルタ名を全部出力しておいて、

let filterNames = CIFilter.filterNamesInCategory(kCICategoryBuiltIn)
for filterName in filterNames {
    print(filterName)
}

そのあと `diff` コマンドで新規追加分を抽出する、ということを毎年 iOS がメジャーバージョンアップするたびにやっています。


で、今年はフィルタ数の変化をグラフにしてみたのですが、


f:id:shu223:20150622071620j:image:w425


ひさびさにフィルタ数がグッと増えていて、ちょっと盛り上がりを感じます。


例によってNDAによってフィルタをかけた結果のスクショ掲載は控えますが、以下に新フィルタ名47種の一覧を載せておくので、名前から効果を察していただけると。

  • CIAreaAverage
  • CIAreaMaximum
  • CIAreaMaximumAlpha
  • CIAreaMinimum
  • CIAreaMinimumAlpha
  • CIBoxBlur
  • CICircularWrap
  • CICMYKHalftone
  • CIColumnAverage
  • CIComicEffect
  • CIConvolution7X7
  • CICrystallize
  • CIDepthOfField
  • CIDiscBlur
  • CIDisplacementDistortion
  • CIDroste
  • CIEdges
  • CIEdgeWork
  • CIGlassLozenge
  • CIHeightFieldFromMask
  • CIHexagonalPixellate
  • CIKaleidoscope
  • CILenticularHaloGenerator
  • CILineOverlay
  • CIMedianFilter
  • CIMotionBlur
  • CINoiseReduction
  • CIOpTile
  • CIPageCurlTransition
  • CIPageCurlWithShadowTransition
  • CIParallelogramTile
  • CIPDF417BarcodeGenerator
  • CIPointillize
  • CIRippleTransition
  • CIRowAverage
  • CIShadedMaterial
  • CISpotColor
  • CISpotLight
  • CIStretchCrop
  • CISunbeamsGenerator
  • CITorusLensDistortion
  • CITriangleTile
  • CIZoomBlur

会場ではシミュレータでデモしたのですが、GPUが効くので、実機でやるとチョッパヤです。



ちなみにちょっと余談ですが、会場で Yahoo の佐野さんから飛び出した「Apple は何のためにそんなにがんばってフィルタを追加しているのか?」という質問が印象的でした。


確かに、CIDetector 系は実用的だし、ボックスブラーとかノイズリダクションとか、色のブレンド系etcは写真加工系に幅広く使えそうなのでわかるとしても、CICrystallize とかの飛び道具系って実際には使う人いなそうだなぁと。そして僕はそういえば案件で Core Image 使ったことなんて記憶に無いのになぜ毎年やってるのだろう、と・・・


おわりに

他の発表者のみなさんもかぶりがないように幅広い内容で発表されていて、人数もちょうどよく和やかな雰囲気で質疑応答も盛り上がり、大変有意義な時間を過ごさせていただきました。主催のグノシーさん、発表者・参加者のみなさまどうもありがとうございました!


次回は「WWDC2015報告共有会@ネクスト」にて、Audio Unit Extensions について話させていただく予定です。


*1:参加者は Apple Developer アカウントを持っている人のみ

hkato193hkato193 2015/06/22 15:57 WWDCの発表者曰く、Core Imageの今年最大のトピックは

「OS XとiOSとで実装を一緒にした(Core Image have a unified implementation across both of our platforms)」

だそうですね。フィルタの種類が両者で同じになっただけでなく、その結果も同じものが得られるようになった、真のクロスプラットフォームなコードが書けるようになったというのがmost important topicだと。

まあ、しかし、その熱意も聴衆にはあまり伝わってませんでしたね…。

shu223shu223 2015/06/23 01:08 僕はスライドpdfしか見ていないのですが、加藤さんがツイートでもおっしゃっていた

> その熱意も聴衆にはあまり伝わってませんでしたね…。

っていう部分はそこだったんですねー 確かにほとんどの開発者にはその恩恵がピンとこないかも。。

スライド後半は Core Image x Metal とかの他フレームワーク連携に大きくページが割かれていましたが、それらも "Core Image have a unified implementation across both of our platforms" による恩恵の一環なんでしょうかね。(というかフレームワーク間連携しやすいように unified したのかな?)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 |