Python kodu GPU ile çalıştırılamıyor

Careta

Centipat
Katılım
11 Ocak 2023
Mesajlar
145
Çözümler
1
Daha fazla  
Sistem Özellikleri
HP Victus 16 S0023NT RTX 4060 8 GB Ryzen 5 7640hs 2x8 ddr5 5600 mhz 512 ssd
Cinsiyet
Erkek
Meslek
Yazılım Mühendisliği 3. Sınıf öğrencisi
Ben bir nesne tespiti yazılımı ile uğraşıyorum, ve bu yazılımı fotoğraf üzerinde çalıştırmayı başardım. Fakat video üzerinde çalıştırınca çok düşük FPS ile kareler ekrana düşüyor. Bunun sebebi sanırım kodun CPU üzerinden çalışması. Kodu çalıştırınca görev yöneticisinden performans'a baktığımda CPU'nun %99-100 civarlarıda dolaşırken GPU'nun ise hiç çalışmadığını fark ediyorum. Kodu GPU üzerinden nasıl çalıştıracağımı ChatGPT programına sorduğumda ise şu kodları önerdi;
Python:
import tensorflow as tf

# GPU ayarları
gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_visible_devices(gpus[0], 'GPU')
tf.config.experimental.set_memory_growth(gpus[0], True)

gibi kodları programa ekleyerek önce bir listeye eşitleyip daha sonra kullanılmasını sağlayabilirsin dedi. Bence öyle yaptım ama olmadı. daha sonra neden olmadığına bakmak için;
Python:
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
kodunu yazdım ve fiziksel GPU'ların listesini konsola yazdırmak istedim fakat konsolda 0 sonucunu aldım. Fakat oyunlarda GPU'nun kullanıldığını ve sistemin GPU'yu algıladığını biliyorum. Sistemim ise Acer Nitro 5 AN-515-55, GTX1650 Ti, Intel Core i5 10300H, 16 GB RAM. Kodu yazdığım ortam Anaconda ve biliyorsunuz kütüphaneler Anaconda içinde oluşturulan enviroment içine kuruluyor bunun ile alakası var mı bilmiyorum. Kullandığım IDE ise Spyder. Ayrıca sürüm ile alakalı bir problem olduğunu düşünmüyorum çünkü her şeyi son sürüme güncelleyip de denedim.
Python:
import cv2
import numpy as np
import tensorflow as tf

print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))

font = cv2.FONT_HERSHEY_SIMPLEX
cap = cv2.VideoCapture("images/VID-20221027-WA0002(0).mp4")

while True:
 
    ret, frame = cap.read()
 
    model = cv2.dnn.readNetFromDarknet("model/spot_yolov4.cfg", "model/spot_yolov4_last.weights")
 
    layers = model.getLayerNames()
    unconnect = model.getUnconnectedOutLayers()
    unconnect = unconnect-1
 
    output_layers = []
    for i in unconnect:
        output_layers.append(layers[int(i)])
 
    classFile = 'spot.names'# dikkat et
    classNames = []
 
    with open(classFile, 'rt') as f:
        classNames = f.read().rstrip('\n').split('\n')
 
 
    frame = cv2.resize(frame, (1600,900))
 
    img_width = frame.shape[1]
    img_height = frame.shape[0]
 
    img_blob = cv2.dnn.blobFromImage(frame,1/255,(416,416),swapRB=True)
 
    model.setInput(img_blob)
    detection_layers = model.forward(output_layers)
 
    ids_list = []
    boxes_list = []
    confidences_list = []
 
    for detection_layer in detection_layers:
        for object_detection in detection_layer:
            scores = object_detection[5:]
            predicted_id = np.argmax(scores)
            confidence = scores[predicted_id]
         
            if confidence > 0.30:
                label = classNames[predicted_id]
                bounding_box = object_detection[0:4] * np.array([img_width,img_height,img_width,img_height])
                (box_center_x, box_center_y, box_width, box_height) = bounding_box.astype("int")
                start_x = int(box_center_x - (box_width/2))
                start_y = int(box_center_y - (box_height/2))
             
                ids_list.append(predicted_id)
                confidences_list.append(float(confidence))
                boxes_list.append([start_x, start_y, int(box_width), int(box_height)])
           
    max_ids = cv2.dnn.NMSBoxes(boxes_list, confidences_list, 0.5, 0.4)
 
    for max_id in max_ids:
        max_class_id = max_id
        box = boxes_list[max_class_id]
     
        start_x = box[0]
        start_y = box[1]
        box_width = box[2]
        box_height = box[3]
     
        predicted_id = ids_list[max_class_id]
        confidence = confidences_list[max_class_id]
     
        end_x = start_x + box_width
        end_y = start_y + box_height
        cenx = start_x + ((end_x-start_x)/2)
        ceny = start_y + ((end_y-start_y)/2)
        alan = (end_x-start_x)*(end_y-start_y)
        frsize = img_height*img_width
        hedefBoyutu = (alan*100)/frsize
     
        cv2.rectangle(frame, (start_x, start_y), (end_x, end_y), (0,0,255), 2)
     
        cv2.line(frame, (788,450), (812,450), (0,255,0), thickness = 2)
        cv2.line(frame, (800,438), (800,462), (0,255,0), thickness = 2)
        cv2.rectangle(frame, (400,90), (1200,810), (255,0,0), thickness = 3)
         
        cv2.putText(frame, "TAC/Guven: {:.2f}%".format(confidence*100), (5,20), font, 0.8, (0,0,0), cv2.LINE_4)
        cv2.putText(frame, "FPS: {}".format("47"), (5, 50), font, 0.8, (0,0,0), cv2.LINE_4)
        cv2.putText(frame, "Kilitlenme Sartlari:<<HEDEF BULUNDU>>", (5, 110), font, 0.6, (0,0,0), cv2.LINE_4)
        cv2.putText(frame, "Hedef Konumu: x = {} y = {}".format(cenx, ceny), (5, 140), font, 0.6, (0,0,0), cv2.LINE_4)
        cv2.putText(frame, "Hedef Boyutu: %{}".format(round(hedefBoyutu)), (5, 170), font, 0.7, (0,0,0), cv2.LINE_4)
        cv2.putText(frame, "Takip suresi: none", (5, 200), font, 0.7, (0,0,0), cv2.LINE_4)
        cv2.putText(frame, "BASARILI KILITLENME: 0", (5, 260), font, 0.8, (0,0,0), cv2.LINE_4)
        cv2.circle(frame, (box_center_x, box_center_y), 3, (0,255,0), 1)
        cv2.line(frame, (800,450), (box_center_x, box_center_y), (0,0,0), thickness = 2)
     
        if cv2.waitKey(1) & ord("q") == 27:
            break
     
        cv2.imshow("frame", frame)

cap.release()
cv2.destroyAllWindows()
bu kodun tam hali. Ekteki resim ise çalıştırılınca nasıl göründüğü. Vermediğim bir detay var ise yazabilirsiniz.
 

Dosya Ekleri

  • Ekran Görüntüsü (437).png
    Ekran Görüntüsü (437).png
    1,2 MB · Görüntüleme: 122
Son düzenleyen: Moderatör:
Stackedowerflow ile CUDA denen bir zımbırtı ile yapıldığı söyleniyor. Biraz bakınca böyle bir kod buldum;

Python:
net = cv2.dnn.readNet(yolo_weight, yolo_config)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

3 FPS'den GPU kullanarak 11 FPS olduğunu göstermiş bunu ekleyerek deneyebilir misiniz?

 
Stackedowerflow ile CUDA denen bir zımbırtı ile yapıldığı söyleniyor. Biraz bakınca böyle bir kod buldum;

Python:
net = cv2.dnn.readNet(yolo_weight, yolo_config)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

3 FPS'den GPU kullanarak 11 FPS olduğunu göstermiş bunu ekleyerek deneyebilir misiniz?

Cuda nvidia ekran kartları için destekleniyor sadece dostum.
 
Arkadaşlar şimdi ise farklı bir sorun oldu. Buraya cevap yazan arkadaşların dediği şeyi yaptım. 3 satırlık kodun en üstündeki net = cv2.dnn.readNet(yolo_weight, yolo_config) yazan kodu tekrar yazmama gerek yoktu çünkü zaten ben o kodu kendi kodumda model diye tanımladım. net yazan yerleri model yazarak değiştirdim ve gözle görünür olmasa da bir miktar artış oldu. sonra ben şu videyu izledim;
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
. videoda cmake programıyla birşeyler yaptı dosyaların adresiyle falan oynadı. Bende aynısını yaptım önceden en azından anaconda'da kodu çalıştırıp deneyebiliyordum ama artık onu da yapamıyorum. anaconda'da opencv kuruluyor ama benim kodumda bulunan cv2 kütüphanesi opencv ile birlikte kurulmuyor
 
Arkadaşlar şimdi ise farklı bir sorun oldu. Buraya cevap yazan arkadaşların dediği şeyi yaptım. 3 satırlık kodun en üstündeki net = cv2.dnn.readNet(yolo_weight, yolo_config) yazan kodu tekrar yazmama gerek yoktu çünkü zaten ben o kodu kendi kodumda model diye tanımladım. net yazan yerleri model yazarak değiştirdim ve gözle görünür olmasa da bir miktar artış oldu. sonra ben şu videyu izledim;
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
. videoda cmake programıyla birşeyler yaptı dosyaların adresiyle falan oynadı. Bende aynısını yaptım önceden en azından anaconda'da kodu çalıştırıp deneyebiliyordum ama artık onu da yapamıyorum. anaconda'da opencv kuruluyor ama benim kodumda bulunan cv2 kütüphanesi opencv ile birlikte kurulmuyor

Öncelikle anacondayı silmenizi tavsiye ederim. Onun yerine düz Python kurun. IDE olarak PyCharm kurun. Spide, anaconda gibilerde çok sorun var. Dediğimi yapıp tekrar kurun
 
Öncelikle anacondayı silmenizi tavsiye ederim. Onun yerine düz Python kurun. IDE olarak PyCharm kurun. Spide, anaconda gibilerde çok sorun var. Dediğimi yapıp tekrar kurun
Silip tekrar kurdum fakat cmake programında yanlş birşeyler yaptım onları nasıl düzeltirim.

Öncelikle CUDA ve CUDNN kurmanız ardından tensorflowu cuda ile derleyerek kurmanız gerekiyor (kısaca mevcut tensorflow ve kerası kaldırın cuda ve cudnn kurulumundan sonra pip install tensorflow ile yükleyin)
tamam teşekkürler sınavlardan sonra denerim. zaten bilgisayarımın performansında düşüş var önce değerli dosyaları alıp format attıktan sonra kurulumları yaparım.
Yardımcı olan herkese teşekkürler.
 

Technopat Haberler

Geri
Yukarı