프로그래밍/에러가 났을때

[CHECKMATE][에러발생]bson.errors.InvalidDocument: cannot encode object

개발자 덕구🐾 2022. 4. 10. 13:23
728x90

작성한 코드이다.

 

모델을 돌려 추출한 임베딩 값을 json형태로 insert하는 코드이다. 

 

 

 

그러나 에러가 발생하였다. 

 

 

 

그런데 evaluation_embs를 몇개만 잘라서 넣으면 DB에 잘 들어간다.

그렇다면 문제는 임베딩값이 너무 많다는 것이다. 

 

 

그래서 학생들의 임베딩값 추출을 출석체크 할 때 하는 것으로 구조를 변경하려고한다.

 

 

 

임베딩값을 제외하고 선택된 사진의 파일명과 인덱스만 DB에 추가되도록 코드를 변경하였다. 

 

 

# student 추가 
@app.route("/students",methods=['POST']) # 라우팅경로
def CreateStduentEmbedding() :
    if request.method =='POST' :
        Img_students_addr = AddStduentImg() # 학생들의 사진 폴더를 선택 
        evaluation_embs, evaluation_labels = Embedding.Create_Embedding(Img_students_addr)
    
        for i in range(len(evaluation_labels)) : 
            Student.insert_one(
                {
                    "studentIdx" : getNextSequence(),
                    "name": evaluation_labels[i]
                }
            ) 
        
        return make_response(jsonify(SUCCESS=True),200)

 

 

이러게 코드를 수정하니 여기서 굳이 코드를 수정할 필요가 없다.

 

Embedding.Create_Embedding을 os.listdir으로 변경하면 쉽게 파일명을 리스트로 반환받을 수 있다. 

 

 

# student 추가 
@app.route("/students",methods=['POST']) # 라우팅경로
def CreateStduentEmbedding() :
    if request.method =='POST' :
        Img_students_addr = AddStduentImg() # 학생들의 사진 폴더를 선택 
        evaluation_labels = os.listdir(Img_students_addr)
    
        for i in range(len(evaluation_labels)) : 
            Student.insert_one(
                {
                    "studentIdx" : getNextSequence(),
                    "name": evaluation_labels[i]
                }
            ) 
        
        return make_response(jsonify(SUCCESS=True),200)

 

 

 

DB에 잘 들어가는 것을 확인할 수 있다.

다만 뒤에 확장자까지 함께 저장되는 것이 문제이다. 

 

 

# student 추가 
@app.route("/students",methods=['POST']) # 라우팅경로
def CreateStduentEmbedding() :
    if request.method =='POST' :
        label = []
        Img_students_addr = AddStduentImg() # 학생들의 사진 폴더를 선택 
        evaluation_labels = os.listdir(Img_students_addr) # 사진들의 이름을 추출
        for evaluation_label in evaluation_labels :  # 확장자 제거 
            label.append(evaluation_label.rsplit('_')[0])
    
        for i in range(len(label)) : 
            Student.insert_one(
                {
                    "studentIdx" : getNextSequence(),
                    "name": label[i]
                }
            ) 
        
        return make_response(jsonify(SUCCESS=True),200)

 

rsplit()을 이용해 이름만을 추출하여 DB에 넣었다. 

 

 

 

 

이름뒤에 _를 넣은 이유는 우리가 사용하는 모델자체에서 _를 기준으로 나누기때문이다.

나중에 혹시라도 문제가 생길수도있기에 동일하게 코드를 만들어주었다. 

 

 

 

 

 

 

참고 블로그 : 

 

https://koos808.tistory.com/61

 

Python 리스트에서 확장자 제거하는 여러가지 방법

리스트에서 확장자제거하는 여러가지 방법 원본 이미지 이름 : N_10_1000_1.jpg 1) image_name.rstrip('.jpg') 2) image_name.rsplit('.')[0] 3) os.path.splitext(image_name)[0] 4) re.sub('.jpg','', image_nam..

koos808.tistory.com

https://seong6496.tistory.com/100

 

[Python]폴더 안에 파일 이름 목록 가져오기

파이썬으로 엑셀 파일을 불러올 때 경로를 찾아서 불러와야 합니다. 경로야 물론 금방 찾을 수 있지만 엑셀 파일 100개를 불러오려면 파일이름을 일일히 써야하는데 노동이 되버리니 폴더 안에

seong6496.tistory.com

 

반응형