728x90

Pose Estimation & Landmark Extraction

  1. 영상 처리 : OpenCV
  2. Landmark 추출 : Google MediaPipe (https://google.github.io/mediapipe/solutions/pose.html)

1 Frame 당 33개 Landmark Data에 대해

  • X : Landmark의 X 축 좌표. [0:1] 의 값으로 Normalized
  • Y : Landmark의 Y 축 좌표. [0:1] 의 값으로 Normalized
  • Z : 카메라와 수직을 이루며 피사체의 left_hip - right_hip 사이의 원점을 통과하는 가상의 depth 좌표.
         카메라와 가까운 쪽으로 음수 값을 가지는 Experimental 한 값
  • V (Visibility) Factor : [0:1]의 값을 가지며 Landmark에 대한 가시성을 나타내는 값.
                                       (가려져 표시되지 않는다면 0)

영상 전체를 Frame by Frame으로 순회하며 Landmark 추출 Pandas 파이썬 패키지 이용 Dataframe 으로 담아 csv파일로 저장

https://youtu.be/OjCwLatUff8

https://youtu.be/iZMHllJtqsI

Vectorization

요가 영상은 고정된 특정 포즈를 취하는 Posing 구간과 A포즈에서 B포즈로 포즈가 바뀌는 Transition 구간으로 나누어짐.
즉, Landmark의 “변화량”을 기준으로 정적인 구간을 구분해 낼 수 있다고 추론.

따라서, X,Y 축 랜드마크 데이터를 가지고 변화량 데이터를 생성.(Z축 데이터는 제외)

1. 가려서 보이지 않는 Landmark 값 = 신뢰도가 떨어진다고 판단 Vector 그래프의 Jitter의 요소를 줄이기 위해
    Visibility Factor를 데이터에 가중치로 활용하기로 함

변화량 값에 곱해줄 가중치로 사용하려고 하기에 벡터 연산에 쓰일 두 Landmark 값중 하나라도 신뢰성이 떨어지면 연산된 벡터 값도 신뢰성이 떨어질거라고 판단, 더 작은 V-factor로 가져와서 Dimension Matching



2. X 축 33개 Landmark Column ——— Concatenate——— Y 축 33개 Landmark Colum

  • DataFrame 1칸 Shift하여 Diff값 구한뒤, Dimension Matching된 V-Factor DataFrame 참조하여 V-Factor값이 0.9 이하인 값에 대하여 Landmark Data 0으로 치환.

 

3. V값 가중치 적용된 Concatenated DataFrame에 대해 Euclidean vector 연산 통해 Vectorization 하여 X축, Y축 각 33개 Landmark에 대한 벡터요소를 하나의 벡터로 합산

 

4. 합산된 벡터 데이터를 표준편차(std) = 1 , 평균(mean) = 0을 갖도록 하는 Standard Normalization 으로 정규화

 

Smoothing

Smoothing Method

1. Savitzky-Golay aka.SAVGOL Filter (사비츠키-골레이) (scipy.signal) <- 해당 필터로 진행

 

2. Moving Average Method

    a. SMA : Simple Moving Average Method

b. CMA : Cumulative Moving Average Method

c. EMA : Exponential Moving Average Method

3. Gaussian Filter

Posing 구간 분리

1. Peak Find (scipy.signal)

전제1 : Peak 기준으로 나눠진 왼쪽, 오른쪽 구간은 서로 다른 포즈이다.

전제2 : Peak 사이 구간의 Status는 2가지로 구별된다.
    - Transition Only (Cluster에 앞서서 pre-processing 통해 제거)
    - Posing + Transition (Clustering 통해 구별 가능)

2. Pre-processing : Peak to Peak 구간의 분류

핵심 전제 : 운동 영상의 경우 Posing 을 유지하는 시간이 Pose가 전환되는 Transition 시간 보다 압도적으로 길다.

*Standard Normalization 을 거치면 전체 데이터의 mean = 0 , std = 1 로 정규화 된다.
→ Posing 구간에서는 변화량이 적기 때문에 Flatten 구간의 데이터는 -1 에 가깝게 분포되어 있다.

만약 Peak to Peak 구간에 Posing 구간이 포함되어 있다면 아래의 식을 만족한다.

(Peak to Peak 구간의 mean 값) - (Peak to Peak 구간 std) < -1

그렇지 않다면, 해당 구간은 Transition 상태만 있는 구간 일 것이다.

3. Clustering (K-means (scikit-learn)) :  Posing 과 Transition이 혼재되어 있는 구간에서의 분류

기본적으로 변화량 데이터를 다루고 있기에, Transition 구간의 데이터 값들의 군집은
Flatten 구간(Posing)의 군집보다 더 큰 값을 가진다.

핵심 전제에 의해, 구간의 mean 값에 대해 Posing 군집의 기여도가 훨씬 크므로, 분류된 두개의 군집에서
최대값을 가지는 데이터를 군집의 대표 데이터로 선택한뒤,
구간 mean값 과의 거리가 먼 군집을 Transition 군집으로, 가까운 군집을 Posing 군집으로 본다.

4. Posing 구간 추출

변화량 데이터 또한 시계열 데이터이므로 Posing 군집에서 x축 최소 값과, x 축 최대값 데이터가
곧 영상에서의 Posing 구간의 시작 프레임과 끝 프레임이다.

 

728x90

https://google.github.io/mediapipe/solutions/pose.html#static_image_mode

STATIC_IMAGE_MODE = True / False
기본값 = False
False 일 경우 솔루션은 입력 이미지를 비디오 스트림으로 취급합니다.
첫번째 이미지에서 가장 두드러진 사람을 기준으로 랜드마크 추출을 지역화하여
후속이미지에서 화면상에서 인물 탐지를 잃을때 까지 해당 랜드마크를 기준으로 트래킹하여 계산과 지연시간을 줄인다.
True일 경우 매 입력 프레임마다 화면상에서 사람이 어디있는지 탐지하며, 정적이고 서로 연관되지 않은 일련의 이미지를 처리하는데 적합

MODEL_COMPLEXITY  = 0 / 1 / 2
기본값 = 1
포즈랜드마크 모델의 복잡성
랜드마크의 정확도와 추론대기 시간은 모델 복잡도가 올라갈수록 증가

SMOOTH_LANDMARKS = True / False
기본값 = True
True 일 경우, 솔루션은 지터를 줄이기 위해 각각의 인풋 프레임에 대해 필터링
STATIC_IMAGE_MODE에서는 True로 설정되어 있더라도 무시됨.

MIN_DETECTION_CONFIDENCE = [0.0 ~ 1.0]
기본값 = 0.5
화면 상에서 사람을 탐지하는 모델의 최소 신뢰 정확도. (화면상에서 사람이 있다고 판단하는 Threshold 값)

MIN_TRACKING_CONFIDENCE
기본값 = 0.5
포즈 랜드마크를 추적하기 위한 랜드마크-추적 모델의 최소 신뢰 정확도. (랜드마크 추적에 대한 Threshold 값)
설정 값 이하로 떨어지면 랜드마크 추적을 놓쳤다고 간주하고 해당 화면에서 사람 탐지를 다시 함.
값이 높을 경우 레이턴시가 길어지는 대신 솔루션에 대한 Robust를 높게 가져갈 수 있다.
STATIC_IMAGE_MODE 가 True 일때는 연관되지 않은 일련의 이미지라는 가정하에 기본적으로 매 프레임에 대해
새롭게 화면상의 사람 위치를 탐지하기 때문에 무시된다.

Sample Code for Config Options

import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

# For static images:
IMAGE_FILES = []
BG_COLOR = (192, 192, 192) # gray
with mp_pose.Pose(
    static_image_mode=True,
    model_complexity=2,
    enable_segmentation=True,
    min_detection_confidence=0.5) as pose:
  for idx, file in enumerate(IMAGE_FILES):
    image = cv2.imread(file)
    image_height, image_width, _ = image.shape
    # Convert the BGR image to RGB before processing.
    results = pose.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

    if not results.pose_landmarks:
      continue
    print(
        f'Nose coordinates: ('
        f'{results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].x * image_width}, '
        f'{results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].y * image_height})'
    )

    annotated_image = image.copy()
    # Draw segmentation on the image.
    # To improve segmentation around boundaries, consider applying a joint
    # bilateral filter to "results.segmentation_mask" with "image".
    condition = np.stack((results.segmentation_mask,) * 3, axis=-1) > 0.1
    bg_image = np.zeros(image.shape, dtype=np.uint8)
    bg_image[:] = BG_COLOR
    annotated_image = np.where(condition, annotated_image, bg_image)
    # Draw pose landmarks on the image.
    mp_drawing.draw_landmarks(
        annotated_image,
        results.pose_landmarks,
        mp_pose.POSE_CONNECTIONS,
        landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
    cv2.imwrite('/tmp/annotated_image' + str(idx) + '.png', annotated_image)
    # Plot pose world landmarks.
    mp_drawing.plot_landmarks(
        results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS)

# For webcam input:
cap = cv2.VideoCapture(0)
with mp_pose.Pose(
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as pose:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      # If loading a video, use 'break' instead of 'continue'.
      continue

    # To improve performance, optionally mark the image as not writeable to
    # pass by reference.
    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = pose.process(image)

    # Draw the pose annotation on the image.
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    mp_drawing.draw_landmarks(
        image,
        results.pose_landmarks,
        mp_pose.POSE_CONNECTIONS,
        landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
    # Flip the image horizontally for a selfie-view display.
    cv2.imshow('MediaPipe Pose', cv2.flip(image, 1))
    if cv2.waitKey(5) & 0xFF == 27:
      break
cap.release()
728x90

    1. 강렬한 도입문구
    2. 당신의 아이디어가 해결할 실존하는 문제들에 대한 공감되는 스토리텔링
    3. 당신의 아이디어가 어떤식으로 문제를 해결 할 수 있을 것인가에 대한 설명. 아이디어에 대한 시각적인 설명을 포함 할 것.
    4. 당신의 아이디어 만이 가지는 특별한 점을 설명. 사용자를 확보하고 이익을 창출 할 수 있는 견고한 계획을 설명.
    5. 지금까지 성취한 점을 설명하고 앞으로 나아갈 비젼을 설명
    6. 당신의 팀이 이 아이디어를 진행시키기에 왜 최고의 선택인지 설명
    7. 아이디어 피칭의 궁극적인 목표(투자 유치, 고객 유치, 파트너쉽 채결 등)를 위한 요청
    8. 전체 설명에 대한 요약 정리
    9. 감사 표하기

  • 확신있고 직접적인 어구를 사용하기.
  • 연습하기. 대본있는 피칭은 확신이 없어 보인다.
  • 효과적인 프레젠테이션 자료를 준비할것. Infographic 등은 효과적인 설명 자료이다.
    프레젠테이션 자료는 발표할 내용의 반복이 아닌, 발표 내용에 얹어질 내용을 준비할것.
  • 자신감 있는 자세를 유지할것.
  • 자연스러운 바디 랭귀지를 사용할것. 

 

728x90
sudo apt install nodejs
sudo apt install npm

쉬운 node 버전 변경을 위한 nvm (node version manager) 설치

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc

 

node 버전 리스트

nvm list-remote
nvm install v16.19.0

 

설치된 노드 버전간 변경

nvm use v16.19.0

 

vue cli 설치

npm install -g @vue/cli

 

electron 설치

npm install electron --save-dev

 

만든 vue app electron으로 빌드하기

vue add electron-builder

electron으로 빌드한 앱 실행

npm run electron:serve
728x90

**Disclaimer - AMD GPU 관련 정보는 전부 Disregard 하세요.

sudo apt install git
sudo apt install openjdk-11-jdk
sudo apt install apt-transport-https curl gnupg
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt update && sudo apt install bazel-3.7.2
sudo unlink /usr/bin/bazel
sudo ln -s /usr/bin/bazel-3.7.2 /usr/bin/bazel

 

bazel --version

https://github.com/bazelbuild/bazel/releases/tag/3.7.2

chmod +x bazel-3.7.2-installer-linux-x86_64.sh
sudo ./bazel-3.7.2-installer-linux-x86_64.sh
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout r2.7
sudo apt install python3-pip
pip3 install six numpy wheel
pip3 install keras_preprocessing

 

for AMD GPU user only.

sudo apt install libnuma-dev
sudo apt install llvm

https://www.amd.com/en/support/kb/release-notes/rn-amdgpu-unified-linux-22-20

 

Radeon™ Software for Linux® 22.20 Release Notes

Article Number RN-AMDGPU-UNIFIED-LINUX-22-20 Release Date: June 28, 2022 This article provides information on the latest version of Radeon™ Software for Linux®. Radeon™ Software for Linux® 22.20 Highlights Introducing support for Ubuntu 22.04 and Ubu

www.amd.com

sudo amdgpu-install --usecase=rocm,hip,mllib --no-dkms

관련문서
https://amdgpu-install.readthedocs.io/en/latest/install-script.html#

sudo usermod -a -G video $LOGNAME
sudo usermod -a -G render $LOGNAME
sudo reboot
apt show rocm-libs
echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/profiler/bin:/opt/rocm/opencl/bin' | sudo tee -a /etc/profile.d/rocm.sh
sudo ldconfig

Tensorflow pre-install configuration

./configure
infinity@infinity-ubuntu:~/tensorflow$ ./configure
You have bazel 3.7.2 installed.
Please specify the location of python. [Default is /usr/bin/python3]: 


Found possible Python library paths:
  /usr/lib/python3/dist-packages
  /usr/local/lib/python3.8/dist-packages
Please input the desired Python library path to use.  Default is [/usr/lib/python3/dist-packages]

Do you wish to build TensorFlow with ROCm support? [y/N]: y
ROCm support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]: n
No CUDA support will be enabled for TensorFlow.

Do you wish to download a fresh release of clang? (Experimental) [y/N]: n
Clang will not be downloaded.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -Wno-sign-compare]: 


Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n
Not configuring the WORKSPACE for Android builds.

Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
	--config=mkl         	# Build with MKL support.
	--config=mkl_aarch64 	# Build with oneDNN and Compute Library for the Arm Architecture (ACL).
	--config=monolithic  	# Config for mostly static monolithic build.
	--config=numa        	# Build with NUMA support.
	--config=dynamic_kernels	# (Experimental) Build kernels into separate shared objects.
	--config=v1          	# Build with TensorFlow 1 API instead of TF 2 API.
Preconfigured Bazel build configs to DISABLE default on features:
	--config=nogcp       	# Disable GCP support.
	--config=nonccl      	# Disable NVIDIA NCCL support.
Configuration finished
bazel clean --expunge
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

for AMD user Only

sudo apt install rocm-libs miopen-hip
bazel build --config=opt --config=rocm //tensorflow/tools/pip_package:build_pip_package

 

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
ERROR: tensorflow-rocm 2.11.0.540 has requirement flatbuffers>=2.0, but you'll have flatbuffers 1.12 which is incompatible.
ERROR: tensorflow-rocm 2.11.0.540 has requirement keras<2.12,>=2.11.0, but you'll have keras 2.9.0 which is incompatible.
ERROR: tensorflow-rocm 2.11.0.540 has requirement tensorboard<2.12,>=2.11, but you'll have tensorboard 2.9.1 which is incompatible.
ERROR: tensorflow-rocm 2.11.0.540 has requirement tensorflow-estimator<2.12,>=2.11.0, but you'll have tensorflow-estimator 2.9.0 which is incompatible.
pip3 install --upgrade /tmp/tensorflow_pkg/tensorflow-2.9.3-cp38-cp38-linux_x86_64.whl

'Dev_Note > Krafton Jungle' 카테고리의 다른 글

아이디어 피칭 방법과 순서  (0) 2023.01.29
vue.js + electron 개발 환경 세팅  (0) 2023.01.24
OpenCV 개발환경 세팅  (0) 2023.01.20
Project RoomFit Figma Wireframe  (0) 2023.01.20
Reminder : 팀 리더로서의 역할  (0) 2023.01.20
728x90

Baseline

infinity@infinity-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.5 LTS
Release:	20.04
Codename:	focal

 

OpenCV Dependencies

1. Ubuntu repo update/upgrade

sudo apt-get update && sudo apt-get upgrade

2. Install cmake

sudo apt-get install build-essential cmake

3. Install pkg-config

sudo apt-get install pkg-config

4. Extra dependencies

sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev
sudo apt-get install libv4l-dev v4l-utils
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install libgtk-3-dev
sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
sudo apt-get install python3-dev python3-numpy

 

Install OpenCV

1. Download OpenCV source / OpenCV contrib

cd ~
mkdir opencv
cd opencv
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

2. Unzip

unzip opencv.zip
unzip opencv_contrib.zip

3. cmake Config OpenCV compile settings

cd opencv-4.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=OFF -D WITH_IPP=OFF -D WITH_1394=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D BUILD_PACKAGE=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_QT=OFF -D WITH_GTK=ON -D WITH_OPENGL=ON -D BUILD_opencv_python3=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules -D WITH_V4L=ON  -D WITH_FFMPEG=ON -D WITH_XINE=ON -D OPENCV_ENABLE_NONFREE=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_SKIP_PYTHON_LOADER=ON -D OPENCV_GENERATE_PKGCONFIG=ON ../

Mac OS 에서 zlib 관련 오류시 옵션 추가

 -D BUILD_ZLIB=OFF

4. compile

make

5. install

sudo make install

 

python3 import cv2 version check

infinity@infinity-ubuntu:~$ python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.4.0
>>> exit()

 

728x90

https://www.figma.com/proto/48AH4xyTxGILCdhq0RO9So/Roomfit-Wireframe?node-id=0%3A2&starting-point-node-id=0%3A2 

 

Figma

Created with Figma

www.figma.com


프로토타입 혹은 와이어프레임의 목적

  1. 프로젝트를 진행하기에 앞서 구성원들에게 프로젝트의 궁극적인 방향과 최종 목표를 가시적으로 제공 해 줄수 있다는 점에서 훌륭한 수단이다.

  2. 유즈케이스 시나리오와 그에 상응하는 페이지 구성을 가시적으로 만들어 봄으로서, 프로젝트 진행도중 미쳐 생각하지 못했던 사용 시나리오를 급하게 생각해내야 할 상황을 미연에 방지 할 수 있다.

  3. 프론트엔드 작업시 가이드라인이 된다. 많은 프로토타이핑 툴들이 최소한의 CSS 속성 Export부터 더 나아가서는 코드로 변환해주는 기능들을 지원하고 있다.

  4. 세부적인 디자인 요소를 미리 정해두고, 인터페이스를 정의해 둚으로서 백엔드-프론트엔드 협업시 잘못된 소통에 의한
    상호 충돌을 방지하고 매끄러운 연결을 도와준다.
728x90

프로젝트의 책임자이자 리더로서 기획한 프로젝트의 결과물이 잘 나오도록 하는것이 가장 1차적인 목표이지만
경험상, 프로젝트의 인적, 시간적, 역량적인 자원은 "언제나" 한정되어있고 "이상"과는 거리가 멀기 때문에 가지고 있는 자원을
최대한 활용하여 가진 리소스 안에서 최대의 결과물을 내도록 하는 것이 가장 중요하다.

물론 팀장의 기술적 역량이 아주 뛰어나 흔히 "캐리" 할 수 있는 상황도 있겠지만, 현실은 그렇지 못하고
더욱이 프로젝트의 규모가 커지고, 코드베이스가 대규모 일 수록 아무리 뛰어난 한명의 기술자라도
그 모든 것을 커버하는 것은 불가능하다.

그렇기에 팀장으로서 기술적 역량과는 별개로 인적 자원을 다루는데는 많은 요령이 요구된다.

팀장으로서 모든 사람이 같은 수준의 프로그래밍 기술을 가지고 있는 것은 아니라는 것을 인식하는 것이 중요하며,
경험이 적을 수 있는 사람들과 협력하고 지원할 수 있는 방법을 찾는 것이 중요하다.

  1. 명확한 지침과 가이드라인을 제공하기

    팀원 모두가 프로젝트의 궁극적인 목표와 그 목적에 대해 그들이 무엇을 해야 하는지에 대해 이해하고 있도록 한다.
    태스크에 대한 명확한 지침을 제공하고, 팀원 각각이 그들이 무엇을 해야 하는지를 명확하게 이해하도록 유도해야 한다.

  2. 기술 수준에 따라 작업 할당하기

    팀 구성원의 기술 수준 및 경험과 일치하는 태스크를 할당하는 것이 중요하다.
    설령 팀 구성 당시 팀원의 기술적인 숙련도가 미흡하더라도, 역량에 맞는 태스크를 할당하는 것은
    팀원으로 하여금 스스로에 대한 확신과 자신감을 심어 줄 수 있고,
    그것은 궁극적으로 시간에 지남에 따라 해당 팀원의 기술 수준을 성장시켜 줄 수 있는 동력원이 된다. 

  3. 교육 및 리소스 제공하기

    팀원들이 스킬 향상에 필요한 교육 및 리소스에 접근 할 수 있도록 한다.
    프로젝트 주제와 사용되는 기술 스택에 대한 튜토리얼, 레퍼런스 코드 또는 경험이 풍부한 팀 구성원의 멘토링 등을 제공한다.

  4. 협업 및 커뮤니케이션 장려

    팀원들이 함께 협업하고 공개적으로 의사소통할 수 있도록 격려하는 것 또한 팀 리더로서의 역할이다.
    이것은 모든 구성원들이 서로에게서 배울 수 있는 상호 지원적인 환경을 만드는데 필수적이다.

  5. 인내심을 갖고 이해하기

    팀의 목표를 달성하는 것이 궁극적인 목적이긴 하나, 팀 리더로서 팀원을 이끌고 포용하는 것 또한 중요한 역할 중 하나이다.
    어려움을 겪고 있는 팀원들에게 인내심을 갖고 이해하며, 지원과 격려를 제공한다.

+ Recent posts