Как вы правильно написали, вам нужно использовать Vision
или CoreML
фреймворки в вашем проекте вместе с ARKit.Также вам необходимо создать предварительно обученную модель машинного обучения (файл .mlmodel
), чтобы классифицировать входные данные для распознавания вашего общего прямоугольника.
Для создания модели обучения используйте один из следующих ресурсов: TensorFlow , Тури , Кафе или Керас .
Используя .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
Надеюсь, это поможет.