opencv-python+yolov 3 목표 검출 실현
인터넷 자료 가 매우 복잡 해서 자원 을 검색 하 는 데 많은 시간 을 낭비 한 것 같 습 니 다.그래서 저 는 이 블 로 그 를 써 서 제 가 그동안 알 고 있 는 것 을 정리 하여 인연 이 있 는 독자 들 이 참고 하여 공부 하도록 하 겠 습 니 다.
목표 검출 개황
목표 검출 은?
목표 검 측 은 대충 말 하면 이미지/동 영상 을 입력 하고 처 리 를 통 해 목표 의 위치 정보(예 를 들 어 왼쪽 상단 과 오른쪽 하단 의 좌표),목표 의 예측 유형,목표 의 예측 신뢰 도(confidence)를 얻 을 수 있다.
Faster R-CNN 이라는 알고리즘 을 예 로 들 면 batch(batch size 도 1)의 그림 이나 동 영상 을 입력 하 십시오.네트워크 의 직접적인 outputs 는 다음 과 같 습 니 다.
[batchId,classId,confidence,left,top,right,bottom],batchId,classId,confidence,left,top,right,bottom 은 모두 스칼라 입 니 다.
batchId 는 이 batch 에서 이 그림 의 id(즉 index)를 표시 합 니 다.다음 네 개의 스칼라 는 목표 의 위치 정보 입 니 다.왼쪽 상단 픽 셀 점 과 오른쪽 아래 픽 셀 점 의 좌표 입 니 다.
목표 검출 알고리즘?
역사적 맥락 에 따라 이야기 하 다.
수 동 특징 추출 알고리즘,예 를 들 어 VJ,HOG,DPM
R-CNN 알고리즘(2014)은 최초 로 심도 있 는 학습 을 바탕 으로 하 는 목표 검출 기 중 하나 로 그 구 조 는 2 급 네트워크 이다.1)우선 선택 적 검색 과 같은 알고리즘 으로 대상 을 포함 할 수 있 는 후보 경계 상 자 를 제시 해 야 한다.2)그리고 이 구역 들 을 CNN 알고리즘 에 전달 하여 분류 한다.
R-CNN 알고리즘 에 존재 하 는 문 제 는 시 뮬 레이 션 이 느 리 고 완전한 엔 드 에서 엔 드 까지 의 대상 감지 기 가 아니 라 는 것 이다.
Fast R-CNN 알고리즘(2014 말)은 원본 R-CNN 을 상당히 개선 했다.정확 도 를 높이 고 정방 향 전달 을 수행 하 는 데 걸 리 는 시간 을 줄 였 다.
그러나 이 모델 은 외부 지역 검색 알고리즘 에 의존 하고 있다.
faster R-CNN 알고리즘(2015),진정한 엔 드 투 엔 드 딥 러 닝 대상 검출 기.선택 적 검색 요 구 를 삭제 하고 의존 합 니 다.
(1)완전 볼 륨 영역 제안 네트워크(RPN,Region Purpose Network)는 대상 경계 상자 와'대상'점 수 를 예측 할 수 있다(한 영역의 가능성 을 계량 화 하 는 점수).
(2)그리고 RPN 의 출력 을 R-CNN 구성 요소 에 전달 하여 최종 분류 와 표 시 를 한다.
R-CNN 시리즈 알고리즘 은 모두 to-stage 전략 을 채택 했다.검사 결 과 는 일반적으로 매우 정확 하지만 시 뮬 레이 션 속도 가 매우 느 려 GPU 에서 도 5 FPS 만 얻 을 수 있다 는 것 이 특징 이다.
one-stage 방법 은 yolo(2015),SSD(2015 말),그리고 이 두 가지 알고리즘 을 바탕 으로 개 선 된 각 논문 에서 제시 한 알고리즘 이다.이러한 알고리즘 의 기본 적 인 사고방식 은 그림 의 서로 다른 위치 에서 고 르 게 밀집 표본 을 추출 하고 표본 을 추출 할 때 서로 다른 척도 와 너비 비 를 사용 한 다음 에 CNN 을 이용 하여 특징 을 추출 한 후에 직접 분류 하고 회귀 할 수 있다 는 것 이다.
전체 과정 은 한 걸음 만 필요 하기 때문에 속도 가 빠 르 지만 훈련 이 어렵다.
yolov 3(2018)는 yolo 작가 가 제시 한 세 번 째 버 전(앞서 yolov 2 와 그들의 tinny 버 전 을 언급 한 적 이 있 으 며,tinny 버 전 은 압축 이 빠 르 지만 정확 도 를 낮 추 었 다)이다.yolov 3 는 80 가지 물체 의 목표 검 측 을 지원 합 니 다.전체 목록[여기에 찍 기]:https://github.com/pjreddie/darknet/blob/master/data/coco.names
타임 라인:
yolov 3 모델 안내
성능 소개
우선,세트,yolov 3 는 강하 다.속도 상 으로 는 R-CNN 보다 1 천 배,Fast R-CNN 보다 100 배 빠르다.검 측 정확도 에서 가장 정확 한 것 은 아니다.YOLOv3-608 은 DSSD 보다 높 고 FPN 에 가깝다.그러나 그것 의 속 도 는 후자 의 3 분 의 1 도 안 된다.
아래 그림 에서 도 알 수 있다.
구조 소개
그 는 일련의 볼 륨,잔 차,샘플링 으로 구성 되 어 있 음 을 알 수 있다.예측 을 세 개의 척도(Scale)로 나 누 어(그림 에서 세 개의 컬러 상자 참조)하고 세 개의 scale 에서 각각 출력 하 는 것 이 특징 이다.
opencv-python 구현
why opencv?
opencv(3.4.2+버 전)의 dnn(Deep Neural Network-DNN)모듈 은 Darknet 프레임 워 크 를 봉 인 했 습 니 다.이 프레임 워 크 는?
자기가 쓴 것 은 yolo 알고리즘 을 봉 인 했 습 니 다.이러한 관계 로 인해 우 리 는 opencv 를 사용 하여 yolo 의 각 버 전 을 편리 하 게 사용 할 수 있 고 데이터(아래 참조)가 있어 서 OpenCV 의 DNN 모듈 이 CPU 에서 실현 하 는 속도 가 OpenML 을 사용 하 는 Darknet 보다 9 배 빠르다 는 것 을 증명 한다.
본문
나 는 먼저 스 크 립 트 세 션 을 결합 하여 설명 한 다음 에 이 스 크 립 트 의 전체 코드 를 제시 하고 설명 할 것 이다.
먼저.
재고품 을 인수 하 다
import numpy as np
import cv2 as cv
import os
import time
인자:
yolo_dir = '/home/hessesummer/github/NTS-Net-my/yolov3' # YOLO
weightsPath = os.path.join(yolo_dir, 'yolov3.weights') #
configPath = os.path.join(yolo_dir, 'yolov3.cfg') #
labelsPath = os.path.join(yolo_dir, 'coco.names') # label
imgPath = os.path.join(yolo_dir, 'test.jpg') #
CONFIDENCE = 0.5 #
THRESHOLD = 0.4 #
가중치 파일,프로필,label 이름 의 다운로드 주소:
wget https://pjreddie.com/media/files/yolov3.weights
wget https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
wget https://github.com/pjreddie/darknet/blob/master/data/coco.names
쉽게 말 하면:약 한 검 측 을 거 르 는 최소 확률:신뢰 도가 이 값 보다 작은 출력 은 모두 필요 하지 않 습 니 다.
최대 치 억제 한도 값 이 아 닙 니 다.프레임 이 겹 치 는 정도(다 중 프레임 에서 같은 물 체 를 감지)를 허용 하고 아래 의 NMS 알고리즘 을 사용 할 수 있 습 니 다.이 알고리즘 은 이 값 에 따라 겹 치 는 프레임 을 합 칩 니 다.값 이 0 일 때 프레임 이 겹 치 는 것 을 허용 하지 않 습 니 다.기본 값 은 0.3 입 니 다.
자세히 말 하면:
안 알 아 봤 어 요.관심 있 으 시 면 알 아 보 세 요.
중요 한 장면 1:
# 、
net = cv.dnn.readNetFromDarknet(configPath, weightsPath) ##
# print("[INFO] loading YOLO from disk...") ##
# 、 blob 、
img = cv.imread(imgPath)
blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False) ## net blob , blobFromImage
net.setInput(blobImg) ## setInput
# ( ),
outInfo = net.getUnconnectedOutLayersNames() ## yolov3 ,yolo scale ,outInfo scale , net.forward
# start = time.time()
layerOutputs = net.forward(outInfo) # 、 , 。
# end = time.time()
# print("[INFO] YOLO took {:.6f} seconds".format(end - start)) ##
layerOutputs
은 2 차원 구조 로 0 차원 은 어느 출력 층 을 대표 하고 1 차원 은 각 검 측 상 자 를 대표 한다.다른 건 주석 에서 다 설명 할 게 요.
중요 한 장면 2:
#
(H, W) = img.shape[:2]
아래 에서 사용 가능:
# layerOutputs
# layerOutputs 1 : [center_x, center_y, width, height, objectness, N-class score data]
# :
boxes = [] # ( )
confidences = [] #
classIDs = [] # ID
# # 1)
for out in layerOutputs: #
for detection in out: #
#
scores = detection[5:] #
classID = np.argmax(scores) # id id
confidence = scores[classID] #
#
if confidence > CONFIDENCE:
box = detection[0:4] * np.array([W, H, W, H]) #
(centerX, centerY, width, height) = box.astype("int")
x = int(centerX - (width / 2))
y = int(centerY - (height / 2))
boxes.append([x, y, int(width), int(height)])
confidences.append(float(confidence))
classIDs.append(classID)
# # 2) (non-maxima suppression,nms)
idxs = cv.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes , box index idxs
이곳 의 NMS 알고리즘 은 바로 앞에서 언급 한 NMS 알고리즘 이다.검 측 결 과 를 적용 합 니 다.여 기 는 테 두 리 를 그립 니 다.
# labels
with open(labelsPath, 'rt') as f:
labels = f.read().rstrip('
').split('
')
아래 에서 사용 가능:
#
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") # , , RGB , size (len(labels), 3)
if len(idxs) > 0:
for i in idxs.flatten(): # indxs , 0 , 1
(x, y) = (boxes[i][0], boxes[i][1])
(w, h) = (boxes[i][2], boxes[i][3])
color = [int(c) for c in COLORS[classIDs[i]]]
cv.rectangle(img, (x, y), (x+w, y+h), color, 2) # 2px
text = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])
cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # cv.FONT_HERSHEY_SIMPLEX 、0.5 、 2px
cv.imshow(' ', img)
cv.waitKey(0)
첫 번 째 부분 설명 이 끝나 면 전체 코드 를 놓 습 니 다.더욱
import numpy as np
import cv2 as cv
import os
import time
yolo_dir = '/home/hessesummer/github/NTS-Net-my/yolov3' # YOLO
weightsPath = os.path.join(yolo_dir, 'yolov3.weights') #
configPath = os.path.join(yolo_dir, 'yolov3.cfg') #
labelsPath = os.path.join(yolo_dir, 'coco.names') # label
imgPath = os.path.join(yolo_dir, 'test.jpg') #
CONFIDENCE = 0.5 #
THRESHOLD = 0.4 #
# 、
net = cv.dnn.readNetFromDarknet(configPath, weightsPath) # #
print("[INFO] loading YOLO from disk...") # #
# 、 blob 、
img = cv.imread(imgPath)
blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False) # # net blob , blobFromImage
net.setInput(blobImg) # # setInput
# ( ),
outInfo = net.getUnconnectedOutLayersNames() # # yolov3 ,yolo scale ,outInfo scale , net.forward
start = time.time()
layerOutputs = net.forward(outInfo) # 、 , 。
end = time.time()
print("[INFO] YOLO took {:.6f} seconds".format(end - start)) # #
#
(H, W) = img.shape[:2]
# layerOutputs
# layerOutputs 1 : [center_x, center_y, width, height, objectness, N-class score data]
# :
boxes = [] # ( )
confidences = [] #
classIDs = [] # ID
# # 1)
for out in layerOutputs: #
for detection in out: #
#
scores = detection[5:] #
classID = np.argmax(scores) # id id
confidence = scores[classID] #
#
if confidence > CONFIDENCE:
box = detection[0:4] * np.array([W, H, W, H]) #
(centerX, centerY, width, height) = box.astype("int")
x = int(centerX - (width / 2))
y = int(centerY - (height / 2))
boxes.append([x, y, int(width), int(height)])
confidences.append(float(confidence))
classIDs.append(classID)
# # 2) (non-maxima suppression,nms)
idxs = cv.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes , box index idxs
# labels
with open(labelsPath, 'rt') as f:
labels = f.read().rstrip('
').split('
')
#
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") # , , RGB , size (len(labels), 3)
if len(idxs) > 0:
for i in idxs.flatten(): # indxs , 0 , 1
(x, y) = (boxes[i][0], boxes[i][1])
(w, h) = (boxes[i][2], boxes[i][3])
color = [int(c) for c in COLORS[classIDs[i]]]
cv.rectangle(img, (x, y), (x+w, y+h), color, 2) # 2px
text = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])
cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # cv.FONT_HERSHEY_SIMPLEX 、0.5 、 2px
cv.imshow('detected image', img)
cv.waitKey(0)
결과:opencv-python+yolov 3 목표 검출 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 opencv yolov 3 목표 검출 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ip camera android에 액세스하고 java를 사용하여 모니터에 표시그런 다음 PC에서 다운로드 폴더를 추출해야 합니다 그런 다음 프로젝트 폴더에 다운로드한 javacv 라이브러리를 추가해야 합니다. 먼저 라이브러리 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 jar/폴더 추가를 선택...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.