项目作者: sanga327

项目描述 :
Object Detection: SSD Model
高级语言: Python
项目地址: git://github.com/sanga327/Object_Detection.git
创建时间: 2021-06-21T09:50:49Z
项目社区:https://github.com/sanga327/Object_Detection

开源协议:

下载


🦜 Object Detection 🦜

Object detection 모델을 이용한 객체 탐지 모델 만들기

SSD(Single Shot Multibox Detector) 사용


1. 데이터 수집

  • 11종의 앵무새 데이터(csv, img)

    • 11종: 고핀, 듀컵, 백색유황앵무, 붉은관유황앵무, 큰유황앵무, 스칼렛매커우, 청금강앵무, 카멜롯매커우, 홍금강앵무, 오색앵무, 회색앵무
    • 각 앵무새 종 폴더에 csv, img 폴더로 구성되어 있음
  • img

    • 300x300 이미지

  • csv
frame xmin xmax ymin ymax class_id
0001_00000080.jpg 22 89 64 152 1
0001_00000047.jpg 40 124 46 160 1
0001_00000121.jpg 170 242 70 159 1
  • frame: image file name

  • xmin, xmax, ymin, ymax: 앵무새 머리 이미지의 Anchor Box pixel 위치값

  • class_id: 앵무새 종


2. 학습 데이터 전처리

  • csv, img 파일을 train, test, val로 분리

    1. for filename in glob.iglob('모듈8데이터(SSD_앵무새)/**/*.csv', recursive=True):
    2. csv = pd.read_csv(filename)
    3. if 'train' in filename:
    4. train_csv = train_csv.append(csv)
    5. for img in glob.iglob('모듈8데이터(SSD_앵무새)/**/*.jpg', recursive=True):
    6. if img.split("\\")[-1] in csv['frame'].values:
    7. shutil.copy(img, "모듈8데이터(SSD_앵무새)/train/")
    8. if 'test' in filename:
    9. test_csv = test_csv.append(csv)
    10. for img in glob.iglob('모듈8데이터(SSD_앵무새)/**/*.jpg', recursive=True):
    11. if img.split("\\")[-1] in csv['frame'].values:
    12. shutil.copy(img, "모듈8데이터(SSD_앵무새)/test/")
    13. if 'val' in filename:
    14. val_csv = val_csv.append(csv)
    15. for img in glob.iglob('모듈8데이터(SSD_앵무새)/**/*.jpg', recursive=True):
    16. if img.split("\\")[-1] in csv['frame'].values:
    17. shutil.copy(img, "모듈8데이터(SSD_앵무새)/val/")
  • h5 file 생성(test, val도 동일하게 진행)

    1. # 1: DataGenerator
    2. train_dataset = DataGenerator(load_images_into_memory=False, hdf5_dataset_path=None)
    3. # 2: Parse the image and label lists
    4. train_dataset.parse_csv(images_dir='data/train/',
    5. labels_filename='data/train/train.csv',
    6. input_format=['image_name', 'xmin', 'xmax', 'ymin', 'ymax', 'class_id'],
    7. include_classes='all')
    8. train_dataset.create_hdf5_dataset(file_path='saved_model/dataset_train.h5',
    9. resize=False,
    10. variable_image_size=True,
    11. verbose=True)

3. 모델 선정 및 학습

  • build model

    • model: ssd 300

    • optimizer: Adam

    1. K.clear_session() # Clear previous models from memory.
    2. model = ssd_300(image_size=(img_height, img_width, img_channels),
    3. n_classes=n_classes,
    4. mode='training',
    5. l2_regularization=0.0005,
    6. scales=scales,
    7. aspect_ratios_per_layer=aspect_ratios,
    8. two_boxes_for_ar1=two_boxes_for_ar1,
    9. steps=steps,
    10. offsets=offsets,
    11. clip_boxes=clip_boxes,
    12. variances=variances,
    13. normalize_coords=normalize_coords,
    14. subtract_mean=mean_color,
    15. swap_channels=swap_channels)
    16. weights_path = './saved_model/VGG_ILSVRC_16_layers_fc_reduced.h5'
    17. model.load_weights(weights_path, by_name=True)
    18. adam = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
    19. ssd_loss = SSDLoss(neg_pos_ratio=3, alpha=1.0)
    20. model.compile(optimizer=adam, loss=ssd_loss.compute_loss)
  • training

    1. initial_epoch = 0
    2. final_epoch = 40
    3. steps_per_epoch = 100
    4. history = model.fit_generator(generator=train_generator,
    5. steps_per_epoch=steps_per_epoch,
    6. epochs=final_epoch,
    7. callbacks=callbacks,
    8. validation_data=val_generator,
    9. validation_steps=ceil(val_dataset_size/batch_size),
    10. initial_epoch=initial_epoch)

4. 모델 개선

  • optimizer: sgd -> adam

  • learning rate: 0.001 -> 0.0001

  • steps_per_epoch: 10 -> 100

  • batch_size, epoch


5. 모델 평가

epoch = 10까지의 결과 그래프

loss값이 수렴하고 있음을 알 수 있다.


6. 테스트 결과

  • epoch = 3, loss = 7.912, val_loss = 6.8487

붉은관유황앵무를 백색유황앵무로 예측하는 것을 보아, 제대로 예측을 하지 못하고 있음을 알 수 있다.

  • epoch = 11, loss = 4.8239, val_loss = 4.2383

붉은관유황앵무를 붉은관유황앵무로, 카멜롯매커우를 카멜롯매커우로 분류하고 있는 것을 보아 예측 성능이 향상된 것을 알 수 있다.