참조: how to train YOLO v3, v4 for custom objects detection using Colab free GPI
https://www.youtube.com/watch?v=hTCmL3S4Obw&t=1631s
오픈소스 YOLO v3 (v4)을 사용하여 사용자가 준비한 이미지 데이터를 학습 시켜보자.
이미지용 학습 데이터는 구글에서 Obama, Zuckerberg, Eln Musk 3명의 얼굴 이미지 jpeg 데이터를 수집하도록 한다.
각 데이터별로 10개씩 수집하여 custom_data 폴더를 생성하여 저장하도록 한다.
labelImg 를 사용하여 수집된 데이터를 오픈 후 Create Rect 묭룡을 사용하여 직사각형 형태로 객체를 둘러 쌓은 후 출력 양식을 YOLO 로 선택하여 Save 명령으로 저장하면 텍스트 파일이 얻어진다.
개별 이미지 파일의 명칭이 복잡하므로 rename 기능을 사용하여 '1', '2', '3', ... 으로 처리하면 간결해진다.
아래 왼쪽 그림은 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 해 두자. 내용물들은 그때그때 NDRIVE 에 준비된 yolo_custom_model_Training 폴더에 drag 하여 채우도록 한다. 특히 이미지 파일은 60개 정도의 소량이므로 그냥 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 이 된다.
하지만 별도로 custom_data 폴더 내에 비어있는 backup 폴더를 생성시켜야 함에 유의하자.
# 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 = 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 폴더에 끌어다 놓고 오픈하여 학습을 시키도록 하자.
YOLOv3_train.ipynb 파일을 오픈 후 런타임 메뉴의 런타임 유형변경에서 GPU T4 를 설정하자. 이 코드는 반드시 GPU 를 설정해야 하며 GPU 설정이 되지 않은 상태에서 실행할 경우 error 로 귀결됨을 유의하자.
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 의 1000종의 ImageNet 에 대한 사전 학습된 가중치를 가져다 놓기 위해 새로이 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 를 오픈하여 수정 후 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=2 subdivisions=8 width=416 height=416 |
filters=255 activation=linear [yolo] mask = 6,7,8 anchors = 10,13, 16,30, ⦁⦁⦁ classes=80 |
filters=24 activation=linear [yolo] mask = 6,7,8 anchors = 10,13, 16,30, ⦁⦁⦁ classes=3 |
filters=255 activation=linear [yolo] mask = 3,4,5 anchors = 10,13, 16,30, ⦁⦁⦁ classes=80 |
filters=24 activation=linear [yolo] mask = 3,4,5 anchors = 10,13, 16,30, ⦁⦁⦁ classes=3 |
filters=255 activation=linear [yolo] mask = 0,1,2 anchors = 10,13, 16,30, ⦁⦁⦁ classes=80 |
filters=24 activation=linear [yolo] mask = 0,1,2 anchors = 10,13, 16,30, ⦁⦁⦁ classes=3 |
yolov3.cfg | yolov3_custom.cfg |
max_batches = 500200 policy=steps steps=400000,450000 |
max_batches = 6000 policy=steps steps=5800,6200 |
!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 가 설정되었는지 확인 후 실행해 보자. 실행 시간이 상당히 길므로 결과를 잘 검토해 보자.
아래의 결과는 26분 실행 시간이 소요되었으며 yolov3_custom_6000 이 backup 폴더에 저장되었음을 나타낸다.
custom_data 폴더의 backup 과 custom_weight 에 저장된 learning 된 학습가중치이다.
6000회 학습 결과 0.0 으로 접근하는 Cost 함수를 살펴보자.
이미지를 탐지하기 위한 위 쥬피터 코드의 스크립트 형 파일을 참조하자.
'인공지능 응용 공학' 카테고리의 다른 글
인공지능 발전사 (0) | 2023.06.29 |
---|---|
YOLO v3 meerkat 1 class Training (0) | 2023.06.27 |
인공지능응용 공학∙ OpenCV 비전코딩 목차 pdf 파일 (0) | 2023.06.14 |
No validation prediction of unseen image using callback weights (0) | 2023.06.14 |
Prediction of unseen image using callback weights (0) | 2023.06.11 |