{"id":270,"date":"2021-10-13T13:28:38","date_gmt":"2021-10-13T13:28:38","guid":{"rendered":"http:\/\/liipetti.net\/retkia\/?p=270"},"modified":"2021-10-13T14:58:07","modified_gmt":"2021-10-13T14:58:07","slug":"neurokuvatreenit-harj-3","status":"publish","type":"post","link":"https:\/\/liipetti.net\/retkia\/neurokuvatreenit-harj-3\/","title":{"rendered":"Neurokuvatreenit, harj 3"},"content":{"rendered":"\n<p>T\u00e4h\u00e4nastisissa harjoituksissa olemme antaneet kuvan kehitty\u00e4 vertaamalla sit\u00e4 pikseli pikselilt\u00e4 tavoitteeseen. Malli n\u00e4ytt\u00e4\u00e4 toimivan, mutta yleisemmin siin\u00e4 on se ongelma, ett\u00e4 t\u00e4m\u00e4 malli ei oikeasti mittaa samankaltaisuutta. Ei tarvitse kuin siirt\u00e4\u00e4 pikseleit\u00e4 hieman sivuun, ja malli arvioi kuvan ihan erilaiseksi, vaikka se todellisuudessa n\u00e4ytt\u00e4\u00e4 ihan samalta.<br><br>Pikselikohtainen virhe on silti hy\u00f6dyllinen ja paljon k\u00e4yt\u00f6ss\u00e4, mutta sen rinnalla k\u00e4ytet\u00e4\u00e4n my\u00f6s muita tapoja. T\u00e4ss\u00e4 harjoituksessa otamme k\u00e4ytt\u00f6\u00f6n kaksi. SSIM (structural similarity) jossa lasketaan matemaattinen arvio vertailemalla kuvien rakennetta, ja ns. perceptual loss, jossa kuvaa tulkitsevan neuroverkon avulla mitataan, ei pikseleit\u00e4 vaan eri tasoisia piirteit\u00e4. Palaamme my\u00f6hemmiss\u00e4 harjoituksissa tarkemmin siihen miten neuroverkkoa voi k\u00e4ytt\u00e4\u00e4 tunnistamaan ja mittamaan kuvassa olevia piirteit\u00e4.<br><br>Saamme nuo molemmat vertailukeinot valmiina kirjasto-ohjelmina. Ne pit\u00e4\u00e4 ensin asentaa, se onnistuu parhaiten jollakin pakettihallintaohjelmalla, joista lis\u00e4\u00e4 asennusta k\u00e4sittelev\u00e4ss\u00e4 artikkelissa. Esim. komentorivill\u00e4<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pip install pytorch_msssim\npip install lpips\npip install scipy\npip install tqdm<\/pre>\n\n\n\n<p>Sin\u00e4ns\u00e4 ohjelmamme toimii edelleen saman kaavan mukaan kuin harjoituksessa 2. Luemme kaksi kuvaa sis\u00e4\u00e4n ja luomme tyhj\u00e4ksi alustetun tensorin ik\u00e4\u00e4nkuin kuvan kasvualustaksi. K\u00e4ymme mittaamaan samankaltaisuutta ja s\u00e4\u00e4d\u00e4mme kuvaa sen mukaan. Oleellisin ero on tavoitefunktiossa, jossa nyt k\u00e4yt\u00e4mme edell\u00e4 mainittuja funktioita. Painotamme my\u00f6s kumpaakin niist\u00e4 erikseen, jotta on helppo kokeilla mik\u00e4 vaikutus on rakenteellisella ja perseptuaalisella mittauksella.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"599\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/harj3-1.png\" alt=\"\" class=\"wp-image-278\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/harj3-1.png 852w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/harj3-1-300x211.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/harj3-1-768x540.png 768w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/harj3-1-213x150.png 213w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/harj3-1-150x105.png 150w\" sizes=\"auto, (max-width: 852px) 100vw, 852px\" \/><\/figure>\n\n\n\n<p>Mik\u00e4 koodissa sitten muuttuu? Tarvitsemme ainakin kaksi uutta parametria, jotta voimme painottaa mittaustapoja erikseen.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">parser.add_argument('--ssim', type=float, default=1, help='blend factor, 0 for none')\nparser.add_argument('--lpips', type=float, default=0, help='blend factor, 0 for none')<\/pre>\n\n\n\n<p>Meid\u00e4n my\u00f6s pit\u00e4\u00e4 ottaa kirjastot k\u00e4ytt\u00f6\u00f6n ohjelmassamme, ei riit\u00e4 ett\u00e4 ne on koneelle asennettu. N\u00e4ist\u00e4 ssim on suoraan valmis funktio k\u00e4ytt\u00f6\u00f6n tavoitefunktiossa, lpips:ilt\u00e4 taas ik\u00e4\u00e4nkuin haemme  halutunlaisen funktion ja nime\u00e4mme sen ploss.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">from pytorch_msssim import ssim\nimport lpips\n\nploss = lpips.LPIPS(net=\"alex\", spatial=True)<\/pre>\n\n\n\n<p>Tavoitefunktiota, siis virheen laskentaa, pit\u00e4\u00e4 my\u00f6s muuttaa. Laskemme virheen kumpaankin tavoitteeseen n\u00e4hden, painottaen kahta laskutapaa halutulla tavalla. Sitten laskemme virheet yhteen, painottaen j\u00e4lkimm\u00e4ist\u00e4 b-parametrin mukaan, kuten teimme kakkosharjoituksessakin. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    # calculate loss\n    loss1 = opt.ssim * (1 - ssim(imgT.unsqueeze(0), imgG.unsqueeze(0))) + opt.lpips * ploss(imgT.unsqueeze(0), imgG.unsqueeze(0)).mean()\n\n    loss2 = opt.ssim * (1 - ssim(imgT2.unsqueeze(0), imgG.unsqueeze(0))) + opt.lpips * ploss(imgT2.unsqueeze(0), imgG.unsqueeze(0)).mean()\n\n    loss2 = opt.b*loss2\n    \n    loss = loss1 + loss2\n\n    # run backwards to find gradient (how to change imgG to make loss smaller) \n    loss.backward()\n\n    # run optimizer to change imgT\n    optimizer.step()\n\n    # print loss to show how we are doing\n    print(i, loss.item(), loss1.item(), loss2.item())<\/pre>\n\n\n\n<p>Tarkasti katsoen huomaamme eron siin\u00e4 miten ssim ja lpips\/ploss k\u00e4sitell\u00e4\u00e4n. Joudumme laskemaan rakenteellisen virheen <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1 - ssim(kuva1, kuva2)<\/pre>\n\n\n\n<p>koska haluamme mitata eroa, mutta SSIM mittaakin samankaltaisuutta. Tied\u00e4mme my\u00f6s, ett\u00e4 SSIM on 1 silloin kun kuvat ovat samanlaiset, eli n\u00e4in laskien meill\u00e4 on virhefunktio joka l\u00e4hestyy nollaa mit\u00e4 paremmin kuvat muistuttavat toisiaan. <\/p>\n\n\n\n<p>Voi tuntua hankalalta, ett\u00e4 eri kirjastot ja niiden tarjoamat funktiot k\u00e4ytt\u00e4ytyv\u00e4t eri tavoin. T\u00e4ss\u00e4 funktiot mittaavat eri suuntaan ja niit\u00e4 k\u00e4ytet\u00e4\u00e4n muutenkin eri lailla. Olemme my\u00f6s huomanneet ett\u00e4 kuvien k\u00e4sittelyss\u00e4 joudumme normalisoimaan pikselien arvot eri tavoin ja v\u00e4lill\u00e4 muuttamaan niit\u00e4. Kannattaa suhtautua niin ett\u00e4 n\u00e4in vain on. Kuhunkin kirjastoon kannattaa perehty\u00e4 ja niiden k\u00e4ytt\u00f6\u00e4 voi itse kokeilla helpoilla esimerkeill\u00e4. Me kun kuitenkin tarvitsemme niit\u00e4 kirjastoja, juuri ne tekev\u00e4t t\u00e4m\u00e4n homman mahdolliseksi. Yleens\u00e4 noille valinnoille on hyv\u00e4t syyt.<\/p>\n\n\n\n<p>Katsotaanpa sitten millaista kuvaa n\u00e4m\u00e4 tekev\u00e4t. K\u00e4ytet\u00e4\u00e4n testikuvina n\u00e4it\u00e4 kahta. Kokeillaan sitten SSIMi\u00e4 kumpaankin erikseen ja sitten molempiin yhdess\u00e4. <\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test-1-150x150.png\" alt=\"\" data-id=\"290\" data-full-url=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test-1.png\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/test-1\/\" class=\"wp-image-290\"\/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2-150x150.png\" alt=\"\" data-id=\"282\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/test2\/\" class=\"wp-image-282\"\/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<figure class=\"wp-block-gallery columns-3 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-ssim-140.jpg\" alt=\"\" data-id=\"283\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t1-ssim-140\/\" class=\"wp-image-283\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-ssim-140.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-ssim-140-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-ssim-140.jpg\" alt=\"\" data-id=\"286\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t2-ssim-140\/\" class=\"wp-image-286\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-ssim-140.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-ssim-140-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssim-140.jpg\" alt=\"\" data-id=\"287\" data-full-url=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssim-140.jpg\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t1t2-ssim-140\/\" class=\"wp-image-287\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssim-140.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssim-140-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Ja sitten LPIPS vastaavasti. Se tuntuu ainakin vaativan huomattavasti enemm\u00e4n iteraatioita ja mahdollisesti tarkemmin s\u00e4\u00e4detyn koulutustahdin p\u00e4\u00e4st\u00e4kseen l\u00e4hellek\u00e4\u00e4n valmista kuvaa. V\u00e4h\u00e4n vaikuttaa silt\u00e4kin ett\u00e4 LPIPS tunnistaa hyvin kuvissa olevia pieni\u00e4 piirteit\u00e4 mutta ei oikein hahmota isoa kokonaisuutta. Voi siis hyvin olla, ett\u00e4 se sopii paremmin k\u00e4ytett\u00e4v\u00e4ksi yhdess\u00e4 jonkin muun tavan kanssa, vaikkapa pikselikohtaisen eron tai SSIM:in.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-3 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-lpips-1990.jpg\" alt=\"\" data-id=\"291\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t1-lpips-1990\/\" class=\"wp-image-291\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-lpips-1990.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-lpips-1990-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-lpips-1610.jpg\" alt=\"\" data-id=\"292\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t2-lpips-1610\/\" class=\"wp-image-292\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-lpips-1610.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-lpips-1610-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-lpips-1780.jpg\" alt=\"\" data-id=\"293\" data-full-url=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-lpips-1780.jpg\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t1t2-lpips-1780\/\" class=\"wp-image-293\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-lpips-1780.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-lpips-1780-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Ja nyt sama viel\u00e4 niin ett\u00e4 molemmat menetelm\u00e4t ovat k\u00e4yt\u00f6ss\u00e4. Ja samantien on huomautettava ett\u00e4 eri asetuksilla (painotukset ja koulutustahti) tulokset muuttuvat ja vain kokeilemalla lopulta tiet\u00e4\u00e4 kuinka paljon. T\u00e4ss\u00e4 nyt ssim 300 ja lpips 1, jolloin ssim aluksi s\u00e4\u00e4t\u00e4\u00e4 kuvan alustavsti kohdalleen ja sitten kun ssim:in virhe on tarpeeksi pieni, lpips p\u00e4\u00e4see vaikuttamaan hienos\u00e4\u00e4t\u00f6\u00f6n.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-3 is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-ssimlpips-460.jpg\" alt=\"\" data-id=\"294\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t1-ssimlpips-460\/\" class=\"wp-image-294\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-ssimlpips-460.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1-ssimlpips-460-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-ssimlpips-670.jpg\" alt=\"\" data-id=\"295\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t2-ssimlpips-670\/\" class=\"wp-image-295\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-ssimlpips-670.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t2-ssimlpips-670-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"256\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssimlpips-350.jpg\" alt=\"\" data-id=\"296\" data-full-url=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssimlpips-350.jpg\" data-link=\"https:\/\/liipetti.net\/retkia\/index.php\/2021\/10\/13\/neurokuvatreenit-harj-3\/t1t2-ssimlpips-350\/\" class=\"wp-image-296\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssimlpips-350.jpg 256w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/t1t2-ssimlpips-350-150x150.jpg 150w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Kaikki lpips:i\u00e4 k\u00e4ytt\u00e4en syntyv\u00e4t kuvat j\u00e4\u00e4v\u00e4t varsin keskis\u00e4vyisiksi, harmaiksi. T\u00e4t\u00e4 ei nyt kannata pys\u00e4hty\u00e4 ihmettelem\u00e4\u00e4n. On mahdollista ja aika todenn\u00e4k\u00f6ist\u00e4kin, ett\u00e4 LPIPS neuroverkkopohjaisena on herkempi kuvan arvoalueen suhteen kuin SSIM, ja ehk\u00e4 vaatisi sille sy\u00f6tetyn kuvan pikselinarvojen s\u00e4\u00e4t\u00f6\u00e4. <br><\/p>\n\n\n\n<p>Tarvittaessa my\u00f6s valmiin kuvan kirkkautta\/kontrastia tai histogrammiakin voi s\u00e4\u00e4t\u00e4\u00e4 tarpeen mukaan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4h\u00e4nastisissa harjoituksissa olemme antaneet kuvan kehitty\u00e4 vertaamalla sit\u00e4 pikseli pikselilt\u00e4 tavoitteeseen. Malli n\u00e4ytt\u00e4\u00e4 toimivan, mutta yleisemmin siin\u00e4 on se ongelma, ett\u00e4 t\u00e4m\u00e4 malli ei oikeasti mittaa samankaltaisuutta. Ei tarvitse kuin siirt\u00e4\u00e4 pikseleit\u00e4 hieman sivuun, ja malli arvioi kuvan ihan erilaiseksi, vaikka se todellisuudessa n\u00e4ytt\u00e4\u00e4 ihan samalta. Pikselikohtainen virhe on silti\u2026<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/liipetti.net\/retkia\/neurokuvatreenit-harj-3\/\">Continue reading<i class=\"crycon-right-dir\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-270","post","type-post","status-publish","format-standard","hentry","category-neurokuvatreenit"],"_links":{"self":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/270","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/comments?post=270"}],"version-history":[{"count":10,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/270\/revisions"}],"predecessor-version":[{"id":299,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/270\/revisions\/299"}],"wp:attachment":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/media?parent=270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/categories?post=270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/tags?post=270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}