인공지능 응용 공학

YOLO v3 meerkat 1 class Training

coding art 2023. 6. 27. 19:00
728x90

오픈소스 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

https://github.com/jakkcoder/training_yolo_custom_object_detection_files/blob/main/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

https://github.com/jakkcoder/training_yolo_custom_object_detection_files/blob/main/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
0.80MB

 
 
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개로 처리되었다.

 

 
 
한편 back 폴더는 코드 출력에도 불구 생성되지 않는다면 os.mkdir  명령을 직접 사용해야 함에 유의하자. 이 부분은 직접 비어 있는 backup 폴더를 사용자 PC에서 해당 위치에 가져다 두는 것으로 처리하도록 하자.

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
 
아울러 max_batches  와 steps  를 지정하자. 클라스 1 당 2000 회 즉 2000 으로 두자.
steps 는 max_batches 의 70 ~80 % 로 두자.
 
 
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 폴더에 저장되었음을 나타낸다.

 

GPU 연산에서 얻은 yolov3_custom_2000.weights 학습 가중치와 configuration 파일 yolov3_custom.cfg  를 학습용에서 실행용으로 수정해야 한다. 
 
OpenCV DNN 명령을 사용하여 읽어서 Image Classification 작업을 실행해 보자. 
이 코드는 다음 Github url 주소에서 쥬피터 파일로 다운 받을은 후 아래처럼 약간 수정하자.
 

학습용 이미지 수가 적어서 그런지 새와 때로는 사람까지도 자세가 이상하면 meerkat 으로 인식되는 웃기는 경우가 있다.