# iOS SDK

Roboflow Mobile iOS SDK は、iOSアプリケーションを開発していて、より高速な推論のため、または新しい機能セット、機能、ユースケース（拡張現実など）を解放するために、エッジ（iPadやiPhone）上でモデルを動作させる必要がある場合に最適な विकल्पです。

カスタムのコンピュータビジョンモデルを組み込んだネイティブモバイルアプリケーションにより、開発者はアプリに視覚を与えることができます。

## タスクサポート

以下のタスクタイプがホスト型APIでサポートされています:

| タスクタイプ           | iOS SDKデプロイメントでサポート |
| ---------------- | ------------------- |
| オブジェクト検出         | ✅                   |
| 分類               |                     |
| インスタンスセグメンテーション  | ✅（iOS 18以上）         |
| セマンティックセグメンテーション |                     |

### CoreMLエクスポート互換性

以下のモデルアーキテクチャは、オンデバイスデプロイメント用のCoreML（`.mlpackage`）エクスポートをサポートしています:

| モデル      | CoreMLエクスポート |
| -------- | ------------ |
| RF-DETR  | ✅            |
| YoloLite | ✅            |
| 分類モデル    | ✅            |

## モデルをiOSデバイスにデプロイする

### 対応ハードウェアとソフトウェア

すべてのiOSデバイスはオンデバイス推論をサポートしていますが、iPhone 8（A11 Bionicプロセッサ）より古いものでは、よりエネルギー効率の低いGPUエンジンにフォールバックします。

Roboflowでは、最低iOSバージョン15.4が必要です（インスタンスセグメンテーションモデルでは18.0）。

## プロトタイピング

次を使って開発できます: [Roboflow Hosted Inference API](https://docs.roboflow.com/deploy/serverless)。これはオンデバイス推論と同じ学習済みモデルを使用します。

## インストール

* インストール [CocoaPods](https://guides.cocoapods.org/using/getting-started.html) | [トラブルシューティングガイド](https://guides.cocoapods.org/using/troubleshooting#installing-cocoapods)

「CocoaPodsはRubyで構築されており、macOSで利用可能なデフォルトのRubyでインストールできます。Rubyバージョンマネージャーを使用することもできますが、何をしているか分かっている場合を除き、macOSで利用可能な標準のRubyを使用することをおすすめします。デフォルトのRubyを使用する場合、gemをインストールする際に `sudo` を使用する必要があります。（ただし、これはgemのインストール中のみの問題です。）」 - [CocoaPods](https://guides.cocoapods.org/using/getting-started.html)

この処理でRubyGemsに管理者権限を付与したくない場合は、「sudoなし」インストールを選択できます。ただし、 `sudo` のインストールの方が一般的です。

ターミナルで `pod --version` を入力して、CocoaPodsが正常にインストールされていることを確認してください。

### Roboflow CocoaPodのインストール

まず、 `pod init` をプロジェクトディレクトリで実行します。

次のことを確認してください: `Podfile` に次が指定されていること `platform :ios, '15.4'`

次に、 `pod 'Roboflow'` を `Podfile`.

XCodeのCommand Line Toolsがインストールされていない場合は、 `xcode-select --install` を入力して、CocoaPodsが正常にインストールされていることを確認してください。

を実行します。 `これにより次が返されます:` Command Line Toolsがすでにシステムに存在する場合は、

最後に、 `pod install` を実行し、生成された `.xcworkspace` ファイルを [XCode](https://developer.apple.com/xcode/).

![Podfileのインストール成功後のターミナル](https://3740591140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-742fddf172d5eea914ea63a42170583cbe748443%2Fimage.png?alt=media)

![Podfileのインストール成功後のプロジェクトディレクトリ](https://3740591140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-85737dbd1b9fcb80ea6674633012e85c908f5c30%2Fimage.png?alt=media)

* これが次のエラーを返す場合:「Rubyインタプリタまたは拡張ライブラリでバグに遭遇した可能性があります」、まず `brew install cocoapods`を実行し、その後 `pod install` を実行し、生成された `.xcworkspace` XCodeでファイルを開いてください。
  * ターミナルで `pod --version` を入力して、CocoaPodsが正常にインストールされていることを確認してください。

### SwiftでRoboflowを使用する

次へ移動します: `.xcworkspace` XCodeでファイルを開いてください。

![](https://3740591140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-845222e3655098babfff65dff3575a9886c12c24%2Fimage.png?alt=media)

次に、以下を追加してRoboflowをインポートします `import Roboflow`を `.xcworkspace` ファイルに追加します。

次に、次でRoboflow APIのインスタンスを作成します `let rf = Roboflow(apiKey: "API_KEY")`。 `modelVersion`については、 `YOUR-MODEL-VERSION-#` をモデルのバージョン番号の整数値に置き換えてください。

#### [プロジェクト情報の見つけ方](https://docs.roboflow.com/roboflow/roboflow-jp/deploy/sdks/broken-reference)

**Completion Handlerの使用法:**

```swift
import Roboflow
...
// API Keyで初期化
let rf = RoboflowMobile(apiKey: "API_KEY")
var model: RFModel?
...

// modelはあなたのモデルのプロジェクト名です
rf.load(model: "YOUR-MODEL-ID", modelVersion: YOUR-MODEL-VERSION-#) { [self] model, error, modelName, modelType in
    if error != nil {
        print(error?.localizedDescription as Any)
    } else {
        model?.configure(threshold: threshold, overlap: overlap, maxObjects: maxObjects
                            processingMode: .performance or .balanced or .quality, // instance seg
                            maxNumberPoints: mask処理ポイントの最大数) // instance seg
        self.model = model
    }
    
}
...

// model?.detect はUIImageを受け取り、その上で推論を実行します
let img = UIImage(named: "example.jpeg") // またはCVPixelBuffer
model?.detect(image: img!) { predictions, error in
    if error != nil {
        print(error)
    } else {
        print(predictions)
    }
}
```

**非同期での使用法:**

非同期で使用するには、Roboflowモデルを非同期ブロック内で呼び出す必要があります。

```swift
import Roboflow
...
// API Keyで初期化
let rf = RoboflowMobile(apiKey: "API_KEY")
...

// modelはあなたのモデルのプロジェクト名です
let (model, loadingError, modelName, modelType) = await rf.load(model: "YOUR-MODEL-ID", modelVersion: YOUR-MODEL-VERSION-#)
model!.configure(threshold: threshold, overlap: overlap, maxObjects: maxObjects)
...

// model?.detect はUIImageを受け取り、その上で推論を実行します
let img = UIImage(named: "example.jpeg")
let (predictions, predictionError) = await model!.detect(image: img!)
print(predictions)
```

**予測の形式:**

```
x:Float // オブジェクトの中心x
y:Float // オブジェクトの中心y
width:Float
height:Float
className:String
confidence:Float
color:UIColor
box:CGRect
points:[CGPoint] // インスタンスセグメンテーションモデルのみ
```

[CGRect](https://developer.apple.com/documentation/corefoundation/cgrect)

### ネイティブSwiftの例

この [roboflow-ios-starter](https://github.com/roboflow/roboflow-ios-starter) app は、roboflowモデルを使ってリアルタイムiOSアプリを作成するための優れた出発点です。オブジェクト検出モデルとインスタンスセグメンテーションモデルの両方について、カメラ設定、モデルの読み込みと処理、出力描画コードが含まれています。

### React Native Expo Appの例

ここでは、このSDKをReact Nativeのexpoアプリに統合する例も提供しています。独自の下流アプリケーションを構築する際に役立つかもしれません。

次の両方があることを確認してください [Expo](https://docs.expo.dev/) と [CocoaPods](https://cocoapods.org/) がインストールされていること。

* `expo-cli` は以下のNode.jsバージョンをサポートしています: `>=12.13.0 <15.0.0` （メンテナンスLTS）と `>=16.0.0 <17.0.0` （アクティブLTS）
* Node.js用にyarnパッケージをインストールする必要があります（`npm install -g yarn`)

{% embed url="<https://github.com/roboflow-ai/RoboflowExpoExample>" %}

### iOSアプリの例 - CashCounter

ダウンロード [CashCounter](https://apps.apple.com/app/roboflow-cash-counter/id1633812788)、米国の硬貨と紙幣を数えるサンプルiOSアプリを、コンピュータビジョンモデルをiPhoneにデプロイする方法の例として提供しています。バウンディングボックスの可視化、FPS、オブジェクトカウント、画像アップロードなどの例を見ることができます。
