【1】coreML入门之结合ARKit场景展示

在iPhone上玩AR,可是有条件的哦:
1、Xcode9
2、一台搭载了A9晶片的设备(6s及其以上设备)
3、iOS11及其以上系统

一般来说AR应用都有两个步骤:
1、处理、追踪、了解现实世界的环境
2、渲染、展示场景的虚拟物件

第一步是透过追踪引擎处理,也就是ARKit。
第二步是通过渲染引擎处理,比如SceneKit被用来渲染3D图形,SpriteKit用于2D渲染,Metal用于自定义呈现。

下面让我们开始我们的ARKit之旅吧~

==========================================

使用Resnet50对我们周边的物件进行文字展示其识别出来的名字

STEP1

打开苹果的机器学习的模板官网 https://developer.apple.com/machine-learning/

找到Resnet50这个模板.这个模板可以识别出大约1000种我们常见的事物。

点击下载。懒人下载专用链接:http://pan.baidu.com/s/1nuLgTmT 密码:hxk2

下载后我们打开Resnet50.mlmodel

我们可以看到,我们的输入是224 * 224 的像素点,输出的是对这个物品的猜测(classLabel)以及可信度(classLabelProbs)。

STEP2

选择选中的模板。语言选择swift,点击创建。

STEP3

导入我们下载好的mlmodel

Xcode有个bug,有时候我们扔进去并没有真正的引用。导致我们var resentModel = Resnet50()初始化的时候,提示我们unresolved identifier

我们进去看一下检查是否真的引用了。

STEP4

总体的思路就是我们点击屏幕,然后识别屏幕中间的物体,然后将屏幕中间的物体的图片转换为像素喂养mlmodel,然后展示mlmodel预测的结果(名称和相似度)

STEP5

代码我就直接贴出来了。

import UIKit
import SceneKit
import ARKit
import Visionclass ViewController: UIViewController, ARSCNViewDelegate {@IBOutlet var sceneView: ARSCNView!//    拿到模型var resentModel = Resnet50()
//    点击之後的結果var hitTestResult: ARHitTestResult!
//    分析的結果var visionRequests = [VNRequest]()override func viewDidLoad() {super.viewDidLoad()// Set the view's delegatesceneView.delegate = self// Show statistics such as fps and timing informationsceneView.showsStatistics = true// Create a new scenelet scene = SCNScene()// Set the scene to the viewsceneView.scene = sceneregiterGestureRecognizers()}// 创建点击手势func regiterGestureRecognizers(){let tapGes = UITapGestureRecognizer(target: self, action: #selector(tapped))self.sceneView.addGestureRecognizer(tapGes)}@objc func tapped(recognizer: UIGestureRecognizer){let sceneView = recognizer.view as! ARSCNView //当前画面的 sceneView  = 截圖let touchLoaction = self.sceneView.centerguard let currentFrame = sceneView.session.currentFrame else { return } //判別當前是否有像素let hitTestResults = sceneView.hitTest(touchLoaction, types: .featurePoint) //识别物件的特征点if hitTestResults.isEmpty { return }  //如果没有特征点就返回。比如说大晚上黑漆漆一片...guard let hitTestResult = hitTestResults.first else { return } // 是否為第一個物件.防止多次点击,不知道识别哪个了self.hitTestResult = hitTestResult //拿到点击的結果let pixelBuffer = currentFrame.capturedImage // 拿到的圖片转成像素perfomVisionRequest(pixelBuffer: pixelBuffer)}//    圖片分解成像素 => coreML => GPUfunc perfomVisionRequest(pixelBuffer: CVPixelBuffer){let visionModel = try! VNCoreMLModel(for: self.resentModel.model) //  mlmodel干活了let request = VNCoreMLRequest(model: visionModel) { request, error inif error != nil { return }guard let observations = request.results else { return } // 把結果拿出來let observation = observations.first as! VNClassificationObservation //把結果中的第一位拿出來進行分析print("Name \(observation.identifier) and confidence is \(observation.confidence)")DispatchQueue.main.async {self.displayPredictions(text: observation.identifier)}}request.imageCropAndScaleOption = .centerCrop // 進行餵食self.visionRequests = [request] // 拿到結果let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .upMirrored, options: [:]) // 將拿到的結果左右反轉DispatchQueue.global().async {try! imageRequestHandler.perform(self.visionRequests) //處理所有的結果}}//    展示預測的結果func displayPredictions(text: String){let node = createText(text: text)// 把模型展示在我們點擊作用的當前位置(中央)node.position = SCNVector3(self.hitTestResult.worldTransform.columns.3.x,self.hitTestResult.worldTransform.columns.3.y,self.hitTestResult.worldTransform.columns.3.z)self.sceneView.scene.rootNode.addChildNode(node) // 把AR結果展示出來}//    制作結果AR原点跟底座func createText(text: String) -> SCNNode {let parentNode = SCNNode()//        底座let sphere = SCNSphere(radius: 0.01) // 1 cm 的小球几何形狀let sphereMaterial = SCNMaterial()sphereMaterial.diffuse.contents = UIColor.orange //整個小球都是橘色的sphere.firstMaterial = sphereMateriallet sphereNode = SCNNode(geometry: sphere) // 創建了一個球狀的节点//        文字let textGeo = SCNText(string: text, extrusionDepth: 0)textGeo.alignmentMode = kCAAlignmentCentertextGeo.firstMaterial?.diffuse.contents = UIColor.orangetextGeo.firstMaterial?.specular.contents = UIColor.whitetextGeo.firstMaterial?.isDoubleSided = truetextGeo.font = UIFont(name: "Futura", size: 0.15)let textNode = SCNNode(geometry: textGeo)textNode.scale = SCNVector3Make(0.2, 0.2, 0.2)parentNode.addChildNode(sphereNode)parentNode.addChildNode(textNode)return parentNode}override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)// Create a session configurationlet configuration = ARWorldTrackingConfiguration()// Run the view's sessionsceneView.session.run(configuration)}override func viewWillDisappear(_ animated: Bool) {super.viewWillDisappear(animated)// Pause the view's sessionsceneView.session.pause()}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Release any cached data, images, etc that aren't in use.}    
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部