수화 인식 프로그램 (Python,

** 딥러닝 기반 AI 수화 인식 프로그램

1) 개발 목적: 수화 인식

2) 사용 모듈: cv2(opencv) 웹캠 제어, mediapipe 손 감지, sklearn(머신 러닝) 학습

– 모듈 설치

!pip 설치 opencv-python
!pip 키보드 설치
!pip 설치 미디어 파이프

3) 코드 내용:

요약:

1. 사용된 수화(변수 “guesture”)를 사전으로 사용
2. MediaPipe와 함께 사용
3. OpenCV를 사용하여 웹캠을 제어하고 웹에서 수화로 콘텐츠 작성

세부 사항:

max_num_hands=하나 # 최대 손 감지: 1
제스처 = {
0:‘ㅏ’,하나:‘비’,2:‘씨’,:‘디’,4:‘이자형’,5:‘에프’,6:‘G’,7:‘시간’,
8일:‘나’,9:‘와이’,10:‘케이’,11:‘나’,12:‘중’,13:‘N’,14:‘영형’,
15:‘피’,16:‘큐’,17:‘아르 자형’,18:‘에스’,19:‘티’,20:‘너’,21:‘V’,
22:‘우’,23:‘엑스’,24:‘와이’,25:‘지’,26:‘거리’,27:‘분명한’,28:‘끄다’
}

– 제스처는 키:값 데이터 형식으로 사전으로 관리
> 키는 임의의 라벨 번호(학습된 라벨 번호)
값은 해당 알파벳 콘텐츠입니다.
> 제스처는 키보드 모듈을 사용(삭제 기능 등)

# MediaPipe 손 모델
mp_hands=mp.solutions.hands # 웹캠 손 포지셔닝 유틸리티
mp_drawing = mp.solutions.drawing_utils # 손 정보를 기반으로 그리기

# 지문인식 모듈 초기화
hands=mp_hands.손(
max_num_hands=max_num_hands, # 최대 손 감지
min_detection_confidence=0.5, # 최소 검출 신뢰도 기준 = 0.5
min_tracking_confidence=0.5 # 최소 추적 신뢰도 기준 = 0.5
)

– 미디어파이프 사용을 위한 설정

# 제스처 인식 모델
에프 =열려 있는(‘test.txt’,‘우’) # 학습할 데이터 세트 저장
파일=np.genfromtxt(‘dataSet.txt’,구분자=‘,’)
각도 = 파일(:,:-하나).astype(np.float32) # 각도
레이블 = 파일(:, –하나).astype(np.float32) # 레이블
knn=cv2.ml.KNearest_create() # knn(k-가장 가까운 알고리즘)
knn.train(각도, cv2.ml.ROW_SAMPLE, 라벨) # 배우다!

– 미디어 파이프에 존재하는 정보 유틸리티 활용
– 미디어파이프 옵션 설정
– 제스처 인식 모델을 사용하여 추가 기능 학습
> 삭제 기능이 코드에 추가되었습니다.
– 제스처 학습에 knn 알고리즘 사용

# 웹캠 열기
cap=cv2.VideoCapture(0)

# 웹캠에서 프레임별로 사진 읽기
시작시간 = 시간.시간()
이전_인덱스 = 0
문장 =
감지 지연 = 하나
~하는 동안 진실:
ret,img = cap.read()
만약에 ~ 아니다 반품:
부서지다

– opencv 모듈로 웹캠을 열어 수화를 인식합니다.
– 변수 ret, img 사용 목적
> ret: 프레임 읽기 성공 또는 실패, 참/거짓
img : 프레임 이미지, numpy 배열 또는 없음

img = cv2.flip(img, 하나)
imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
결과 = hands.process(imgRGB)

# 각도를 감지하고 제스처를 인식하는 부분
만약에 result.multi_hand_landmarks ~이다 ~ 아니다 없음: # 손이 감지되었을 때
~을 위한 입술 ~ 안에 result.multi_hand_landmarks:
# 관절 == 랜드마크의 빨간 점
# 21개의 관절과 x,y,z 좌표가 있으므로 21.3
관절 = np.zeros((21,))
~을 위한 j, lm ~ 안에 낱낱이 세다(해상도 랜드마크):
조인트(j) = (lm.x,lm.y,lm.z) # 각 관절에 대한 x,y,z 좌표 저장

– cv2.flip은 이미지 뒤집기 효과 기능 있음(웹캠 사용시 반전으로 감지되기 ​​때문에)
– cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
> openCV는 기본적으로 BGR 형태로 변환하여 데이터를 가져오고,
PIL은 이미지를 현재 형식으로 가져옵니다.
> 색상을 적용하는 모듈에 따라 모양을 변경해야 하기 때문에
– 위의 mp set으로 만든 가변 손 그림이 무엇을 의미하는지 이해

# 관절 관절 사이의 각도 계산
# **공식 문서에는 각 공통번호의 색인이 표시됩니다**
v1 = 조인트((0,하나,2,,0,5,6,7,0,9,10,11,0,13,14,15,0,17,18,19) 🙂
v2 = 조인트((하나,2,,4,5,6,7,8일,9,10,11,12,13,14,15,16,17,18,19,20) 🙂

v = v2 – v1 # (20,3) 공통 벡터
# v 정규화(표현식 축소, API 간소화)
v = v / np.linalg.norm(v, 중심선=하나)(:, np.newaxis)

# 관절별 역함수(빨간색 점)
# **스칼라 곱(벡터 곱의 일종) 후 arccos로 각도 계산**
비교V1 = v((0,하나,2,4,5,6,7,8일,9,10,12,13,14,16,17) 🙂
비교V2 = v((하나,2,,5,6,7,9,10,11,13,14,15,17,18,19) 🙂
각도 = np. arccos(np.onesum(‘nt,nt->n’V1 비교, V2 비교))
각도 = np.degree(각도)

# a를 눌러 저장
# 학습 모델을 만들어야 할 때 사용
만약에 keyboard.is_pressed(‘ㅏ’):
~을 위한 숫자 ~ 안에 각도:
숫자 = 둥근(숫자,6)
f. 쓰기 (거리(숫자))
f. 쓰기 (‘,’)
f. 쓰기 (‘28.00000’) # 제스처 키 입력
f. 쓰기 (\N)
누르다(“다음”)
누르다(‘——————–‘)
# 학습된 제스처 모델 참조
데이터 = np. 배열((각도), dtyp=np.float32)
ret, 결과, 이웃, 거리 = knn.findNearest(데이터,)
인덱스 = 내부(결과(0)(0))

cv2.putText(img, 텍스트=gesture(index).upper(), 조직=(내부(해상도 랜드마크(0).x * 이미지 모양(하나)), 내부(해상도 랜드마크(0).y * 이미지 모양(0) + 20)), 폰트=cv2.FONT_HERSHEY_SIMPLEX, 글꼴 크기=하나, 색상=(255, 255, 255), 두께=2)

– 이것은 관절의 좌표와 실제 각도가 관절 벡터를 사용하여 계산됨을 의미합니다.
– 계산 결과 a를 눌렀을 때 좌표 저장을 가능하게 하여 데이터 학습

putText 함수로 인식되는 손의 알파벳 또는 제스처 입력

만약에 색인 ~ 안에 제스처.키(): # 인덱스가 Gesture.Key에 있는 경우
# prev_index=0, startTime = time.time()
만약에 인덱스 != 이전_인덱스:
시작시간 = 시간.시간()
prev_index = 인덱스
다른:
만약에 time.time() – startTime > recognitionDelay:
만약에 인덱스 == 26: # 거리
문장 +=
열하나 인덱스 == 27: #분명한
문장 =
열하나 인덱스 == 28: #끄다
문장 = 문장 (:-하나)
다른:
문장 += 몸짓(색인)
시작시간 = 시간.시간()

– Gesture result #Draw : Gesture의 결과 값을 만드는 부분

# 손에 랜드마크 그리기
mp_drawing.draw_landmarks(img,res,mp_hands.HAND_CONNECTIONS)
# 텍스트를 화면에 보이게 하기
cv2.putText(이미지, 문장,(20,440),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),)

– 랜드마크는 손에서 실제로 어떤 수화를 인식했는지 시각적으로 알려주는 기능입니다.

putText 함수로 아래에 인식된 내용을 입력하세요.
– 두 가지 유형의 putText 사용
1) 손에 글자나 제스처 입력
2) 아래 인식된 내용 입력

cv2.imshow(‘손 추적’그림)

# 중지하려면 q를 누르십시오.
만약에 cv2.waitKey(하나) == 오른쪽(‘큐’):
부서지다
cv2.destroyAllWindows()

– opencv에서 imshow를 사용하여 창에 표시되도록 했습니다.

– q버튼을 누르면 취소(프로그램 강제해제)


# 다음으로 소스를 추가하고 Flask를 사용하여 웹에서 여는 과정을 추가합니다.