opencv-python+yolov 3 목표 검출 실현

최근 의 임 무 는 목표 검 측 에 유용 하기 때문에 어젯밤,오늘 오전 에 해 보 았 습 니 다.목표 검 측 이라는 임 무 를 신속하게 파악 하고 opencv 를 사용 하여 목표 검 측 을 실 현 했 습 니 다.
인터넷 자료 가 매우 복잡 해서 자원 을 검색 하 는 데 많은 시간 을 낭비 한 것 같 습 니 다.그래서 저 는 이 블 로 그 를 써 서 제 가 그동안 알 고 있 는 것 을 정리 하여 인연 이 있 는 독자 들 이 참고 하여 공부 하도록 하 겠 습 니 다.
목표 검출 개황
목표 검출 은?
목표 검 측 은 대충 말 하면 이미지/동 영상 을 입력 하고 처 리 를 통 해 목표 의 위치 정보(예 를 들 어 왼쪽 상단 과 오른쪽 하단 의 좌표),목표 의 예측 유형,목표 의 예측 신뢰 도(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 목표 검출 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기