Object Detection Using Python (Part 1)
Original Source Here
Oke, Langsung saja kita lakukan YOLO object detection untuk gambar. Langkah pertama yang dilakukan adalah membuka notepad dan simpan sebagai “yolo.py”. Kemudian akan dibahas skrip satu persatu. Pertama impor package yang dibutuhkan yaitu sebagai berikut.
import numpy as np
import argparse
import time
import cv2
import os
Selama package NumPy dan OpenCv telah terinstall, maka tidak akan terjadi masalah pada skrip tersebut. Kemudian membangun argumen parse dengan perintah sebagai berikut.
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to input
image")
ap.add_argument("-y", "--yolo", required=True,help="base path to
YOLO directory")
ap.add_argument("-c", "--confidence", type=float,default=0.5,
help="minimum probability to filter weak detections")
ap.add_argument("-t", "--threshold", type=float, default=0.3, help=
"threshold when applying non-maxima suppression")
args = vars(ap.parse_args())
Pada skrip tersebut terdapat empat argumen parse dengan masing-masing meliputi :
- “–image” : Jalur untuk input gambar. Skrip ini mendeteksi objek dalam gambar menggunakan YOLO.
- “–yolo” : Jalur dasar ke direktori YOLO. Skrip ini memuat file YOLO yang diperlukan untuk melakukan deteksi objek pada gambar.
- “– confidence” : Kemungkinan minimum untuk memfilter weak detections. Nilai default pada skrip ini adalah 50% (0. 5), tetapi Anda dapat bebas bereksperimen dengan nilai tersebut.
- “–threshold” : Ambang penekanan non-maksimal kami dengan nilai default 0. 3.
Selain itu, terdapat “args” merupakan variabel yang menjadi kamus berisi pasangan key value untuk 4 argumen parse sebelumnya. Selanjutnya, dibuat skrip untuk memuat label kelas COCO tempat model yolo dilatih serta mengatur warna acak untuk masing-masing label.
#load the COCO class labels our YOLO model
labelsPath = os.path.sep.join([args[“yolo”], “coco.names”])
LABELS = open(labelsPath).read().strip().split(“\n”)# initialize a list of colors to represent each possible class label
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3),dtype=”uint8")
Kemudian turunkan jalur ke bobot YOLO dan konfigurasi model, diikuti dengan memuat object detector YOLO yang dilatih pada kumpulan data COCO (80 kelas).
# derive the paths to the YOLO weights and model configuration
weightsPath = os.path.sep.join([args[“yolo”], “yolov3.weights”])
configPath = os.path.sep.join([args[“yolo”], “yolov3.cfg”])# load our YOLO object detector trained on COCO dataset (80 classes)
print(“[INFO] loading YOLO from disk…”)
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
Membuat perintah untuk memuat gambar dan mengirimkannya melalui network sebagai berikut:
# load our input image and grab its spatial dimensions
image = cv2.imread(args["image"])
(H, W) = image.shape[:2]# determine only the *output* layer names that we need from YOLO
ln = net.getLayerNames()
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]# construct a blob from the input image and then perform a forward
# pass of the YOLO object detector, giving us our bounding boxes and
# associated probabilities
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),
swapRB=True, crop=False)
net.setInput(blob)
start = time.time()
layerOutputs = net.forward(ln)
end = time.time()# show timing information on YOLO
print("[INFO] YOLO took {:.6f} seconds".format(end - start))
Kemudian akan dibuat skrip untuk memfilter dan memvisualisasikan hasilnya. Pertama inisialisasikan beberapa daftar yang diperlukan dalam proses, yaitu:
boxes = []
confidences = []
classIDs = []
- “boxes” : Kotak pembatas kami di sekitar objek.
- “confidence” : Nilai keyakinan yang diberikan YOLO ke suatu objek. Nilai kepercayaan yang lebih rendah menunjukkan bahwa objek tersebut mungkin tidak seperti yang dipikirkan oleh jaringan. Ingat dari argumen baris perintah sebelumnya bahwa skrip akan memfilter objek yang tidak memenuhi treshold 0. 5.
- “classIDs” : Label kelas objek yang terdeteksi.
Sekarang akan mulai mengisi daftar ini dengan data dari YOLO “layerOutputs”, skrip yang digunakan sebagai berikut.
# loop over each of the layer outputs
for output in layerOutputs:# loop over each of the detections
for detection in output:# extract the class ID and confidence (i.e., probability) of
# the current object detection
scores = detection[5:]
classID = np.argmax(scores)
confidence = scores[classID]# filter out weak predictions by ensuring the detected
# probability is greater than the minimum probability
if confidence > args["confidence"]:# scale the bounding box coordinates back relative to the
# size of the image, keeping in mind that YOLO actually
# returns the center (x, y)-coordinates of the bounding
# box followed by the boxes' width and height
box = detection[0:4] * np.array([W, H, W, H])
(centerX, centerY, width, height) = box.astype("int")# use the center (x, y)-coordinates to derive the top and
# and left corner of the bounding box
x = int(centerX - (width / 2))
y = int(centerY - (height / 2))# update our list of bounding box coordinates, confidences,
# and class IDs
boxes.append([x, y, int(width), int(height)])
confidences.append(float(confidence))
classIDs.append(classID)
Kemudian terapkan apa yang disebut “Non-Maximum Suppression (penekanan non-maksimal)”. YOLO tidak menerapkan penekanan non-maxima, jadi perlu menerapkannya secara eksplisit. Menerapkan penekanan non-maxima menekan kotak pembatas yang tumpang tindih secara signifikan. Non-Maximum Suppression juga memastikan tidak memiliki kotak pembatas yang berlebihan. Berikut adalah perintah yang digunakan.
# apply non-maxima suppression to suppress weak, overlapping bounding
# boxes
idxs = cv2.dnn.NMSBoxes(boxes, confidences, args[“confidence”],
args[“threshold”])
Skrip selanjutnya adalah membuat kotak dan teks kelas pada gambar dengan perintah sebagai berikut.
# ensure at least one detection exists
if len(idxs) > 0:# loop over the indexes we are keeping
for i in idxs.flatten():# extract the bounding box coordinates
(x, y) = (boxes[i][0], boxes[i][1])
(w, h) = (boxes[i][2], boxes[i][3])# draw a bounding box rectangle and label on the image
color = [int(c) for c in COLORS[classIDs[i]]]
cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
text = “{}: {:.4f}”.format(LABELS[classIDs[i]], confidences[i])
cv2.putText(image, text, (x, y — 5), cv2.FONT_HERSHEY_SIMPLEX,
0.5, color, 2)# show the output image
cv2.imshow(“Image”, image)
cv2.waitKey(0)
Setelah semua skrip selesai dan tersimpan dalam file “yolo.py”, kita dapat menjalankan perintah untuk object detection gambar pada command prompt. Menggunakan gambar yang sebelumnya telah di download dari google dan disimpan dengan nama “example.jpg”, gunakan perintah “python yolo.py –image images/example.jpg –yolo yolo-coco”.
Diperoleh hasil sebagai berikut.
Dapat dilihat bahwa telah berhasil dilakukan object detection pada gambar “example.jpg”. Pada gambar tersebut terdeteksi adanya orang-orang, koper, bahkan handbag pada wanita di bagian kanan.
Oke, cukup sekian pembahasan Object Detection dengan Python. Semoga Bermanfaat.
AI/ML
Trending AI/ML Article Identified & Digested via Granola by Ramsey Elbasheer; a Machine-Driven RSS Bot
via WordPress https://ramseyelbasheer.wordpress.com/2021/01/09/object-detection-using-python-part-1/