728x90
반응형
In [1]:
import cv2
import numpy as np
video_signal = cv2.VideoCapture(0)
YOLO_net = cv2.dnn.readNet("./yolo/config/yolov2-tiny.weights", "./yolo/config/yolov2-tiny.cfg")
classes=[]
with open ("./yolo/config/coco.names", "r") as f :
classes = [line.strip() for line in f.readlines()]
"""YOLO 레이어 전체 이름 추출"""
layer_names= YOLO_net.getLayerNames()
"""YOLO 레이어(계층)만 이름 추출"""
output_layer= [layer_names[i-1] for i in YOLO_net.getUnconnectedOutLayers()]
cv2.namedWindow("YOLO3_CM_01")
###################
# 인식된 객체 이미지로 저장
# - 이미지 파일 저장시 파일명에 번호 붙이기
img_cnt =1
###################
"""카메라를 통한 영상 처리 시에는 윈도우 창을 계속 띄어 놓아야 합니다.
- 정지 옵션 (윈도우 창 닫기)은 필수.......
"""
while True :
"""
카메라에서 영상 읽어 들이기 : read() 함수 사용
- 영상 파일 또는 카메라로 부터 프레임을 읽어오는 역할 수행
* ret : 읽어 들이는 프레임이 있는지 여부 판단(True or False)
:더이상 읽어 들일 프레임이 없으면 False가 됨
* frame : 실제로 읽어들인 프레임(이미지) 자체
: 더이상 읽어들일 프레임이 없으면 None이 됨
: 우리가 사용할 변수
"""
ret, frame = video_signal.read()
"""frame 정보에서 높이 너비 채널(흑백, 또는 컬러) 추출하기"""
h,w,c = frame.shape
"""BLOB 데이터 구조화"""
blob = cv2.dnn.blobFromImage(
# 카메라에서 읽어들인 frame (이미지) 데이터
image = frame,
# 이미지 픽셀 값 정규화(스케일창)
scalefactor = 1/255.0,
# YOLO 모델이 사용할 크키로 조정
size = (416,416),
# BGR, RGB 선택
# - True이면 : OpenCV의 기본 BGR 색상 순서를 RGB로 변경
swapRB = True,
# 위에 size로 조정 후 어떻게 할지 결정
# True 이면 잘라내기
# False 이면 size로 전체 조정하기
crop = False
)
#yolo 입력 데이터로 넣어주기
YOLO_net.setInput(blob)
# yolo 모델에 출력 계층 이름을 알려주고 출력 결과 받아오기
outs = YOLO_net.forward(output_layer)
#라벨 (명칭, 이름) 담을 리스트 변수
class_ids = []
# 인식률(정확도) 담을 리스트 변수
confidences = []
# 바운딩 박스의 좌표를 담을 리스트 변수
boxes = []
"""출력 결과 여러개 (인식된 객체 여러개)"""
for out in outs:
#실제 객체 인식 데이터 처리
for detection in out:
# 인식데이터의 인식률(정밀도)
scores = detection[5:]
# 인식률(정밀도)가 가장 높은 인덱스 위치 얻기 :라벨(명칭,이름)의 위치값
class_id = np.argmax(scores)
# 인식률(정밀도) 값 추출하기 : class_id 의 인덱스 번호 위치 값이 정밀도
confidence = scores[class_id]
# 정밀도가 50% 이상인 경우만 처리
if confidence >0.5:
"""중앙값의 좌표 비율에 실제 너비로 연산하여 x값 추출"""
center_x = int(detection[0] * w)
"""중앙값의 좌표 비율에 실제 높이로 연산하여 중앙 y값 추출"""
center_y = int(detection[1] * h)
"""바운딩 박스의 실제 너비와 높이 계산하기"""
dw = int(detection[2] * w)
dh = int(detection[3] * h)
"""바운딩 박스의 시작 좌표 x y 계산하기"""
x= int (center_x - dw/2)
y= int (center_y- dh/2)
boxes.append([x, y, dw, dh])
confidences.append(float(confidence))
class_ids.append(class_id)
"""중복된 바운딩 박스 제거하기
- 정확도가 0.45보다 작으면 제거하기
"""
indexs = cv2.dnn.NMSBoxes(boxes, confidences, 0.45, 0.4)
"""인식된 객체마다 바운딩 박스 처리하기"""
for i in range(len(boxes)):
# 중복 제거 이후 남은 바운딩 박스의 정보만 이용
if i in indexs:
# 해당 객체에 대한 좌표값
x,y,w,h = boxes[i]
# 해당 객체에 대한 라벨값
label = str(classes[class_ids[i]])
# 해당 객체에 대한 정확도
score = confidences[i]
# 바운딩 박스 그리기
cv2.rectangle(
# 원본이미지(frame)
frame,
# 시작좌표
(x,y),
# 종료좌표
(x+w, y+h),
# 선 색상
(0,255,255),
# 선 굵기
5
)
"""라벨, 정확도 이미지에 텍스트 그리기"""
cv2.putText(
# 지금까지 그려진 frame이미지
img = frame,
# 추가할 텍스트 (문자열 타입으로)
text = label,
# 텍스트 시작 위치 지정
org = (x,y-20),
# 텍스트 font 스타일
fontFace= cv2.FONT_ITALIC,
# font 크기
fontScale=0.5,
# font 색상
color=(255,255,255),
# font 굵기
thickness=1
)
# 윈도우창 open 하기
cv2.imshow("YOLO3_CM_01", frame)
# 윈도 창 크키 조절하기
cv2.resizeWindow("YOLO3_CM_01",650,500)
#########
# 이미지로 저장하기
print(f">>>>>>>>>>> 정확도 평균 : {np.mean(confidences)}")
# 정확도 평균이 0.8 이상인 경우만 저장시키기
if np.mean(confidences) >= 0.8:
# 이미지 저장 함수: imwrite() 함수 사용
cv2.imwrite(f"./yolo/images_new/img_{img_cnt}.jpg", frame)
# 파일 명 끝에 넣을 번호 1 추가
img_cnt+=1
# while문 종료하기
if cv2.waitKey(100) > 0:
# 윈도우 모조건 종료
cv2.destroyAllWindows()
break
#키보드에서 q 입력시 종료시키기
if cv2.waitKey(1) & 0xFF == ord("q") :
# 윈도우 무조건 종료
cv2.destroyAllWindows()
break
"""윈도우 종료후 재실행 시 안되는 경우가 발생할 수 있음
- 이때는 주피터가 실행된 프롬프트 창에서 [ctrl+c] 정지후 다시 주피터 실행"""
>>>>>>>>>>> 정확도 평균 : 0.8710326552391052
>>>>>>>>>>> 정확도 평균 : 0.7936805685361227
>>>>>>>>>>> 정확도 평균 : 0.7954492966334025
>>>>>>>>>>> 정확도 평균 : 0.787559966246287
>>>>>>>>>>> 정확도 평균 : 0.7959062457084656
>>>>>>>>>>> 정확도 평균 : 0.8563625514507294
>>>>>>>>>>> 정확도 평균 : 0.8660885989665985
>>>>>>>>>>> 정확도 평균 : 0.8758115768432617
>>>>>>>>>>> 정확도 평균 : 0.8758087754249573
>>>>>>>>>>> 정확도 평균 : 0.8466709554195404
>>>>>>>>>>> 정확도 평균 : 0.8556316196918488
>>>>>>>>>>> 정확도 평균 : 0.7454047997792562
>>>>>>>>>>> 정확도 평균 : 0.7994685769081116
>>>>>>>>>>> 정확도 평균 : 0.7973208626111349
>>>>>>>>>>> 정확도 평균 : 0.7482778032620748
>>>>>>>>>>> 정확도 평균 : 0.7333951592445374
>>>>>>>>>>> 정확도 평균 : 0.8198845386505127
>>>>>>>>>>> 정확도 평균 : 0.8897324204444885
>>>>>>>>>>> 정확도 평균 : 0.8741563558578491
>>>>>>>>>>> 정확도 평균 : 0.8495921492576599
>>>>>>>>>>> 정확도 평균 : 0.8100136518478394
>>>>>>>>>>> 정확도 평균 : 0.7872598171234131
>>>>>>>>>>> 정확도 평균 : 0.7904649972915649
>>>>>>>>>>> 정확도 평균 : 0.7270484566688538
>>>>>>>>>>> 정확도 평균 : 0.7513769865036011
>>>>>>>>>>> 정확도 평균 : 0.7810034155845642
>>>>>>>>>>> 정확도 평균 : 0.762061595916748
>>>>>>>>>>> 정확도 평균 : 0.7907949090003967
>>>>>>>>>>> 정확도 평균 : 0.7637155055999756
>>>>>>>>>>> 정확도 평균 : 0.7098020315170288
>>>>>>>>>>> 정확도 평균 : 0.7341628074645996
>>>>>>>>>>> 정확도 평균 : 0.762978732585907
>>>>>>>>>>> 정확도 평균 : 0.7688276171684265
>>>>>>>>>>> 정확도 평균 : 0.765387237071991
>>>>>>>>>>> 정확도 평균 : 0.7498107552528381
>>>>>>>>>>> 정확도 평균 : 0.7375869750976562
>>>>>>>>>>> 정확도 평균 : 0.8219277858734131
>>>>>>>>>>> 정확도 평균 : 0.7950738668441772
>>>>>>>>>>> 정확도 평균 : 0.8523392677307129
>>>>>>>>>>> 정확도 평균 : 0.7785575985908508
>>>>>>>>>>> 정확도 평균 : 0.7446132004261017
>>>>>>>>>>> 정확도 평균 : 0.7590486407279968
>>>>>>>>>>> 정확도 평균 : 0.7628529965877533
>>>>>>>>>>> 정확도 평균 : 0.7332491278648376
>>>>>>>>>>> 정확도 평균 : 0.7585863471031189
>>>>>>>>>>> 정확도 평균 : 0.707994282245636
>>>>>>>>>>> 정확도 평균 : 0.6657467186450958
>>>>>>>>>>> 정확도 평균 : 0.6738425493240356
>>>>>>>>>>> 정확도 평균 : 0.695074995358785
>>>>>>>>>>> 정확도 평균 : 0.7598300576210022
>>>>>>>>>>> 정확도 평균 : 0.7622952659924825
>>>>>>>>>>> 정확도 평균 : 0.8650891780853271
>>>>>>>>>>> 정확도 평균 : 0.8423098623752594
>>>>>>>>>>> 정확도 평균 : 0.7031071335077286
>>>>>>>>>>> 정확도 평균 : 0.6964544355869293
>>>>>>>>>>> 정확도 평균 : 0.8681477904319763
>>>>>>>>>>> 정확도 평균 : 0.8241533041000366
>>>>>>>>>>> 정확도 평균 : 0.8616101145744324
>>>>>>>>>>> 정확도 평균 : 0.7442432343959808
>>>>>>>>>>> 정확도 평균 : 0.7322254776954651
>>>>>>>>>>> 정확도 평균 : 0.7471027076244354
>>>>>>>>>>> 정확도 평균 : 0.7512976229190826
>>>>>>>>>>> 정확도 평균 : 0.7974402606487274
>>>>>>>>>>> 정확도 평균 : 0.7319261233011881
>>>>>>>>>>> 정확도 평균 : 0.7471692164738973
>>>>>>>>>>> 정확도 평균 : 0.6962573677301407
>>>>>>>>>>> 정확도 평균 : 0.7857923905054728
>>>>>>>>>>> 정확도 평균 : 0.8052311092615128
>>>>>>>>>>> 정확도 평균 : 0.8095446676015854
>>>>>>>>>>> 정확도 평균 : 0.761296272277832
>>>>>>>>>>> 정확도 평균 : 0.7960652709007263
>>>>>>>>>>> 정확도 평균 : 0.8069420605897903
>>>>>>>>>>> 정확도 평균 : 0.7959947735071182
>>>>>>>>>>> 정확도 평균 : 0.7591756939888
>>>>>>>>>>> 정확도 평균 : 0.8166629523038864
>>>>>>>>>>> 정확도 평균 : 0.8047117739915848
>>>>>>>>>>> 정확도 평균 : 0.7960654497146606
>>>>>>>>>>> 정확도 평균 : 0.7904024422168732
>>>>>>>>>>> 정확도 평균 : 0.7988295704126358
>>>>>>>>>>> 정확도 평균 : 0.7999174445867538
>>>>>>>>>>> 정확도 평균 : 0.7650795429944992
>>>>>>>>>>> 정확도 평균 : 0.7660360038280487
>>>>>>>>>>> 정확도 평균 : 0.720795750617981
>>>>>>>>>>> 정확도 평균 : 0.7654917538166046
>>>>>>>>>>> 정확도 평균 : 0.8361156582832336
>>>>>>>>>>> 정확도 평균 : 0.8644258975982666
>>>>>>>>>>> 정확도 평균 : 0.8556869626045227
>>>>>>>>>>> 정확도 평균 : 0.8517669439315796
>>>>>>>>>>> 정확도 평균 : 0.7059587041536967
>>>>>>>>>>> 정확도 평균 : 0.692306657632192
>>>>>>>>>>> 정확도 평균 : 0.860526442527771
>>>>>>>>>>> 정확도 평균 : 0.7167700131734213
>>>>>>>>>>> 정확도 평균 : 0.7049423654874166
>>>>>>>>>>> 정확도 평균 : 0.7321235537528992
>>>>>>>>>>> 정확도 평균 : 0.7231841286023458
>>>>>>>>>>> 정확도 평균 : 0.7078258991241455
Out[1]:
'윈도우 종료후 재실행 시 안되는 경우가 발생할 수 있음\n- 이때는 주피터가 실행된 프롬프트 창에서 [ctrl+c] 정지후 다시 주피터 실행'
In [3]:
.
In [ ]:
728x90
반응형