Фреймворки Vision и ARKit в проекте Xcode

Я хочу создать приложение ARKit, используя Xcode. Я хочу, чтобы он распознавал общий прямоугольник без нажатия кнопки и чтобы впоследствии прямоугольник выполнял определенную функцию.

Как это сделать?

2 ответа

Вы не должны ARKit распознавать только прямоугольники Vision,

Для распознавания общих прямоугольников используйте VNDetectRectanglesRequest,

Как вы правильно написали, вам нужно использовать Vision или же CoreML фреймворки в вашем проекте вместе с ARKit. Также вы должны создать предварительно обученную модель машинного обучения (.mlmodel файл), чтобы классифицировать входные данные, чтобы распознать ваш общий прямоугольник.

Для создания модели обучения используйте один из следующих ресурсов: TensorFlow, Turi, Caffe или Keras.

С помощью .mlmodel с тегами классификации внутри него, запросы Vision возвращают результаты как VNRecognizedObjectObservation объекты, которые идентифицируют объекты, найденные в захваченной сцене. Таким образом, если соответствующий тег изображения доступен через процесс распознавания в ARSKView, тогда ARAnchor будет создан (и SK/SCN объект может быть размещен на этом ARAnchor).

Вот фрагмент кода на тему "как это работает":

import UIKit
import ARKit
import Vision
import SpriteKit

.................................................................

// file – ARBridge.swift
class ARBridge {
    static let shared = ARBridge()
    var anchorsToIdentifiers = [ARAnchor : String]()
}

.................................................................

// file – Scene.swift
DispatchQueue.global(qos: .background).async {
    do {
        let model = try VNCoreMLModel(for: Inceptionv3().model)
        let request = VNCoreMLRequest(model: model, completionHandler: { (request, error) in

             DispatchQueue.main.async {
                 guard let results = request.results as? [VNClassificationObservation], let result = results.first else {
                     print ("No results.")
                     return
                 }
                 var translation = matrix_identity_float4x4
                 translation.columns.3.z = -0.75
                 let transform = simd_mul(currentFrame.camera.transform, translation)
                 let anchor = ARAnchor(transform: transform)
                 ARBridge.shared.anchorsToIdentifiers[anchor] = result.identifier
                 sceneView.session.add(anchor: anchor)
             }
         }
         let handler = VNImageRequestHandler(cvPixelBuffer: currentFrame.capturedImage, options: [:])
         try handler.perform([request])
     } catch { 
         print(error) 
     }
}

.................................................................

// file – ViewController.swift
func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
    guard let identifier = ARBridge.shared.anchorsToIdentifiers[anchor] else {
        return nil
    }
    let labelNode = SKLabelNode(text: identifier)
    labelNode.horizontalAlignmentMode = .center
    labelNode.verticalAlignmentMode = .center
    labelNode.fontName = UIFont.boldSystemFont(ofSize: 24).fontName
    return labelNode
}

И вы можете скачать два проекта Apple (пример кода), написанных инженерами Vision:

Распознавание объектов в живом захвате

Классификация изображений с помощью Vision и Core ML

Надеюсь это поможет.

Другие вопросы по тегам