Bird
Raised Fist0
Computer Visionml~20 mins

Python CV ecosystem (OpenCV, PIL, torchvision) in Computer Vision - ML Experiment: Train & Evaluate

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Experiment - Python CV ecosystem (OpenCV, PIL, torchvision)
Problem:You want to build a simple image classifier using Python computer vision libraries. Currently, your model uses raw images loaded with OpenCV but the training accuracy is high (95%) while validation accuracy is low (70%).
Current Metrics:Training accuracy: 95%, Validation accuracy: 70%, Training loss: 0.15, Validation loss: 0.65
Issue:The model is overfitting because it learns too well on training images but fails to generalize on new images.
Your Task
Reduce overfitting by improving image preprocessing and data augmentation using Python CV libraries to increase validation accuracy above 85% while keeping training accuracy below 92%.
You must use OpenCV, PIL, and torchvision for image loading, preprocessing, and augmentation.
You cannot change the model architecture or training hyperparameters.
You must keep the dataset size the same.
Hint 1
Hint 2
Hint 3
Hint 4
Solution
Computer Vision
import cv2
from PIL import Image, ImageEnhance
import torchvision.transforms as transforms
import torch
from torch.utils.data import DataLoader, Dataset
import os

# Custom dataset using PIL and torchvision transforms
class CustomImageDataset(Dataset):
    def __init__(self, image_paths, labels, transform=None):
        self.image_paths = image_paths
        self.labels = labels
        self.transform = transform

    def __len__(self):
        return len(self.image_paths)

    def __getitem__(self, idx):
        # Load image with PIL
        image = Image.open(self.image_paths[idx]).convert('RGB')
        label = self.labels[idx]
        if self.transform:
            image = self.transform(image)
        return image, label

# Define augmentation and preprocessing pipeline
train_transforms = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])

val_transforms = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])

# Example usage (paths and labels should be your dataset)
train_image_paths = ["path/to/train/image1.jpg", "path/to/train/image2.jpg"]
train_labels = [0, 1]
val_image_paths = ["path/to/val/image1.jpg", "path/to/val/image2.jpg"]
val_labels = [0, 1]

train_dataset = CustomImageDataset(train_image_paths, train_labels, transform=train_transforms)
val_dataset = CustomImageDataset(val_image_paths, val_labels, transform=val_transforms)

train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

# Model training code remains the same but now uses augmented data
# This will reduce overfitting and improve validation accuracy
Replaced raw OpenCV image loading with PIL image loading for better compatibility with torchvision transforms.
Added data augmentation using torchvision transforms: random horizontal flip, rotation, and color jitter.
Normalized images with standard mean and std values for pretrained models.
Created custom dataset class to apply transformations during training and validation.
Results Interpretation

Before: Training accuracy 95%, Validation accuracy 70%, Training loss 0.15, Validation loss 0.65

After: Training accuracy 90%, Validation accuracy 87%, Training loss 0.30, Validation loss 0.40

Using image augmentation and proper preprocessing with Python CV libraries helps reduce overfitting by making the model see more varied data, improving its ability to generalize to new images.
Bonus Experiment
Try using OpenCV to perform custom augmentations like random cropping and color space conversion before feeding images to the model.
💡 Hint
Use cv2.cvtColor to convert images to different color spaces and cv2.getRotationMatrix2D with cv2.warpAffine for rotation.

Practice

(1/5)
1. Which Python library is best known for fast image and video processing tasks?
easy
A. PIL (Pillow)
B. OpenCV
C. torchvision
D. matplotlib

Solution

  1. Step 1: Understand library purposes

    OpenCV is designed for fast image and video processing, widely used in computer vision.
  2. Step 2: Compare with other libraries

    PIL is mainly for image editing, torchvision is for ML image datasets, matplotlib is for plotting.
  3. Final Answer:

    OpenCV -> Option B
  4. Quick Check:

    Fast image/video processing = OpenCV [OK]
Hint: OpenCV = fast image/video tasks, PIL = editing, torchvision = ML prep [OK]
Common Mistakes:
  • Confusing PIL as the fastest for video processing
  • Thinking torchvision handles video processing
  • Assuming matplotlib is for image processing
2. Which of the following is the correct way to read an image using OpenCV in Python?
easy
A. img = cv2.imread('image.jpg')
B. img = Image.open('image.jpg')
C. img = torchvision.io.read_image('image.jpg')
D. img = plt.imread('image.jpg')

Solution

  1. Step 1: Identify OpenCV image reading syntax

    OpenCV uses cv2.imread() to load images from files.
  2. Step 2: Differentiate from other libraries

    PIL uses Image.open(), torchvision uses torchvision.io.read_image(), matplotlib uses plt.imread().
  3. Final Answer:

    img = cv2.imread('image.jpg') -> Option A
  4. Quick Check:

    OpenCV image read = cv2.imread() [OK]
Hint: OpenCV reads images with cv2.imread() [OK]
Common Mistakes:
  • Using Image.open() which is from PIL, not OpenCV
  • Using plt.imread() which is for plotting, not OpenCV
  • Confusing torchvision's read_image with OpenCV
3. What will be the shape and color format of the image loaded by this OpenCV code?
import cv2
img = cv2.imread('image.jpg')
print(img.shape)
medium
A. (height, width, 3) with RGB color order
B. (width, height, 3) with BGR color order
C. (width, height, 3) with RGB color order
D. (height, width, 3) with BGR color order

Solution

  1. Step 1: Understand OpenCV image shape

    OpenCV loads images as NumPy arrays with shape (height, width, channels).
  2. Step 2: Know OpenCV color format

    OpenCV uses BGR color order by default, not RGB.
  3. Final Answer:

    (height, width, 3) with BGR color order -> Option D
  4. Quick Check:

    OpenCV shape = (H, W, 3), color = BGR [OK]
Hint: OpenCV images: shape (H,W,3), color BGR [OK]
Common Mistakes:
  • Assuming RGB color order instead of BGR
  • Swapping width and height in shape
  • Thinking OpenCV loads grayscale by default
4. This code tries to convert a PIL image to a NumPy array for OpenCV processing but causes an error:
from PIL import Image
import numpy as np
img_pil = Image.open('image.jpg')
img_cv = np.array(img_pil)

What is the likely cause and fix?
medium
A. PIL image must be converted to grayscale first
B. Color channels are in wrong order; convert RGB to BGR after np.array()
C. Use img_pil.convert('RGB') before np.array() to ensure 3 channels
D. No error; code works fine as is

Solution

  1. Step 1: Identify PIL image mode issue

    PIL images may not be in RGB mode by default; could be 'P' or 'L' mode causing np.array to have unexpected shape.
  2. Step 2: Fix by converting to RGB mode

    Use img_pil.convert('RGB') to ensure 3 color channels before converting to NumPy array.
  3. Final Answer:

    Use img_pil.convert('RGB') before np.array() to ensure 3 channels -> Option C
  4. Quick Check:

    PIL to NumPy needs RGB mode [OK]
Hint: Convert PIL image to RGB before np.array() [OK]
Common Mistakes:
  • Assuming np.array always works without convert()
  • Ignoring color channel order differences
  • Trying to convert to grayscale unnecessarily
5. You want to prepare an image for a PyTorch model using torchvision transforms. Which sequence correctly converts a PIL image to a tensor normalized for pretrained models?
hard
A. Use torchvision.transforms.ToTensor() then torchvision.transforms.Normalize(mean, std)
B. Use cv2.imread() then convert to tensor manually
C. Use PIL.Image.open() then convert to NumPy array and normalize manually
D. Use torchvision.transforms.Normalize() only on PIL image

Solution

  1. Step 1: Understand torchvision transform pipeline

    To prepare images for PyTorch models, convert PIL image to tensor with ToTensor(), which scales pixels to [0,1].
  2. Step 2: Normalize tensor with mean and std

    Use Normalize() with pretrained model's mean and std to standardize input.
  3. Final Answer:

    Use torchvision.transforms.ToTensor() then torchvision.transforms.Normalize(mean, std) -> Option A
  4. Quick Check:

    ToTensor + Normalize = correct PyTorch prep [OK]
Hint: Use ToTensor() then Normalize() for PyTorch image prep [OK]
Common Mistakes:
  • Trying to normalize PIL images directly
  • Using OpenCV images without conversion
  • Skipping normalization step