Вы можете использовать его для приложений красоты и для наборов данных частей лица.

С помощью распознавания ориентиров лица в Vision вы можете получить такие точки, как брови, глаза, нос и рот. На этот раз мы будем использовать эти точки для обрезки каждой части.

Преобразование ориентиров в координаты исходного изображения

Так как нормализованный CGPoint ориентиров представляет собой нормализованные координаты в ограничивающей рамке лица, VNImagePointForFaceLandmarkPoint преобразует их в координаты всего изображения.

extension CGPoint {
    func convertToImagePoint(_ originalImage:CIImage,_ boundingBox:CGRect)->CGPoint {
        let imageWidth = originalImage.extent.width
        let imageHeight = originalImage.extent.height
        let vectoredPoint = vector2(Float(self.x),Float(self.y))
        let vnImagePoint = VNImagePointForFaceLandmarkPoint(vectoredPoint,boundingBox, Int(imageWidth), Int(imageHeight))
        let imagePoint = CGPoint(x: vnImagePoint.x, y: vnImagePoint.y)
        return imagePoint
    }
}

После этого все, что вам нужно сделать, это найти максимальные и минимальные значения x и y точек, которые вы взяли, установить для него значение CGRect и вырезать его из исходного изображения.
Если вы используете точку как есть, сложно понять, потому что он вырезан ровно, поэтому легче понять, какая часть набивки.

func cropParts(partsPoints points:[CGPoint],horizontalSpacing hPadding:CGFloat, verticalSpacing vPadding:CGFloat, originalImage image:CIImage)->UIImage?{
        if let Minx = points.min(by: { a,b -> Bool in
            a.x < b.x
        }),
            let Miny = points.min(by: { a,b -> Bool in
                a.y < b.y
            }),
            let Maxx = points.max(by: { a,b -> Bool in
                a.x < b.x
            }),
            let Maxy = points.max(by: { a,b -> Bool in
                a.y < b.y
            }) {
            let partsWidth =  Maxx.x - Minx.x
            let partsHeight = Maxy.y - Miny.y
            let partsBox = CGRect(x: Minx.x - (partsWidth * hPadding), y: Miny.y - (partsHeight * vPadding), width: partsWidth + (partsWidth * hPadding * 2), height: partsHeight + (partsHeight * vPadding * 2))
            let croppedImage = image.cropped(to: partsBox)
            guard let final = ciContext.createCGImage(croppedImage, from: croppedImage.extent) else {return nil}
            let partsuiimage =  UIImage(cgImage: final)
            return partsuiimage
        } else {
            return nil
        }
    }

Будьте осторожны с изображениями нескольких людей

VNDetectFaceLandmarksRequest от Vision обрабатывает несколько людей одновременно с одного изображения. Я взял только 3 человек, но с таким количеством людей я могу взять четкий ориентир. Однако такие люди, как отраженные на заднем фоне, могут быть обнаружены, и для предотвращения этого потребуется фильтрация по размеру ограничивающей рамки.

Мое домашнее приложение, использующее эту технологию

КрасотаПодпись

"Подпишись на меня в Твиттере. Пожалуйста."

Я делаю приложение, использующее Core ML, Create ML и Vision.
Если вы хотите использовать модель машинного обучения с периферийным устройством (iOS), свяжитесь с нами по электронной почте.
rockyshikoku @gmail.com

И хлопайте в ладоши👏

Чао!