ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #17 : KT_AIVLE_SCHOOL : DX_4th : 딥러닝_시각지능
    KT_AIVLE_SCHOOL_DX_4th 2023. 10. 27. 00:30

     

    지난 세션에서는 딥러닝의 언어지능을 배웠었다. #16 딥러닝_언어지능 =>(  https://datawithu.tistory.com/27  )

    이번 강의는 총 2일동안 이루어졌으며, 새롭게 김건영 강사님과 함께 하게 되었다.


    #Intro 

    언어지능 부분은 잘 하지는 못하더라도 비교적 익숙한 부분들이 꽤 있었다.

    즉, 사용방법에 대해서는 들어는 봤다는 말이다.  반면, 시각지능은 조금 낯설었다.

     

    지난 세션의 언어지능이 인간의 언어(자연어)를  컴퓨터가 이해(?)하고 처리하는 것이라면,

    시각지능은 우리의 눈으로 보는 것 => 이미지 처리일 것이라고 추측했었다.  어느정도 유추는 맞았다.

     

    그리고 이 글을 쓰면서 정정하자면,

    MNIST와 Fashion_MNIST는 이미지처리를 하기 떄문에 시각지능이라고 봐야한다. 

    역시 무엇이든지, 다시보고 다시봐야하나보다. 하하하... 

     

    그러나 이번 세션에서는 객체탐지(Object Detection)에 대해 배웠고, 이건 조금 놀라웠다.

    현재 세상에 작동되는 다양한 기계들이 어떻게 물체들을 분류해 내는지 이해해 볼 수 있는 시간이었다. 

    또한, 수업을 들으면서 어떻게 컴퓨터가 발전해나갔고, 현재 수준이 어느정도 인지를 미약하게나마 들여다 볼 수 있는 계기가 되었다. 다음  18편 -미니프로젝트에서 재언급을 하겠지만,  시각지능이 지금까지 수업들 중에 제일 신났던 파트였다. 

    여담이지만, 강사님들끼리 참 비슷한 부분들이 많이시다. 설명을 정말 친절하게 해주신다는 부분이 그렇고, 뭔가 같이 일하셨고, 일하시는 분들이라 그런지 성격도 비슷하신 것 같다.  무엇보다, 내가 유치원생이 된 것 같이 하나씩 체계적으로 알려주시는 데, 꽤 괜찮다.

    성인이 되고 나면, 의외로  허무하다. 아무것도 정해진 것도 가야할 곳도 없기 때문이다. 그렇기 때문에, 이렇게 한 스푼씩 입에 넣어주는 건 생각보다 더 좋다. 


    Object Detection : 객체 탐지 

    1. 기본 용어 개념 

    1). Bounding Box

    • 하나의 물체(object)가 포함된 최소 크기 박스로, 박스 하나에 적어도 한개의 사물이 존재해야함
    • 바운딩 박스는 물체의 위치 정보를 의미하며,
    • 예측값과 실제값이 유사해지는 것은 바운딩 박스가 좌표를 잘 찾은 것이라 할 수 있

    2) Class Calssification

    3).Confidence Score

    • object가 바운딩 박스 안에 있는지에 대한 확신/신뢰 정도
    • 차후에, cf score에 따라서,  분류에 대한 신뢰도를 나타내기도 함 
    • 예) cf score = 0.5 수준이다,   50%의 확률/신뢰로 바운딩 박스 안의 물체을 ~이라고 분류함. 

    4).IoU = Intersection_over_Union

    • 두 바운딩 박스의 겹치는 영역를 측정
    • 겹치는 부분이 넓을 수록 더 좋은 예측을 하고 있음
    • 즉 IoU 값이 클 수록 잘하는것 

    5).NMS = Non-Maximum Suppression

    • 같은 물체에 대해 중복되는 바운딩 박스를 제거
      •  설정된 Confidence Score 이하 제거 + IoU값이 일정 이상인 것 남김
      • 반복
    • 가장 정확하다고 판단되는 바운딩 박스 한개만 남김 

    confidence Score 역치가 높고, IoU 역치가 낮은 것이 박스에 대한 판단 수준이 올라감.

    6.) Precision, Recall, AP, mAP

    • Precision : 모델이 정답이라고 예측한 것 중에서  실제로 정답인 것
    • Recall : 실제 값 중에서 모델이 예측해서 맞춘 것
      • IoU Threshold에 값에 따라서, precision과 Recall 값이 변화
    • AP (Average Precision)  : Precision-Recall-곡선 그래프 아래의 면적으로, 영역값이 클수록 좋음
    • mAP  (meanAP) : 각 클래스 별 AP를 합산하여 평균을 낸 값으로 높을 수록 좋음 ( 모델 정확함)

    7).Annotaion

    • 정답 박스로 각 클래스 정보들이 들어가 있음
    • Object의 Bounding Box 위치나 Object 이름등  제공(xml, json,csv)

    2.Roboflow  & Yolo

    Roboflow Universe: The Largest Community of Vision Datasets

     

    Roboflow Universe: The Largest Community of Vision Datasets

    The largest resource of computer vision datasets and pre-trained models.

    roboflow.com

    사람들이 공유해준 데이터 셋과,  짜여진 학습모델코드를 다운 받아서 사용가능하다.

    내가 새로 한개씩 짜는 것보다, 기존에 잘 짜여진 코드를 재사용하는 것이 더 효율적이기 때문에 사용권장을 많이 하는 것 같다. 그리고 컴맹에 무지렁이인 나는 다운로드 & Export도 어려웠어서 이번세션이 아니라, 미니 프로젝트에서 클리어했다.ㅎㅎ  

    1) 코드 다운로드 방식은 총 3개로

    • Jupyter (colab 같이 사용가능)
    • Terminal
    • URL 

    우리는 colab으로 실습을 했기 때문에 jupyter 방식으로 & Yolo로 api key를 복붙해서 사용했다. 

    2) 데이터 셋 폴더

    • data.yaml : 데이터셋의 정보가 들어있으며 가장 중요한 파일이라고 하셨다 
      • 클래스별 이름(names),  클래스 갯수(nc),  train/val/test의 파일 경로가 표시되어 있다 
      • 경로를 코드에 넣어야 하기 때문에, 이 yaml 파일 수정 조작을 잘해야 된다.
    • train/test/vaild : 각각 폴더별로 image/labels 폴더가 따로 들어가 있다. 
      • label폴더의 txt파일에는 클래스 정보 & 바운딩박스 위치 정보(x,y,w,h)가 들어가 있다. 

     

    3) YOLO v5, v8 

    yolo : object detectio모델로, Input에 image을 넣으면  object의 클래스 (ex.고양이, 강아지, 고래 등 ) 확률(classifier)과 위치를 box로 표시(localizer)해주는 것

    실시간 적용이 가능해서, 스트리밍 영상, CCTV영상, 유튜브 등등도 물체 탐지가 용이했다.

    미니프로젝트에서 해봤는데, 진짜 재밌다 ㅎㅎ

    3-1) YOLO 모델 기본

    # 라이브러리 설치#불러오기
    !pip install ultralytics
    from ultralytics import YOLO
    
    #모델 + 가중치 조절하는 부분
    model = YOLO()
    
    #모델 학습 조절하는 부분 
    model.train()
    
    # 모델 검증 : 학습된 모델 성능을 검증 
    model.val()
    
    #예측값
    model.predict(save=True) # detect 폴더 안에 predict라는 폴더가 생성됨

    3-2) YOLO 모델 모델링

    from ultralytics import YOLO
    
    model = YOLO(model='yolov8n.pt', task='detect')  #yolo ver8 사용
    # n나노  s스몰  m  l  x  학습할 양이 많아짐
    # task : detect, segment, classify, pose 등이 있음
    
    #모델 학습. 파라미터가 참.. 많다... 
    model.train(data='coco128.yaml', #이부분이 중요(파일 경로 입력하기), data.yaml과 같은 부분
                epochs=10,
                patience=5,
                save=True,
                project='trained',
                name='trained_model',
                exist_ok=False,
                pretrained=False,
                optimizer='auto',
                verbose=False,
                seed=2023,
                resume=False,
                freeze=None
                )
    # 모델 검증             
    model.val()    
    # 모델 예측
    model.predict(source=, conf=,  iou= )# 등등의 파라미터 많음..

     


    DNN vs CNN 

    이번 강의의 강사님도 다른 강사님들과는 다른 방식을 알려주셨기 때문에 

    #16에서도 언급했던 것처럼 코드를 한번 비교해볼 필요성을 느꼈다. 

     

    1.DeepLearning  Deep Neural Network (DNN)

    1) Sequential API

    1-1)라이브러리 

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras.backend import clear_session
    from tensorflow.keras.models import Sequential, Model
    from tensorflow.keras.layers import Input, Dense, Flatten, BatchNormalization, Dropout

    1-2) 모델링 

    #1. 세션 클리어 
    clear_session()
    
    #2. 모델 발판 선언 
    # model1 = Sequential([Input(), Dense()]) #이 방식 번거롭데
    
    model1 = Sequential()
    
    #3. 레이어조립 : 순차적으로 싸음
    model1.add( Input( shape=(28,28,1)) ) #1은 채널정보이다.
    model1.add( Flatten())
    
    model1.add( Dense( 256, activation='relu'))
    model1.add( Dense( 128, activation='relu'))
    model1.add( BatchNormalization( ))
    model1.add( Dropout(0.25 ))
    
    model1.add( Dense(10, activation='softmax')) #output layer
    
    #4. 컴파일
    model1.compile( optimizer='adam',
                   #loss='categorical_cross entropy',
                    loss=keras.losses.categorical_crossentropy,
                   metrics=['accuracy']
                    )
    # 모델 확인
    model1.summary()

    2).Functional API

    #1 세션클리어
    clear_session()
    
    #2 레이어 엮기
    il = Input(shape=(28,28,1)) #input layer
    hl = Flatten()(il)          #hidden layer
    
    hl = Dense(256, activation='relu')(hl)
    hl = Dense(128, activation='relu')(hl)
    hl = BatchNormalization()(hl)
    hl = Dropout(0.25)(hl)
    
    ol = Dense(10, activation='softmax')(hl) #output layer
    
    #3 모델 시작 끝 지정
    model2 = Model(il, ol)
    
    #4 컴파일
    model2.compile(optimizer='adam',
                   loss=keras.losses.categorical_crossentropy,
                   metrics=['accuracy']
                   )
    # 요약
    model2.summary()

     

     


    2. DeepLearning Convolutional Neural Network(CNN)

    1) Sequential API

    import tensorflow as tf
    from tensorflow import keras
    # 1. 세션 클리어
    keras.backend.clear_session()
    
    # 2. 모델
    model1 = keras.models.Sequential()
    
    # 3. 레이어 블록 조립 : .add( )
    # 인풋레이어
    model1.add( keras.layers.Input(shape=(32,32,3)) )
    
    # Convolution : 필터수 32개, 사이즈(3, 3), same padding
    model1.add( keras.layers.Conv2D(filters=32,kernel_size=(3,3), strides=(1,1),padding='same', 
    			activation='relu',  ) ) #마지막에 컴마 있어야함.
    
    # BatchNormalization
    model1.add( keras.layers.BatchNormalization() )
    
    # MaxPooling : 사이즈(2,2) 스트라이드(2,2)
    model1.add( keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2) ))   
    
    # DropOut : 25% 비활성화
    model1.add( keras.layers.Dropout(0.25) )
    
    # Conv2D ~ DropOut 반복 가능
    
    # Flatten( )
    model1.add( keras.layers.Flatten() )
    
    # 중간 연결 단계
    # Fully Connected Layer : 노드 1024개
    model1.add( keras.layers.Dense(1024, activation='relu') )
    
    # BatchNormalization
    model1.add( keras.layers.BatchNormalization() )
    
    # DropOut : 35% 비활성화
    model1.add( keras.layers.Dropout(0.35) )
    
    # 아웃풋레이어
    model1.add( keras.layers.Dense(10, activation='softmax') )
    
    # 4. 컴파일
    model1.compile(optimizer='adam',
                   loss=keras.losses.categorical_crossentropy,
                   metrics=['accuracy'] )
    #5. model1.summary()

     

    2).Functional API

    from tensorflow.keras.backend import clear_session
    from tensorflow.keras.models import Model
    from tensorflow.keras.layers import Input, Dense, Flatten, BatchNormalization, Dropout
    from tensorflow.keras.layers import Conv2D, MaxPool2D
    from tensorflow.keras.losses import categorical_crossentropy
    # 1. 세션 클리어
    clear_session()
    
    # 2. 
    # 인풋레이어
    il = Input(shape=(32,32,3))
    
    # Convolution : 필터수 32개, 사이즈(3, 3), same padding
    hl = Conv2D(filters=32,kernel_size=(3,3), strides=(1,1),padding='same',
               activation='relu' )(il)    # input연결하는 것 주의!!!
    # BatchNormalization
    hl = BatchNormalization()(hl)
    
    # MaxPooling 
    hl = MaxPool2D(pool_size=(2,2),strides=(2,2))(hl)
    # DropOut : 25% 비활성화
    hl = Dropout(0.25)(hl)
    
    # Flatten( )
    hl = Flatten()(hl)
    
    # 중간 연결
    # Fully Connected Layer : 노드 1024개
    hl = Dense(1024, activation='relu')(hl)
    
    # BatchNormalization
    hl = BatchNormalization()(hl)
    
    # DropOut : 35% 비활성화
    hl = Dropout(0.35)(hl)
    
    # 아웃풋레이어
    ol = Dense(10, activation='softmax')(hl)
    
    # 3. 모델 지정
    model2 = Model(il, ol)
    
    # 4. 컴파일
    model2.compile(optimizer='adam', loss=categorical_crossentropy,metrics=['accuracy'] )

    Conv2D 필터를 CNN이 스스로 학습한다. 


    보다싶이 차이가 꽤있다. 

    강사님은 현업에서는 Functional한 방식을 많이 사용한다고 말씀해주셨는데

    아무래도, 계속 연결해서 쓰거나 , 어떤 부분이 잘못되면 좀 더 빨리 캐치하거나

    혹은 삭제하는 것이 용이해서 그런 것  같다  

    코드만 이렇게 올린 생각은 없었는데, 아무래도 Deep learning쪽으로 올 수록 코드가 점점 길어지기 때문인것 같다.

    물론, 완전 개발쪽으로 하면, 코드가 몇 만줄이 넘어가서 거의 파일로 넘기고 수정해야 하니까

    그런 걸 생각하면... 그나마 DX트랙이 나한테는 더 잘 맞는 걸지도 모르겠다. 

Designed by Tistory.