From 6b65fc2f6776b0b4a9d29beba89a6def4f3e5bfa Mon Sep 17 00:00:00 2001 From: eust-w Date: Fri, 11 Apr 2025 14:28:02 +0800 Subject: [PATCH] :memo: fix readme --- .env | 2 +- README.md | 176 ++++++++++++------ __pycache__/mock_baidu_api.cpython-39.pyc | Bin 3757 -> 0 bytes app/__pycache__/__init__.cpython-39.pyc | Bin 146 -> 0 bytes .../__pycache__/azure_openai.cpython-39.pyc | Bin 4339 -> 0 bytes .../baidu_image_search.cpython-39.pyc | Bin 9783 -> 0 bytes .../__pycache__/image_utils.cpython-39.pyc | Bin 2405 -> 0 bytes .../__pycache__/type_manager.cpython-39.pyc | Bin 3349 -> 0 bytes .../type_manager_mongo.cpython-39.pyc | Bin 3145 -> 0 bytes 9 files changed, 118 insertions(+), 60 deletions(-) delete mode 100644 __pycache__/mock_baidu_api.cpython-39.pyc delete mode 100644 app/__pycache__/__init__.cpython-39.pyc delete mode 100644 app/api/__pycache__/azure_openai.cpython-39.pyc delete mode 100644 app/api/__pycache__/baidu_image_search.cpython-39.pyc delete mode 100644 app/api/__pycache__/image_utils.cpython-39.pyc delete mode 100644 app/api/__pycache__/type_manager.cpython-39.pyc delete mode 100644 app/api/__pycache__/type_manager_mongo.cpython-39.pyc diff --git a/.env b/.env index cc47590..f4205bc 100644 --- a/.env +++ b/.env @@ -10,4 +10,4 @@ AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o-drobotics # MongoDB配置 MONGO_URI=mongodb://localhost:27017/ -MONGO_DB_NAME=imgsearcher \ No newline at end of file +MONGO_DB_NAME=imgsearcherxx \ No newline at end of file diff --git a/README.md b/README.md index 67be4b4..8fc549c 100644 --- a/README.md +++ b/README.md @@ -1,99 +1,157 @@ -# 相似图片搜索系统 +# ImgSearcher -这是一个基于百度AI开放平台的相似图片搜索API的封装系统,提供了图片入库、检索、删除和更新等功能,并配有简洁美观的Web界面。 +一个强大的图像搜索和分析应用,结合百度图像搜索API和Azure OpenAI功能,实现智能图像识别、分类和交互式对话。 ## 功能特点 -- **图片入库**:将图片添加到百度相似图片搜索库中,支持添加名称、ID和标签 -- **图片检索**:上传图片搜索相似的图片,支持标签过滤 -- **图库管理**:更新和删除图库中的图片信息 -- **直观界面**:简洁美观的Web界面,操作便捷 +- **图像搜索**:使用百度图像搜索API上传和搜索相似图像 +- **图像管理**:在图像库中添加、更新和删除图像 +- **类型分类**:自动按类型分类图像并提供详细描述 +- **交互式对话**:使用Azure OpenAI集成与上传的图像进行AI对话 +- **MongoDB集成**:使用MongoDB存储和检索图像类型描述 -## 安装与使用 +## 架构 -### 环境要求 +应用程序采用Flask后端和响应式前端构建。它使用多个外部API和服务: -- Python 3.9+ -- Conda -- Poetry +- **百度图像搜索API**:用于图像相似度搜索和分类 +- **Azure OpenAI API**:用于图像分析和交互式对话功能 +- **MongoDB**:用于图像类型描述的持久化存储 -### 安装步骤 +## 前提条件 -1. 克隆或下载本项目到本地 +- Python 3.7+ +- MongoDB(本地或远程实例) +- 百度AI平台账户,并启用图像搜索API +- Azure OpenAI API访问权限 -2. 使用Conda创建虚拟环境: +## 安装 + +1. 克隆仓库: ```bash - conda env create -f environment.yml - conda activate imgsearcher + git clone https://github.com/yourusername/imgsearcher.git + cd imgsearcher ``` -3. 使用Poetry安装依赖: +2. 安装依赖: ```bash - poetry install + pip install -r requirements.txt ``` -4. 配置API密钥: - 在项目根目录创建`.env`文件,填入百度AI平台的API密钥: +3. 在根目录创建`.env`文件,配置如下: ``` - BAIDU_API_KEY=你的API_KEY - BAIDU_SECRET_KEY=你的SECRET_KEY + # 百度API配置 + BAIDU_API_KEY=你的百度API密钥 + BAIDU_SECRET_KEY=你的百度Secret密钥 + APP_ID=你的百度应用ID + + # Azure OpenAI配置 + AZURE_OPENAI_API_KEY=你的Azure_OpenAI_API密钥 + AZURE_OPENAI_ENDPOINT=你的Azure_OpenAI端点 + AZURE_OPENAI_API_VERSION=2023-12-01-preview + AZURE_OPENAI_DEPLOYMENT_NAME=你的部署名称 + + # MongoDB配置 + MONGO_URI=mongodb://localhost:27017/ + MONGO_DB_NAME=imgsearcher ``` -5. 创建上传目录: +## 使用方法 + +1. 启动应用: ```bash - mkdir uploads + ./run.sh ``` - -6. 运行应用: + 或手动启动: ```bash - poetry run python app.py + python app.py ``` -7. 在浏览器中访问: +2. 打开浏览器并访问: ``` - http://localhost:5000 + http://localhost:5001 ``` -## 使用说明 +3. 使用Web界面: + - 上传图像到图像库 + - 搜索相似图像 + - 管理图像集合 + - 与上传的图像进行AI对话 -### 图片入库 +## 数据迁移 -1. 在"图片入库"标签页中,选择要上传的图片 -2. 填写图片名称和ID(用于后续识别) -3. 可选择添加标签(最多2个,用逗号分隔) -4. 点击"上传入库"按钮 +如果您需要从基于JSON的类型存储迁移到MongoDB,请使用迁移脚本: -### 图片搜索 +```bash +python migrate_types_to_mongo.py +``` -1. 在"图片搜索"标签页中,选择要搜索的图片 -2. 可选择添加标签过滤条件 -3. 选择标签逻辑(AND或OR) -4. 点击"搜索"按钮 -5. 查看搜索结果 +这将把所有类型描述从JSON文件转移到您的MongoDB实例。 -### 图库管理 +## API端点 -1. 先在"图片搜索"标签页进行搜索 -2. 在搜索结果中,可以对图片进行编辑或删除操作 +### 图像管理 +- `POST /upload` - 上传图像到库 +- `POST /search` - 搜索相似图像 +- `POST /delete` - 从库中删除图像 +- `POST /update` - 更新图像信息 -## API说明 +### 对话功能 +- `GET /chat-with-image` - 访问对话界面 +- `POST /api/upload-chat-image` - 上传图像用于对话 +- `POST /api/chat` - 发送消息与AI对话关于图像 -本系统封装了百度相似图片搜索API的以下功能: -- 图片入库:`/upload` (POST) -- 图片检索:`/search` (POST) -- 图片删除:`/delete` (POST) -- 图片更新:`/update` (POST) -- 获取Token:`/api/token` (GET) +## 项目结构 -## 注意事项 +``` +imgsearcher/ +├── app/ +│ ├── api/ +│ │ ├── azure_openai.py # Azure OpenAI集成 +│ │ ├── baidu_image_search.py # 百度图像搜索API客户端 +│ │ ├── image_utils.py # 图像处理工具 +│ │ ├── type_manager.py # 基于JSON的类型管理器 +│ │ └── type_manager_mongo.py # 基于MongoDB的类型管理器 +│ ├── data/ +│ │ └── type_descriptions.json # 类型描述(JSON格式) +│ ├── static/ +│ │ ├── css/ # CSS样式表 +│ │ ├── js/ # JavaScript文件 +│ │ └── img/ # 静态图像 +│ └── templates/ +│ ├── index.html # 主应用页面 +│ └── chat.html # 对话界面页面 +├── uploads/ # 上传图像目录 +├── app.py # 主应用入口点 +├── migrate_types_to_mongo.py # 类型数据迁移脚本 +├── requirements.txt # Python依赖 +├── run.sh # 启动脚本 +└── .env # 环境配置 +``` -- 上传的图片最短边至少50px,最长边最大4096px -- 支持JPG、PNG、BMP格式的图片 -- 每个图片可以添加最多2个标签 -- 检索接口不返回原图,只返回入库时填写的brief信息 -- 图片删除可能会有延时生效(百度API特性) +## 开发 -## 许可证 +### 添加新的图像类型 + +要添加新的图像类型和描述,您可以: + +1. 使用Web界面上传带有新类型的图像 +2. 直接向MongoDB集合添加条目: + ```python + from app.api.type_manager_mongo import TypeManagerMongo + + manager = TypeManagerMongo() + manager.add_type("新类型名称", "新类型的详细描述") + ``` + +### 扩展对话功能 + +可以通过修改`app.py`中的`chat()`函数和`app/api/azure_openai.py`中的Azure OpenAI集成来扩展对话功能。 + +## 故障排除 + +- **MongoDB连接问题**:确保MongoDB正在运行,并且`.env`文件中的连接URI正确 +- **图像上传失败**:检查上传目录是否存在并具有适当的权限 +- **API认证错误**:验证`.env`文件中的API密钥和密钥 -MIT diff --git a/__pycache__/mock_baidu_api.cpython-39.pyc b/__pycache__/mock_baidu_api.cpython-39.pyc deleted file mode 100644 index 84696e3560b9839cf0107a5396cea5074d302345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3757 zcmd5<-ESOM6~A|8c6N5WaX$J%i`vxf17=ZUuN^08EE5_U6(UgsNn50aYBZTU-b}M! zxieE*Yb+7jBo0m~rA?ILCG4V7VySJ~sv%L5I)4HD0rS8Ecz5j=ctCv#t>BzHyOXuq z5i{o7L0!IXe#$jY}uje*T-*FXo!FKW?17ymED6_2%Mg{Y>-n!s?~7x&^A& zjU=odhw1JEViT}|z5WSdw&NNG#~ z%eRGhKUKDlecg1Jf3Rrg?ZdXot)u=RsBT*>F4bDRx^m+NT&;EbRD3ls8SZ6KknIfQ zC74gZbngSgXh00&5TMkPz-N?_w$HY~c4PjRjo&Ub&YX*W47`#1QV|R?Ov|!e*YL{6 z?2<7ux^ryT?mds~&1UyLwrBUQv7MtM!ooA%8H34;9HzT9hN^>?b;Cr3J0&ke zL&dcVQ%i)aVAQR>!_T-jcZb;yUOrOx9LpX4VVNI0Trn+s*eT{+;Ut?63saAv^9-}% z3{_qVHN$X9j%OHY^Z;rjl1f!N{a`OY4|Sv`Eg_2HFf^D6n8J$~Wkg(o%%~m>)S6T$ zvvejIC_y5SD~|-U@(7ce!V*;_AkWJ|a)K~5NWz&U)2bNdl>bc#j6TpFk*}Lqt~Y*C zi$dC%e-B}M?X_4YX7=;EJ07o4gK(WuF}j-!3sm^Be)$^-womjb9Z=SfcPRcXE+JVOW zNdRV#?O67Z?fJa4;bP3OJh+lbSU}?H&DR@?7ZBvvUu#~d#%I?cAY{@<_(rnb*Pp&? zG&{O$M|NyScJIK*$appjpNtYFg#Dp{28J@+GpCu18J<(LoqK-&{bZPQeF1rpRSV_3 z;jl1el}n!CI{8wl+nkrVVU?L3rXs%R=0R5ReUOx0kLMD|j&Uql8I2=;Lj88E!gRz( zzUK%}j+Kx1A;HV=%}5Z35y3hWrqD`p5=BHxlg%1UD-xBcPNh%M8glUW$@KP~5RVn` z6lhp`6p&~kz&itfA9v7h_X3bSnb82qq(R66LI>XmgO@#6C&r+{-vax&Put}|g*LWu1|m|-su$aDQOG@$e31@bI`fJ=-V zCQEcupnpjUrJ-yngEy9FuAN8dx$fMU$lE3R#R}i|6zKaKOfo&zGY6uE5#`a)M4@b% z1$W<2eEb%D^uMu{-w(eS+4Du@9*mcmx_mp3?;`UMko=SwfBBk7`iv}+JxsV(ncL!# z^ZwC4jz1}Kly8Cq8I||LS5D`)>lZwu02CatrE**Cwnu=-n{kcyeiQ;#ohI^2Rl7!VDOvM-srAjH3cq!M{ zHlyG`sl!6miHTF1Dn~vL*B3=A-R*A?@UOrLvQ?3{NeWF%Yq1~a$wnhJ^t=4%ud7rj+%aX~*81u-km8&l|-Z>BN(Mz&`=xq>oH8kuf0>?`< z>WE4NH__v6_q`3>F6~#C>Df`DGEm`SVv)2i321z(CKcLGVan0^Gl0^q#lphV8OX;# zK}>!IPy|H2ieP{j`8F7m{+n|%`|`t2ZS|K9!G=QD{(9GRr}imdp8FaRE= z@O8ap7Hz`_bpt9I^9#tQ4db|P7TP;W!(e60FgU)oaBLlX2a-`FSY4v>v;Gzw{}aMH oyI9sVsz{ouKdg`F4~d;gaKIisiekOahuTDB&OXG8D}a;uCx;|jWB>pF diff --git a/app/__pycache__/__init__.cpython-39.pyc b/app/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 0dee61c117024ec885a1a4078a470b1b830670c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmYe~<>g`k0@gcU(?x;wV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~CqbN$fb)S_bj z6y2iyr2LZ13QA#`t|GX_kQoSnM~>go(*UIJ$CW|LO#bz_aj4P1AO*46pS#bNOIv{%1NS5b5#80 zoD6?jR7z@2m5@g+MoQ6KRM1LME5&j#L90c*6wk#aVyTlvA}{0dZipEV229VwY()^^L}`Eh8|MfF9eP_&U_$3)fIY?gt8 zZ?2TbDtQ#u{dAV}1hiTNmjO$VKz+*OLnNm#g{kmYL$z`d7H2W0AChuWrh#$^KR#4* zxwWNgm4`;$4Io9-Q(;4DXzNID<-o!RueYw=yfb&Sb@Idc+2ixqkH4^WNB_D?aPds@ z!|CS!15gILooJhqrFpvTO5jc88H2+C1z&4%&2Y>*DLjTDLCGUq2RHKH5C> z3FnWTZ_MBPG@Fk5v|{^_F$)dGkDAqjvDcdLHLJ|3l|tF^@Q5vwNW+G$DnrCTa2tsn*wJgadck^AuUz4=zT7PZ-j( zKsdw$Lz<*h57((9HK<1$@-&&28VUoG+DRz*tU?qrDNAHKd7Rkm)`EZHy9+)hgPADq zH4vny+D~xhaB%js)|+p%=1#X72j;KOj+(ahQuH_j?2s65MeufFcr=ls?j=gC=}H^b)|Xia%Z$p`Djgbo!$LE z%cfOd!Tt6l;YdF=`s6yRoUbs;SGZ*|Kf)}mrDcx$@9SS{nrqX$3q?yDcvvh)wxkgX z3C$-3O|}9B(Gybb!6ir5&9~&-5Rvf{=e82ypyq?~l06ch-Z808u@;^lqhn+m&aN(d zazkb^Q>JNMfqtc-dH@G?)l=@K6 zx|8q#Y|fJN%A_O_9J`zD1S?aBlRP0!^hu-+(V>=t5pgH##RM-!-ko55EK!gBF2<7E z+tgaJ7AUaC9`|G1Ewm(jLdDteFc%mk2A~8^Fq}Dta5Qw zdwEB$bSylaW-#TVjozJY@zm{L_D|6Gqp!z=Ub=Kkf{RxdKDjiQ%BCq_1FWJ*_wXdp zej)^^(2o5z1_Matr9v41uwpv~w~7UGv}hTqsqM>vxV#6)EdvUeJBowj*oCs~nB~0X z%iycNvd0GORWY*LzGgBeWcX^8BS6bVaLU;5Yk5noJFN@%3pXv<)~UUBJ>O8G?Utw! z{~_w46dbF>A3{|00q%0?UDPWgq)BSsTbf_ zmneKaKq<5bsECxHE8yQNEthIPUgGWFFF%_X0D%+0gL~Kk?I*zbJ()=^;fXNedlOh_cV4tdw{KA53-f#)Os9xU<_LYf7D_%{56oF z))P)_kM1Qr-HWpy9FyxwFS#eq*6gJxB)-N=HWJeSA5M}z1noUItH@$FU|L67bb57Z++B!^KHznfWCMkIC8l8{)zU+-S{*( z`+n=MCl~*4dGU|$e!l;pi>9jU3%B13r37;gcQrJ1unBnd5dP+GPs5hqnLFb?6ONg= z7F?Kxv=|1@&z=pt;b_`Z9ezEyd?TDK+%OQ?nYOmN%gs|}nWegXb+9I<`cp!)*57Zo zZeD0kooHR01t`SeJTNeDXYNRI|IH8}Q6J2a?##XEN9+k3up&(%_*aUSAB6*f6w>h( z7cx1(W9u~sP%;JV{O3^ku@Ed=Ui4)sY7a2eF$YCsW>3``dn!yT9=khe5C+wHA>S(& z^5T>;h=OTaOFS3O)V~8@tA-hCKV+e_0L1vqP4Bb&gmudHN&aw zwaRub4%!3knUEh@In}9DjVdh4flQ`U>&t|hW#;R2*Ur?|Wb)&tlgU>~5V6qi?DaT# zJ2(CXY(;b&@*uEE{s<_)_zx&t3=;y^x^6p|h+jQ;H<+ZC@pZt&S7Gre7LP&UM_}oY zg!34-V0Ob3Sj4eU~qax zyC-VEB|2{y94{2%*@#mb!7AQax(aj^9)SXP+Qzej1yL;t@1vqUo#bGhgx`+^+6Etj z0up9%P3L$A@mIom4}d)le8*)9ozB1aE<@Xq@czy*66QKXMI>%tw_ss#nHTpkp+lFx bLVb~ZYfp#Ee+K2)*aVj)@wP8da)kaDD2QwF diff --git a/app/api/__pycache__/baidu_image_search.cpython-39.pyc b/app/api/__pycache__/baidu_image_search.cpython-39.pyc deleted file mode 100644 index 029623ee93c2cb04b72d543d4b5cc20815ea051c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9783 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 OA`e;E;$`42S@;J{eyOJb diff --git a/app/api/__pycache__/type_manager_mongo.cpython-39.pyc b/app/api/__pycache__/type_manager_mongo.cpython-39.pyc deleted file mode 100644 index cc15438b93f16ea10097bda47876e3faf41d4382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3145 zcmcIm?QaxC7@wKl+itH{I1mvGA&2pUmnetC1k)IUP()2y5?&Is(X7{PrHVYQOlw#Q$Kw+P$Nn{Aglg;`7Y*HrE$EXyPU_JF`2_ zJkR`o&&!m%yR!tI-!A?+xIIV6?>K3H6qsy>=Di3VC!9LOz&CSfl^KlUSaFo9YN(Xh z>M=seZo*ZbIZk-y7&9`Q?juEQ4x~wckw#s8Zf(%r=~V2Rk5k7jbCbKiU3=HUHSG_B z$#!VoYtY%mpqvedStt&=%61-~~`H`_oMG+)X*}-O;==*&P2kzVvhR)XCr=Zcz|yJqVQwZ6`GEP3U|wK{@4Yl8sO~R=5gd=ChC56B^ehDJ6af?+Do?a)lj(8Q0+moxxhzJ|4Xi-}p2>ePQ0_ zhcj0jXRjHZeS7+M?=cVTeSP@JDuT@idP*h7waU&R*YkU}Zrk$wwvy4EEbHB2_P^4% z%jl|92R*witV6aiR`~#s$!*UPmAYSXYhI+{r(g@Ho!3@q1F?{r65l!97#;s(`gCGU zJUUhAFX|CMRvSpXrj#ety z>(DACdBSSq1E$<}bNy(fo1nSko8}7G)WeP_Ihs?l6#E<-Uf*_V3B=}>goX6C9(02Y zH0cTmT1bT+GB1bG0OXP(aEp*uCl{%PEM5Pve! z7`@QA^h4vqRN|6}Kc;Ka!7F0W>q%$0gFG$b)l-=F=J7Ml8&eC`w9(yKwMfCM0?#z8 zKJD3l)YZ0re~}tmPzMHpEP)Bd$Od(eM7lNG$d#?bHTONo=7Tmbssi#1i8@o8L>}jw zu)VMz~%W%??vC!9A&w}uL7QTkm(_4H% zph`X_=?Dv%cqU{MkYhNV1TJI-Q-fbYBn9l@*?aNWh5v(wRK;G~4@7Mdk)AIWk^`X@ zU;n6a^>Sj%?EN$G?JwfXH{;QZ4`^y*xiq0w?htKdu=93I2 z38+&Q->xpkuN$4N>^KrYZ$C&S2zID+1zk&rH!eYNfxrSEMf_3>H^YQu%AgZOBDmo# zHlmC`EuWyF5<;~XIY5zZBO~kxi~vO?_yvU0^UXdu`^LUK{f+ZejWc)RyVLQBYyUQ@ z40&$Ngk)RpDafrRrsL_cL;o0hP&SZaZ@qhXl;Wer9LLPr<*mb=4M3Z0q-XmWhw`?=3=%LLWCBe}Zt7n#5? z1KSjDO*6`xaOdEGgX5fO9tq0M z{GSdJZo`&oij}aRgi}0$qjlJAz^;HD>TLs2T7~sepdDS%WT}Kg$@ILwMqdqmPS4A~ qMNMe1!04zSmG_?c3t4gp7g#0bvgLM<^p_H|Uq&@DhIDx|(%3)m=6{F)