
In todayās data-driven world, computer vision has emerged as a powerful tool for extracting valuable information from visual data. One such application is number detection, a technique that enables machines to recognize and interpret numerical digits from images and videos.
In this article, weāll walk through a Python project focusing on detecting numbers using the powerful YOLOv8 model. This project is designed to recognize and detect numbers in both images and live video feeds using the OpenCV library.
Weāll cover two Python programs here: one for detecting numbers in images and another for live detection using a webcam or IP camera. These programs are designed to be beginner-friendly yet powerful enough to perform number detection from images and even videos.
Letās dive into the details!
Recommended Article: Creating a Bike Helmet Detection Project in Python using YOLO
Requirements and Installations
Before we start coding, letās ensure Python (3.6 or later) is installed on your computer. If you donāt have Python, you can download it for free fromĀ https://www.python.org/downloads/.
Now download all the dependencies we require using the following commands:
pip install gitpython>=3.1.30 pip install matplotlib>=3.3 pip install numpy>=1.23.5 pip install opencv-python>=4.1.1 pip install pillow>=10.3.0 pip install psutil pip install PyYAML>=5.3.1 pip install requests>=2.32.0 pip install scipy>=1.4.1 pip install thop>=0.1.1 pip install torch>=1.8.0 pip install torchvision>=0.9.0 pip install tqdm>=4.64.0 pip install ultralytics>=8.2.34 pip install pandas>=1.1.4 pip install seaborn>=0.11.0 pip install setuptools>=65.5.1 pip install filterpy pip install scikit-image pip install lap
Alternative Installation
Installing the above utilities one by one might be a boring task. Instead, you can download the ārequirements.txtā file containing all the dependencies above. Simply run the following command. It will automate the whole task in one go.
pip install -r requirements.txt
Training of YOLO Model on Custom Dataset
At the very first, we have to train our YOLO model. Please follow the steps below:
Download the Dataset
Download the number detection dataset fromĀ roboflow.com.
Now unzip the downloaded dataset. The folder should look like the following:

Training YOLOv8 Model with Custom Dataset using Colab
OpenĀ Google Colab, sign in with your Gmail account, and open a new notebook.
Now go to the āRuntimeā menu, select āChange runtime typeā, choose āT4 GPUā for the Hardware accelerator, andĀ save it.
Letās check whether the GPU is running perfectly or not using the following command:
!nvidia-smi
The output should look like the following:

Next, install ultralytics on your colab workspace using the following command:
!pip install ultralytics
Now open yourĀ Google DriveĀ and navigate to āMy Drive.ā Now create a folder named āDatasetsā under āMy Driveā and inside the āDatasetsā folder create one more folder āNumberDetect.ā
Letās open the unzipped dataset folder, select all items present there, and drop them into the āNumberDetectā folder on Google Drive. It may take a while so wait until it is finished. The final āNumberDetectā folder will look like the following:

Now open the ādata.yamlā file in the text editor and modify the path variable to: ā../drive/MyDrive/Datasets/NumberDetectā The final ādata.yamlā file will look like the following:

Now, letās go back to our Google Colab dashboard. You need to mount your Google Drive with the Colab. Insert the following command in a new cell and run it:
from google.colab import drive drive.mount('/content/drive')
You should get a success message like this: āDrive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(ā/content/driveā, force_remount=True).ā
Now we will start training our YOLO model with our number detection dataset. Again, create a new cell, insert the command below, and run it.
!yolo task=detect mode=train model=yolov8l.pt data=../content/drive/MyDrive/Datasets/NumberDetect/data.yaml epochs=100 imgsz=640
Here, āepochs=100ā specifies the number of training epochs. An epoch is one complete pass through the entire training dataset. Here, the model will be trained for 100 epochs.
āimgsz=640ā sets the size of the input images on which the model will be trained. In this case, images will be resized to 640Ć640 pixels before being fed into the model.
The whole training can take around 1 ā 2 hours even more to complete.
After, the completion of the training go to the āFilesā section in your Colab dashboard and navigate through these folders: ārunsā -> ādetectā -> ātrainā -> āweightsā. Inside the āweightsā folder you will see ābest.ptā and ālast.ptā these two files. Download ābest.ptā from there.
Setting Up the Environment
Create a separate folder named āNumberDetectorā for this project. Under this folder create two more folders named āWeightsā and āMediaā to store pre-trained YOLO models and images respectively.
Place the Downloaded YOLO Model
In the previous section, we trained our YOLO model with a custom number detection dataset and downloaded a file named ābest.pt.ā Now place this file inside the āWeightsā folder.
Create Your Python Script
Weāre almost at the end of setting up the environment. Now choose your favorite text editor and open the entire project folder āNumberDetector.ā Inside this folder, create a Python program file named ānumber_detector.py.ā This is where youāll write the code.
Your final project file hierarchy should look like the following:
NumberDetector/ āāā Weights/ ā āāā best.pt āāā Media/ ā āāā number_1.jpg ā āāā number_2.jpg āāā number_detector.py āāā number_detector_video.py
Number Detection from Images
First, we will create a Python program to detect numbers only in images. Letās start writing your code step-by-step and try to understand the logic.
Import Libraries
First, we need to import the necessary libraries. Here, āOpenCVā is used for image processing, ācvzoneā helps draw bounding boxes, and āYOLOā from the āultralyticsā library is used for object detection.
import cv2 import math import cvzone from ultralytics import YOLO
Load YOLO Model and Define Class Names
Next, load the YOLO model with the custom-trained weights and define the class names that YOLO can detect. Make sure you have downloaded the ābest.ptā weights and placed them in the correct directory.
# Load YOLO model with custom weights yolo_model = YOLO("Weights/best.pt") # Define class names class_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
Load the Image
Now, load the image you want to process using OpenCVās āimreadā method.
# Load the image image_path = "Media/number_1.jpg" img = cv2.imread(image_path)
Perform Object Detection
Now use āyolo_modelā to detect objects in the loaded image.
# Perform object detection results = yolo_model(img)
Draw Bounding Boxes and Labels
Now we will loop through the detected objects and draw bounding boxes around them. The confidence score and class label will also be displayed.
# Loop through the detections and draw bounding boxes for r in results: boxes = r.boxes for box in boxes: x1, y1, x2, y2 = box.xyxy[0] x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) w, h = x2 - x1, y2 - y1 conf = math.ceil((box.conf[0] * 100)) / 100 cls = int(box.cls[0]) if conf > 0.3: cvzone.cornerRect(img, (x1, y1, w, h), t=2) cvzone.putTextRect(img, f'{class_labels[cls]} {conf}', (x1, y1 - 10), scale=0.8, thickness=1, colorR=(255, 0, 0))
Display the Image
Finally, we will display the processed image using OpenCVās āimshowā method. The window will close when the āqā button is pressed.
# Display the image with detections cv2.imshow("Image", img) # Close window when 'q' button is pressed while True: if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() cv2.waitKey(1)
Output

Live Number Detection with Webcam
This program detects numbers in real-time through a webcam or IP camera. It is not only a webcam; it can also detect numbers in a video.
In the program below, we use ācv2.VideoCapture()ā to capture video frames. You can set the argument inside āVideoCapture()ā to ā0ā, ā1ā, or the specific webcam index number to capture frames directly from your computerās webcam. To capture video from an IP webcam, replace this with āip_address/videoā. This can also be used to access mobile cameras through Python.
If youād like to detect numbers in a pre-recorded video, simply specify the video file path within āVideoCapture()ā.
In the code, Iāve provided separate lines for each capture option, so you can switch between them by commenting out the lines based on your requirements.
import cv2 import math import cvzone import threading from ultralytics import YOLO # Load YOLO model with custom weights yolo_model = YOLO("Weights/best.pt") # Define class names class_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] frame = None def capture_video(video_capture): global frame while True: success, img = video_capture.read() if success: frame = img # For number detection through webcam video_capture = cv2.VideoCapture(0) # For number detection through ip webcam # url = 'ip_address_here/video' # video_capture = cv2.VideoCapture(url) # For number detection in a video # video_path = "video_file_here" # video_capture = cv2.VideoCapture(url) # Start the video capture in a separate thread capture_thread = threading.Thread(target=capture_video, args=(video_capture,)) capture_thread.daemon = True capture_thread.start() while True: # Perform object detection results = yolo_model(frame) for r in results: boxes = r.boxes for box in boxes: x1, y1, x2, y2 = box.xyxy[0] x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) w, h = x2 - x1, y2 - y1 conf = math.ceil((box.conf[0] * 100)) / 100 cls = int(box.cls[0]) if conf > 0.3: cvzone.cornerRect(frame, (x1, y1, w, h), t=2) cvzone.putTextRect(frame, f'{class_labels[cls]} {conf}', (x1, y1 - 10), scale=0.8, thickness=1, colorR=(255, 0, 0)) # Display the frame with detections cv2.imshow("Image", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() cv2.waitKey(1)
Output

Summary
In this tutorial, we developed a number detection system using Python, YOLOv8, and OpenCV. We built two Python programs: one to detect numbers in static images and another to detect numbers in real-time through a webcam or in video files.
Weāve covered each step in detail here, from setting up the environment to training a custom YOLO model with a number detection dataset.
Recommended Article: Detecting Potholes on Roads Using Python and YOLOv8
For any query related to this project, reach out to me at contact@pyseek.com.
Happy Coding!