苹果17年发布会上面提出了Core ML,Vision 和 NLP 几个新库。
Vison 的功能有:
- Face Detection
- Rectangle Detection
- Barcode Detection
- Text Detection
- Object Tracking
下面一一介绍一下:
- Face Detection
Vision库提供了人脸识别功能,除了能够基本地识别出人脸的方框位置之外,还能识别出脸部特征,也就是Face Landmark。
- 第一种 识别脸部方框:
// Init request and handler
let request = VNDetectFaceRectanglesRequest.init()
let handler = VNImageRequestHandler.init(cgImage: cgImage, options: [:])
do{
try handler.perform([request]) // 执行请求
}catch{
print(error.localizedDescription)
}
// 执行的结果会和request一起返回。
let results = request.results as! [VNFaceObservation]
for observation in results {
// boundingBox是脸部所在的方框坐标。
print(observation.boundingBox)
}
这里有一个需要注意的地方就是,在苹果的文档中写到,返回的这个boundingBox是标准化了(Normalized rect),并且在这个坐标系中是以左下角为(0,0)的。所以我们需要做相应的坐标转化。下面给出了转化函数:
// scale是bounding box,size是实际图片的大小。
static func generateRect(withScale scale: CGRect, size: CGSize) -> CGRect{
let scaleSize = CGSize.init(width: scale.width * size.width, height: scale.height * size.height)
let point = CGPoint.init(x: scale.origin.x * size.width, y: (1 - scale.origin.y) * size.height - scaleSize.height)
let result = CGRect.init(origin: point, size: scaleSize)
return result
}
- 第二种 脸部特征识别
进行脸部特征(Land Mark)识别的时候,需要先进行面部方框识别(Face Rectangle Detection)。在识别完脸部矩形之后,传入结果到 VNDetectFaceLandmarksRequest 的 inputFaceObservations。具体代码如下
// 从面部方框识别的步骤中获得FaceObservation 列表。
guard let observations = self.detectFaceRectangles(image: image), let cgImage = image.cgImage else{
return
}
let request = VNDetectFaceLandmarksRequest.init()
request.inputFaceObservations = observations
let handler = VNImageRequestHandler.init(cgImage: cgImage, options: [:])
do{
try handler.perform([request])
}
catch{
print(error.localizedDescription)
}
执行完代码之后,会获得一组新的VNFaceObservation 列表。每一个 VNFaceObservation 中都会存有一个 VNFaceLandmarks2D 变量。Landmark 中保存一张脸的脸部特征:脸廓、左右眼、左右眼睫毛、鼻廓、鼻梁、外嘴唇轮廓、内嘴唇轮廓。 这些脸部数据都是由 VNFaceLandmarkRegion2D 来表示。VNFaceLandmarkRegion2D 包含有多个点来表示脸部轮廓。这里的点和之前提到的Rectangle 的点一样,也是标准化了的(这里是相对于该脸所在的方框大小标准化的)。同时这里的坐标系也是以左下角为零点的。所以为了画出这些脸部轮廓,需要先把点的标准化坐标转化成在方框中的坐标,最后再转化成在整张图片中的坐标。
- Barcode Detection
二维码的识别比较简单,功能是能识别图片中 二维码所在的区域,也能识别出二维码所包含的 字符串信息(比如在网上使用在线二维码生成信息图片,Vision能够识别出来)。代码如下:
// Init request and handler
let request = VNDetectBarcodesRequest.init()
let handler = VNImageRequestHandler.init(cgImage: cgImage, options: [:])
do{
try handler.perform([request])
}
catch{
print(error.localizedDescription)
}
guard let results = request.results as? [VNBarcodeObservation] else {
return
}
for item in results{
print(item.payloadStringValue) // 可能包含的字符串信息
print(item.symbology) // 不同类型的二维码含义
print(item.barcodeDescriptor)
print(item.boundingBox) // 二维码所在坐标位置
}
- Text Detection
这个功能能够识别图片中存在文字的区域,有个局限性就是它只能识别水平显示的文字,不能识别偏转的文字。
代码如下:
// Init request and handler.
let request = VNDetectTextRectanglesRequest.init()
let handler = VNImageRequestHandler.init(cgImage: cgImage, options: [:])
do{
try handler.perform([request])
}
catch{
print(error.localizedDescription)
}
guard let results = request.results as? [VNTextObservation] else {
return
}
var rects = [CGRect]()
for item in results{
rects.append(item.boundingBox)
print(item.boundingBox)
}
- Rectangle Detection
网友评论