From b86767d7bd25ba1196e312f1762cf1bdcf79b2b7 Mon Sep 17 00:00:00 2001 From: Laurent Mazuel Date: Fri, 4 May 2018 15:27:18 -0700 Subject: [PATCH] Visual Search Sample (#9) * Visual Search doc * Draft of samples * Complete example, not tested --- README.md | 2 + requirements.txt | 1 + samples/search/TestImages/image.jpg | Bin 0 -> 48873 bytes samples/search/visual_search_samples.py | 202 ++++++++++++++++++++++++ 4 files changed, 205 insertions(+) create mode 100644 samples/search/TestImages/image.jpg create mode 100644 samples/search/visual_search_samples.py diff --git a/README.md b/README.md index 0ef9f84..591004d 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ This project framework provides examples for the following services: * Using the **Bing Image Search SDK** [azure-cognitiveservices-search-imagesearch](http://pypi.python.org/pypi/azure-cognitiveservices-search-imagesearch) for the [Image Search API](https://azure.microsoft.com/services/cognitive-services/bing-image-search-api/) * Using the **Bing News Search SDK** [azure-cognitiveservices-search-newssearch](http://pypi.python.org/pypi/azure-cognitiveservices-search-newssearch) for the [News Search API](https://azure.microsoft.com/services/cognitive-services/bing-news-search-api/) * Using the **Bing Video Search SDK** [azure-cognitiveservices-search-videosearch](http://pypi.python.org/pypi/azure-cognitiveservices-search-videosearch) for the [Video Search API](https://azure.microsoft.com/services/cognitive-services/bing-video-search-api/) +* Using the **Bing Visual Search SDK** [azure-cognitiveservices-search-visualsearch](http://pypi.python.org/pypi/azure-cognitiveservices-search-visualsearch) for the [Visual Search API](https://azure.microsoft.com/services/cognitive-services/bing-visual-search-api/) * Using the **Bing Web Search SDK** [azure-cognitiveservices-search-websearch](http://pypi.python.org/pypi/azure-cognitiveservices-search-websearch) for the [Web Search API](https://azure.microsoft.com/services/cognitive-services/bing-web-search-api/) ### Vision @@ -83,6 +84,7 @@ We provide several meta-packages to help you install several packages at a time. 4. Set up the environment variable `IMAGESEARCH_SUBSCRIPTION_KEY` with your key if you want to execute ImageSearch tests. 4. Set up the environment variable `NEWSSEARCH_SUBSCRIPTION_KEY` with your key if you want to execute NewsSearch tests. 4. Set up the environment variable `VIDEOSEARCH_SUBSCRIPTION_KEY` with your key if you want to execute VideoSearch tests. +4. Set up the environment variable `VISUALSEARCH_SUBSCRIPTION_KEY` with your key if you want to execute VideoSearch tests. 4. Set up the environment variable `WEBSEARCH_SUBSCRIPTION_KEY` with your key if you want to execute WebSearch tests. 4. Set up the environment variable `COMPUTERVISION_SUBSCRIPTION_KEY` with your key if you want to execute Computer Vision tests. You might override too `COMPUTERVISION_LOCATION` (westcentralus by default). 4. Set up the environment variable `CONTENTMODERATOR_SUBSCRIPTION_KEY` with your key if you want to execute Content Moderator tests. You might override too `CONTENTMODERATOR_LOCATION` (westcentralus by default). diff --git a/requirements.txt b/requirements.txt index 8144a70..4f3482d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ azure-cognitiveservices-search-entitysearch azure-cognitiveservices-search-imagesearch azure-cognitiveservices-search-newssearch azure-cognitiveservices-search-videosearch +azure-cognitiveservices-search-visualsearch azure-cognitiveservices-search-websearch azure-cognitiveservices-vision-computervision azure-cognitiveservices-vision-contentmoderator diff --git a/samples/search/TestImages/image.jpg b/samples/search/TestImages/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57020d8760daca3144c7468b465ae860578b4912 GIT binary patch literal 48873 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
K**~0bMg;wOQgQ@r-SV!TQITD)|s2!?H24m z3h(s)0Exd3Z7RqywD_(VDFJ`ZEuR7eofEW;K zL~1J75+G{faRC`qliH$mxg;{S29tL!OiZ%*D%#(rBHP1`p?}$2cV(UkF0Peik)uQK6 zVhA}DvhQ*?CVg@$l||$yP4twP&i??J^BuRwD5E=Ww8^49@}|8HOZcbZE0zJJ^4R|X zdy4dlbd4T=zik;l>MM!8@E?V43vaMMeL%%K!Tph1s{2X$qrbG*v@5a+YDJJ96g154Sgru~=A9SB4;a7?+H_e+9ZK^@CzyLh)iv@yv4+v+ZK~vZ=8{c3 zBV+AZKAEqUBKWle9kWF}xjlC&uSwIqSEuR_tHU}HeNGJ?&H9a0i+VJArdl?^Y>NEi ze-ZeLz`EYHEm9PFx%OgYB&x>6g8{%Hfxxf6A=RwZe)3h^f7%toc;myGSBkX6ww85C zBXH4521Kav2bL(9%iu4Q54(oH-OiKkhicDZghocJRe%M#alLA8<5)|>zWB6Bk zggJfHx$};te`vYg?CkW^V#r~;xsN|6m8!wIBx83KgA+WC?#C?0CajcN!ckW{<0owk zrsNECpiJ%1dsQ69pz%!;5DDpypIV+@A@g~gyF#u{TF9Pr&TBQU=3~k0Ol*_ZoN2r2 zDO62pK-0S#KnTG!*Fr@%aVgJg=(0Jk?rz3TIHWlTnvU3=t6EPOBRQ@|qdOA3NiD7< zM&g|=UDc0K)9PwlD`};XQ4?`u00X%-^v;*?_6uPf>J7S5p!rM4LH^ghW}JPZT3wr{ z&BLvc<$e;;EpBcaOPNB2842C1>g!!YM2gu~D>YK18O23q;lB+=e8pX^MmyJ7+8&4G zfU^}i&tCQE!9puVuU2NGKO*!#C9zv^6GjF{JXf3e;`+tB7k3N*5xgEd6IU+ufQVvJxzIrlj57}dnLM(;7tks4yLBN@kNHE8@gJABaF8d z(6vdUYc(q~Q&N{gw@=)S-K)$dHj*Wf<$fHRr}1Uj)f^&U@zvHLZ7bdhvy63k>(CTgdN@cwW_d+jAzPe!qF6;hkIi zChet~)h2BGxl_e^)vv}2L&76O-+?3}o`)4Qi)dX{6astEb#d9*YI|~g zN6`!Jn|ygcU*%g7d_nM&H_ddTJu}68xqVxQ z80b;U=0SQGo-n8UD6f@e(c(|OynY6Xtvh}uP0z^n6^+VZM#uf2Gn$bgJxp!*@m(2h z9TySa$s1>bfI<3-qSwdF#^jt1th^fIaciO0n(jjcQj!PRjt8mhTd~q;0WVY)W+6nD-l4H4Aa!K;i2CCKl91zI**q5I}QqdXplxu~@p z+b(iI@7}f_#SYP`_0J!T7t?k=rS{SbfW|Pa2T;_e(cu7+xE;yOanfoNO*nZXCugCl z&Y>D?VHr?4!%}T}jU&|UBaFwphCRZXdd+67%rXvpiu2g@rEGwM80t8ymimge51)?M z9Q+XbEXJvJv&MhM&MPq+wI4GOUJu0>yf#_Ks5!mSOdOo|DQaO_FzQt#x(x9W!7 zXnr2K2klldHh;XJ*Ouzv2mBYP0$_pd-1C^vAC-FiH_=EweT($wuSFCOCg|?S_UVes z*4I_&Q%YN;{ZEST{sG(q=Fd5pj2?qn_nX z4St0@Hdg}@+oAU(HOA^*1MqIBj4mu7B#*uqYY)U$Qk-AKNk2zpNYkjk8qd;7=gihW z7<@fGJk^#K?lF;Gfn(#X0`30*bEvA5*}huJ)xT%m0#X{v@@P+?JBRCDU8sBr@inkN zWxIlJOyxDcPd;YCEA!I(!Cw%xXDltQ zlrQl_OApesZG3U#Jvqv??A(70tNt|oi+>E$8pTCFew>l|Yi)KTTq=%zDVJs!Z;=wq{>E@xWFEQ2YOIXi*wnmb!BM+D_@!&fdGm6)>5gkLWw$~I0jVB+ z-3S$@G9|?5U~8ww%bX9UD$@(pZd|^7Ij(Xyxsp6=&O3_7pY3SdgEEoRoKsHZ+Q(t% zCP9`GYIMKSj#cA7Oji#Ur*|6v0LREaqpezxSc$W~*K;4@+qS7(o0@l;W`TW>ZDTxl z73cE&IMb&s<-z5S#TymcLo^4>C3XYY9Gayo%a9|wbsm_-JNc5*d#j#5dGL~12{GT? z#z(7G9G(I3UYrBkYrDw)7UsSAC)7Z~%1(Ncb5?(}W<^shXxn`SS2ONs?4jD;j>pFy zCh+f!^_xV3`r0{~BbcUM8FSQogXv#0YW^41^sA35cuJGXlfYr@YxQbPa>dSkl0AiU z7xvmdw-4EFEj-mHfK=okP)9>g+EiOVlQ5}N%`c#ZGa6Y9>DQ7-O2E1(CR_EBxxqo+>yKbbx1pR8Lc-f)dKRdsOnqcm=Ul zqYa)L7^`gw>c=(6_uTDY4#xhM8Ae7`EPTbJS~9TdpyK*1n|ECbw{+Z9oEXz~>Y~Ex9{tx}7PcqpwYmK$bf~Hx=9THH&c~1`Mn! zz4Vqas|CFdM_kt-E#z_&u!kei(|1o(Yol)WSe7`6MLG4ajXXmY`rcf~V{hKMB-hfD zO>_bIK+kICE)+5S;^g-j=|oh-PCX&9}9*^K}65T$I(McE|K7L`=y#eNq;2ro}`W#oB z+S*SXd5%0*w(GsyU!We9gO6!-9RqU$&joBt+zp zG0z{BZ>9XZloVmcTZ&3jT}$PI=y|JXmx<39&M*)E0Ir(0x`O3aCOz|Bu$qOT;gJv2 zRgrSJ1!D??bF|a;k|)_iqdZD$ZAn>6D*%0}q?Z>E@=F@_`^Sw-WH}y(1XnbmN*gMn zN$#X`R;T2MbicgMF?~+uv5fsH#5%hqgr0}myUFxenM*3hNgUvc&xga7%vdtMK;v&b z)hRB-I8V9G{{X^3&U=OZ1 zHD2o?^;6pCc_y!Hj7Ii3Jc`hZRJ3vTm<-_aUO-miBpfnxj=8HVJdhKRK_@$i&MES) zmtTIx<01(=`ivXVbq-nEu9 zB9w|`VtU3%AD2q_UdzUQA+-vtcSHmGY~)3$}+h0$mX-LvX;kU5Y9#-By>ASsa0o;I9Wo2&=H!U zZFv?9mlmLH&(9g%gZN<9t+ck64h%Q3mH-{C@}7Nj%|lHZCcBcx^K#B`I2jyg=~{4I zD-xiV$M?EbxNW9VS;pc1$IZv#TTohBy2>o#Yk8X z8bt%Ay?O7JTLofd$8EsX)f&1+Std}YrZbUB%Krct-a9q+PU085T!E51RH>|7K-(ou zWc}{njc_S_djx{-o zHgQ=e0<9#E3Dmv_ zcxv!&g3eoZZs_;}@aDY3Q2m~@HHfvQp}3FXb^fBh-c3^G0sFudp5y!~?0VD5C?_p} z{5)2Qq}I&A(SzPA@;@r|PlNt9vde#F{h>#Aj(<)o&7@s_N{|PN=Gm9jGJduDMB0>6 z5(2S3vsl-VX;&$>TUf})JJd3o)mN8Qa|ecv^lcxKcAh`+b+H6$CO|qXo!`#AF2mzC zsSyI^(HwEOq1tQgT}$DQgY`np+FVLoIe3Q5epTU`zrZaqnnP)SEC={i#_?9AMq9?j z^5S8%@ALlvGQGFPKMlCV$vj!>k-Pak%FJrzE{-#3;4p+F@<5e zQT@ilenz}|Qt-yHV0PW$Tzt{IB~N|XABHM+ zjzj=QB64{c&3;u{-f9-E8ruG7NIV5{E79#fBlzaf0B?lKJ4m6A=Sk3#+Dqm*;-L40 zm!`kuevU;Q!CV`RjQ06yg3{D(XZf&sB<8*(vG~)err)(`=^*|i8x=p1uKwHO7J)k9 zmEbx4CEeHQQS7R&hU&cs_P+D!eO>e`cT$2%sVg@7(I(9>PzWnHnh2YuKEskMZxrM}Ry zmh>4FnR{UzcG8n`B%WH9#(I!5jw;hcG|MyUIzE?e_U&Haqyfsu3Sh}QkKs}2>TAn9 zL-BIrO*&P!xsOd(Z}nE-Nj}lpq~I^mSIHhBywt83T-?a!Ng38Sj&TYD@7&i4uA&Wu zoRiHt;Nv+dN=@15x+8^S3JS+BH@l2$3C;Ui}H4AiM_ zDo8geTK3IjU1ONwWQs5`wG=7i*A?XQ&%WT6e3CI*sW!Gbr3j{#?rK4^Xu$xE^{Ffy zkPr#?9V<54TXjF{FmYWHy2zjqG3rh$mQCF3f=zBuqT9>5&GRY80E%b!H;Lk4Be_{UiT?l^n@72)H2Xiy_2{OGRt)FM zQT@@9Yoa%LAScPU+Suio_w}y<^ZZwCaP~~#cTu0^RY!?tjlX|n;~lyFwN_midrNM< z^nEX9CgL|syVC}?%Wq;;*ysk~Q)?EPvl2)YuvKA| z03Iq542fp*o}rg?za^K|IzO ziW#RY@*@C0h;8?(5?mBuLSpdK*X{&=ewS{hpdWS%&)(Ss5WeX5cr`W|;Soe>+D zgF9i?pzqex1 zIABHw;nzQ%aaS5Pr2r-E-yhxsaQ!RnSpL*7UIOYnAr3L^j%otBT(I~H_GiT$j`;SgaNJzmzUbw2Bf645m3>=%qFCJwJ+x%t5k-NesvBJeF{}7$E!ZV(tK;COY+5ilh4a9$)8S5dW>42kclL+i>Ke= zzxwt0v@!w1R>hvJsoAz|?xc+RD-l_`OQSj?iFUM=&(fo5y5*!c2VE&ba zsmro{hh!_k{i}MPWkss#QpvF-dwD?nlAq{${sy#~Sy`}RhETv9#;0)~Lz?;W$He*t z{^g48CLi5wZ~QtM?X9oXR|zc8fH)kw{=ACkY5DxlxXCqrAED~|p&4H-z#|=x1Fr{~ zr7gLU2Ecx!whls2b$Nn z@fq^e{h*LX2ORV3US{nSD!Z;A=jadP)~LMsjS6o$BxDAE>5Nv9w?@&MSKTIhx@rWu z+a_{OMg>`n83@`39P^+509APeciN00F=Shwa0Goj@tV|GuO+%U<%EOTpN_J`h}%eHKkW<}ziWT0+P>?1sRy78NAj=KT}Q&&E#Pl9#wmZi z+X4KEuN~Ar6L@}5#ckdKazTyo2jR_btHGR-!qiVjza!;)Ump0T5(Lv3g7OvEo(HFs?+Ew<*) zNXYBG2&w|!$@7NVYbQnzX4m3su{9RzFYrFU)%+`KbWDf?lhkA|{4rijec;IAIcQXM z&l#^Owx3qDIkdl$KVam3mA;-Z@kCe>OB}#|eF6POE20i*TbVNnx>D7_uT4tRcvc{P z)nI3X(>0MNhMhU`@y~O`bj#yOco!CV_f{Z&MuXxlF5%A%r~RRt-))H(RW8x2C=E^ zac-MeJTWBVxU0FZE(tTsBMkH>iq(nyv3FLHMM_RQsddfoRSnLCCI3pc;*Do!e z$4irxRqlBvsX8NsjX?DyyZ=k<&r+CK2`2<+|_G~yO_t41_HL+W4&6oyN23JXN=(OJI{Rj8qK(#KRF#+ zCwOCl#b)8}>#DYfs%w)?9rg1*fbc!M4A15}hf|TBp_FF?dRHK_T`cYiWPQhQJoBDu znn#Iaw($VGP3|0_*g6~x5No2jnJ%>(sn$KKEUxOA$xz2Q(r~L&Tc>L?rd4B7 zl{K@AcV4Ayd8ClwvVJ^QS#FXXf1{IvIRw;@=$e$4=_GnwjJAh3BES1thMh`=CyYn`;cjxFpIZpa~| z!{Z-X)%#rYNDC}SJ#f1Rx??e1a$!u96MW6v4?*NGJaKr)d!5P41W6c$0iM zmNq|R)(ZM7aDPgZ{t=HJS`0&Z6yW~=32uK{_igqP>?PZG@p*~}{MNKS%Yv+vMtbCL zC@?(%#Zqs%9?BgRy&3b8-1x%OvANKMpmiv@$G^*2N5(KmE+(_MfP?BrKRj2~th$5> zpe{2QY~VKR`P*!w2jH?9zK6iYVOS4KGJ_RbHMFYv>QHQ={D4JCp1*lU;sAHJj^37K@vE)R{*>vi|@^rS6r@QGJ*4KARezov>|mR@_DzPxY-x9y!#Lc#Kr^iNMA` z8u=1^XUDcni=8=`V;M1L^;)2wJ$U|0jW{XjdmqT+ouW^+eQte;cOAiD<;1|S#y~mz z>yMHffxqXFHvs36pM2MZ!Q-tZw`b0WcLah)J^0ObPaFk8=e1|8hCvyY zAf%p|0=j5qv_cQtJ#Fp?~eJhEf_4tS%PKE+w~EK2r-C^~XBcMykgH~j*x-l!gylwm;k%@8dhV4(8^bS?j@O!TX>9dke zkc{UC=GuMhk-YeHR5`c11EB%1z~|go(rS?zT}yq^LkEbjY@T@^l|*g))B#}ucW}tr zJaNe6(a+q6MlAT+@4>p&zbhI{Kk1uu`Bw{ZX*?`E$l5Y|1dBn>FrN z-Vf1bcEz)%TLGas89v+!;V%3ECnnnDj&ZUo<~YXq z$%(P}WLK)`e-rdM;_|K~c=C7?F7^KazL%wZw|C(^e%+Y0qcB|MqanXewZ}^h#4ol; z-ZDEdApW(Rrw6v4hN`_-@2{#qO!R$f+F;FRssoX`YDliUcL1D7I|l&$WI{M?8_Tvav=T2sk7073mspkGxG{Hm&PSoPO?M<|)Tcy#BS#EIse4 ze}UHwV$n3$qrc{UpxNuTN)cqWYdoAOEww@I(~NrNwq(1ykgKJ{Oc;E}Zzt0PZi@vtNnX8uaD% zll%{_l2s%NfTC&a&f6vW=5!v;=@g2w;DmO43}!PnQvy zNB0|_`{aRC>~(lVN+1a+VUn_`UJq@{!ThSkH_PTQp4h>TLkA9{9rq04vu^zvqR@da zRPQenM&W=UfDh+W&263BFB~gAc?YgeK;pGl`dMK(yN*bXa3_hZw$tON%;|y5*{dx?J4LHjWmxeB_(3L=copM{Cjnw%e@sW~C_UuSCyBzlu#v_f{IqRMe z<`3&uqMu*9&h1}MxZby$NQxy5Y4(;3a9zxNeKXBfxxTeo8~qwM)bJDz2jf&OEp*sZ z=e|aA20=mzK7f;o#~x^mvl)T|(e|jv)04$&)9r6VB-Z!)&4s+PAU4(@ag5{n)ug(! zFSryZ&<;jxmV50zK2V}oToP4FaDKQSjXV2peV-+yg9PB54CAgs@+vu3^`Td2?1+Wi zYcO16mK#St_^R@0aFr*_g_MpPuRfXSTry3oyR$5j01wQFy+_pKj8dyeh{8sdw{6pB3!_dn8b$ zK+hSE1L@a_KG>PSkyH%h&G}A8)4f`oTWUk67rIBucb^DY9q>KGE7XP|_^&k7ejaP~ zRxeREO=y;4fc`hSIeA93JKE^(OcrH|e>$j{S}TwTY2 zGw7WgeABJmSt(<|AaF}C;QJ?41 zxF>5VN!!MKd8j_jg9RT4&>U5%6K|R6cDghY$`FX+9dg7E<)2#XA@Fs)j>akc#QqsJ z4WR!3wVsvY3k~XX<{m2a8n&rwK?I+n#afhDt!{_8ofl0wjNe4k3?G{y5_rHE1L|uS zSj%p~mO?h;1sAzKy(@>d@q5L?#@?WxTGJjTv$$eja-{Xj;;Qjsbb5ZD;$3pqGZnV2 za-i^4c>^4uU(&5#Yg+B{#LN3PTa zpT~Fj)_d8{AKoM8$-{N)+MzPqVFkp)5Z?(o53BVm2f%w*pR}q5BmoK!Rx>q0%$2G@AG9XoX6pVKp zvVMcstj6faca+6|f)pRHbBCPpR3(m4Pf#Qy-_JX0%2)Y%Jv zZ3qh*ylTX7if|9912vuYmSz#Q56$a=`sS73%5FuP^ueZ&vq0jSVg z_BWwRc2{3Gt^qhJxD)jiN>U>#6KNUhjfUx-jxk)&igx}1AjeQjXWKn0Q89=N#X4h; zl!yL&(O~BCHr&iI46>XqPUO%2f_eNa3V*ZDv`Q_c1n?wGAN+V^)1{WtVH+;vM*{#l zv~BbxW|B43q)6E<9(7aqqmVM-_Qy1=E^db}KZUd#gl0NyC5hz5cJcUEBXi&l37cxk zG)1~$w`1xEuV3<}4!&)hlY^8AwZ51bHGT%PED@o)h>_AfNPi{()6|z3K8McI_y+DC zZ8eN%vjV@K4Hfho&t+~D9YJz>q>!E5_rT65r*=oPr+w}7IWzWl=w5 z!bBX7SB(8dS9_ONP{0D+a=5FBIe5r99QyD*g<$^T(>3AAVZGC5O~G*L z%p8ArX(0XvumFwK`BFv*0Dt=F=r#^yVgVQ*d4C#L?9Daocb4s?oV!DYCxD+XKb=~5 zROCl@w~@697C8R^cw)Tk?G1s1S6p^D{KZ}V)7t0?vbP^k!yHt*-(*^G?s^J7uoM9d z%NhVgh(x4kRUR0q=V1R>-GFAW*tJ=07)V&0L~;M zulx%=YIN?`;%J|vHVjt`e6u)wleiY#Pv=!q%%*>Iz#M`=$Mf~5*HEx7M#WMF2bNp; z42sf@-gzR-Z6*}_#%ThN%Y*t;wC$rzJ;wD`DXdNg*1TcI%FMoD&!;qbGnh$;!!A!D zWH6pOB-pB7^uLZSc>e3O;Gq4}18S7B&w@dOZU!#ASic($W z;dkww8d z0#M-N&>T|cihV{VR)6|wS2xBdstT!BwpwBgzCXWo@q=@n_O|2LajB~&l=DVm$ zqcmnjRVO2BZ9bppioN!A4U>CshHv$G$r(PsE^7IuZ7uzJnes=i&z>*52c=vWDG!n8 zB5a?jR{oXem!A%=)E~24B$z*ShQp7oeTo(L6=D}0D`Yp`=O7$@l})S>6LQEiyBx7X zLG6YEBk4_4YkQfx5Pgq=?)){b+L7j1%Zz>H8@>Mkhc(YJnli}bpw0;C(!W6)PY73} zcmalU$S0gNHftF!qLMi+;B^Bd%#Jq5`jyEQqNyX6WWGTI?Sg9gQ(9Q>x}+2>KFb3(=J)ea7he>$!3h{{ZW3X5a(zjocpmS3Xq6z%ud=Ao0i2vvg_8Z4G0ItsV9CKT<8V zdr84kVVvjXbaA--3Ldr6L95)wxg(Uaj(oSsIQBL9KWBS2w4u>eU0a7=m4P0Hz0*$k zv*I)xE~jbK1NX+}KaNFZEIYQ2=R`4)zOlEV`UWoGkrn5K#^a2(I%m{>O0XSR0R*`R zjAtY1&THcww`1#E<&D${$ZhTiM$Z06 zLPt6J)$^)A#2>PN~cMKeM8--baDO)%|Ndx6zy#6>QutOnNUpYZuh}*k%Imh5d zTuX@^7#LX(`ygZU!Q!3YRdFP`XjzS>E(o@112OrD+6NtagNl{YQ6#B@Dh}WR7SE|0 zv6`VPEJH5_(m(}+ocnMykyT~6yDEH}xklbuLhf9CCyHy8?Wf`=&FV__su$-_2|lF` zM^2cmSz>@>pxVUz+gsQ0saEb#-@OftU}W&zdJt+qwnEV3Dvh2OZWq%yWW2qgZMTH#?X zHr%0M&KP8z`u3vM-B?$@RLaJ99hjZT$2r89{1X*KTS+8a(5#v25CA~;2bxLUfyzdM zj0Oh;{$1-PZBKYm{jy4`Y<@jIoobPjXsaw`B>n0HJRFg*pKtOiBWff#H!@_76^7-( zOGiooP^EJnTb=XPrrHWO~2I6Bs`1Nwnr0dXwzQRJP zIVb}ReiimQY4SNT#_?PL3H$#5H~sSblk}(>8Fqn|LOO(3T;$sXKx zAgQJp?OTv>^%eFd)|~~wVKPTAPDljt^{zqu5ux2Wgn-6R1g2B-IfD|%} z`V3Q|6M~=;MtH!_^RJp<)O8zn1txXJW61q$dM_4g$VTF_4{?v>R4!$6-;(B1F#K`O zS3UhJRx8NWK+ixr@t@23*NNMB-vD`*>_6RV=&ih0rN{s*7uknDohuqCuIH-#tq2ON z#2!j*Oa@xW3pz`FnDDcg0`{z-1yvEuK|>$J(SirL;wh%t;@@31%ngD6sjw$=*nv{{Yni zj_3aXuhyav*b*E9HjllW0gBF>Q!=R82pk-i>z`l_KRV|`!K4i>!xBaSBxCaEDcFZ4 z>UQ@&C>9|{_Nx(}-JQgz9_^pfubqFy_jbF@z>)^R{n7;7J=#1RSDHD2zEwqFPB}eu z_03X5cqDHve5~~-as07Bxu5(qJt1`+B_d^;NR&B0d(R{T{_79xMR~$aIGZxhaKPYT z$%CI!$Md3%M5X2U9UK=|D4}-~p4~@2#;^UN-OtZ%7pCHeZaZ{2u2C){kenuW9;4;O zXrTGFmtLJuTE|}Kq|wx`mdw6Xg9PBK41@2HR)Hz^qbHsUo!x$&tC?74L@ZdgPdGo) zt0m--xd1W|?T)`%j#d8v3~9{Hu|$SYm?v=gc)&f!`82tFf>1^j42Es_?VJjvx`ouC zeCAnDbUo_K&u)#kYk+Vwoa5>bH9m%y(6G@$(^mug`wO9&3pnbY~+Wy+Qt>w36mxn;tjh=WzLl=~=roRVHprsKX>%b{)X+ zxs-#0>5Tq$C)+JTGl1*6)p4}`wa6GDoQ=+#cVUKbbLumSv;;7z07{2%%19(1#)~^? zbP8JZXJ(57p=3BC8-lq%r%H*Q@dEh>%nu+pIs8{2%DAOTC1R|g`fbS1;nuoHE*jGU z8>b9N!P;;SvwGCoz3j`n^G8~cYOjF$a{xwE?HIxIFN%U&N5NS>KsYIq2tPx`Lm!EC zk0UR1Tyi;Vo_gastkdEvtSb31G(mx4=u2m&K?Gui2}&)-i* zpU%eK<65Wrm3f9NGzA!gf}bck<2hUkAy!DfNrZ=ttF8|p-C>H>7iVcyx5uE|2R@^w zYQ#xxDU3*|yBr1uN%|9xe;Su5tz{p=<)s$vrTEzAkDSsG<$?}y$orHJeATI8h>%gy zo494p@1QyBT|}Bx1}uqYO!|P){{WxHx%pDk*}*eJbTX=)`LW zEacjNalqwIu5viVa##9AoUEyJ1TMV`6b-@e+nV*09Or1Zx4d33Bys}e`l-!beFsvS zEX#Rd73*>-F`8I3QEIudP zf(7NG$^P6gv4`Mz{3}-b;qHqhW660foD8te@6B79^DEB)YmmS0WQO5;6@7%~*|AOg z8E%sN1ePWnHrL*LC8qpC@U_9oltC!Q460NA03J&9YYz}bKG`9hNx>&1N{!LQBx ztuIruJ8msyiH{#L9DaQ)U}J6_@nwCs<8NksKTg_ z{nk)9{5a;NeQE{+MA->(E$qF8)TK!}$%t}uS` z5aaT0YbQo)W%nH`6-r%g>V2Cn;FK0ImKn!P<2>~^HAFq1m{)r%1IXRDWcwaJD)B8l z#(G7=D2nzy?U91UHUsF~8tviK;FnmQEX_GzAnxpTt;q!MyAF+RZ7 zY*O3C>{?k7_iz-Fe>2v(c&_(nZLwVc01)Z;gIkbF-dgWqMh@V)&*7daTg|~_om!m!4#ZYOC#W& z&6OU<-l?_4@k5n{JY#7^1&96gO>CU4{$?+gu~7NVwE3(E=Ocmj$3yk1kEoBa?EhfcMYG8Pie(BPc$+Z6rZ_+mZopNXE=Q{KeV zEti;bc`PH^4}GBY{3`}1InQJ3UBrGA)Mpun-rxh*bWOnN#xq(o zcpt?85SB8@v~^zNuTBkYnlfqiJlZ=~n{$a)<0KNYK7U571%eo{z6l`QatQgC*QYd3 zr{CGWC)4GFkO_5V{c%eS(z7nva-%;l`R`jJD-$GlEJ;hWl~@2!zDV{Uoa5_45?ubjMo7dz-k3Y3(DNbPT{YKD&9VcKV%~?OA;2 zfXHS?;|Kkd{xk*kExd9D8I>1~jKvL4Ewso7?ze-27+@}acXLulJTAK}%1RjIG=t0h z%V+u3hP6nBWe*80%OEU20yxDM8HO#-8Bh*++Bc8P@m#(C0EYC-&FAcpyOGId=l=j4 z0~Oz>k;e_^6QA{i9X%?*Q{|sC2s?%4zTciFFezuvk91Ax4B?T#sYi1u;ld`oxXPZC>_ z9?VPr;|4#F!LBx2d7x}h1IBuM>yPJOpwUGF?E>8N;IYD=r)ti;lGX8AIMjiOte@fnu#)`mifcui$zahnWjK3=o z=ur9*kLOGQ4ruuYG?!D_qVWcqI{eop9Q16c`eUVameNBy2Z`fgFmM<*nKL{ zjzR7@{VA2qndofcH0)zAi>%=33*_sn7GR1lM$_db1%NH*@^B zr*d>Qo6I~H>66ZXofPP9Z6*7Yq=e%c?f6kl300&o^QJ&ORN(%#AY#ve+gSeqdxC2X zFVl>4_pJ}L7RMRKOjb52GjTlBOh^bFm>Rm1vaupef&e4e^Q=|5$jMMgKQT&LIXt{f>yeL`dV7kfV{OM{f=S~Bog=cAM+7h& ze7)&dtD50X&_T(@0Uc=??nprlSdQq~HOwnU&B@2VTC*kO%FB`;ZyfS*O4{f?W21*s zCpbXLdV|RN)_|VTllOtp{{XT4xvnVO#juYlke;|aenzY;!IeTu^&Jjrw8o@%GTXr* zR*jYOjD{m8>z_|*hc_c?lF5$4ryj<+B3v-sxc43FeJ^%}+~q+0YdwuGb7lu6hyWb_ z0JDNBSs_#i%FTjvoc{nip$+RM1Yocv!DpTu%18uK(wTVhnt z%zt*-?92LsI%cJjP%jbSgN>@$$n_bk&^4Tsg^FFr2a-0Arg~OI zKLR+TmUq~@#@mvZjtLHq2Rj`~kUpZRrmF?CfR@-tIY!<1cdPN)mu266%)^bNj=c2r ztrXMjVh(=Jr1ogQ1pQW_xGmkvN^exGLY^Xfl7<*J1w4ir2iJq%wr%e(oDVWpw;AZG zyFZRE{5{L2?*+4K5xtnR;SyeljScS!f?yn z{vC}Rs`u4Dz=D@lN)5(lFXp$&sv<;{hdmBDm!Pe2M|*n`D-Xtq^D_ILAF z{&`LO!R<(>#GU$cZQF+Oz;JO?n_VyHLyBws&pBvrVu&g$?Ee610bYH%;<#-`!dgxH z5hc7u+n+KO5wJd-aBJRdzpz$9g`VBdMPSMK6UAJcNZf_uUpy1kZESnwQSB0YHTV+g zU36>jJ}JBSaSHA!dhncN38TnAh{bvR?}IhVcV$S@VfVg6f_=bjewFuS)}JFNNtRx{ zn<{-W52a#VX`n~Uh)ClFO8)@$tD-eubB=gu_Obc%abtOG`)7hk&!eGV=T~gCeOAr0 zZ*?jG*fGHVmGIpw_9_ z^2;BIejtEiLX)riLkIM((#zstl0@^vTa5D2fZv{LpSth`rZWxG#!o=QaQ^@r;O{&e zuE6II`NRE=zmccQP4uxm_2bpE>Wd!`X?lQF=mEud7L!7tu(v`zKKJ8a zo^sns8Ig>S6vstLk#x_ZZD{_I@R@m;kqN%(%b+jz0rh-)^#%h!O;U zKr{TQuR`vhQ_wW;80yxsENO8*0X&AvpHG#uU2L8|*WV!B5r7ETHXqkHuL+b!Q!L4z zzcU}{LrE&ef;N{&~39S=k=zSq;@hWh|E-jWp=_$wZ&TDbCzlYb5yIpCKM(jRf zvE%UtabG4ysL8OZU=i1V?fITXNRr1X-7ZTX;%4Oj2DMMf&7^ylrr!f4!iR!u$Jznv@R2RI)tJ%ZI#gHKX61l%}10Y8^DblpUZKz2ji zINMEf^DbRuVbC49Kc6O$Xk<)X8|D%P1GWx-JQ~dxj-`SD@1K|d079;vV<>twV2p5g ze>~G;jy5Gv?*Q(@f%#L^O&CyII~*)eyFC?hKR#<@63d5VjgCneC8_TiSHP8&j)6f7 zRi!f|L>3!+k~ylmHYiV~Y4d~TLb3z@06i2naQA)!@YJl^pj0QkWT)sWzK%#ld2f`S z`?inB)Q@ul<7zaSIpl3Y@1C@1ON#7#_jmBt9G|ml48Dr$8}%5j7XJXiejvB#Vw85; z*eCEc^-Q-bA^DpFKXx!N_?n`!+s6L@Amsl5ca!?jWMttJ;=8RUSG8m3SjwPx+DQDx zVs2dEji$cmlz=xdKaV8-70cY|nqAmFb)anbEB;L@88{ywG6wHV^2q)g`fg7E=<}-; zV+rk{cFc zqbz?q>!2qip43r8DH|}8xxR+1Hvr@Nv{6}_qekD5Ki(h8w(LoE8;*F#Jkdoy<#r*x zL=qe*ABAHt`me@{Dj0V(ZTWMaeoPWd#s$eItzNVM#Bp6#u4$h;eBU=6`J#%_I}sz&;^D2x;Fag!n(FsAn{G0BCp1x9 z^7xMEdNg)giu^2t*qN-mC6n-{zcI2}tCm^pmr$o#dfFut}D6VI* zw^O0BX3BDY_9~6TFfD>c8;ns!DSS)Nxa`XFBAHZ`2Z7t#s?GAEk-^C1QAKU`QJ33h zwW_PR3>Kcy5_ z%lItCe;FF_ODkG}U5UqYSuV^Z>Uqw6=%TnIx!o;>UfaMe%XvwkU86O?MoY&qW4i;4 z^NJ|1MjNBfp3Jr)i|kPyi=C_5xlKp_MmXk*E2^gFBHQLQ;DPK@bV%9Ga-i4F9x1i9 zjHyUbPpYUN%8Du}{7k~O$nuf*{{RY*^=c@thH#?Fk^ms!*R^` z?2ejS{EtksX5ZBJuGtCl&ooh4z0TFK6GtDFG1@XQgNlaF=8dz?4|*u8V(d6G68R^C zTDHmxl0ZDsMQhlGHeb4@-m~rb-JWQonFm*DNs0Z97coS|OCpnj)Mkn*(9TC+cS&}m z6c9JDLVx?1E3sHMI8pWH{$;QSDya0T=aS!V#T|~x|S2FHU*iqDGy!vh>Bevd@QB<}wWiU?j&w88yHlF3VG*L*+>^97nk%>9y sy$ncsFnuVZm@_uuki!QV>x$5mgc#$BD5^x6j!yh%j8R1tnVa1I*%QR3E&u=k literal 0 HcmV?d00001 diff --git a/samples/search/visual_search_samples.py b/samples/search/visual_search_samples.py new file mode 100644 index 0000000..98a7464 --- /dev/null +++ b/samples/search/visual_search_samples.py @@ -0,0 +1,202 @@ +import json +import os.path + +from azure.cognitiveservices.search.visualsearch import VisualSearchAPI +from azure.cognitiveservices.search.visualsearch.models import ( + VisualSearchRequest, + CropArea, + ImageInfo, + Filters, + KnowledgeRequest, +) +from msrest.authentication import CognitiveServicesCredentials + +SUBSCRIPTION_KEY_ENV_NAME = "VISUALSEARCH_SUBSCRIPTION_KEY" + +CWD = os.path.dirname(__file__) +TEST_IMAGES = os.path.join(CWD, "TestImages") + +def search_image_binary(subscription_key): + """VisualSearchImageBinary. + + This will send an image binary in the body of the post request and print out the imageInsightsToken, the number of tags, the number of actions, and the first actionType. + """ + client = VisualSearchAPI(CognitiveServicesCredentials(subscription_key)) + + image_path = os.path.join(TEST_IMAGES, "image.jpg") + with open(image_path, "rb") as image_fd: + + # You need to pass the serialized form of the model + knowledge_request = json.dumps(VisualSearchRequest().serialize()) + + print("Search visual search request with binary of dog image") + result = client.images.visual_search(image=image_fd, knowledge_request=knowledge_request) + + if not result: + print("No visual search result data.") + return + + # Visual Search results + if result.image.image_insights_token: + print("Uploaded image insights token: {}".format(result.image.image_insights_token)) + else: + print("Couldn't find image insights token!") + + # List of tags + if result.tags: + first_tag = result.tags[0] + print("Visual search tag count: {}".format(len(result.tags))) + + # List of actions in first tag + if first_tag.actions: + first_tag_action = first_tag.actions[0] + print("First tag action count: {}".format(len(first_tag.actions))) + print("First tag action type: {}".format(first_tag_action.action_type)) + else: + print("Couldn't find tag actions!") + else: + print("Couldn't find image tags!") + +def search_image_binary_with_crop_area(subscription_key): + """VisualSearchImageBinaryWithCropArea. + + This will send an image binary in the body of the post request, along with a cropArea object, and print out the imageInsightsToken, the number of tags, the number of actions, and the first actionType. + """ + client = VisualSearchAPI(CognitiveServicesCredentials(subscription_key)) + + image_path = os.path.join(TEST_IMAGES, "image.jpg") + with open(image_path, "rb") as image_fd: + + crop_area = CropArea(top=0.1,bottom=0.5,left=0.1,right=0.9) + knowledge_request = VisualSearchRequest(image_info=ImageInfo(crop_area=crop_area)) + + # You need to pass the serialized form of the model + knowledge_request = json.dumps(knowledge_request.serialize()) + + print("Search visual search request with binary of dog image") + result = client.images.visual_search(image=image_fd, knowledge_request=knowledge_request) + + if not result: + print("No visual search result data.") + return + + # Visual Search results + if result.image.image_insights_token: + print("Uploaded image insights token: {}".format(result.image.image_insights_token)) + else: + print("Couldn't find image insights token!") + + # List of tags + if result.tags: + first_tag = result.tags[0] + print("Visual search tag count: {}".format(len(result.tags))) + + # List of actions in first tag + if first_tag.actions: + first_tag_action = first_tag.actions[0] + print("First tag action count: {}".format(len(first_tag.actions))) + print("First tag action type: {}".format(first_tag_action.action_type)) + else: + print("Couldn't find tag actions!") + else: + print("Couldn't find image tags!") + +def search_url_with_filters(subscription_key): + """VisualSearchUrlWithFilters. + + This will send an image url in the knowledgeRequest parameter, along with a \"site:www.bing.com\" filter, and print out the imageInsightsToken, the number of tags, the number of actions, and the first actionType. + """ + client = VisualSearchAPI(CognitiveServicesCredentials(subscription_key)) + + image_url = "https://images.unsplash.com/photo-1512546148165-e50d714a565a?w=600&q=80" + filters = Filters(site="www.bing.com") + + knowledge_request = VisualSearchRequest( + image_info=ImageInfo(url=image_url), + knowledge_request=KnowledgeRequest(filters=filters) + ) + + # You need to pass the serialized form of the model + knowledge_request = json.dumps(knowledge_request.serialize()) + + print("Search visual search request with url of dog image") + result = client.images.visual_search(knowledge_request=knowledge_request) + + if not result: + print("No visual search result data.") + return + + # Visual Search results + if result.image.image_insights_token: + print("Uploaded image insights token: {}".format(result.image.image_insights_token)) + else: + print("Couldn't find image insights token!") + + # List of tags + if result.tags: + first_tag = result.tags[0] + print("Visual search tag count: {}".format(len(result.tags))) + + # List of actions in first tag + if first_tag.actions: + first_tag_action = first_tag.actions[0] + print("First tag action count: {}".format(len(first_tag.actions))) + print("First tag action type: {}".format(first_tag_action.action_type)) + else: + print("Couldn't find tag actions!") + else: + print("Couldn't find image tags!") + +def search_insights_token_with_crop_area(subscription_key): + """VisualSearchInsightsTokenWithCropArea. + + This will send an image insights token in the knowledgeRequest parameter, along with a cropArea object, and print out the imageInsightsToken, the number of tags, the number of actions, and the first actionType. + """ + client = VisualSearchAPI(CognitiveServicesCredentials(subscription_key)) + + image_insights_token = "bcid_113F29C079F18F385732D8046EC80145*ccid_oV/QcH95*mid_687689FAFA449B35BC11A1AE6CEAB6F9A9B53708*thid_R.113F29C079F18F385732D8046EC80145" + crop_area = CropArea(top=0.1,bottom=0.5,left=0.1,right=0.9) + + knowledge_request = VisualSearchRequest( + image_info=ImageInfo( + image_insights_token=image_insights_token, + crop_area=crop_area + ), + ) + + # You need to pass the serialized form of the model + knowledge_request = json.dumps(knowledge_request.serialize()) + + print("Search visual search request with url of dog image") + result = client.images.visual_search(knowledge_request=knowledge_request) + + if not result: + print("No visual search result data.") + return + + # Visual Search results + if result.image.image_insights_token: + print("Uploaded image insights token: {}".format(result.image.image_insights_token)) + else: + print("Couldn't find image insights token!") + + # List of tags + if result.tags: + first_tag = result.tags[0] + print("Visual search tag count: {}".format(len(result.tags))) + + # List of actions in first tag + if first_tag.actions: + first_tag_action = first_tag.actions[0] + print("First tag action count: {}".format(len(first_tag.actions))) + print("First tag action type: {}".format(first_tag_action.action_type)) + else: + print("Couldn't find tag actions!") + else: + print("Couldn't find image tags!") + +if __name__ == "__main__": + import sys, os.path + sys.path.append(os.path.abspath(os.path.join(__file__, "..", ".."))) + from tools import execute_samples + execute_samples(globals(), SUBSCRIPTION_KEY_ENV_NAME) \ No newline at end of file