# iOS SDK

Roboflow Mobile iOS SDK는 더 빠른 추론을 위해 또는 새로운 기능, 역량, 사용 사례(예: 증강 현실)를 활성화하기 위해 엣지(iPad 또는 iPhone)에서 모델이 실행되어야 하는 iOS 애플리케이션을 개발하는 경우 훌륭한 옵션입니다.

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

## 작업 지원

다음 작업 유형은 호스팅 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 호스팅 추론 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 설치를 사용하면 gems를 설치할 때 `sudo` 를 사용해야 합니다. (다만 이는 gem 설치가 진행되는 동안에만 문제입니다.)" - [CocoaPods](https://guides.cocoapods.org/using/getting-started.html)

"Sudo 없이" 설치는 이 과정에서 RubyGems에 관리자 권한을 부여하고 싶지 않은 경우 선택할 수 있는 옵션입니다. 하지만 `sudo` 설치 방식이 더 일반적이라는 점에 유의하세요.

터미널에 다음을 입력하여 CocoaPods가 성공적으로 설치되었는지 확인하세요. `pod --version` 를 입력합니다.

### Roboflow CocoaPod 설치하기

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

다음이 있는지 확인하세요. `Podfile` 에 다음이 지정되어 있습니다. `platform :ios, '15.4'`

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

XCode Command Line Tools가 설치되어 있지 않다면 다음을 실행하세요. `xcode-select --install` 를 입력합니다.

그러면 다음이 반환됩니다: `xcode-select: error: command line tools are alreadyinstalled, use "Software Update" to install updates` 명령줄 도구가 이미 시스템에 있는 경우.

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

![Podfile 설치가 성공한 후의 터미널](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)

* 다음 오류가 반환되면: "Ruby 인터프리터 또는 확장 라이브러리에서 버그가 발생했을 수 있습니다," 먼저 다음을 실행하세요. `brew install cocoapods`, 그런 다음 다음을 실행하세요. `pod install` 그리고 생성된 `.xcworkspace` XCode에서 파일을 엽니다.
  * 터미널에 다음을 입력하여 CocoaPods가 성공적으로 설치되었는지 확인하세요. `pod --version` 를 입력합니다.

### 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 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)

**완료 핸들러 사용법:**

```swift
import Roboflow
...
//API 키로 초기화
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, // 인스턴스 세분화
                            maxNumberPoints: mask 처리 포인트의 최대 수) // 인스턴스 세분화
        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 키로 초기화
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) 앱은 roboflow 모델로 실시간 iOS 앱을 만들기 위한 훌륭한 출발점입니다. 여기에는 카메라 설정, 모델 로딩 및 처리, 그리고 객체 탐지 및 인스턴스 세분화 모델 모두에 대한 출력 그리기 코드가 포함되어 있습니다.

### React Native Expo 앱 예제

또한 여기에서 이 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)
* 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에 어떻게 배포할 수 있는지 보여주는 예시입니다. 바운딩 박스 시각화, FPS, 객체 수 계산, 이미지 업로드 등의 예제를 볼 수 있습니다.
