Computer Vision with Vertex AI
Building vision models for image classification, object detection, and custom visual recognition at enterprise scale with minimal ML expertise.
Overview
Vertex Vision AutoML enables quick model development without custom training code. For advanced needs, use custom training with TensorFlow or PyTorch on Vertex Training infrastructure.
Quick Start: AutoML Image Classification
Python - AutoML Setup
from google.cloud import aiplatform
import json
# Initialize Vertex AI
aiplatform.init(project="your-project-id", location="us-central1")
# Create dataset
dataset = aiplatform.ImageDataset.create(
display_name="product-images",
gcs_source="gs://your-bucket/images/train.csv", # CSV with img_path, label
)
# Training pipeline for image classification
job = aiplatform.AutoMLImageTrainingJob(
display_name="product-classifier-v1",
prediction_type="classification",
multi_label=False, # Single-label classification
model_type="CLOUD", # Cloud-hosted model
)
model = job.run(
dataset=dataset,
budget_milli_node_hours=8000, # Training budget
disable_early_stopping=False,
)
Custom Training Pipeline
Python - Custom Training
from google.cloud import aiplatform
import tensorflow as tf
from tensorflow.keras import layers, models
# Define custom model
def create_model():
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
return model
# Training function (saved as train.py)
def train_and_save():
# Load data
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
# Normalize
x_train, x_test = x_train / 255.0, x_test / 255.0
# Build and compile
model = create_model()
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# Train
model.fit(
x_train, y_train,
epochs=10,
batch_size=32,
validation_data=(x_test, y_test)
)
# Save to GCS
model.save('gs://your-bucket/models/cifar10')
# Create custom training job
aiplatform.init(project="your-project-id")
job = aiplatform.CustomTrainingJob(
display_name="custom-image-classifier",
script_path="train.py", # Your training script
container_uri="gcr.io/cloud-aiplatform/training/tf-cpu.2-12",
requirements=["tensorflow==2.12"],
)
model = job.run(
replica_count=1,
machine_type="n1-standard-4",
)
Object Detection Model
Python - Object Detection Training
from google.cloud import aiplatform
# Create object detection dataset
dataset = aiplatform.ImageDataset.create(
display_name="product-detection",
gcs_source="gs://your-bucket/detection/annotations.csv",
import_schema_uri=aiplatform.schema.dataset.ioformat.image_bounding_box.single_label_classification,
)
# Training job for object detection
job = aiplatform.AutoMLImageTrainingJob(
display_name="product-detector",
prediction_type="object_detection",
model_type="CLOUD",
)
model = job.run(
dataset=dataset,
budget_milli_node_hours=20000, # More budget for detection
)
Batch Prediction
Python - Large-Scale Inference
from google.cloud import aiplatform
# Get deployed model
model = aiplatform.Model("your-model-resource-id")
# Create batch prediction job
batch_job = model.batch_predict(
job_display_name="product-images-batch",
gcs_source="gs://your-bucket/images/predict/*.jpg",
gcs_destination_prefix="gs://your-bucket/predictions/",
)
# Wait for completion
batch_job.wait()
# Process results
print(f"Output location: {batch_job.output_info.gcs_output_directory}")
Real-Time Predictions
Python - Endpoint Deployment
from google.cloud import aiplatform
import base64
# Deploy model to endpoint
endpoint = model.deploy(
machine_type="n1-standard-4",
accelerator_type="NVIDIA_TESLA_K80",
accelerator_count=1,
traffic_percentage=100,
)
# Make predictions
import json
from PIL import Image
from io import BytesIO
# Load image
with open("product.jpg", "rb") as img_file:
image_base64 = base64.b64encode(img_file.read()).decode()
# Prepare prediction request
instances = [{
"data": image_base64
}]
predictions = endpoint.predict(instances=instances)
for pred in predictions:
print(f"Top classes: {pred['displayNames'][:3]}")
print(f"Confidences: {pred['confidences'][:3]}")
Model Evaluation & Monitoring
Python - Model Performance Tracking
from google.cloud import aiplatform
from sklearn.metrics import classification_report, confusion_matrix
# Get model evaluation
model = aiplatform.Model("your-model-resource-id")
model_eval = model.get_model_evaluation()
print("Model Evaluation Metrics:")
print(f"Accuracy: {model_eval.metrics['accuracy']}")
print(f"Precision: {model_eval.metrics['precision']}")
print(f"Recall: {model_eval.metrics['recall']}")
# Setup monitoring
job = aiplatform.ModelMonitoringJob.create(
display_name="model-monitoring",
objective_config=aiplatform.ModelMonitoringObjectiveConfig(
skew_detection_config=aiplatform.ModelMonitoringAlertConfig(
data_drift_threshold=0.1,
attribution_score_skew_threshold=0.05,
),
prediction_drift_config=aiplatform.ModelMonitoringAlertConfig(
data_drift_threshold=0.15,
),
),
)
Advanced: Custom Model with TensorFlow
Python - Production Model Code
import tensorflow as tf
from google.cloud import storage
import os
class ProductClassifier(tf.keras.Model):
def __init__(self, num_classes):
super().__init__()
self.base = tf.keras.applications.EfficientNetB0(
input_shape=(224, 224, 3),
include_top=False,
weights='imagenet'
)
self.global_avg = tf.keras.layers.GlobalAveragePooling2D()
self.dropout = tf.keras.layers.Dropout(0.2)
self.dense = tf.keras.layers.Dense(num_classes, activation='softmax')
def call(self, inputs, training=None):
x = self.base(inputs, training=False)
x = self.global_avg(x)
x = self.dropout(x, training=training)
return self.dense(x)
# Training wrapper for Vertex
def train_and_export(args):
# Load data
train_dataset = tf.data.Dataset.from_tensor_slices(...)
train_dataset = train_dataset.shuffle(1000).batch(32)
# Create model
model = ProductClassifier(num_classes=10)
model.compile(
optimizer=tf.keras.optimizers.Adam(1e-4),
loss='categorical_crossentropy',
metrics=['accuracy']
)
# Train
model.fit(train_dataset, epochs=10)
# Save to GCS
bucket = storage.Client().bucket(args.bucket)
model.save('/tmp/model')
for file in os.listdir('/tmp/model'):
blob = bucket.blob(f"models/{args.model_name}/{file}")
blob.upload_from_filename(f"/tmp/model/{file}")
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--bucket")
parser.add_argument("--model-name")
args = parser.parse_args()
train_and_export(args)
Best Practices
- Start with AutoML for rapid prototyping
- Use balanced datasets to avoid bias
- Implement data validation before training
- Monitor model performance in production
- Set up retraining pipelines for data drift
- Use batch prediction for large-scale inference
- Implement proper access controls and versioning