SSD 알고리즘을 달성하기 위해

목적이 문서 : - 멋진 프로젝트를 소개하는 Keras와 SSD 알고리즘을 구현하기를 .

이 문서 디렉토리 :

  • 0 소개
  • 1 어떻게 기차 SSD 모델
  • 2 SSD 모델을 평가하는 방법
  • 3 SSD 방법을 미세 조정 모델에
  • 4 개 기타주의 사항

0 소개

내 SSD 알고리즘을 읽은 후, 다음과 같이 기록 구체적인 세부 사항에 대한 의문이 많이 있습니다 :

  • SSD 네트워크는 어떻게 달성하는 것입니다?
  • 기존의 데이터는 다음과 같다?
  • 어떻게 앵커로 이미지를 깰?
  • 어떻게 앵커 각각의 태그에 라벨?
  • 어떻게 긍정적이고 부정적인 샘플을 정의? 편집기 매칭 전략?
  • 부정적인 샘플 발굴의 어려움은 어떻게 달성하는 것입니다?
  • 어떻게 데이터가로 공급된다? 무엇 밖으로?
  • L2 정상화 어디에, 어떻게 달성하기 위해?
  • Atrous 계층 어디?
  • SSD 손실 함수 방법을 달성하는 것입니다?
  • 모델의 데이터는 어떻게 흐름인가?
  • 데이터 개선 방법을 달성하기 위해인가?
  • 어떻게 원래의 프레임의 결과를 예측하는?
  • 어떻게 파스칼 VOC 또는 MS 코코의에지도 모델을 계산?

GitHub의 검색에이 멋진 프로젝트의 발견 - SSD 알고리즘을 구현하는 Keras와을 의 SSD는 그 학습 알고리즘에 이상적이지만, (주로 내 자신의) 일부 모호한 학생들을 자세히 설명합니다. 매우 문서 주석을 자세히 설명하고, 미세 조정에 모델 자신의 데이터 세트에 미리가 훈련 등 방법, 모델의 성능을 평가하는 방법을, SSD 모델을 훈련하는 방법으로 명확 운영 지침을 제공합니다.

기록 요약 예 (ssd7_training.ipynb 파일)와 SSD 네트워크의 간단한 버전입니다 빠른 이해를 용이하게하기 위해, 세부 사항은 프로젝트 문서 주석을 참조하십시오.

1 어떻게 기차 SSD 모델

프로세스의 주요 기능은, 라이브러리 함수의 도입과 소정의 공통 파라미터에 더하여 네 개의 요소로 분할된다 :

  • 준비 모델;
    • 모델의 건설;
    • 사용자 정의 손실 함수 및 컴파일;
  • 준비 데이터;
    • 대상 이미지 생성기 datagen의 정의 교육 및 검증 세트;
    • 이미지 발생기의 기능을 사용하여 문서 화상과 태그 정보를 판독하고;
    • 화상 강조법 체인을 정의;
    • 포맷으로 부호화 된 태그 정보에 의해 코딩 손실 함수를 요구;
    • 발전기 반복자 정의 데이터;
  • 교육;
    • 콜백 기능을 정의;
    • 교육;
    • 결과 시각화 훈련;
  • 예측 (검출 시각 효과);
    • 배치의 샘플을 획득하는 반복자 정의 데이터 및;
    • 샘플은 모델 예측에 전송하고, 예측 프레임을 디코딩된다;
    • 진정한 값 예측 블록 및 영화 일본어 블록 대조적.

1.1 제조 모델

1.1.1 빌드 모델

훈련 모드에서 작은 SSD 모델을 구축합니다. 예측기는 4 개소에서 그려. 상기도에서의 각 화소의 예측. 4 대응 앵커 블록의 각.

모델 구축 과정 :

  • 기본 네트워크를 구축;
  • 도 각각 네 개의 피쳐 추출 예측기;
  • 각 예측자는 (문서 도시 기준에 따른 제 문서)를 세 개의 경로로 분할된다;
  • 이 softmax, 삼방 결국 최종 치수 합칠 필요도 분류는 정제 (배치, n_total_boxes 21 + 4 + 8) 모델이 네 앵커 블록에 대응 n_boxes_total 예측 특성 다이어그램을 나타낸다 원재료 출력 원료 출력이며 전체 최종 치수는 21 프레임 오프셋된다 카테고리 + + + 앵커 프레임 편차를 조정한다;
  • 모드가 디코더에 연결된 추론 한 경우에도 단부 (여과 후 신뢰도 임계치 NMS 다른 예측 프레임 출력) DecodeDetections 필요

비고 :

  • 둘뿐만 아니라 conv4 뒤에 이상의 계층 앵커 상자를 생성 AnchorBoxes, 그런데 왜 테이크 백 boxes4,? A : 동일 중간 값으로 두 차원, 즉,도 2의 특성의 관점. 그러나, 함수에 따라 후술 CONV4 연결되어야한다, 즉, 입력 (배치, 높이, 폭, 채널)

AnchorBoxes 층

  • 입력의 기능의 목적은, 원래의 앵커 블록의 시리즈로 분리.
  • 공정 : 인자 파라미터와 종횡비가 계산 될 수있는 스케일링 및 화소에 대응하는 상기 고정 블록 번호 특성도의 크기, 그리고도의 높이와 폭의 특성은, 앵커 블록의 중앙을 얻었다.
  • 입력 (배치, 높이, 폭, 채널), 즉,도 1의 기능의 크기.
  • 앵커 n_boxes 블록의 총 개수는도 8 방송 앵커 프레임 정보에 대응하는 기능을 나타내는 출력 (배치, 높이, 폭, n_boxes, 8), 즉 + 분산 좌표;

DecodeDetections 层

  • 모드 = 추론을 모델링 할 때, 디코더에서의 예측 후이면;
  • 공정 : top_K 프레임을 예측하기 전에 스크리닝 각 플롯의 신뢰도 임계치는 NMS 등 출력 변수의 최대 수;
  • 입력 일본어 모델의 출력 (배치, n_boxes_total, n_classes + 4 + 8) 마지막 범주 일차원 (21) + 오프셋 + 프레임 앵커 프레임과 분산 (무게 중심 포맷);
  • 출력 (일괄 top_k 6) 최종 치수는 포맷 Xmin, Ymin, Xmax, Ymax 순 좌표 (CLASS_ID, 비밀도, box_coordinates)이다. 여기 top_K = 200 박스 합리적인 예측이없는 경우에도, Couchu 200 것이다.

비고 :

  • 출력 좌표에있어서 입력 파라미터만을 좌표를 지원 = 좌표 = '무게 중심은'실제 출력 포맷 [는 Xmin, Ymin, Xmax, Ymax]의 입력 형식을 말한다 "무게 중심".

1.1.2 사용자 정의 손실 함수 및 컴파일

(SSD300 모델에서는 VGG16에게 사전에 훈련하는 무게를 권리를로드해야합니다.)

사용자 정의 손실 함수의 keras_ssd_loss.py

  • 유실 SSDLoss, 예컨대 L1 부드럽고 로그 손실로 각종 특정 손실 함수 정의있다;
  • 손실 L1 부드럽게 두 파라미터 (BATCH_SIZE, #boxes, 4), 출력 (BATCH_SIZE, #boxes)이다. 의심이가 직접 요청이 좌표 값의 직접 손실을 찾고, L1을 부드럽게한다? 하나는 그 손실 아 오프셋 요구해야한다고 생각 하는가? 또는 입력 값보다는 직접 좌표 상쇄 될 예정이다? A : 수신 통화가 compute_loss 기능에 오프셋 때, OK입니다. 로그 손실은 매우 간단합니다;
  • compute_loss 총 손실 함수 계산 및 파라미터 y_true y_pred있다 (BATCH_SIZE, #boxes # 클래스 + 12), 출력 스칼라. 총 손실 이유에 긍정적 인 샘플의 수보다는 총 개수로 나눈 질문 1,? A : 양성 및 음성 시료 1의 비율 : 3 만, 그 차이의 배수가 결과에 영향을 미치지 않는다. 질문 2, 반환 결과는 스칼라 (배치) 아직 그렇지? BATCH_SIZE 곱한 것을 아직도 이해가? A : 각 일괄 적으로 계산 된 값 keras 힘, 즉 항상, 이는 실제 작업 (배치, ...) 배치의 평균치가 일괄 compute_loss 총 손실로서 계산하는 경우에 대하여 설명한다, 배치 크기를 확보 keras 강제 BATCH_SIZE 평균 한 후 합계를 곱한 것입니다.

비고 :

  • 함수 정의 손실 때문에 y_true 및 y_predict 손실 계산을 따라이 함수에 의해 리턴 컴파일 개체에 전달하는 기능이고;
  • 이 포맷 (BATCH_SIZE, #boxes, #classes + 12) 원료의 출력, 즉, 모델 y_pred된다 y_true 후속 SSDInputEncoder 클래스 인스턴스는 실제 출력 프레임 부호 값이고;
  • 당신은 들어오는 사용자 정의 custom_objects에 load_model에 의해 모델, 기능 층과주의를 저장로드하는 경우.

1.2 데이터를 준비

이 내용은 이미지 발생기 DataGenerator 맞춤 클래스 달성하는 방법으로 일반적이다. 상기 DataGenerator 함수 내부 발생은 ()는 두 클래스를 더 커스터마이즈 할 필요가 있고, 이미지 강조 블록 사슬과 참값의 부호화 파라미터를 수신 할 필요가있다.

DataGenerator 클래스

  • DataGenerator 자동 호출 할 때 인스턴스화 INIT __ __ ()이 수있는 제 1 화상 강조 처리 (가공 변형 프로세스 함수를 생성 여기 이루어 지도록 keras이다);
  • DataGenerator 함수 인사이드 parser_csv ()가 (즉 참값 블록) 데이터 파일 및 라벨로부터 판독되고, 판독 블록 들어오는 형식의 실제 값은 각 소자는 2 차원 어레이, 즉, 배열이고 길이리스트의 샘플들의 개수이며, [CLASS_ID, Xmin, Ymin, Xmax, Ymax 순] ...], 샘플 블록에 대한 값의 수에 해당 n_boxes 상기 (n_boxes, 5)의 형상;
  • DataGenerator 함수 내 생성 ()를 이미지 강조 블록 사슬과 참값 인코더 및 다른 파라미터들을 수신하고, 데이터 (X, Y)의 배치를 생성한다 (참고 : keras 내장 flow_from_directory 읽기 파일 데이터 생성을 실현 (X, Y)의 두 가지 기능 만 파일 필요성 이외에 CSV는이 두 기능으로 분할되어, 다른 형태가있을 수있다, 여기에서 해결 될);
  • 에 가속을위한 한 가지 방법 : 첫 번째 이미지와 제 읽기 라벨 parser_csv는 다음 create_hdf5_dataset () 함수를 사용하여, 이미 진정한 가치를 포함, 이미지 및 레이블 파일 H5 (8G 근처 트레이닝 세트, 2G 근처 검증 세트로 변환 ) 상자,하지만 코딩. 당신이 DataGenerator의 H5 파일 후 직접 읽을 될 수 있습니다 만들 때 다음 기능 데이터를 생성하여 더 이상 필요 parser_csv 없습니다. 그러나 시험 후, 아니 H5 파일 외모와 차이 훈련 시간의 획기적인 12 분 훈련,가없는 것처럼.

정의 데이터 인핸스 체인

  • DataAugmentationConstantInputSize 클래스, 이미지 왜곡, 변형 진정한 가치 상자가 있나요? 그렇지 않으면 그것은에 없습니다. 방법을 변경하려면? 방법 A : 모듈 data_generator.object_detection_2d_geometric_ops의 변형은 라벨에 함께 처리된다.
  • 클래스를 만들 때 __ () 메소드를 __ 전화를 작성하는 경우 파이썬 후, 다음 클래스는 인스턴스 이름은 ()) (__ 방법 __ 전화를 호출 인스턴스를 인스턴스화, 사용중인 사용자 정의 계층 keras을 ) (__ __ 전화 대신 ()를 호출;
  • DataAugmentationConstantInputSize __ __에서 초기화 ()는 가변 순서로 배치 된 물체, 및 () 함수 호출 __ __ 호를 통합한다.

블록 포맷으로 인코딩 참값과 SSDInputEncoder 클래스 인스턴스 (여기서는 y_encoded로 표시) y_true 손실 함수를 필요

  • gt_labels 입력은 각 소자는 2 차원 어레이, 즉, 배열이고 BATCH_SIZE리스트의 길이이다 [CLASS_ID, Xmin, Ymin, Xmax, Ymax 순] ...];
  • 세 단계로 구현 된 __ 호출 __ () 함수의 주요 기능 :
    • 도 조건에서 입체적 특징 스케일링 인자 및 종횡비의 원래 크기는 21 + 4 + 4 + 4), 그리고 마지막으로 21 행 y_encoded 템플릿 (앵커, 즉, 일련 (배치, # 상자 형상을 만들어 분류된다 + + 앵커 프레임) + 분산 좌표 좌표계;
    • 블록 앵커 블록 참값 21 + (4)의 치수, 즉 마지막 업데이트 매칭;
    • 오프셋된다 앵커 프레임의 좌표를 변환하는 단계;

데이터를 생성하는 데 필요한 전화 train_dataset.generate () (X, Y)

  • 준비된 데이터 객체 및 향상된 링크 SSDInputEncoder 오브젝트는 다른 파라미터 train_dataset.generate 통과 함께) 리턴 데이터 생성기 (processed_images, encoded_labels) (전 (일괄 h_img, w_img, 채널 형상의 형태를 지정할 때 SSDInputEncoder 후속 사용을 위해 결과의 클래스 인스턴스에 의해 출력) model.fit_generator이다.

1.3 교육

정의는 몇 가지 유용한 콜백 함수, ModelCheckpoint, CSVLogger는, EarlyStopping (초 정지), ReduceLROnPlateau (CSV 파일에 손실 및 지표 저장) (평면 영역을 자동으로 학습 속도를 감소) (모델은 각 시대 후에 저장)에서 SSD300 또한, TerminateOnNaN (NaN이 정지 훈련에있는 데이터를 발생) (예정 조정 학습 속도로) LearningRateScheduler을 사용했다. 는 가장 일반적으로 사용되는 ModelCheckpoint 및 CSVLogger입니다.

훈련 매개 변수 initial_epoch 때 final_epoch 사용자가 당신이 훈련을 중단 한 부분부터 다시 시작할 수도 매우 흥미 롭다. (정오 수면 :-) 떨어지는의 더 이상 두려워하지 않습니다)

결과 시각화 훈련 : 당신은 전화를 지시 할 수있다하면 반환 값도 값을 기록 읽기 CSV 파일이 될 수에 맞게.

1.4 예측 (육안 검출 결과)

예측을 받기

  • 배치의 샘플을 획득하는 반복자 정의 데이터 및;
  • 예측 모델에 샘플이 배치 예측값을 얻었다 (이 시간 y_pred 원료 출력 모델을 구한다)

디코더는 예측 된 값을 처리

  • 동일한 기능 디코더 층 모델 구조가 작동 DecodeDetections decode_detections, 그들은 :
    • 트랜 번호 뒤에 번호 12 동안 4 스위치 옵셋 좌표 (절대 좌표 또는 상대 좌표 중 하나);
    • 그리고 NMS 신뢰를 필터링 각 범주에 대한;
    • , 만일 불충분 top_k 직접 출력 이전 top_k 예측 프레임 (경우 top_k 설정)을 선택한다.
  • y_pred 입력 파라미터 : 원료 출력 SSD 모델 트레이닝 모드 (일괄 # 박스, 21 + 4 + 4 + 4), 상기 모든 #boxes 앵커 프레임;
  • 반환 값 (일괄 filtered_boxes 6), 상기 경과 filtered_boxes 수 필터링 된 예측 블록, 6 CLASS_ID, 신뢰는 Xmin, Ymin, Xmax, Ymax];
  • 주 : decode_detections DecodeDetections 계층 기능 및 다른 장소 : 수가 충분 top_k 예측 블록을 필터링 한 후, 전자는 직접 출력하지만, 후자는 top_k에 충전 될 경우 (손실 계산 치수에 상당).

예측 프레임은 이미지 콘트라스트에 표시된

  • 화상을 표시하고, 콜 아웃 박스 프레임 예측 방법을 그릴;
  • (휘도에 대하여, 그 색의 변화에 더 민감하기 때문에, 유용) plt.cm에서 PLT 값은 의사 컬러로 매핑 될 수 기준을

1.5 SSD300 교육의 차이

  • SSD300 교육 모델, 파스칼 VOC 데이터를 사용하여, 태그 파일은 XML 파일입니다;
  • SSD300 모델 구조, 노트에 세 가지가있다 :
    • 그 나라의 구조물 SSD의 구조 모델;
    • 회선 보이드 층 : FC6 Conv2D = (1,024, (3,3), dilation_rate = (6,6), ...);
    • L2 정규화 层 : conv4_3_norm = L2Normalization (gamma_init = 20, ...) (conv4_3);
  • 질문 : 영상 채널이 기차 BGR로 대체 할 때 SSD300 모델 매개 변수를 정의했지만 결국 BGR에 때 이미지 채널의 더 예측이 없다?

2 SSD 모델을 평가하는 방법

대략 점 :

  • 이것은, 즉 SSD300_evaluation.ipynb 문서의 하나의 행;
  • SSD 평가를하는 추론 모델을 사용하여 모델을 생성, 파일 VGG_VOC0712Plus_SSD_300x300_ft_iter_160000.h5 웨이트 트레이닝 모델이 만들어 훈련 모드를 기반으로 다운로드 (가중치를 파일이기 때문에, 그것은 훈련을 얻을 확실히, 확실히 만든 트레이닝 모드 모델입니다 ), model.load_weights (그래서 weights_path, by_name = 참), 그렇지 않으면 최대 추가하지, by_name를 추가 할 필요가;
  • 방법 드로잉 PR 곡선.

3 SSD 방법을 미세 조정 모델에

weight_sampling_tutorial.ipynb에서 사용할 수이 하나.

저자는 몇 가지 훈련 된 SSD 모델을 제공하는 방법을 미세 조정에 이러한 모델들은 자신의 데이터 세트에 자신의 작업을 완료 할 수 있도록하려면? 예를 들어, 지금은 객체 8 종류를 인식 할, 그리고 코코에서 제공되는 저자가 MS에 모델 객체의 80 종류의 인식 훈련, 그럼 어떻게 작동 하는가?

저자는 세 가지 방법을 제안하고, 가장 좋은 방법은 분류 다운 샘플링의 직접적인 결과이다. 예를 들어 제 분류기 출력 SSD 출력 9에서 (BATCH, H1 (W1)를 샘플링함으로써 얻어진 W1 및 H1은 conv4_3도 기능 높이와 너비 예측기 (배치, H1, W1, 81 * 4)이며, * 4) 상기 (9)는 여덟 가지의 목적 및 배경 후 미세 조정이 자신의 데이터를 설정할 수를 나타낸다. 이 방법 (80)는 MS COCO 범주이다 대상체 내에 이러한 작업에 특히 유효하다.

4 개 기타주의 사항

  • model.load_weights ( './ ssd7_weights.h5'by_name = TRUE) 여기서 by_name 동일한 이름 적재 중량 구조적 모델과 다른 만 무거운 층을로드 할 수있는 권한을 의미 참조
  • 후는 별도로 저장하기 때문에 전체 모델, model.save을 저장 사용해보십시오, 최적화 상태를 다시로드하는 것 재설정, 참조

참고:

추천

출처www.cnblogs.com/inchbyinch/p/12045140.html