Study/class note

딥러닝 / 고라니, 너구리 디텍션2

chanzae 2022. 5. 4. 14:44

1. 다크넷 신경망으로 학습할 때의 하이퍼 파라미터 값과 같은 학습 정보

/content/drive/MyDrive/yolo_custom_model_Training3/darknet/cfg/yolo4_custom.cfg

 

2. 다크넷 신경망의 가중치

/content/drive/MyDrive/yolo_custom_model_Training3/backup/yolo4_custom_last.weights

 

ㅇ고라니와 가중치 환경구성파일을 이용해서 로컬에서 object detection 하기

net = cv2.dnn.readNetFromDarknet('C:\\animal\\yolov4_custom.cfg','C:\\animal\\yolov4_custom_last.weights')

이 부분 코드에 위에서 다운로드 받은 환경구성파일과 가중치 파일을 넣으면 됨.

import cv2
import numpy as np

LABELS = ['gorani','raccoon']
#gorani, raccoon

CONFIDENCE = 0.3
THRESHOLD = 0.3  #NMS(Num Max Suppression)

net = cv2.dnn.readNetFromDarknet('C:\\animal\\yolov4_custom.cfg','C:\\animal\\yolov4_custom_last.weights')

def main(img_path):
    img = cv2.imread(img_path)
    H, W, _ = img.shape
    blob = cv2.dnn.blobFromImage(img, scalefactor=1/255., size=(416, 416), swapRB=True)
    net.setInput(blob)
    output = net.forward()
  
    boxes, confidences, class_ids = [], [], []
    
    cnt = 0
    cnt2 = 0
    for det in output: #output [:4]:x,y,w,h, [5:]:score
        box = det[:4]
        #print(box)
        scores = det[5:]
        #print(scores)
        #cnt = cnt + 1
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        #print(confidence)
    
        
        if confidence > CONFIDENCE:
            #print(confidence)
            #cnt2 = cnt2 + 1
            #print(box)
            cx, cy, w, h = box * np.array([W, H, W, H]) # 역정규화함
            #print(cx,cy,w,h)
            x = cx - (w / 2) # 중심찾는것
            y = cy - (h / 2) # 중심찾는것

            boxes.append([int(x), int(y), int(w), int(h)])
            confidences.append(float(confidence))
            class_ids.append(class_id)
   
    #Num Max Suppression # https://naknaklee.github.io/etc/2021/03/08/NMS/
    idxs = cv2.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD)
    
    if len(idxs) > 0:
        for i in idxs.flatten():
            #print(boxes) # 6개의 박스중에 
            #print(i) # 3번과 4번중 4번으로 박싱을 함
            x, y, w, h = boxes[i]
            cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
            cv2.putText(img, text='%s %.2f %d' % (LABELS[class_ids[i]], confidences[i], w), org=(x, y -10 ), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.5, color=(0, 0, 255), thickness=2)

    cv2.imwrite('c:\\animal\\detection18.png', img)
   #print(cnt)  # 그림 한장에서 507개의 프레임을 찾음
   #print(cnt2) # cnt2 는 6장 찾음

 

 

ㅇ위의 main함수를 실행하는 사용자 인터페이스 만들기

 

import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
from keras.models import load_model
import numpy  as  np
import cv2
import glob
from matplotlib import pyplot as plt
import os



##### 화면 생성
top = tk.Tk()
top.geometry('700x500')
top.title('Animal Object Detection')
top.configure(background='snow2')  # 창 백그라운드 색깔
#label = Label(top, background='red', font=('arial',15,'bold'))

img = Image.open('c:\\animal\\gorani.jpg')
img = img.resize((400, 320))
im = ImageTk.PhotoImage(img,master=top)
sign_image = Label(top, image=im)
sign_image.place(relx=0.28, rely=0.1)  #https://076923.github.io/posts/Python-tkinter-12/
                                # x 좌표의 배치 비율, y 좌표의 배치 비율
    

##### 화면 타이틀
heading = Label(top, text="고속도로에서 죽는 동물 살리기 프로젝트", pady=20, font=('맑은 고딕',20,'bold'))
heading.configure(background='snow2', foreground='navy')
heading.pack()


##### 함수 생성
def upload_image():
    plt.clf()  # 현재 그림을 지웁니다. 
    try:
        #label.configure(foreground='black', text='display Image ...', font=('Comic Sans MS',15))
        plt.clf() # 현재 그림을 지웁니다. 
        
        # 결과 이미지 출력 
        file_path = filedialog.askopenfilename() # 윈도우 탐색기를 열고 파일을 선택하는 창
        Test_root = glob.glob(file_path)[0] # 불러온게 리스트므로 리스트안의 요소를 가져옵니다.

        main(Test_root)
        
        file_path2 = 'C:\\animal\\detection18.png'        
        uploaded = Image.open(file_path2)
        uploaded = uploaded.resize((400, 320))
        uploaded.thumbnail(((top.winfo_width()/2.25),(top.winfo_height()/2.25))) # 이미지 사이즈 조정
        im = ImageTk.PhotoImage(uploaded) # 이미지를 tk inter 창에 출력
        sign_image.configure(image=im)
        sign_image.image = im
            
    except:
        pass

    
##### 버튼 생성
upload = Button(top, text="Upload image", relief=RIDGE, command=upload_image, padx=10, pady=5)
# relief 는 버튼 스타일
upload.configure(background='mediumpurple4', foreground='white', font=('arial',12,'bold'))
# 버튼에 색깔과 폰트 
upload.pack(side=BOTTOM, padx=10, pady=10)
# 버튼을 아래쪽(BOTTOM) 위치 

sign_image.pack(side=BOTTOM, expand=True) # https://m.blog.naver.com/dudwo567890/130167237607
# expand=True 요구되지 않은 공간활용하기 

#label.pack(side=BOTTOM, expand=True)

top.mainloop()
반응형