Вы можете использовать его для приложений красоты и для наборов данных частей лица.
С помощью распознавания ориентиров лица в 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
И хлопайте в ладоши👏
Чао!