인공지능 응용 공학

YOLO v3 3 Classes Custom Data Training: 오바마, 저커버그, 일런머스크

coding art 2023. 6. 21. 10:36
728x90

참조: 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

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 이 된다.

하지만 별도로  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

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.78MB

 

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  의 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
 
아울러 max_batches  와 steps  를 지정하자. 클라스 1 당 2000 회 즉 6000 으로 두자.
 
 
 
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  함수를 살펴보자. 

 

 
GPU 연산에서 얻은 yolov3_custom_6000.weights 학습 가중치와 configuration 파일 yolov3_custom.cfg  를 OpenCV DNN 명령을 사용하여 읽은 후 Image Classification 작업을 실행해 보자. 학습 이미지 수가 지나치게 적어서 오바마가 저커버그나 엘론 머스크로 판독되기도 한다. 즉 얼굴면의 각도를 다양하게 잡아서 학습시키면 해결이 될 것이다.
이 코드는 다음 Github url 주소에서 쥬피터 파일로 다운 받을 수 있다.

 

 

이미지를 탐지하기 위한 위 쥬피터 코드의 스크립트 형 파일을 참조하자.

 

Custom_Image_Detector.py
0.00MB