| --- |
| license: apache-2.0 |
| tags: |
| - vision |
| - image-classification |
| datasets: |
| - imagenet |
| - imagenet-21k |
| --- |
| |
| # Vision Transformer (base-sized model) |
|
|
| Vision Transformer (ViT) model pre-trained on ImageNet-21k (14 million images, 21,843 classes) at resolution 224x224, and fine-tuned on ImageNet 2012 (1 million images, 1,000 classes) at resolution 224x224. It was introduced in the paper [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale](https://arxiv.org/abs/2010.11929) by Dosovitskiy et al. and first released in [this repository](https://github.com/google-research/vision_transformer). However, the weights were converted from the [timm repository](https://github.com/rwightman/pytorch-image-models) by Ross Wightman, who already converted the weights from JAX to PyTorch. Credits go to him. |
|
|
| This repo contains a Core ML version of [google/vit-base-patch16-224](https://huggingface.co/google/vit-base-patch16-224). |
|
|
| ## Usage instructions |
|
|
| Create a `VNCoreMLRequest` that loads the ViT model: |
|
|
| ```swift |
| import CoreML |
| import Vision |
| |
| lazy var classificationRequest: VNCoreMLRequest = { |
| do { |
| let config = MLModelConfiguration() |
| config.computeUnits = .all |
| let coreMLModel = try ViT(configuration: config) |
| let visionModel = try VNCoreMLModel(for: coreMLModel.model) |
| |
| let request = VNCoreMLRequest(model: visionModel, completionHandler: { [weak self] request, error in |
| if let results = request.results as? [VNClassificationObservation] { |
| /* do something with the results */ |
| } |
| }) |
| |
| request.imageCropAndScaleOption = .centerCrop |
| return request |
| } catch { |
| fatalError("Failed to create VNCoreMLModel: \(error)") |
| } |
| }() |
| ``` |
|
|
| Perform the request: |
|
|
| ```swift |
| func classify(image: UIImage) { |
| guard let ciImage = CIImage(image: image) else { |
| print("Unable to create CIImage") |
| return |
| } |
| |
| DispatchQueue.global(qos: .userInitiated).async { |
| let handler = VNImageRequestHandler(ciImage: ciImage, orientation: .up) |
| do { |
| try handler.perform([self.classificationRequest]) |
| } catch { |
| print("Failed to perform classification: \(error)") |
| } |
| } |
| } |
| ``` |
|
|