Гарын хэлбэр таних

Hand Gesture Recognition

Зорилго

Камераар дамжуулан гарын ямар хэлбэр гаргасан буюу хэдэн хуруу гаргасныг машин сургалтын аргаар таньж, түүнийгээ хялбар тоглоомонд ашиглах.

Таних үйл ажиллагаа

  1. Зураг хүлээж авах
  2. Зураг боловсруулах
  3. Шинж чанаруудыг ялгаж авах
  4. Таних
  5. Шийдвэр гаргах

Ашигласан технологи

  • Python
  • OpenCV (Open Source Computer Vision Library)
  • scikit-learn (Machine Learning in Python)
  • Numpy (Fundamental package for scientific computing with Python)
  • PyAutoGUI (GUI automation for human beings)

Ашигласан технологи

  1. Зураг хүлээж авах - Камер
  2. Зураг боловсруулах - OpenCV
  3. Шинж чанаруудыг ялгаж авах - OpenCV
  4. Таних - scikit-learn SVM
  5. Шийдвэр гаргах - Тоглоом/PyAutoGUI

Зураг хүлээж авах

Камераар хүлээн авч буй зургуудыг ашиглах бөгөөд танилтыг сайжруулахын тулд гар нь орчноос өөр өнгөтэй байх хэрэгтэй.

						
							# OpenCV
							import cv2

							cap = cv2.VideoCapture(0)
							while True:
								ret, img = cap.read()
						
					
Камернаас зураг унших (OpenCV)

Зураг боловсруулах

Арын фон
Үндсэн зураг
Арын фоныг хассан
Зааглах
							
								# Background
								img = cv2.absdiff(bgImg, image)
								# Gray
								gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
								# Gaussian Blur
								blur = cv2.GaussianBlur(gray, (11, 11), 0)
								# Threshold
								ret, thresh = cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY)
								# Gaussian Blur
								thresh = cv2.GaussianBlur(thresh, (3, 3), 0)
							
						

Шинж чанаруудыг ялгах

Гарын өнцгүүд дээрх X, Y координатуудыг олох
Countours | Convex hull | Convexity defects
							
								cv2.findContours()

								cv2.convexHull()

								cv2.convexityDefects()
							
						

Таних

Зурагнаас олж буй шинж чанаруудыг гарын хөдөлгөөн бүрт хадгалан нийт 300 ширхэг жишээ өгөгдөл цуглуулсан.

Цуглуулсан өгөгдлүүдээ SVM (Support vector machine) машин сургалтын аргыг ашиглан сургаж, танилтанд ашигласан.

							
								# scikit-learn svm
								from sklearn import svm

								# Train data
								tdata = [[...],[...]...]
								tlabel = [...]
								clf = svm.SVC(kernel='linear', C=1.0)
								clf.fit(tdata, tlabel)

								# Predict
								clf.predict([coords])
							
						

Шийдвэр гаргах

Зурагнаас таньсан дүрснээс хамаарч тоглоомонд зохих үйлдлүүдийг хийх

							
								# PyAutoGUI
								import pyautogui
								# Queue
								last_predict = deque([0, 0, 0])
								
								# Play Dino
								last_predict.popleft()
								last_predict.append(data.clf.predict([coords]))
								pred = func.most_common(last_predict)
								if prev != pred:
									if prev == 0 and pred == 5 and status_dino:
										pyautogui.press('space')
									prev = pred
							
						

Туршилт

Туршилт (Chrome Dino)

Үр дүн

Хуруу Танилтын хувь
0 95%
1 90%
2 70%
3 25%
4 90%
5 100%

Дүгнэлт

Орчин болон гар хоорондоо ялгаатай өнгөтэй үед арын фоныг орж ирж буй зургаас хасахад гарыг бүрэн ялгаж авч чадсан. Threshold хийсэн зургаас findContours, convexHull, convexityDefects функцуудыг ашиглан гарын онцгой цэгүүдийг тооцоолж олсноор тэдгээрийг машин сургалтын SVM аргаар ангилан орж ирсэн зургаас гар ямар хэлбэр гаргаж байгааг олох боломжтой бөгөөд боломжийн үр дүнд хүрсэн. Цааш Convex hull аргаар олсон цэгүүдийг оновчтой хуваарилж, SVM-ын параметрүүдийг өөрчилж, тохиромжтой утгуудыг олсноор танилтыг сайжруулах боломжтой.

Анхаарал тавьсанд баярлалаа

Хүн компьютерийн харилцаа - 2017-2018 - хавар - II баг