오픈소스 YOLO v3 (v4)을 사용하여 사용자가 준비한 이미지 데이터 1종 meerkat 이미지를 학습 시켜보자.
이미지용 학습 데이터는 아래의 두 유튜브 영상을 참조하자.
BBC Meerkat 검색 결과 영상들
오마이갓 백두산 검색 결과 영상들
1ㅗㅇ의 데이터만 학습시키기 위해서 총 64개의 데이터를 준비하여 개인사용자 PC에서 custom_data 폴더를 생성하여 저장하도록 한다. 64 란 숫자의 의미는 batch sixe 를 32 로 설정하기에 이에 맞춘것이다.
각 custom_data 별로 라벨 값 meercat 을 부여할 수 있도록 labelImg 를 사용하자. 수집된 각 이미지 데이터를 오픈 후 Create Rect 명령을 사용하여 직사각형 형태로 객체를 drag 하여 둘러 쌓은 후 출력 양식을 YOLO 로 선택하여 Save 명령으로 저장하면 텍스트 파일이 얻어진다.
개별 이미지 파일의 명칭이 복잡할수도 있겠지만 rename 기능을 사용하여 'mcat1', 'mcat2', 'mcat3', ... 으로 처리하면 간결해진다.
아래 왼쪽 그림은 labelImg 에 이미지를 오픈하여 Create RecBox 명령을 적용한 사례이다. 그 결과는 2.txt 파일에 저장된다. 첫번째 숫자 '1'은 labelIm.exe 파일과 같은 폴더 내의 data 폴더에 저장되어 있는 predefined.txt 파일로서 사용자가 학습시킬 데이터들을 준비 후 그 각 종류별로 class 명을 순서대로 기록해두면 된다. 이는 labelImg 작업 시 입력하는 단계에서 메뉴를 보고 클릭하면 처리된다. 작업이 완료되면 classes.txt 파일이 얻어지며 이를 복사 후 classes.names.txt 파일로 rename 한다.
구굴 Colab 을 사용하기 전에 사용자 PC 내에서 아래와 같이 labelImg,exe 를 포함하는 windows_v1.8.0 폴더 내에 yolo_custom_model_training 폴더를 준비하자. 그 안에는 custom_data 폴더가 있으며 위 이미지 파일과 텍스트 파일이 쌍으로 들어 있다.
yolo_custom_model_Training 폴더를 채워넣기 전에 빈 상태에서 NDRIVE에 미리 drag 해 두자. 채워야 할 내용물들은 그때그때 개인 사용자 PC에서 NDRIVE 에 준비한 yolo_custom_model_Training 폴더에 drag 하여 채우도록 한다. 특히 이미지 파일은 64개 정도의 소량이므로 압축하지 않고 그냥 drag 작업해도 무방하다. 하지만 수량이 많아 크다면 압축하여 drag 하여 옮겨넣고 Colab 코드상에서 구글 DRIVE mount 후 읽어들여 unzip 작업을 수행해야 한다.
아래의 url 주소에서 creating-files-data-and-name.py 를 다운받아 custom_data 폴더와 함께 놓자.
참조: creating-files-data-and-name.py
이 파일을 열어 아래와 같이 'custiom_data' 로 수정하자.
⦁⦁⦁ # 'C:\\Users\\my_name\\Downloads\\video-to-annotate' full_path_to_images = 'custom_data’ ⦁⦁⦁ |
아울러 이 코드의 마지막 부분 'backup = backup' 부분이 틀렸으므로 다음과 같이 수정하자.
'backup = ' + full_path_to_images + '/' + 'backup/'
그래야 출력결과가 backup = custom_data/backup 이 된다.
하지만 실행 결과 backup 폴더 생성이 안될 경우 직접 custom_data 폴더 내에 빈 backup 폴더를 생성시켜도 된다. 이 폴더에는 GPU 연산 후 생성되는 binary 형태의 학습가중치를 저장하는 곳이다.
# Location of the train.txt file data.write('train = ' + full_path_to_images + '/' + 'train.txt' + '\n') # Location of the test.txt file data.write('valid = ' + full_path_to_images + '/' + 'test.txt' + '\n') # Location of the classes.names file data.write('names = ' + full_path_to_images + '/' + 'classes.names' + '\n') # Location where to save weights data.write('backup = custom_data/backup/') |
아래의 url 주소에서 creating-files-data-and-name.py 를 다운받아 custom_data 폴더와 함께 놓자.
참조: creating-train-and-test-txt-files.py
마찬가지로 이 파일을 열어 아래와 같이 'custiom_data' 로 수정하자.
⦁⦁⦁ # 'C:\\Users\\my_name\\Downloads\\video-to-annotate' full_path_to_images = 'custom_data’ ⦁⦁⦁ |
이 상태에서 사용자의 구글 NDRIVE 를 열어 yolo_custom_model_Training 폴더 내부에 custom_data 폴더와 2개의 python 파일을 대상으로 drag 작업을 완료하자. 아울러 아래의 노트북 파일을 다운받아 역시 yolo_custom_model_Training 폴더에 끌어다 놓고 오픈하여 학습을 시키도록 하자.
Google DRIVE mount 작업을 실시하여 사용자의 NDRIVE 전체를 /content/drive/MyDrive 밑에 연결한다.
1 |
from google.colab import drive drive.mount('/content/drive') ______________________________________ Mounted at /content/drive |
파일을 열어보면 /content/drive/MyDrive/yolo_custom_model_Training 이 들어 있음을 확인하자.
git clone 작업에 의해 darknet 을 복사붙이기 하되 darknet 을 yolo_custom_model_Training 폴더에 집어넣자.
2 | !git clone 'https://github.com/AlexeyAB/darknet.git’ '/content/drive/MyDrive/yolo_custom_model_Training/darknet' _________________________________________
Cloning into 'darknet'...remote: Enumerating objects: 15530, done. remote: Counting objects: 100% (16/16), done. remote: Compressing objects: 100% (16/16), done. remote: Total 15530 (delta 5), reused 5 (delta 0), pack-reused 15514 Receiving objects: 100% (15530/15530), 14.21 MiB | 23.59 MiB/s, done. Resolving deltas: 100% (10417/10417), done. |
yolo_custom_model_Training 폴더 내부에 custom_data 폴더와 방금 clone 한 darknet 을 확인하자.
아울러 darknet 폴더내에 Makefile 이 들어 있는지 확인하도록 한다. 이 파일을 클릭하여 오픈 후 직접 OPENCV, GPU, CUDNN, CUDNN_HALF 파라메터들의 수정작업을 해도 된다. 수정만 해둬도 자동 저장된다.
또는 다음과 같이 sed 명령을 사용하여 설정할 수도 있다. OPENCV=1 은 OpenCV 적용을 의미한다. OpenCV DNN 적용을 위해서는 사용하는 라이브러리로부터 OpenCV 로 변환이 필요한 만큼 미리 설정해 두면 OpenCV에 호환 가능한 형태로 학습가중치가 제공될 것이다.
GPU=1 로 강제 설정한다. 따라서 런타임에서의 GPU 설정이 실패할 경우 실행과정에서 ERROR 가 발생하게 된다.
2 | %cd darknet !sed -i 's/OPENCV=0/OPENCV=1/' Makefile !sed -i 's/GPU=0/GPU=1/' Makefile !sed -i 's/CUDNN=0/CUDNN=1/' Makefile !sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile |
darknet 폴더 내에서 아래와 같이 make 명령을 실행하자. C 언어로 작성되어 darknet 을 지원하는 코드들을 빌드한다. darknet 의 중요 코드들은 파이선이 아닌 C 언어임에 유의하자. GPU 설정과 무관하게 2~3분 시간이 소요된다.
3 | !make |
darknet 폴더에서 yolo_custom_model_Training 폴더로 한층 올리도록 하자. custom_data 폴더와 darknet 폴더 그리고 실행파일 YOLOv3.ipynb 가 들어 있음을 확인하다. 이 폴더를 기준으로 custom_data 폴더에 들어 있는 2개의 파이선 파일을 실행 시키도록 한다.
4 | %cd /content/drive/MyDrive/yolo_custom_model_Training #darknet이 ..._Training 에 들어 왔는지 확인
__________________________________________________
custom_data darknet YOLOv3_train.ipynb |
custom_data 폴더 내의 파이선 코드 creating-files-data-and-name.py 를 실행하여 labelled_data.data 파일을 생성하자.
5 | !python custom_data/creating-files-data-and-name.py |
custom_data 폴더를 관찰하면 labelled_data.data 파일이 생성되었음을 알 수 있다. 이 파일을 열어보면 생성시킬 학습용 데이터 (train.txt)와 검증시험용(test.txt) 데이터 파일들이 위치할 장소를 지정하고 있다. 하지만 사용자가 준비한 이미지 데이터를 학습 후 얻어지는 수정된 학습가중치를 백업 받을 장소도 명확하게 지정해야 하므로 여기서는 아래 그림같이 수정하도록 한다.
custom_data 폴더내의 파이선 코드 creating-train-and-test-txt-files.py 를 실행하여 train.txt 파일과 test.txt 파일을 생성하자. 코드를 살펴보면 85:15 으로 나누어 생성하게되어 있음에 유의하자. 클라스별로 29개씩 총 60개의 샘플이미지가 사용되므로 15% 는 9개이며 int(9) 로 처리하면 text 용은 9개가 되며 학습(train)용은 51개가 된다. 이 정해진 비율은 YOLO v3 에서 절대 변경해서는 안됨에 유의하자.
이 코드 실행은 간단하지만 Colab 에서 결과 확인이 안되기에 아례 사용자 PC에서 아나콘다에서 실행시켜 얻어진 결과를 custom_data 에 업로딩으로 갖다두어도 된다.
6 |
!python custom_data/creating-train-and-test-txt-files.py |
custom_data 폴더에서 실행 후 생성된 train.txt 와 test.txt 를 살펴보자. 26개와 4개로 처리되었다.
yolo_custom_model_Training 폴더 내부에 YOLO v3 의 사전 학습된 가중치를 가져다 놓기 위해 새로이 custom_weight 폴더를 개설하자. 네트워크로부터 'darknet53.conv.74' 를 가져오자.
os.mkdir("/content/drive/MyDrive/yolo_custom_model_Training/custom_weight") os.chdir("/content/drive/MyDrive/yolo_custom_model_Training/custom_weight") !wget https://pjreddie.com/media/files/darknet53.conv.74 !ls |
마지막으로 yolov3_cfg 를 클라우드인 Colab 외부의 사용자 PC에서 학습용으로 수정해서 darknet 폴더에 넣어 두어야 한다. 그러기 위해서는 클라우드 Colab 이 아닌 사용자 PC에서 예를 들면 아나콘다에 설치된 YOLO v3 darknet 의 cfg 폴더에서 yolov3_cfg 를 오픈하여 현재의 custom data 학습에 알맞게 수정 후 yolov3_custom.cfg 로 저장한 후 Colab 의 yolo_custom_model_Training 폴더의 darknet 에 직접 drag 하여 준비하자.
수정 내용은 다음과 같다.
yolov3.cfg | yolov3_custom.cfg |
[net] # Testing batch=1 subdivisions=1 # Training #batch=64 #subdivisions=16 width=608 height=608 |
[net] # Testing # batch=1 # subdivisions=1 # Training batch=32 subdivisions=16 width=416 height=416 |
filters=255 activation=linear [yolo] mask = 6,7,8 anchors = 10,13, 16,30, ⦁⦁⦁ classes=80 |
filters=18 activation=linear [yolo] mask = 6,7,8 anchors = 10,13, 16,30, ⦁⦁⦁ classes=1 |
filters=255 activation=linear [yolo] mask = 3,4,5 anchors = 10,13, 16,30, ⦁⦁⦁ classes=80 |
filters=18 activation=linear [yolo] mask = 3,4,5 anchors = 10,13, 16,30, ⦁⦁⦁ classes=1 |
filters=255 activation=linear [yolo] mask = 0,1,2 anchors = 10,13, 16,30, ⦁⦁⦁ classes=80 |
filters=18 activation=linear [yolo] mask = 0,1,2 anchors = 10,13, 16,30, ⦁⦁⦁ classes=1 |
yolov3.cfg | yolov3_custom.cfg |
max_batches = 500200 policy=steps steps=400000,450000 |
max_batches = 2000 policy=steps steps=1400,1600 |
!darknet/darknet detector train custom_data/labelled_data.data darknet/cfg/yolov3_custom.cfg custom_weight/darknet53.conv.74 –dont_show ※ ※※ !!darknet/darknet detector train custom_data/labelled_data.data darknet/cfg/yolov3_custom.cfg custom_weight/darknet53.conv.74 –dont_show |
Colab 에서 GPU 가 설정되었는지 확인 후 실행해 보자. 실행 시간이 상당히 길므로 결과를 잘 검토해 보자.
아래의 결과는 1시간 36분 실행 시간이 소요되었으며 yolov3_custom_2000 이 backup 폴더에 저장되었음을 나타낸다.
학습용 이미지 수가 적어서 그런지 새와 때로는 사람까지도 자세가 이상하면 meerkat 으로 인식되는 웃기는 경우가 있다.
'인공지능 응용 공학' 카테고리의 다른 글
OpenCV 의 BGR, RGB, GRAY 및 Matplotlib 의 RGB format 비교 (0) | 2023.07.10 |
---|---|
인공지능 발전사 (0) | 2023.06.29 |
YOLO v3 3 Classes Custom Data Training: 오바마, 저커버그, 일런머스크 (0) | 2023.06.21 |
인공지능응용 공학∙ OpenCV 비전코딩 목차 pdf 파일 (0) | 2023.06.14 |
No validation prediction of unseen image using callback weights (0) | 2023.06.14 |