Пример #1
0
    def post(self):
        ts = time.time()
        parser = reqparse.RequestParser()
        parser.add_argument('userEmail', type=str)
        parser.add_argument('gid', type=str) 
        args = parser.parse_args()
    
        gid = args['gid']
        user : User = User.query.filter(User.googleEmail==args['userEmail']).first() 
        uid = user.id

        print("(uid : "+str(uid)+", gid : "+str(gid)+") 수신함.\n")
        
        #db에서 group 레코드 삭제
        engine.execute('Delete From %s.group Where id = %s;'%(db['database'],gid))

        model_path = main_folder+'uid_'+str(uid) + group_folder

        os.remove(model_path+str(uid)+'_' + str(gid) +'_'+'model.clf')  

        elapsed = time.time() - ts
        print("uid :" + str(uid) +" , gid : "+str(gid))
        print("서버 반환 걸린 시간: " +str(elapsed)) 
        print("================================\n")
        return {'uid': uid , 'gid' : gid}
Пример #2
0
def getAllGroups(userEmail):
    uid = (engine.execute('Select id From %s.user WHERE googleEmail = "%s";'%(db['database'], userEmail))).first()[0]
    result = engine.execute('Select * From %s.group WHERE uid = %d order by favorites desc;'%(db['database'],uid))
    #튜플들의 리스트로 결과 행들 받아옴
    rows = result.fetchall()
    dicList = []
    for v in rows:
        dicList.append({'id' : v[0], 'name' : v[1], 'favorites' : v[2]})
        json.dumps(dicList)
    return json.dumps(dicList)
Пример #3
0
    def post(self):
        ts = time.time()
        print("여기까지 ok2")
        parser = reqparse.RequestParser()
        parser.add_argument('userEmail', type=str)
        parser.add_argument('gname', type=str) #그룹이름 
        parser.add_argument('pidList', type=str) #안드로이드 스튜디오에서 ArrayList<Integer>로 pid 담아서 보내면 됨
        args = parser.parse_args()
        
        gname = args['gname']
        #문자열로 넘어왔으니 리스트로 파싱해준다.
        pidList = args['pidList'][1:-1].replace(" ","").split(sep=",")
        
        user : User = User.query.filter(User.googleEmail==args['userEmail']).first() 
        uid = user.id

        print("여기까지 ok1")
        #db에 그룹 추가
        g= Group(uid, gname)
        db_session.add(g)
        db_session.commit()
        print("여기까지 ok2")
        
        gid = g.id
        #db에 그룹이 보유한 pid관계 추가(pidList를 반영)
        for pid in pidList:
            group_person.insert().values(gid=gid, pid=pid).execute()

        model_path = main_folder+'uid_'+str(uid)+group_folder
        path = main_folder+'uid_'+str(uid)+face_folder
        
        #모델 디렉토리가 없으면 새로 생성
        try:
            if not os.path.exists(model_path):
                os.makedirs(model_path)
        except Exception as e:
            print('Error : Creating directory', e)
            
        print("Training KNN classifier...")
        classifier = FaceTrain.train(pidList, path, model_save_path=model_path+str(uid)+'_' + str(gid) +'_'+'model.clf', n_neighbors=2)
        
        #group_info에 모델명, 모델에 학습시킨 얼굴 개수, gid 삽입
        engine.execute('Insert into %s.group_info values("%s",%d,%d);'%(db['database'],str(uid)+'_' + str(gid) +'_'+'model.clf', classifier,int(gid)))
        
        
        print("================================")

        print(str(classifier)+" faces training complete! (pid_list : "+str(pidList)+")")
        elapsed = time.time()-ts
        print("서버 반환 걸린 시간: " +str(elapsed)) 
        print("================================\n")
        return {'uid': uid , 'pid' : pidList, 'gid' : gid}#<------생성된 모델로 잘 인식하는지 테스트 해보고싶으면 밑에서 테스트해보세요!
Пример #4
0
def getAllPersons(userEmail):
    uid = (engine.execute('Select id From %s.user WHERE googleEmail = "%s";'%(db['database'], userEmail))).first()[0]
    result = engine.execute('Select * From %s.person WHERE uid = %d;'%(db['database'],uid))
    #튜플들의 리스트로 결과 행들 받아옴
    rows = result.fetchall()
    dicList = []
    for v in rows:
        if v[2] is None:
            dicList.append({'id' : v[0], 'name' : v[1], 'thumbnail' : v[2]})
        else:    
            tostring = base64.encodebytes(v[2]).decode() #base64 bytes로 인코딩해준 후 문자열로 다시 디코딩해줌
            dicList.append({'id' : v[0], 'name' : v[1], 'thumbnail' : tostring})
    return json.dumps(dicList, ensure_ascii=False)
Пример #5
0
def loginUser(userEmail):

    #ignore을 쓰지 않고 굳이 번거롭게 select해서 if문으로 구분하는 이유
    # 1. return 값을 구분하기 쉬움
    # 2. 최근 mysql부터 insert 실패시에도 auto_increment가 작동하여 기본키값이 올라감, 이를 편하게 방지하기 위해서

    #기존에 있는 유저인지 확인하기 위해 select하는 코드
    u = User.query.filter(User.googleEmail==userEmail).first()
    if u:
        return "기존에 등록 된 유저입니다. ID : %s"%userEmail
    else:
        now = datetime.datetime.now()
        nowDate = now.strftime('%Y/%m/%d')
        engine.execute('Insert into user(googleEmail, last_update) values("%s", "%s");'%(userEmail, nowDate))
        return "새로운 User를 등록했습니다. ID : %s"%userEmail
Пример #6
0
def getGroupsByPid(pid):
    
    result = engine.execute('Select g.* From %s.group as g, group_person as g_p WHERE g.id = g_p.gid and pid = %d;'%(db['database'],int(pid)))
    #튜플들의 리스트로 결과 행들 받아옴
    rows = result.fetchall()
    dicList = []
    for v in rows:
        dicList.append({'id' : v[0], 'name' : v[1], 'favorites' : v[2]})
    return json.dumps(dicList, ensure_ascii=False)
Пример #7
0
def getPersonsByGid(gid):
    result = engine.execute('Select p.* From %s.person as p, group_person as g_p WHERE p.id = g_p.pid and gid = %d;'%(db['database'],int(gid)))
    #튜플들의 리스트로 결과 행들 받아옴
    rows = result.fetchall()
    dicList = []
    for v in rows:
        if v[2] is None:
            dicList.append({'id' : v[0], 'name' : v[1], 'thumbnail' : v[2]})
        else:    
            tostring = base64.encodebytes(v[2]).decode() #base64 bytes로 인코딩해준 후 문자열로 다시 디코딩해줌
            dicList.append({'id' : v[0], 'name' : v[1], 'thumbnail' : tostring})
    return json.dumps(dicList)
Пример #8
0
def getGroup_Person(gid):
    result = engine.execute('Select pid From %s.group_person WHERE gid = %d;'%(db['database'],int(gid)))
    pidList = [v[0] for v in result.fetchall()]
    print(pidList)
    return pidList
Пример #9
0
def getLastUpdate(userEmail):
    result = (engine.execute('Select last_update From %s.user WHERE googleEmail = "%s";'%(db['database'], userEmail))).first()[0]
    return str(result)
Пример #10
0
    def post(self):
        ts = time.time()

        parser = reqparse.RequestParser()
        parser.add_argument('userEmail', type=str) 
        parser.add_argument('pid', type=str) 

        args = parser.parse_args()
        pid = args['pid']
        user : User = User.query.filter(User.googleEmail==args['userEmail']).first() 
        uid = user.id


        result = engine.execute('Select g.* From %s.group as g, group_person as g_p WHERE g.id = g_p.gid and pid = %d;'%(db['database'],int(pid)))
        #지우는 pid가 해당되었던 그룹 리스트 받아오기
        rows = result.fetchall()
        dicList = []
        for v in rows:
            dicList.append(v[0])
        print(dicList)
        #db에서 person 레코드 삭제
        engine.execute('Delete From person Where id = %s;'%pid)

        ######## person을 삭제하게 됨으로써 빈 그룹도 삭제하는 과정
        #person을 하나도 안가지고있는 group 찾아내기 (group_person 테이블에 없는 그룹)
        result = engine.execute('SELECT * From %s.group Where id not in (Select distinct gid From group_person);'%db['database'])
        gidList = str(tuple([v[0] for v in result])).replace(",)",")") #튜플은 원소가 1개인경우 (1,) 이런식으로 표현됨. 그래서 replace 한 것임
        if gidList != '()': #비어있는 그룹이 하나이상 존재한다면 delete한다
            engine.execute('Delete From %s.group Where id in %s;'%(db['database'], gidList))#group_info까지 연쇄삭제됨

        #폴더 삭제
        shutil.rmtree(main_folder+'uid_'+ str(uid) +face_folder+'/'+str(pid), ignore_errors=True)  

        model_path = main_folder+'uid_'+str(uid)+group_folder
        path = main_folder+'uid_'+str(uid)+face_folder

        
        for gid in dicList:
            result = engine.execute('Select p.* From %s.person as p, group_person as g_p WHERE p.id = g_p.pid and gid = %d;'%(db['database'],int(gid)))
            #튜플들의 리스트로 결과 행들 받아옴
            if result is None:
                continue
            
            pidList = [str(v[0]) for v in result.fetchall()]

            if not pidList:
                continue
            
            print(pidList)
            print(gid)

            print("Training KNN classifier...")
            classifier = FaceTrain.train(pidList, path, model_save_path=model_path+str(uid)+'_' + str(gid) +'_'+'model.clf', n_neighbors=2)
            
            #group_info에 모델명, 모델에 학습시킨 얼굴 개수, gid 삽입
            engine.execute('update %s.group_info set fnum = %d where gid = %d;'%(db['database'],classifier,int(gid)))
            
            
            print("================================")

            print(str(classifier)+" faces training complete! (pid_list : "+str(pidList)+")")


        elapsed = time.time() - ts
        print("uid :" + str(uid) +" , pid : "+str(pid))
        print("서버 반환 걸린 시간: " +str(elapsed)) 
        print("================================\n")
        
        return {'uid': uid , 'pid' : pid}
Пример #11
0
    def post(self):
        ts = time.time()
        parser = reqparse.RequestParser()
        parser.add_argument('gid', type=int) #그룹아이디 
        parser.add_argument('gname', type=str)
        parser.add_argument('pidList', type=str) #안드로이드 스튜디오에서 ArrayList<Integer>로 pid 담아서 보내면 됨
        parser.add_argument('favorites', type=int)

        args = parser.parse_args()
        gid = args['gid']
        gname = args['gname']
        favorites = args['favorites']
        pidList = args['pidList']

        group : Group = Group.query.filter(Group.id==gid).first()
        uid = group.uid

        rStr=""
        #####db###########
        ##################
        # not 은 리스트 안에 값이 있는지 없는지를 확인 ex) p=[]일 경우 not p임. 즉 not으로 비교하면 없는 걸로 침
        # None 은 해당 값 자체가 존재하는지를 확인 ex) p=[]일 경우 p is not None임. 즉 None으로 비교하면 있는 걸로 침
        
        #빈 리스트를 준게 아니라 아예 값을 주지 않았을 때를 방지하기 위한 체크임
        if gname is not None :
            engine.execute('Update %s.group set name = "%s" where id = %d;'%(db['database'],gname,gid))
            rStr+="gname 수정 됨"
        if favorites is not None:
            engine.execute('Update %s.group set favorites = "%d" where id = %d;'%(db['database'],favorites,gid))
            rStr+="favorites 수정 됨"
        if pidList is not None:
            rStr+="pidList 수정 반영 됨"
            #문자열로 넘어왔으니 리스트로 파싱해준다.
            pidList = pidList[1:-1].replace(" ","").split(sep=",")

            #그룹의 pid관계를 다 삭제하고 변경된 pidList들을 db에 삽입함
            engine.execute('Delete From group_person Where gid = %d;'%gid)
            for pid in pidList:
                group_person.insert().values(gid=gid, pid=pid).execute()

            model_path = main_folder+'uid_'+str(uid)+group_folder
            path = main_folder+'uid_'+str(uid)+face_folder
    
            #비어져있는 pidlist를 받으면 해당 그룹 모델파일을 없애버림 --> 얼굴 삭제 했을 때 그룹에 사람이 없는경우
            if len(pidList) == 0: 
                rStr+="pidList가 비어있어 모델 파일을 삭제함"
                os.remove(model_path+str(uid)+'_'+str(gid)+'_'+'model.clf')
                engine.execute('Delete From %s.group_info Where gid = %d;'%(db['database'],int(gid)))

            


            else:
                #모델 디렉토리가 없으면 새로 생성
                try:
                    if not os.path.exists(model_path):
                        os.makedirs(model_path)
                except Exception as e:
                    print('Error : Creating directory', e)
                
                model_face_num = []
                print("Training KNN classifier...")
                classifier = FaceTrain.train(pidList, path, model_save_path=model_path+str(uid)+'_'+str(gid)+'_'+'model.clf', n_neighbors=2)
                #group_info 새로 학습된 정보로 업데이트
                engine.execute('update %s.group_info set fnum = %d where gid = %d;'%(db['database'],classifier,int(gid)))

                print("================================")

                print(str(classifier)+" faces training complete! (pidList : "+str(pidList)+")")
            
 
        elapsed = time.time()-ts

        print("서버 반환 걸린 시간: " +str(elapsed)) 
        print("================================\n")

        return rStr
Пример #12
0
    def post(self, userEmail):
        ts_total = time.time()

        uid = (engine.execute('Select id From %s.user WHERE googleEmail = "%s";'%(db['database'], userEmail))).first()[0]
        
        try:
            if not os.path.exists('./DATA'):
                os.makedirs('./DATA')
            if not os.path.exists('./DATA/uid_'+ str(uid)) :
                os.makedirs('./DATA/uid_'+ str(uid))
            if not os.path.exists('./DATA/uid_'+ str(uid)+'/tmp_'+str(uid)) :
                os.makedirs('./DATA/uid_'+ str(uid)+'/tmp_'+str(uid))
        except Exception as e:
            print('Error : Creating directory', e)

        parser = reqparse.RequestParser()
        parser.add_argument('GalleryFiles', type=str)
        args = parser.parse_args()
        GalleryFiles_en=args['GalleryFiles']
        GalleryFiles=[]
        x = json.loads(GalleryFiles_en)


    
        path = main_folder+ 'uid_'+str(uid)+'/'

        #path = './DATA/uid_'+uid+'/tmp/'

        if not os.path.exists(path+"tmp_"+str(uid)):
            os.makedirs(path+"tmp_"+str(uid))

        for k, v in x.items():
            f=open(path+"tmp_"+str(uid)+"/"+k,"wb")
            f.write(base64.b64decode(v))
            f.close()

        print("postGalleryPic")


        elapsed = time.time() - ts_total
        print("사진 받아오는데 걸린 시간: " +str(elapsed))
        print("-------------------------------------------------------")


        reg_group = []
        gnameList = []
    #==========사진 받아온 후 ====================

        #group_info에 있는 데이터 리스트로 가져옴
        
        result = engine.execute('select * from %s.group_info where gid in (select id from %s.group where uid = %d);'%(db['database'],db['database'],int(uid)))
        reg_group = [list(v) for v in result.fetchall()]    

        print(reg_group)
        os.listdir(path+"tmp_"+str(uid))
        for image_file in sorted(os.listdir(path+"tmp_"+str(uid))):
            full_img_path = os.path.join(path+"tmp_"+str(uid), image_file)
            print("Looking for faces in {}".format(image_file))
            ts = time.time()
            # Find all people in the image using a trained classifier model
            # Note: You can pass in either a classifier file name or a classifier model instance

            for model_file in os.listdir(path+'group_model'):
                full_model_path = os.path.join(path+'group_model', model_file)
                predictions = FaceDetect.predict(full_img_path, model_path=full_model_path)
                for i in reg_group:
                    if i[0] == str(model_file):
                        i.append(predictions)
            print(reg_group)
            check_group = {}
            #사진에서 인식된 얼굴의 수 리스트에 추가

            for i in reg_group:
                check_group[i[2]] = [i[1], i[3]]
                del i[3]
            print(check_group)
            #학습시킨 얼굴의 개수와, 인식된 얼굴의 수를 비교하여 해당 사진이 어떤 그룹에 속하는지 반환
            group = FaceDetect.findBestFitModel(check_group)
            print(group)
            if group == -1:
                gnameList.append("None")
                print(image_file+"은 적합한 그룹이 없습니다!!")
            else:
                gnameList.append((engine.execute('Select name From %s.group WHERE id = "%d";'%(db['database'], int(group)))).first()[0])
                print(image_file+"은 "+str(group)+"그룹에 적합한 사진입니다!")
            elapsed = time.time()-ts
            print("얼굴 판별에 걸린 시간: " +str(elapsed))
            print("-------------------------------------------------------")

        try:
            shutil.rmtree(main_folder+'uid_'+ str(uid)+"/tmp_"+str(uid), ignore_errors=True)  #폴더 삭제
        except Exception as e:
            print('Error : Removing tmp directory : ', e)

        now = datetime.datetime.now()
        nowDate = now.strftime('%Y/%m/%d')
        result = (engine.execute('update %s.user set last_update = "%s" WHERE googleEmail = "%s";'%(db['database'], nowDate, userEmail)))

        print("마지막 업데이트 날짜 변경 완료")
        print("================================")
        elapsed = time.time()-ts_total
        print("서버 반환 시간: " +str(elapsed))
        print("================================\n")

        print(gnameList)
        #return {"gnameList" : gnameList}
        return gnameList
Пример #13
0
def getPidListByGid(gid):
    result = engine.execute('Select pid From group_person WHERE gid = %d;'%int(gid))
    pidList = [v[0] for v in result.fetchall()]
    return json.dumps(pidList)