Итак, мы тут решили перепечатать немного документации Apple для наглядности.
Шаг 1 - сбор данных.
Здесь нужно подготовить данные для обучения.
[
{
"filename": "image1.jpg",
"annotations": ["window_sill", "aloe", "pot"]
},
{
"filename": "image2.jpg",
"annotations": ["cactus", "pot", "person"]
}
]
Шаг 2 - ферментирование данных.
Здесь данные будут переведены в формат, с которым будем работать дальше
// Define an annotation.
struct AnnotatedFile: Decodable {
var filename: String
var annotations: Set<String>
}
// Specify the input directory.
let directoryURL = URL(filePath: "/path/to/files", directoryHint: .isDirectory)
// Decode the annotations.
let decoder = JSONDecoder()
let data = try Data(contentsOf: directory.appending(component: "annotations.json"))
let annotatedFiles = try decoder.decode([AnnotatedFile].self, from: data)
// Convert the annotations to an array of `AnnotatedFeature`.
let annotatedFeatures = annotatedFiles.map {
AnnotatedFeature(
feature: directory.appending(component: $0.filename),
annotation: $0.annotations
)
}
Шаг 3 - алгоритм обработки.
Здесь собирается pipeline обработки данных для обучения.
// List all the labels.
let labels = ["aloe", "cactus", "person", "pot", "window_sill"]
// Compose the estimator.
let estimator = ImageReader()
.appending(ImageFeaturePrint())
.appending(FullyConnectedNetworkMultiLabelClassifier<Float, String>(labels: labels))
Шаг 4 -обучение.
let (training, validation) = annotatedFeatures.annotatedFiles.randomSplit(by: 0.8)
let model = try await estimator.fitted(
to: training,
validateOn: validation
)
let predicted = try await model.prediction(from: testAnnotatedFiles)
let metrics = try MultiLabelClassificationMetrics(
classifications: predicted.map(\.prediction),
groundTruth: predicted.map(\.annotation),
strategy: .balancedPrecisionAndRecall,
labels: labels
)
print(metrics.meanAveragePrecision)
Шаг 5 - чёрный ящик.
И вот тут как раз то, о чём говорили - за нас уже подумали.
Экспортируем модель
// Export to Core ML
let modelURL = URL(filePath: "/path/to/model")
try model.export(to: modelURL)
И далее в игру вступает фирменный Big Thing от Apple.
import Vision
import CoreML
let handler = VNImageRequestHandler(url: URL(filePath: "image.jpg"))
let visionModel = try VNCoreMLModel(for: compiledModel)
let request = VNCoreMLRequest(model: visionModel)
try handler.perform([request])
if let observations = request.results as? [VNClassificationObservation] {
// Filter observations using a target precision and recall.
let filteredObservations = observations.filter {
$0.hasMinimumPrecision(0.3, forRecall: 0.7)
}
// Use observations.
}
В итоге нам предложили полностью упакованный и фаршированный тулинг.
* На самом деле Google тоже недалеко ушёл, если только брать в рассчёт то, что TensorFlow появился именно внутри корпорации добра. Но это в следующих постах=)
