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()
반응형