AI

과제

수박쓰123 2024. 4. 3. 09:03

1. 선형 회귀

(1) 선형 회귀란?

- 선형 회귀는 알려진 다른 관련 데이터 값을 사용하여 알 수 없는 데이터의 값을 예측하는 데이터 분석 기법

- 알 수 없는 변수 또는 종속 변수와 알려진 변수 또는 독립 변수를 선형 방정식으로 수학적으로 모델링함

 

(2) 선형 회귀가 중요한 이유

- 알려지지 않은 파라미터에 대해 선형 관계를 갖는 모델을 세우는 것이, 비선형 관계를 갖는 모델을 세우는 것보다 용이하기 때문

 

(3) 선형 회귀의 단계

- 예를 들어, (x,y)에 대한 입력 데이터 세트가 (1,5), (2,8), (3,11)이라고 가정할 때

  1. 직선을 그리고 1과 5 사이의 상관 관계를 측정한다
  2. 모든 값이 맞을 때까지 새 값 (2.8) 및 (3.11)에 대한 직선 방향을 계속 변경한다
  3. 선형 회귀 방정식을 y=3*x+2로 식별한다
  4. x가 다음과 같을 때 y가 14임을 추정하거나 예측한다.

2. CNN

Convolutional Neural Networks(CNNs)은 시각 데이터를 분석하는 데 특히 적합한 딥러닝 모델입니다. 이것들은 컴퓨터 비전 분야를 혁신시켰으며, 이미지 분류, 객체 감지, 세그멘테이션 등과 같은 작업에 필수적인 도구로 자리 잡았습니다.

다음은 CNN이 작동하는 방식에 대한 간략한 개요입니다.

 

 

  1. 합성곱층(Convolutional Layers): CNN은 합성곱 개념을 기반으로 구축되었습니다. 합성곱층은 입력 이미지에 학습 가능한 필터(커널이라고도 함) 집합을 적용합니다. 각 필터는 입력 이미지를 슬라이딩하여 다양한 측면을 캡처하는 특징 맵을 생성합니다.
  2. 풀링층(Pooling Layers): 합성곱 후에는 풀링층을 사용하여 특징 맵의 공간적 차원을 줄입니다. 최댓값 풀링 및 평균 풀링은 CNN에서 사용되는 일반적인 풀링 기법입니다.
  3. 활성화 함수(Activation Functions): ReLU(Rectified Linear Unit)와 같은 비선형 활성화 함수는 합성곱 및 풀링 연산 후에 적용되어 네트워크에 비선형성을 도입하여 복잡한 패턴을 학습할 수 있도록 합니다.
  4. 완전 연결층(Fully Connected Layers): 네트워크의 끝쪽에는 일반적으로 하나 이상의 완전 연결층이 사용됩니다. 이러한 층은 합성곱층에서 추출된 고수준 특징을 가져와 출력 클래스 또는 값으로 매핑합니다.
  5. 학습(Training): CNN은 역전파(backpropagation) 및 경사 하강(gradient descent) 알고리즘을 사용하여 훈련됩니다. 훈련 중에 네트워크는 예측된 출력과 실제 값 사이의 차이를 측정하는 손실 함수를 최소화하기 위해 각 층의 매개변수(가중치 및 편향)를 조정하도록 합니다.
  6. 정규화 기법(Regularization Techniques): 과적합을 방지하기 위해 CNN에는 일반적으로 드롭아웃(dropout), 배치 정규화(batch normalization), 데이터 증강(data augmentation)과 같은 정규화 기법이 포함됩니다.
  7. 전이 학습(Transfer Learning): 전이 학습은 CNN과 함께 일반적으로 사용되며, 큰 데이터셋(예: ImageNet)에서 사전 훈련된 모델이 작은 데이터셋에서 fine-tuning되는 방식입니다.

3. 전이학습

전이 학습(Transfer Learning)은 사전에 훈련된 모델의 지식을 새로운 작업에 활용하는 기술입니다. 이를 통해 적은 양의 데이터로도 효과적인 모델을 학습할 수 있습니다. 주로 큰 규모의 데이터셋(예: ImageNet)에서 사전 훈련된 모델을 가져와서, 그 모델의 일부를 새로운 작업에 재사용하는 방식으로 진행됩니다.

 

전이 학습의 일반적인 단계는 다음과 같습니다:

  1. 기본 모델 가져오기: 대규모 데이터셋에서 사전 훈련된 모델을 선택하고 가져옵니다. 이 모델은 이미지 분류나 객체 감지와 같은 비슷한 작업을 위해 훈련되었을 수 있습니다.
  2. 특징 추출 부분 고정: 기본 모델의 일부 또는 전체를 고정하고, 새로운 작업에 맞게 마지막 분류 계층을 제외한 나머지 층을 동결합니다. 이렇게 하면 사전 훈련된 모델의 특징 추출 능력을 그대로 사용할 수 있습니다.
  3. 새로운 분류 계층 추가: 새로운 작업에 맞게 분류를 위한 새로운 계층을 추가합니다. 이 층은 일반적으로 사전 훈련된 모델의 출력 크기에 맞추어 설계됩니다.
  4. 학습 및 평가: 새로운 분류 계층을 포함한 전체 모델을 새로운 데이터셋으로 학습시키고, 평가합니다. 이때 사전 훈련된 모델의 가중치는 동결되어 있고, 새로운 분류 계층의 가중치만 업데이트됩니다.

 

예시

예전에 티처블 머신으로 만든 연예 소속사 인상 판독기도 전이학습의 예시라고 할 수 있다.

https://subakbingsoo.tistory.com/13


 4. 욕하면 모자이크 처리하는 프로그램

 

import cv2
import mediapipe as mp

# 손 인식 모델 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False, max_num_hands=1)

# 모자이크 함수 정의
def mosaic(img, x, y, w, h, size=30):
    for i in range(int(w / size)):
        for j in range(int(h / size)):
            xi = x + i * size
            yi = y + j * size
            img[yi:yi + size, xi:xi + size] = cv2.blur(img[yi:yi + size, xi:xi + size], (23, 23))

# 카메라 연결
cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        continue

    # 화면 반전
    frame = cv2.flip(frame, 1)

    # 손 인식
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = hands.process(rgb_frame)

    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            # 중지 손가락 끝 좌표 추출
            index_finger_tip_y = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP].y * frame.shape[0]
            middle_finger_tip_y = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP].y * frame.shape[0]

            # 중지 손가락을 올린 경우에만 손에 모자이크 적용
            if index_finger_tip_y > middle_finger_tip_y:
                # 손의 경계 상자 추정
                x_min, y_min = int(min(l.x * frame.shape[1] for l in hand_landmarks.landmark)), int(min(l.y * frame.shape[0] for l in hand_landmarks.landmark))
                x_max, y_max = int(max(l.x * frame.shape[1] for l in hand_landmarks.landmark)), int(max(l.y * frame.shape[0] for l in hand_landmarks.landmark))

                # 손에만 모자이크 적용
                mosaic(frame, x_min, y_min, x_max - x_min, y_max - y_min)

    # 화면 표시
    cv2.imshow('Hand Gesture Mosaic', frame)

    # 종료 키 설정
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

# 리소스 해제
cap.release()
cv2.destroyAllWindows()

'AI' 카테고리의 다른 글

Chat gpt로 볼링 점수 계산하기  (0) 2024.06.26
테트리오 랭크 예측  (0) 2024.06.12
사진을 다양하게 변형시켜보자  (0) 2024.03.27
영상인식과 opencv  (0) 2024.03.20
[인공지능] 인공지능  (0) 2024.03.06