• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

efficientdet 실습 질문

21.08.05 15:19 작성 조회수 309

0

강사님 안녕하세요 올려주신 efficientdet 수업과 예제를 통해서 제가 가지고 있는 데이터셋으로 object detection을 해보려고 하는데 계속 오류가 발생해서 질문을 작성하게 되었습니다

현재 커스텀데이터로 tfrecord 파일을 만드는 것까지는 전부 완료한 상태입니다. 코드에서 변경한 부분은 주소와 자료에서 라벨이름이 car, pool 예제에서와 같이 숫자가 아닌 한글 단어로 되어있어 해당 부분을 int가 아니라 byte로 바꾸고 encode를 추가한 것 외에는 없습니다
만들어진 tfrecord를 가지고 모델에 학습시키는 코드를 실행했을 때 코드 가장 앞에 requirements.txt를 이용하는 코드를 돌리면 numpy가 1.19로 다시 재설치 되기 때문에 config.override(params, True)가 포함된 셀에서
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
에러가 발생하게 됩니다.
찾아보니 해당 오류는 numpy 버전이 낮아서 발생한다고 해서 requirements.txt 실행 후 numpy를 삭제하고 다시 설치하는 방식으로 버전을 1.21로 변경하면 오류가 발생하기 않다가 model.fit을 하는 셀에서
NotImplementedError: Cannot convert a symbolic Tensor (parser/strided_slice_16:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported
이라는 에러가 발생하게 됩니다
혹시 어떻게 해결하면 좋을지에 대해 조언해주실수 있으실까요? 감사합니다
아래는 문제가 생겼던 셀의 코드 입니다
class TRAIN_CFG:
    model_name='efficientdet-d2'
    strategy=''
    model_dir=model_weight
    pretrained_ckpt = ckpt_path#coco로 pretrained된 checkpoint파일이 있는 디렉토리 위치

    #num_classes=3으로 변경
    hparams='num_classes=3,moving_average_decay=0,mixed_precision=true'
    use_xla=False
    use_fake_data=False

    #max_instances_per_image를 200으로 설정하고
    #d2모델이 상대적으로 더 크기 때문에 batch_size를 8로 설정시 GPU Out of Memory발생
    batch_size=4
    eval_samples=5000 #evaluation image데이터 갯수
    steps_per_execution=1 #train시 steps 횟수
    num_examples_per_epoch=3000 #1epochs 시 적용하는 examples 개수
    num_epochs=20 #epochs 횟수
    train_file_pattern=train_temp+'/*.tfrecord'
    test_file_pattern=test_temp+'/*.tfrecord'
    test_json_file=None #optional coco validation json
    mode='traineval' #train만 적용 또는 train과 eval함께 적용(traineval)
    num_shards=100
    max_instances_per_image=100

    num_cores=2
    tpu=None
    gcp_project=None
    tpu_zone=None
    eval_master=''
    eval_name=None
    tf_random_seed=2021
    profile=False
    debug=False

sys.path.append('./automl/efficientdet')

from keras.train import setup_model
import hparams_config

import utils
from keras import tfmot
from keras import train_lib
from keras import util_keras

config=hparams_config.get_detection_config(TRAIN_CFG.model_name)
config.override(TRAIN_CFG.hparams)

steps_per_epoch=TRAIN_CFG.num_examples_per_epoch // TRAIN_CFG.batch_size

if tf.config.list_physical_devices('GPU'):
    ds_strategy=tf.distribute.OneDeviceStrategy('device:GPU:0')
else:
    ds_strategy=tf.distribute.OneDeviceStrategy('device:CPU:0')

print(ds_strategy)


params=dict(
    profile=TRAIN_CFG.profile,
    mode=TRAIN_CFG.mode,
    model_name=TRAIN_CFG.model_name,
    steps_per_execution=TRAIN_CFG.steps_per_execution,
    num_epochs=TRAIN_CFG.num_epochs,
    model_dir=TRAIN_CFG.model_dir,
    steps_per_epoch=steps_per_epoch,
    strategy=TRAIN_CFG.strategy,
    batch_size=TRAIN_CFG.batch_size,
    tf_random_seed=TRAIN_CFG.tf_random_seed,
    debug=TRAIN_CFG.debug,
    test_json_file=TRAIN_CFG.test_json_file,
    eval_samples=TRAIN_CFG.eval_samples,
    num_shards=ds_strategy.num_replicas_in_sync,
    max_instances_per_image = TRAIN_CFG.max_instances_per_image
)

config.override(params, True)

#image size를 tuple 형태로 변환. 512는 (512,512)로 '1920x880'은 (1920, 880)으로 변환
config.image_size=utils.parse_image_size(config.image_size)
print(config)
sys.path.append('./automl/efficientdet')

from keras import train
import numpy as np

config.batch_size=4
train_steps_per_epoch=train_df.shape[0]
test_steps_per_epoch=test_df.shape[0]
print('train_steps_per_epoch : ',train_steps_per_epoch,
    'test_steps_per_epoch : ', test_steps_per_epoch)

test_dataset=get_dataset(False, config) if 'eval' in config.mode else None
model.fit(
    get_dataset(True, config),
    epochs=20,
    steps_per_epoch=train_steps_per_epoch,
    callbacks=train_lib.get_callbacks(config.as_dict(), test_dataset),
    validation_data=test_dataset,
    validation_steps=test_steps_per_epoch
)

tf.keras.backend.clear_session()

답변 4

·

답변을 작성해보세요.

0

음,,, 이렇게 debugging 지원은 어려울 것 같습니다.

전체 데이터와 소스코드를 colab 형태로 올려주셔서 제가 접근할 수 있게 만들어 주시고 URL을 보내주시면 제가 Debugging 해보겠습니다. 

김희수님의 프로필

김희수

질문자

2021.08.10

강사님 안녕하세요 제가 코랩이 아니라 다른 서버에서 돌리던 코드라 코랩에 업로드에 시간이 걸려서 우선 github 링크로 드리겠습니다.

https://github.com/Moonsu9158/EfficientDet

데이터의 경우 어떤 형식인지 보여드리기 위해 train, test각각 5개 정도만 업로드해두었고 tfrecord를 이용해주시면 감사하겠습니다

automl의 경우 파일을 한번에 깃허브에 올릴수가 없어서 코드에서 git clone을 하셔야합니다ㅠ 죄송합니다

혹시 업로드된 부분에 문제가 있다면 말씀해주세요 감사합니다

음, 올려주시느라고 수고 하셨습니다.. 그런데, 좀 정돈이 된 형태가 되었으면 좋겠습니다. github에서 올려주신 ipynb 파일가지고 제가 디버깅하기 어렵습니다. 

먼저 문제가 되는 부분까지 코드를 올려주십시요. 현재 아래와 같이 get_dataset()으로 test_dataset을 만드는데 오류가 발생합니다.  모델 코드등은,  생략해주시고, 아래 get_dataset()을 호출하기 위해서 필요한 코드까지만 별도로 생성해서 올려 주십시요.

test_dataset=get_dataset(False, config) if 'eval' in config.mode else None

 valid용 tfrecord를 만드는 부분 오류가 의심됩니다. 

github에 올라있는 코드는 제가 복사해서 작업하는데 시간이 걸립니다.( 올라가 있는 코드의 output 출력 결과가 길어서 drag해서 코드 확인하기가 어렵습니다).

위에서 말씀드린 문제가 되는 코드에 대한 기반 코드들까지만 colab으로 작성해 주시고, 데이터는 github에서 다운로드 할수 있게 만들어 주십시요. 데이터를 코드 기준에 맞춰서 제가 다시 코드를 작성한다든가 하면 debugging작업을 해드리기 어렵습니다.  debugging 자체만 제가 할 수 있도록 colab으로 작성해 주십시요. 

 

0

exmple_dict 생성시 format은 png로 변경하신건가요?
example_dict = {'height':height, 'width':width, 'filename':data['filename'].encode('utf8'),
                  'source_id': str(image_id).encode('utf8'), 'key_sha256': key.encode('utf8'),
                  'encoded': encoded_jpg, 'format':'png'.encode('utf8'),
                  'xmin':xmins, 'xmax':xmaxes, 'ymin':ymins, 'ymax':ymaxes,
                  'area':areas, 'class_text':classes_texts, 'class_label':classes,
                  'difficult':difficult_obj, 'truncated':truncated, 'poses':poses}
김희수님의 프로필

김희수

질문자

2021.08.09

네 그 부분도 수정하였습니다

0

해당 오류는 numpy 버전 문제가 아니라 tfrecord 오류로 보입니다

Label 이름은 한글로 하지마시고 다시 만들어보십시요

김희수님의 프로필

김희수

질문자

2021.08.09

강사님 말씀해주신대로 label이름을 다시 숫자로 바꾸고 실행했음에도 동일한 오류가 발생했습니다. 이에 코드를 다시 보던 중 제가 가지고 있는 데이터의 타입이 png이기에 dict_to_tf_example을 작성하는 중 jpeg인지 확인하는 부분을  png로 변경하였는데 이에 대해서도 오류가 발생할 수 있는지 확인 한번만 부탁드려도 될까요? 감사합니다

    #PNG image를 binary 그대로 읽음
    with tf.io.gfile.GFile(image_path, 'rb') as fid:
        encoded_png=fid.read()

    #image가 PNG 타입인지 확인
    encoded_png_io=io.BytesIO(encoded_png)
    image=PIL.Image.open(encoded_png_io)
    if image.format != 'PNG':
        raise ValueError('Image format not PNG')

0

안녕하십니까, 

지금 오류가 발생한것이 Colab 환경인지요, 아님 다른 환경인지요? 

저도 검색을 해보니 python 3.8 version에서의 이슈 같습니다만(지금 colab은 python 3.7 입니다)

만약 다른 환경에서 python 3.8을 꼭 사용을 해야하고, 사용시 오류가 발생한다면 numpy를 1.20.0 으로 변경해 보시지요. 

감사합니다.

김희수님의 프로필

김희수

질문자

2021.08.06

안녕하세요 colab환경이 아니라 linux환경이고 python버전은 3.7입니다.

조언해 주신 것처럼 numpy를 1.20.0으로 해봤을 때는 질문과 동일하게 두번째로 올린 셀의

test_dataset=get_dataset(False, config) if 'eval' in config.mode else None

줄에서

NotImplementedError: Cannot convert a symbolic Tensor (parser/strided_slice_16:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported

오류가 동일하게 발생합니다

그리고 제가 질문에서도 말씀 드렸듯이 annotation을 진행할 때 label이름을 한글로 해서 tfrecord 생성 할 때 image/object/class/label 부분을 byte로 바꾸었는데 그 외에 특별히 신경써야 될 부분이 있을까요?

답변 감사합니다