# iOS SDK

Roboflow Mobile iOS SDK는 iPad 또는 iPhone과 같은 엣지에서 모델을 실행해야 하여 더 빠른 추론이 필요하거나, 증강 현실 같은 새로운 기능, 역량 및 사용 사례를 열어야 하는 iOS 애플리케이션을 개발할 때 훌륭한 선택입니다.

사용자 지정 컴퓨터 비전 모델이 내장된 네이티브 모바일 애플리케이션은 개발자가 앱에 시각을 부여할 수 있게 해줍니다.

## 작업 지원

다음 작업 유형은 hosted API에서 지원됩니다:

| 작업 유형                 | iOS SDK 배포에서 지원 |
| --------------------- | --------------- |
| Object Detection      | ✅               |
| Classification        |                 |
| Instance Segmentation | ✅ (iOS 18 이상)   |
| Semantic Segmentation |                 |

### CoreML Export 호환성

다음 모델 아키텍처는 온디바이스 배포를 위한 CoreML(`.mlpackage`) export를 지원합니다:

| 모델                | CoreML Export |
| ----------------- | ------------- |
| RF-DETR           | ✅             |
| YoloLite          | ✅             |
| Classification 모델 | ✅             |

## iOS 기기에 모델 배포하기

### 지원되는 하드웨어 및 소프트웨어

모든 iOS 기기는 온디바이스 추론을 지원하지만, iPhone 8(A11 Bionic Processor)보다 오래된 기기는 에너지 효율이 더 낮은 gpu engine으로 대체됩니다.

Roboflow는 최소 iOS 버전 15.4를 요구합니다(Instance Segmentation 모델의 경우 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 Version manager를 사용할 수도 있지만, 무엇을 하고 있는지 확실히 알고 있지 않다면 macOS에 기본으로 제공되는 표준 Ruby를 사용하는 것을 권장합니다. 기본 Ruby 설치를 사용하면 gems를 설치할 때 `sudo` 를 사용해야 합니다. (다만 이는 gem 설치가 진행되는 동안에만 문제입니다.)" - [CocoaPods](https://guides.cocoapods.org/using/getting-started.html)

"Sudo-less" 설치는 이 과정에 대해 RubyGems 관리자 권한을 부여하고 싶지 않을 때 사용할 수 있는 옵션입니다. 그러나 `sudo` 설치가 더 일반적이라는 점을 참고하세요.

Terminal에 `pod --version` 을 입력하여 CocoaPods가 성공적으로 설치되었는지 확인하세요.

### Roboflow CocoaPod 설치하기

먼저, `pod init` 을 프로젝트 디렉터리에서 실행하세요.

다음이 있는지 확인하세요. `Podfile` 이 다음을 지정하는지 `platform :ios, '15.4'`

그다음, 다음을 추가하세요. `pod 'Roboflow'` 를 `Podfile`.

XCode Command Line Tools가 설치되어 있지 않다면 다음을 실행하세요. `xcode-select --install` 을 입력하여 CocoaPods가 성공적으로 설치되었는지 확인하세요.

그러면 다음이 반환됩니다: `xcode-select: error: command line tools are alreadyinstalled, use "Software Update" to install updates` 시스템에 Command Line Tools가 이미 설치되어 있는 경우입니다.

마지막으로, `pod install` 을 실행하고 생성된 `.xcworkspace` 파일을 [XCode에서 여세요.](https://developer.apple.com/xcode/).

![Podfile의 설치가 성공한 후 Terminal](https://3958014485-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://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-85737dbd1b9fcb80ea6674633012e85c908f5c30%2Fimage.png?alt=media)

* 다음 오류가 반환되면: "You may have encountered a bug in the Ruby interpreter or extension libraries," 먼저 `brew install cocoapods`를 실행한 다음 `pod install` 을 실행하고 생성된 `.xcworkspace` 파일을 XCode에서 여세요.
  * Terminal에 `pod --version` 을 입력하여 CocoaPods가 성공적으로 설치되었는지 확인하세요.

### Swift에서 Roboflow 사용하기

다음으로 이동하세요. `.xcworkspace` 파일을 XCode에서 여세요.

![](https://3958014485-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하세요. `import Roboflow`. 를 `.xcworkspace` 파일에 추가하세요.

그런 다음 다음을 사용하여 Roboflow API 인스턴스를 만드세요. `let rf = Roboflow(apiKey: "API_KEY")`. For `modelVersion`, `YOUR-MODEL-VERSION-#` 를 모델 버전 번호의 정수값으로 바꾸세요.

#### [프로젝트 정보 찾기](https://docs.roboflow.com/roboflow/roboflow-ko/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] // instance segmentation 모델에만 해당
```

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

### 네이티브 Swift 예제

roboflow-ios-starter [앱은 roboflow 모델을 사용해 실시간 iOS 앱을 만드는 데 훌륭한 출발점입니다. 여기에는 object-detection 및 instance segmentation 모델 모두를 위한 카메라 설정, 모델 로딩 및 처리, 출력 그리기 코드가 포함되어 있습니다.](https://github.com/roboflow/roboflow-ios-starter) React Native Expo 앱 예제

### 또한 여기에서 React Native를 사용해 이 SDK를 expo 앱에 통합하는 예제도 제공합니다. 직접 다운스트림 애플리케이션을 구성할 때 유용할 수 있습니다.

다음 두 가지가 모두 설치되어 있는지 확인하세요.

Expo [와](https://docs.expo.dev/) 가 [CocoaPods](https://cocoapods.org/) 설치되어 있습니다.

* `expo-cli` 는 다음 Node.js 버전을 지원합니다: `>=12.13.0 <15.0.0` (Maintenance LTS) 및 `>=16.0.0 <17.0.0` (Active LTS)
* yarn 패키지는 Node.js용으로 설치되어 있어야 합니다(`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에 배포하는 방법의 예시입니다. bounding box 시각화, FPS, 객체 수 세기, 이미지 업로드 등의 예제를 볼 수 있습니다.
