From de65fcb282e46b2ad6ed359d6cd370b0ca438fdd Mon Sep 17 00:00:00 2001 From: minseo9451 <94168097+minseo9451@users.noreply.github.com> Date: Wed, 18 Oct 2023 19:01:37 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[Feat]=20=EC=9E=85=EB=A0=A5=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 5개 입력 # 5개 미만인 경우 # 5개 - 입력 받는 갯수를 계산해서 가장 높은 tf-idf값 추출 단어 갯수 찾고 # 단어를 추출 # 모인 5개 단어를 번역 # 번역한 단어를 karlo에 전송 # 8개 이미지 받아서 # 클라에 전송 --- .DS_Store | Bin 0 -> 6148 bytes app/__pycache__/main.cpython-311.pyc | Bin 0 -> 6228 bytes app/main.py | 119 +++++++++++++++++---------- 3 files changed, 77 insertions(+), 42 deletions(-) create mode 100644 .DS_Store create mode 100644 app/__pycache__/main.cpython-311.pyc diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ba5b93fad179582602b1aa835f51317184720808 GIT binary patch literal 6148 zcmeHKL2uJA6n<{YmQo?*0MafkWJx5RHmo~i+o0ZIqiQVP%WRhn^+3o%mwR+>u z#-_LFwY+!HCpC}CxSSRJczVdK*GlEdMLka5Wa)h9-+!TG8D}z`YC<+jk#h7llOr|n ztC<`Xnj4u8ujw_1{?=mA+j-UwcDuc0J6P=Xy6xcU&hB#A^d3BVy#H!=l8>eOW`q~` zPinho@dCc1VpsDen#x?skBD&gT^f+0V>+Rfru2a_$|+sbe8Yyozb@DoKc59 zQ-Lw$DoZ?EWBC|ArBj+=4z7*il1gwpD8Ev<#^>LBbyhT;IR%^oPJtUMV9!Udb>k5n z(J9~*xUCBC`4GSvLyMI`eRQDEPXJ&8VQr}EkAGmm0bppcGKdIF7%I?Eg?(ZO`*sk9 zj{eZ*R|XB8gq|7W*qMcWp$Pl*5P?o75gK%*Q@|;(szBW|eZK!+{{8*GN^&iyfK%XB zDIgkyXwb)!?A>~8aeUVX@b_>w&Z`VwQc%%XF>?7T-hyjGJm3m2v{)HL1m->jv<$9r J3j9+AegmZ0e_Q|n literal 0 HcmV?d00001 diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c2077d80ced5f48a74b2e5fa97a3939b75e6890 GIT binary patch literal 6228 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 + +

Click here to go to the Swagger UI and test the generate_image endpoint.

+ + + """ +@app.post("/generate_image", response_class=HTMLResponse) +async def generate_image(input_data: ImageInput): + + # 사용자가 입력한 키워드를 리스트로 만듭니다. + user_keywords_list=[input_data.keyword1,input_data.keyword2,input_data.keyword3,input_data.keyword4,input_data.keyword5] + tokenizer = WordPunctTokenizer() - stop_words = [ ".", ",", @@ -213,48 +225,71 @@ async def generate_image(request: Request): vectorizer = TfidfVectorizer(tokenizer=tokenizer.tokenize, stop_words=stop_words) - tfidf_matrix = vectorizer.fit_transform([translated_text]) + # 입력된 텍스트에 대해 TF-IDF 벡터라이저를 적용합니다. + tfidf_matrix = vectorizer.fit_transform([input_data.text]) + # TF-IDF 벡터라이저에서 feature 이름들을 가져옵니다. feature_names = vectorizer.get_feature_names_out() - # Sort by tf-idf score and get top 5 keywords + # TF-IDF 점수 기준으로 정렬하고 상위 5개의 키워드를 가져옵니다. sorted_keywords_indices = tfidf_matrix.toarray().argsort()[0][::-1][:5] - keywords_prompt = " ".join( - [feature_names[index] for index in sorted_keywords_indices] - ) + top_5_tfidf_keywords=[feature_names[index] for index in sorted_keywords_indices] + + # 사용자가 제공한 키워드와 TF-IDF로 추출된 키워드들을 합칩니다. + final_user_and_tfidf_keywrods=user_keywords_list+top_5_tfidf_keywords[:max(0, 5-len(user_keywords_list))] + + translated_final_keywords=[] + for keyword in final_user_and_tfidf_keywrods: + if keyword is not None: + # Google Cloud Translation API를 사용하여 각 키워드를 영어로 번역합니다. + result_keyword_translate=translate_client.translate(keyword,target_language='en') + translated_final_keywords.append(result_keyword_translate['input']) + + final_translated_user_and_tfidf_keywrods = translated_final_keywords + + keywords_prompt=" ".join(final_translated_user_and_tfidf_keywrods) REST_API_KEY = "9ea943bc1dce2cd5fe7a41bdba661924" - try: - r = requests.post( - "https://api.kakaobrain.com/v2/inference/karlo/t2i", - json={ - "prompt": keywords_prompt, + image_urls=[] + for _ in range(8): + r=requests.post( + 'https://api.kakaobrain.com/v2/inference/karlo/t2i', + json={ + 'prompt':keywords_prompt, }, headers={ - "Authorization": f"KakaoAK {REST_API_KEY}", - "Content-Type": "application/json", - }, + 'Authorization': f'KakaoAK {REST_API_KEY}', + 'Content-Type':'application/json' + } ) + + if r.status_code != 200: + raise HTTPException(status_code=400, detail="Image generation failed") - if r.status_code != 200: - raise HTTPException() - - response_json = r.json() + response_json = r.json() + + image_url = response_json["images"][0]["image"] + + image_urls.append(image_url) - image_url = response_json["images"][0]["image"] + html_content = """ + + + Generated Images:
+ """ + + for url in image_urls: + html_content += f'{keywords_prompt}
' + + html_content += f""" + Keywords:
+ {', '.join(final_translated_user_and_tfidf_keywrods)} + + """ + + return HTMLResponse(content=html_content, status_code=200) - return { - 'isSuccess': True, - 'code': 200, - 'message': '요청에 성공하였습니다.', - 'data': image_url, - } - except HTTPException as e: - return { - 'isSuccess': False, - 'code': 400, - 'message': '이미지 생성에 실패하였습니다.' - } \ No newline at end of file + From 4b16d915ccf45e70508b3da72d13c8140de3cc6a Mon Sep 17 00:00:00 2001 From: minseo9451 <94168097+minseo9451@users.noreply.github.com> Date: Thu, 19 Oct 2023 10:48:54 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[Fix]=20return=20type=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. URL: generate_image를 generate-image로 수정. 2. 기존 return type으로 변경 3. 요청 결과에 따른 로그 작성 4. 생성된 이미지를 전부 return --- app/__pycache__/main.cpython-311.pyc | Bin 6228 -> 6432 bytes app/main.py | 61 ++++++++++++++------------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc index 9c2077d80ced5f48a74b2e5fa97a3939b75e6890..f98be14c4df3166e5850e4fbf1b15dcef1a75756 100644 GIT binary patch delta 1424 zcma)5ZA=?w9DknnuGg1q>3fg9tlfg4IF)vqsaq5SlTg?a&HS(soi;p2Eh|Ou+87a2 zR1yj_0lXROgxC+uwq#jkb{PHU68*NAD>=1kvdD)Kqm<<4%LlVWe4a97-M;wT|9 zeg41a<&;S2kmaJ;Yy^1xJrm)V1B(_8rWV^@=|=!*Q`SMN2JqGq8%ZF8w_kt&T*mLt z71Fy4=#*a2y#t-)8@lHq zye8T8&v_?oBko;J$ZtZC*CL1DhBy0OkP0CE4bdNmW+>oU>OJUi0fU4Ra?A}{hG|C073 zXzJJ4H zndDeHBxZ+(cu^eArb5GGLP+4>%<^I;^eedy<82S5566=!9yO)*CKqsW_F-I5U%s~a z`B(LelcD+t%k`gsRh)vfUTO({Xa zdBP6_e#B6tP&^aw@JqL>Uq)&sF%!>Z#a9U#;d>I+rN$BoUZ_#YG~S(A;$q&43+ZG! z(cvnu*q(((;alt#$*&=q9S4nfu+mOE*UR0G8JM#nxn8vR&&|uGpz+HFk@t2M3N`Ixg=&f~6XasP^Wyc#v4W+-#uPRtH)O-?m_I#xTK4Z|`1`P4F~<~hOm4^q zW6U3UFE^Dd?q6ekGUHqK2CFWv${kY~%6iPC0?JCjVET&%v}tmusz;`J zR2}g6sy1iUdAMrxsRo*5RImdyBede3>%<;wv z2@V_(evv+OKjQtFs4Pj;;<&Jnm>UG{NL6>hsK>XJ+-`AL+IAQGz%to*FcG6K?@8=X&E6}fMx+%z%230`5_u_3W&;}_VXKT8d)F?rf8=sQ z42ca=G{b&q`U)%RAfIBvfURS>~1dKm#rpd;vK;fl&W2Y=gkjc=SZ) z3~`ar`3>rSb*Rm4_&0=nvqpXnp^DDX&%#^i8a?7mQ2=}-qYC{yEtlwe(A(-OABR5m zy${?dhVLJad+Yzo7~4AAf!ee~O}lD!g)Pl;{KtR?fOxxV5mR z8y%l+Sh@Ui$CqEpEg6Ll?ajs4&=fVcK5eWTX3jEnZN_6Sj=yE5GmM6%$c*P#mb8Mo z@M5y)Pinbk%TqF5Nb$TEp2Q#f;rX9@KRK|3Bcr@1WFXnLfypuQGyJ6z1g&J}K z{(`=j--M6RB_$Oo&bJ#V1b>Rv6SQ&~ExE0+WL*WWWhlCLBqi+=j{iOKN qzOsnkP(Pg9ovo-Xc%cn1IK%`6U#ibLz@7W?kOaiV """ -@app.post("/generate_image", response_class=HTMLResponse) +@app.post("/generate-image") async def generate_image(input_data: ImageInput): # 사용자가 입력한 키워드를 리스트로 만듭니다. @@ -252,44 +257,42 @@ async def generate_image(input_data: ImageInput): REST_API_KEY = "9ea943bc1dce2cd5fe7a41bdba661924" - image_urls=[] + image_urls = [] for _ in range(8): - r=requests.post( - 'https://api.kakaobrain.com/v2/inference/karlo/t2i', - json={ - 'prompt':keywords_prompt, + r = requests.post( + 'https://api.kakaobrain.com/v2/inference/karlo/t2i', + json={ + 'prompt': keywords_prompt, }, headers={ 'Authorization': f'KakaoAK {REST_API_KEY}', 'Content-Type':'application/json' } ) - - if r.status_code != 200: - raise HTTPException(status_code=400, detail="Image generation failed") - response_json = r.json() + if r.status_code == 200: + response_json = r.json() - image_url = response_json["images"][0]["image"] + image_url = response_json["images"][0]["image"] - image_urls.append(image_url) - - html_content = """ - - - Generated Images:
- """ - - for url in image_urls: - html_content += f'{keywords_prompt}
' - - html_content += f""" - Keywords:
- {', '.join(final_translated_user_and_tfidf_keywrods)} - - """ + image_urls.append(image_url) - return HTMLResponse(content=html_content, status_code=200) + logger.info(f"Image generation successful for request {i+1}") # 이미지 생성 요청이 성공적으로 완료되었음을 로그로 남깁니다. + else: + logger.warning(f"Image generation failed for request {i+1}") # 이미지 생성 요청이 실패했음을 로그로 남깁니다. + if len(image_urls) == 0: + return { + 'isSuccess': False, + 'code': 400, + 'message': "이미지 생성에 실패하였습니다." + } + + logger.info("Image generation requests completed successfully") # 모든 이미지 생성 요청이 성공적으로 완료되었음을 로그로 남깁니다. - + return { + 'isSuccess': True, + 'code': 200, + 'message': "요청에 성공하였습니다.", + 'data': image_urls + } \ No newline at end of file From dcfd2726ef87500390552baabd8c18c866a03230 Mon Sep 17 00:00:00 2001 From: minseo9451 <94168097+minseo9451@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:00:59 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[Fix]=20=EB=B0=98=EB=B3=B5=EB=AC=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 반복문 수정 --- app/__pycache__/main.cpython-311.pyc | Bin 6432 -> 6409 bytes app/main.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc index f98be14c4df3166e5850e4fbf1b15dcef1a75756..91ec9343e3f2a6eadf5dda74e17093591570a1f2 100644 GIT binary patch delta 192 zcmZ2r)M>=EoR^o20SMH3H*yuQGB#|kX5GcaxN5Q)M<{DtjoB