Object Detection Model on Custom Dataset Using YOLO Pre-Trained Weights — The Training

Nisarg Bhatt
Analytics Vidhya
Published in
4 min readApr 18, 2021

Object Detection:

Data Preparation

Download LabelImg by running the following snippet in the terminal:

git clone https://github.com/tzutalin/labelImg.git

Now, open the directory and run “python3 labelImage.py”. It will open a window like this.

Click on “Open Dir” And choose your directory containing the data.

Now Click on Create on RectBox and make a box and label the name you want …

After labeling the data, we have to make a model (The Brain), that will make the boxes in the correct place, where the objects are.

Upload the folder containing the labels to your drive.

So here is a link to train the model: “https://github.com/nisargbhatt09/Object-Detection-Custom-Data/blob/main/Yolo_Training.ipynb

Let’s Code

I would prefer that you use Google Colab if you don’t have a GPU on your device.

So, Firstly let’s check whether the GPU is enabled or not.

!nvidia-smi

If you get something like this, GPU is enabled.

+------------------------------------------------------------------+ | NVIDIA-SMI 460.56  Driver Version: 460.32.03  CUDA Version: 11.2 | |---------------------------+------------------+-------------------+ | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC | | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. | |                               |                      |               MIG M. | |===============================+======================+======================| |   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 | | N/A   37C    P0    26W / 250W |      0MiB / 16280MiB |      0%      Default | |                               |                      |                  N/A | +-------------------------------+----------------------+----------------------+                                                                                 +-----------------------------------------------------------------------------+ | Processes:                                                                  | |  GPU   GI   CI        PID   Type   Process name                  GPU Memory | |        ID   ID                                                   Usage      | |=============================================================================| |  No running processes found                                                 | +-----------------------------------------------------------------------------+

Access the Google Drive

from google.colab import drivedrive.mount('/content/gdrive')

List of items on your drive

!ln -s /content/gdrive/My\ Drive/ /mydrive!ls /mydrive

Darknet: It is an open-source neural network framework. We will use it to train the pre-trained weights later.

Clone the darknet:

!git clone https://github.com/AlexeyAB/darknet

Set the OpenCV with the GPU

# change makefile to have GPU and OPENCV enable%cd darknet!sed -i 's/OPENCV=0/OPENCV=1/' Makefile!sed -i 's/GPU=0/GPU=1/' Makefile!sed -i 's/CUDNN=0/CUDNN=1/' Makefile!make

Now let’s change the configuration file “yolov3-tiny.cfg” from cfg directory from the darknet. This is for one class, you may have more than one, just change 1 with the number of classes you want.

!cp cfg/yolov3-tiny.cfg cfg/yolov3_training.cfg!sed -i 's/batch=1/batch=64/' cfg/yolov3_training.cfg!sed -i 's/subdivisions=1/subdivisions=16/' cfg/yolov3_training.cfg!sed -i 's/max_batches = 500200/max_batches = 4000/' cfg/yolov3_training.cfg!sed -i '610 s@classes=80@classes=1@' cfg/yolov3_training.cfg!sed -i '696 s@classes=80@classes=1@' cfg/yolov3_training.cfg!sed -i '783 s@classes=80@classes=1@' cfg/yolov3_training.cfg!sed -i '603 s@filters=255@filters=18@' cfg/yolov3_training.cfg!sed -i '689 s@filters=255@filters=18@' cfg/yolov3_training.cfg!sed -i '776 s@filters=255@filters=18@' cfg/yolov3_training.cfg

Create a folder on your drive to save the weights.

# Create folder on google drive so that we can save there the weights!mkdir "/mydrive/yolov3_w1"

We will make a file called “obj.data” in data directory that will keep all the classes names, here I have only used one class, so bear with me 😌️

!echo "Class_Name" > data/obj.names!echo -e 'classes= 1\ntrain  = data/train.txt\nvalid  = data/test.txt\nnames = data/obj.names\nbackup = /mydrive/yolov3_w1' > data/obj.data!mkdir data/obj

Now we need pre-trained weights, you can use darknet53.conv.74. This weight is going to be retrained on given data.

!wget https://pjreddie.com/media/files/darknet53.conv.74

Extract the directory from the drive, unzip the directory to data/obj.

!unzip /mydrive/data.zip -d data/obj

We’re going to convert the class index on the .txt files. As we’re working with only one class, it’s supposed to be class 0. (The indentation is not correct, please refer to the code link.)

import globimport osimport retxt_file_paths = glob.glob(r"data/obj/new_dataset/*.txt")for i, file_path in enumerate(txt_file_paths):# get image sizewith open(file_path, "r") as f_o:lines = f_o.readlines()text_converted = []for line in lines:print(line)numbers = re.findall("[0-9.]+", line)print(numbers)if numbers:# Define coordinatestext = "{} {} {} {} {}".format(0, numbers[1], numbers[2], numbers[3], numbers[4])text_converted.append(text)print(i, file_path)print(text)# Write filewith open(file_path, 'w') as fp:for item in text_converted:fp.writelines("%s\n" % item)

Gather the jpg files

import globimages_list = glob.glob("data/obj/new_dataset/*.jpg")## Perform Normalization!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!### I have not done it........print(images_list)

Create the train.txt file in which there will be names of jpg files.

file = open("data/train.txt", "w")file.write("\n".join(images_list))file.close()

Start the Training, wait until the model converges.

Wait for eternity…

!./darknet detector train data/obj.data cfg/yolov3_training.cfg darknet53.conv.74 -dont_show

After this, the weights will be stored at “yolov3_w1” in your drive.

You Got It !!!

Thanks for reading, please do clap and share this article.

--

--

Nisarg Bhatt
Analytics Vidhya

Master of Computing in AI @ National University of Singapore