딥러닝 객체인식 네트워크 retinanet 내 데이터셋으로 학습하는 방법
참고: https://github.com/fizyr/keras-retinanet
1. 실행 환경 구축
1.1. Anaconda (python=3.6) 개발 환경 생성
conda create -n myenv python=3.6
1.2. Anaconda 개발 환경 활성화 (윈도우)
activate myenv
1.3. 관리자 권한으로 cmd 실행
1.4. python setup.py install
1.5. pip install Keras==2.2.4
2. 학습할 데이터셋 만들기
2.1. 학습할 이미지 준비하기
2.2. 학습할 이미지에 있는 인식할 객체의 Bounding Box 위치 알아내기
2.3. 모든 학습할 이미지를 특정 폴더에 path/to/image.jpg 모두 저장
2.4. Annotations format 파일 만들기
path/to/image.jpg,x1,y1,x2,y2,class_name 순으로 CSV파일 만들기
2.5. Class mapping format 파일 만들기
class_name,id 순으로 CSV파일 만들기
2.6. 내 학습 데이터 체크 (스페이스바로 다음 이미지 넘어가기)
python keras_retinanet/bin/debug.py csv mydataset_annoation.CSV mydataset_classmapping.CSV
3. 학습하기
3.1. 학습 시작
python keras_retinanet/bin/train.py csv mydataset_annoation.CSV mydataset_classmapping.CSV
3.2. 학습 epoch, step 조절
python keras_retinanet/bin/train.py --gpu=0 --epochs=2 --steps=1000 --workers=0 csv mydataset_annoation.CSV mydataset_classmapping.CSV
3.3. training model을 inference model로 바꾸기
python keras_retinanet/bin/convert_model.py snapshots/resnet50_csv_01.h5 snapshots/mymodel.h5
4. 테스트하기
4.1. examples/ResNet50RetinaNet.ipynb를 jupyter로 오픈하거나 .py로 컨버팅하여 실행
(아래 url의 예제 코드를 복사하여 .py 파일을 만들면 됨)
https://github.com/fizyr/keras-retinanet/blob/master/examples/ResNet50RetinaNet.ipynb
(.py로 실행할때는 아래 코드 주석처리)
#%matplotlib inline
#%load_ext autoreload
#%autoreload 2
4.2. 적절한 경로를 지정하고, class 개수에 맞게 labels_to_names 딕셔너리를 바꾸기
4.3. read_image_bgr('테스트할 이미지 경로')와 같이 수정 하여 코드 실행
4. 평가하기(evaluation)
python keras_retinanet/bin/evaluate.py csv [어노테이션csv파일] [class맵핑csv파일] 학습된모델(.h5)
python keras_retinanet/bin/evaluate.py csv mydataset_annoation.CSV mydataset_classmapping.CSV snapshots/mymodel.h5
(에러) No module named 'keras_retinanet.utils.compute_overlap'
(해결법) python setup.py build_ext --inplace
(에러) TypeError: can't pickle generator objects (multiprocessing 문제)
(해결법) python keras_retinanet/bin/train.py --workers=0 csv mydataset_annoation.CSV mydataset_classmapping.CSV
(예제) 내데이터셋 준비 (아이유, 손흥민), 이미지 사이즈는 크게 중요하지 않은 듯
(예제) 인물의 얼굴 위치 바운딩박스(Bounding Box)를 어노테이션함
(윈도우 그림판으로 사진을 열면 왼쪽하단에 픽셀 좌표 나옴)
(예제) 인식결과