파 이 썬,사진 속 얼굴 비 주 얼 예측 실현

20805 단어 Python얼굴 인식
1.필요 한 도구
**Python 버 전:*3.5.4(64bit)
관련 모듈
  • opencv_python 모듈
  • sklearn 모듈
  • numpy 모듈
  • dlib 모듈
  • 파 이 썬 자체 모듈
  • 3.환경 구축
    (1)해당 버 전의 Python 을 설치 하고 환경 변수 에 추가 합 니 다.
    (2)pip 설치 관련 모듈 에서 언급 한 모듈.
    예 를 들 면:
    图片
    pip 설치 오류 가 발생 하면 스스로 도착 하 십시오:
    http://www.lfd.uci.edu/~gohlke/pythonlibs/
    pip 설치 오류 모듈 의 whl 파일 을 다운로드 하고 사용:
    pip install whl 파일 경로+whl 파일 이름 설치.
    예 를 들 면:
    (관련 파일 에 dlib 라 이브 러 리 에 설 치 된 whl 파일 을 컴 파일 했 습 니 다.->이 라 이브 러 리 가 가장 설치 하기 어렵 기 때 문 입 니 다.)
    图片
    참고 문헌 링크
    [1]xxxPh.D.의 블 로그
    http://www.learnopencv.com/computer-vision-for-predicting-facial-attractiveness/
    [2]화남이공대학 모 실험실
    http://www.hcii-lab.net/data/SCUT-FBP/EN/introduce.html
    4.주요 사고
    (1)모형 훈련
    PCA 알고리즘 을 사용 하여 특징 을 압축 하여 낮 추 었 습 니 다.
    그리고 랜 덤 숲 훈련 모형 으로
    데 이 터 는 인터넷 에서 기원 되 었 는데 데이터 의'발원지'가 바로 화남이공대학 의 한 실험실 이 라 고 합 니 다.그래서 저 는 참고 문헌 에 이 실험실 의 링크 를 추가 한 것 입 니 다.
    (2)얼굴 추출 포인트
    주로 dlib 라 이브 러 리 를 사 용 했 습 니 다.
    공식 적 으로 제공 하 는 모델 을 사용 하여 특징 추출 기 를 구축 하 다.
    (3)특징 생 성
    xxxPh.D.의 블 로 그 를 완전히 참고 하 였 습 니 다.
    (4)비 주 얼 예측
    이전의 데이터 와 모델 을 이용 하여 비 주 얼 예측 을 하 다.
    사용 방식
    특수 질환 자 는 자신의 비 주 얼 을 신중하게 예측 해 보 세 요.본인 은 비 주 얼 예측 결과 와 가 져 온 모든 부정적인 영향 에 대해 책임 을 지지 않 습 니 다!!
    본론 으로 돌아가다.
    환경 구축 완료 후 관련 파일 의 Face 압축 해제Value.rar 파일,cmd 창 을 압축 해제 후의*.py 파일 이 있 는 디 렉 터 리 로 전환 합 니 다.
    예 를 들 면:
    图片
    test 열기img 폴 더,얼굴 값 을 예측 해 야 할 사진 을 넣 고 test.jpg 로 이름 을 바 꿉 니 다.
    예 를 들 면:
    图片
    귀 찮 거나 다른 수요 가 있 으 면 스스로 수정 하 십시오.
    getLandmarks.py 파일 의 13 번 째 줄 입 니 다.
    마지막 으로 순서대로 실행:
    train_model.py(내 모델 을 직접 사용 하려 면 이 단 계 를 무시 하 십시오)
    
    #       
    import numpy as np
    from sklearn import decomposition
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.externals import joblib
    
    
    #           
    features_path = './data/features_ALL.txt'
    ratings_path = './data/ratings.txt'
    
    #     
    #  500   
    #    480        , 20        
    features = np.loadtxt(features_path, delimiter=',')
    features_train = features[0: -20]
    features_test = features[-20: ]
    ratings = np.loadtxt(ratings_path, delimiter=',')
    ratings_train = ratings[0: -20]
    ratings_test = ratings[-20: ]
    
    #     
    #    PCA             。
    #          20 ,         500 ,           ,       20   。
    #          
    pca = decomposition.PCA(n_components=20)
    pca.fit(features_train)
    features_train = pca.transform(features_train)
    features_test = pca.transform(features_test)
    regr = RandomForestRegressor(n_estimators=50, max_depth=None, min_samples_split=10, random_state=0)
    regr = regr.fit(features_train, ratings_train)
    joblib.dump(regr, './model/face_rating.pkl', compress=1)
    
    #            
    print('Generate Model Successfully!')
    
    getLandmarks.py
    
    #          
    import cv2
    import dlib
    import numpy
    
    
    #     
    PREDICTOR_PATH = './model/shape_predictor_68_face_landmarks.dat'
    #   dlib   frontal_face_detector       
    detector = dlib.get_frontal_face_detector()
    #                 
    predictor = dlib.shape_predictor(PREDICTOR_PATH)
    face_img = cv2.imread("test_img/test.jpg")
    #   detector      ,rects      
    rects = detector(face_img, 1)
    #        
    if len(rects) >= 1:
    	print("{} faces detected".format(len(rects)))
    else:
    	print('No faces detected')
    	exit()
    with open('./results/landmarks.txt', 'w') as f:
    	f.truncate()
    	for faces in range(len(rects)):
    		#   predictor         
    		landmarks = numpy.matrix([[p.x, p.y] for p in predictor(face_img, rects[faces]).parts()])
    		face_img = face_img.copy()
    		#   enumerate                 
    		for idx, point in enumerate(landmarks):
    			pos = (point[0, 0], point[0, 1])
    			f.write(str(point[0, 0]))
    			f.write(',')
    			f.write(str(point[0, 1]))
    			f.write(',')
    		f.write('
    ') f.close() # print('Get landmarks successfully')
    getFeatures.py
    
    #       
    #            
    import math
    import numpy
    import itertools
    
    
    def facialRatio(points):
    	x1 = points[0]
    	y1 = points[1]
    	x2 = points[2]
    	y2 = points[3]
    	x3 = points[4]
    	y3 = points[5]
    	x4 = points[6]
    	y4 = points[7]
    	dist1 = math.sqrt((x1-x2)**2 + (y1-y2)**2)
    	dist2 = math.sqrt((x3-x4)**2 + (y3-y4)**2)
    	ratio = dist1/dist2
    	return ratio
    
    
    def generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates):
    	size = allLandmarkCoordinates.shape
    	if len(size) > 1:
    		allFeatures = numpy.zeros((size[0], len(pointIndices1)))
    		for x in range(0, size[0]):
    			landmarkCoordinates = allLandmarkCoordinates[x, :]
    			ratios = []
    			for i in range(0, len(pointIndices1)):
    				x1 = landmarkCoordinates[2*(pointIndices1[i]-1)]
    				y1 = landmarkCoordinates[2*pointIndices1[i] - 1]
    				x2 = landmarkCoordinates[2*(pointIndices2[i]-1)]
    				y2 = landmarkCoordinates[2*pointIndices2[i] - 1]
    				x3 = landmarkCoordinates[2*(pointIndices3[i]-1)]
    				y3 = landmarkCoordinates[2*pointIndices3[i] - 1]
    				x4 = landmarkCoordinates[2*(pointIndices4[i]-1)]
    				y4 = landmarkCoordinates[2*pointIndices4[i] - 1]
    				points = [x1, y1, x2, y2, x3, y3, x4, y4]
    				ratios.append(facialRatio(points))
    			allFeatures[x, :] = numpy.asarray(ratios)
    	else:
    		allFeatures = numpy.zeros((1, len(pointIndices1)))
    		landmarkCoordinates = allLandmarkCoordinates
    		ratios = []
    		for i in range(0, len(pointIndices1)):
    			x1 = landmarkCoordinates[2*(pointIndices1[i]-1)]
    			y1 = landmarkCoordinates[2*pointIndices1[i] - 1]
    			x2 = landmarkCoordinates[2*(pointIndices2[i]-1)]
    			y2 = landmarkCoordinates[2*pointIndices2[i] - 1]
    			x3 = landmarkCoordinates[2*(pointIndices3[i]-1)]
    			y3 = landmarkCoordinates[2*pointIndices3[i] - 1]
    			x4 = landmarkCoordinates[2*(pointIndices4[i]-1)]
    			y4 = landmarkCoordinates[2*pointIndices4[i] - 1]
    			points = [x1, y1, x2, y2, x3, y3, x4, y4]
    			ratios.append(facialRatio(points))
    		allFeatures[0, :] = numpy.asarray(ratios)
    	return allFeatures
    
    
    def generateAllFeatures(allLandmarkCoordinates):
    	a = [18, 22, 23, 27, 37, 40, 43, 46, 28, 32, 34, 36, 5, 9, 13, 49, 55, 52, 58]
    	combinations = itertools.combinations(a, 4)
    	i = 0
    	pointIndices1 = []
    	pointIndices2 = []
    	pointIndices3 = []
    	pointIndices4 = []
    	for combination in combinations:
    		pointIndices1.append(combination[0])
    		pointIndices2.append(combination[1])
    		pointIndices3.append(combination[2])
    		pointIndices4.append(combination[3])
    		i = i+1
    		pointIndices1.append(combination[0])
    		pointIndices2.append(combination[2])
    		pointIndices3.append(combination[1])
    		pointIndices4.append(combination[3])
    		i = i+1
    		pointIndices1.append(combination[0])
    		pointIndices2.append(combination[3])
    		pointIndices3.append(combination[1])
    		pointIndices4.append(combination[2])
    		i = i+1
    	return generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates)
    
    
    landmarks = numpy.loadtxt("./results/landmarks.txt", delimiter=',', usecols=range(136))
    featuresALL = generateAllFeatures(landmarks)
    numpy.savetxt("./results/my_features.txt", featuresALL, delimiter=',', fmt = '%.04f')
    print("Generate Feature Successfully!")
    
    Predict.py
    
    #       
    from sklearn.externals import joblib
    import numpy as np
    from sklearn import decomposition
    
    
    pre_model = joblib.load('./model/face_rating.pkl')
    features = np.loadtxt('./data/features_ALL.txt', delimiter=',')
    my_features = np.loadtxt('./results/my_features.txt', delimiter=',')
    pca = decomposition.PCA(n_components=20)
    pca.fit(features)
    predictions = []
    if len(my_features.shape) > 1:
    	for i in range(len(my_features)):
    		feature = my_features[i, :]
    		feature_transfer = pca.transform(feature.reshape(1, -1))
    		predictions.append(pre_model.predict(feature_transfer))
    	print('            (   5 ):')
    	k = 1
    	for pre in predictions:
    		print(' %d  :' % k, end='')
    		print(str(pre)+' ')
    		k += 1
    else:
    	feature = my_features
    	feature_transfer = pca.transform(feature.reshape(1, -1))
    	predictions.append(pre_model.predict(feature_transfer))
    	print('          (   5 ):')
    	k = 1
    	for pre in predictions:
    		print(str(pre)+' ')
    		k += 1
    
    파 이 썬 이 사진 속 사람의 얼굴 에 대해 비 주 얼 예측 을 하 는 것 에 관 한 글 을 소개 합 니 다.더 많은 파 이 썬 이 사람의 얼굴 에 대해 비 주 얼 예측 을 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기