path-foundation-demo / web /123.8afe2adc6a675877.js
lirony's picture
v1
960a64d
"use strict";(self.webpackChunkviewer=self.webpackChunkviewer||[]).push([[123],{123:(P,m,o)=>{o.r(m),o.d(m,{DemoIntroComponent:()=>F});var c=o(7060),f=o(3881),_=o(9417),s=o(9969),u=o(177),b=o(9454),C=o(6493),p=o(4119),e=o(4438),h=o(2168);const k=n=>({"slide-up":n}),v=(n,g,i)=>({"future-content":n,"slide-in":g,"slide-up":i}),d=(n,g)=>({"future-content":n,"slide-in":g});var l=function(n){return n[n.Intro=0]="Intro",n[n.Demos=1]="Demos",n[n.DigitalPathology=2]="DigitalPathology",n[n.OutlierTissueDetector=3]="OutlierTissueDetector",n[n.ClassifierTissueDetector=4]="ClassifierTissueDetector",n[n.SimilarTissueWithLinearProbe=5]="SimilarTissueWithLinearProbe",n[n.SimilarTissueWithLinearProbeResults=6]="SimilarTissueWithLinearProbeResults",n}(l||{});let F=(()=>{class n{constructor(i,r,t){this.embeddingsService=i,this.router=r,this.route=t,this.isMinimized=!1,this.selectedDemo=null,this.demoType=c.Y,this.windowMinValue=.5,this.windowMaxValue=.7,this.options={floor:0,ceil:1,step:.1},this.slides=l,this.currentContent=l.Intro}ngOnInit(){this.route.queryParams.subscribe(i=>{const r=i.content;r&&(this.currentContent=+r)})}selectDemo(i){this.selectedDemo=i,this.embeddingsService.setup(i),this.currentContent=i==c.Y.OutlierTissueDetector?l.OutlierTissueDetector:l.ClassifierTissueDetector}go(){this.router.navigate(["/viewer"],{queryParams:{series:`${p.c.IMAGE_DICOM_STORE_BASE_URL}${p.c.DEFAULT_SERIES_TO_LOAD}`,x:.01158,y:-.0272,z:.75}})}nextContent(i){this.currentContent=i}static{this.\u0275fac=function(r){return new(r||n)(e.rXU(c.w),e.rXU(h.Ix),e.rXU(h.nX))}}static{this.\u0275cmp=e.VBU({type:n,selectors:[["demo-intro"]],decls:132,vars:20,consts:[[1,"backdrop"],[1,"dialog-container","dialog-content"],[1,"dialog-content","dialog-text",3,"ngClass"],[1,"icon-container"],["src","https://developers.google.com/static/health-ai-developer-foundations/images/path-foundation-logo_480.png","alt","Microscope Icon",1,"main-icon"],[1,"dialog-text"],[1,"bullet-points"],[1,"secondary-text"],[2,"text-decoration","underline"],[1,"see-what-this-means","margin-top"],["src","assets/down-arrow.svg",1,"clickable",3,"click"],[1,"dialog-text","dialog-content",3,"ngClass"],[1,"horizontal","spaced-evenly"],[1,"clickable","demo-rectengular",3,"click"],["src","assets/outlier.svg"],[1,"medium"],[1,"vertical-bar"],["src","assets/classifier.svg"],[1,"light-text","margin-top"],[1,"horizontal","light-text","small-text"],["target","_blank","rel","noopener noreferrer","href","https://developers.google.com/health-ai-developer-foundations/path-foundation",1,"link"],["src","assets/external-link.svg"],[1,"link",3,"click"],["target","_blank","rel","noopener noreferrer","href","https://developers.google.com/health-ai-developer-foundations",1,"link"],["src","assets/down-arrow.svg",1,"clickable","flip-vertical",3,"click"],[1,"horizontal","spaced-evenly",2,"margin","auto"],["src","assets/outlier-screenshot.jpg",1,"screenshot-image"],[2,"min-width","50px"],[2,"text-align","left"],[1,"big"],[1,"blue-button",3,"click"],["src","assets/classifier-screenshot.jpg",1,"screenshot-image"],[1,"big",2,"margin-bottom","0"],[1,"horizontal"],[1,"small-text",2,"text-align","left"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/pathology/transformation_pipeline"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/ilm"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/EZ-WSI-DICOMweb"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/pathology/viewer"],["target","_blank","rel","noopener noreferrer","href","https://github.com/GoogleCloudPlatform/medical-imaging/tree/main/pathology/dicom_proxy"],["src","assets/dpas.png",2,"margin","auto"]],template:function(r,t){1&r&&(e.nrm(0,"div",0),e.j41(1,"div",1)(2,"div",2)(3,"div",3),e.nrm(4,"img",4),e.k0s(),e.j41(5,"div",5)(6,"span"),e.EFF(7," Path Foundation accelerates AI development for histopathology image analysis. The model uses self-supervised learning on large amounts of digital pathology data to produce embeddings that capture dense features relevant for histopathology applications, such as: "),e.j41(8,"ul",6)(9,"li"),e.EFF(10,"Data-efficient classification"),e.k0s(),e.j41(11,"li"),e.EFF(12,"Similar image search"),e.k0s(),e.j41(13,"li"),e.EFF(14,"Outlier detection"),e.k0s()()(),e.j41(15,"div",7)(16,"span",8),e.EFF(17,"Disclaimer"),e.k0s(),e.j41(18,"span"),e.EFF(19,": This interface is for demonstration purposes only. Path Foundation is able to supply the capabilities but you will need to build the interface. "),e.k0s()()(),e.j41(20,"div",9)(21,"span"),e.EFF(22,"See what this means"),e.k0s(),e.nrm(23,"br"),e.j41(24,"img",10),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s()()(),e.j41(25,"div",11)(26,"p"),e.EFF(27,"Select a demo to see how this model could be used"),e.k0s(),e.j41(28,"div",12)(29,"div",13),e.bIt("click",function(){return t.selectDemo(t.demoType.OutlierTissueDetector)}),e.nrm(30,"img",14),e.j41(31,"div",15),e.EFF(32,"Outlier Tissue Detector"),e.k0s(),e.j41(33,"div",7),e.EFF(34," Outlier tissue is identified by calculating the Euclidean distance in embedding space between tissue embeddings and a precomputed set of background embeddings. "),e.k0s()(),e.nrm(35,"div",16),e.j41(36,"div",13),e.bIt("click",function(){return t.selectDemo(t.demoType.SimilarTissueWithLinearProbe)}),e.nrm(37,"img",17),e.j41(38,"div",15),e.EFF(39,"Path Classification"),e.k0s(),e.j41(40,"div",7),e.EFF(41," Patch classifier is trained using embeddings for target patches of interest and precomputed background embeddings. This classifier is then applied to patches in the field of view. "),e.k0s()()(),e.j41(42,"span",18),e.EFF(43,"Learn more"),e.k0s(),e.j41(44,"div",19)(45,"a",20),e.EFF(46,"Path Foundation Model "),e.nrm(47,"img",21),e.k0s(),e.nrm(48,"div",16),e.j41(49,"div",22),e.bIt("click",function(){return t.nextContent(t.slides.DigitalPathology)}),e.EFF(50," Digital Pathology "),e.k0s(),e.nrm(51,"div",16),e.j41(52,"a",23),e.EFF(53,"Other HAI-DEF Models "),e.nrm(54,"img",21),e.k0s()()(),e.j41(55,"div",11)(56,"img",24),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s(),e.j41(57,"span"),e.EFF(58,"Go back"),e.k0s(),e.j41(59,"div",25),e.nrm(60,"img",26)(61,"div",27),e.j41(62,"div",28)(63,"p",29),e.EFF(64,"Outlier Tissue Detection"),e.k0s(),e.j41(65,"p"),e.EFF(66," In this demo, tissue patches are compared to randomly selected background patches from non-tumor specimens of the same dataset. "),e.k0s(),e.j41(67,"p"),e.EFF(68," Using a Euclidean distance measurement from the nearest background embedding vector, potential outlier tissue patches are highlighted in red. "),e.k0s(),e.j41(69,"div",30),e.bIt("click",function(){return t.go()}),e.EFF(70,"Try it"),e.k0s()()()(),e.j41(71,"div",11)(72,"img",24),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s(),e.j41(73,"span"),e.EFF(74,"Go back"),e.k0s(),e.j41(75,"p",29),e.EFF(76,"Tissue Classification"),e.k0s(),e.j41(77,"div",12),e.nrm(78,"img",31)(79,"div",27),e.j41(80,"div",28)(81,"p"),e.EFF(82," In this demo, you will train a classifier for a specified target tissue. You will be able to annotate the target tissue and then train a classifier to distinguish the annotated tissue from the background. "),e.k0s(),e.j41(83,"p"),e.EFF(84," After training the classifier with a single click in the browser, you can analyze all tissue patches in the field of view. Patches matching your target tissue are highlighted in red, with cyan and blue indicating lower confidence scores for the target tissue. "),e.k0s()()(),e.j41(85,"div",30),e.bIt("click",function(){return t.go()}),e.EFF(86,"Try it"),e.k0s()(),e.j41(87,"div",11)(88,"img",24),e.bIt("click",function(){return t.nextContent(t.slides.Demos)}),e.k0s(),e.j41(89,"span"),e.EFF(90,"Go back"),e.k0s(),e.j41(91,"p",32),e.EFF(92," Open Source Tools for Advancing Digital Pathology "),e.k0s(),e.j41(93,"div",33)(94,"div",34)(95,"span"),e.EFF(96,"This demo was built using open-source tools built by Google."),e.k0s(),e.j41(97,"p")(98,"b"),e.EFF(99,"DICOM ensures interoperability"),e.k0s(),e.EFF(100," Google's Healthcare API DICOM Store manages these images, and Google Research's "),e.j41(101,"a",35),e.EFF(102,"Transformation Pipeline"),e.k0s(),e.EFF(103," ingests various image formats into it. "),e.k0s(),e.j41(104,"p")(105,"b"),e.EFF(106,"Cost efficiency using Image Lifecycle Management"),e.k0s(),e.EFF(107," Google Research's "),e.j41(108,"a",36),e.EFF(109,"ILM tool"),e.k0s(),e.EFF(110," automates storage tiering for cost optimization, and IaC via terraform enables reliable deployments. "),e.k0s(),e.j41(111,"p")(112,"b"),e.EFF(113,"Effortlessly work with DICOMWeb"),e.k0s(),e.j41(114,"a",37),e.EFF(115,"EZ WSI DicomWeb"),e.k0s(),e.EFF(116," is a python library that provides the ability to effortlessly extract an image patch from a pathology DICOM and generate embeddings. "),e.k0s(),e.j41(117,"p")(118,"b"),e.EFF(119,"Zero Footprint DICOMWeb Pathology Viewer"),e.k0s(),e.EFF(120," A "),e.j41(121,"a",38),e.EFF(122,"web-based application"),e.k0s(),e.EFF(123," for visualizing and annotating DICOM pathology images, compatible with any DICOMweb server and accessible on all devices with a browser. Used in this demo. "),e.k0s(),e.j41(124,"p")(125,"b"),e.EFF(126,"Optimizing DICOMweb for Digital Pathology"),e.k0s(),e.EFF(127," The "),e.j41(128,"a",39),e.EFF(129,"Digital Pathology DICOM Proxy Server"),e.k0s(),e.EFF(130," enhances DICOMWeb by adding just-in-time frame caching for faster whole slide imaging, enhanced JPEGXL transcoding for efficient image delivery, and ICC color profile transformations for consistent and optimized image visualization. "),e.k0s()(),e.nrm(131,"img",40),e.k0s()()()),2&r&&(e.R7$(2),e.Y8G("ngClass",e.eq3(5,k,t.currentContent>t.slides.Intro)),e.R7$(23),e.Y8G("ngClass",e.sMw(7,v,t.currentContent<=t.slides.Demos,t.currentContent===t.slides.Demos,t.currentContent>t.slides.Demos)),e.R7$(30),e.Y8G("ngClass",e.l_i(11,d,t.currentContent<=t.slides.OutlierTissueDetector,t.currentContent===t.slides.OutlierTissueDetector)),e.R7$(16),e.Y8G("ngClass",e.l_i(14,d,t.currentContent<=t.slides.ClassifierTissueDetector,t.currentContent===t.slides.ClassifierTissueDetector)),e.R7$(16),e.Y8G("ngClass",e.l_i(17,d,t.currentContent<=t.slides.DigitalPathology,t.currentContent===t.slides.DigitalPathology)))},dependencies:[f.Ez,_.YN,u.MD,u.YU,b.MY,C.Ti],styles:["[_nghost-%COMP%]{position:fixed;display:flex;justify-content:center;align-items:center;width:100vw;height:100vh}.clickable[_ngcontent-%COMP%]{cursor:pointer}.backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:900}.dialog-container[_ngcontent-%COMP%]{background-color:#fff;border-radius:12px;box-shadow:0 2px 4px #0000001a;padding:30px 40px;text-align:left;position:relative;border:2px solid #dee2e6;z-index:1000;overflow:hidden;font-size:20px;font-family:Google Sans;font-weight:400;word-wrap:break-word}.dialog-content[_ngcontent-%COMP%]{text-decoration:none;width:800px;height:600px;padding:30px 40px;text-align:left;position:relative;line-height:1.5;color:#000;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center}.margin-top[_ngcontent-%COMP%]{margin-top:auto}.secondary-text[_ngcontent-%COMP%]{font-size:14px}.light-text[_ngcontent-%COMP%]{color:#707070}.future-content[_ngcontent-%COMP%]{position:absolute;top:0;left:0;transform:translateY(800px);opacity:0}.slide-in[_ngcontent-%COMP%], .slide-up[_ngcontent-%COMP%]{transition:transform .5s ease,opacity .5s ease}.slide-up[_ngcontent-%COMP%]{transform:translateY(-600px);opacity:0}.slide-in[_ngcontent-%COMP%]{transform:translateY(0);opacity:1}.slide-down[_ngcontent-%COMP%]{transform:translateY(600px);opacity:0}.icon-container[_ngcontent-%COMP%]{width:120px;height:120px;border-radius:50%;border:2px solid #A7A7A7;background-color:#fff;margin:0 auto 20px;display:flex;justify-content:center;align-items:center;position:relative}.icon-container[_ngcontent-%COMP%] img.main-icon[_ngcontent-%COMP%]{max-width:60%;max-height:60%;z-index:2}.icon-container[_ngcontent-%COMP%] img.sub-icon[_ngcontent-%COMP%]{position:absolute;top:-5px;left:-5px;width:35px;height:35px;z-index:1;border-radius:50%}.dialog-text[_ngcontent-%COMP%]{margin-bottom:20px;line-height:1.5;color:#000}.bullet-points[_ngcontent-%COMP%]{list-style:disc;margin-bottom:1rem}.bullet-points[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin-bottom:.5rem;color:#212529}.see-what-this-means[_ngcontent-%COMP%]{color:#707070;text-align:center}.arrow-down[_ngcontent-%COMP%]{font-size:1.8rem;color:#ced4da;cursor:pointer}.big[_ngcontent-%COMP%]{color:#000;font-family:Google Sans;font-size:32px;font-style:normal;font-weight:400;line-height:normal}.medium[_ngcontent-%COMP%]{color:#000;font-family:Google Sans;font-size:24px;font-style:normal;font-weight:400;line-height:normal}.small-text[_ngcontent-%COMP%]{font-size:14px}.future-content[_ngcontent-%COMP%]{text-align:center}.soft-button[_ngcontent-%COMP%]{border-radius:146.875px;border:1.469px solid var(--Grey-300, #DADCE0);margin:auto;width:100px;cursor:pointer}.demo-rectengular[_ngcontent-%COMP%]{width:300px;height:400px;flex-shrink:0;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center;padding:0 10px}.demo-rectengular[_ngcontent-%COMP%]:hover{border-radius:20px;background:#fff;box-shadow:0 0 8px #00000040}.demo-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-around}.flip-vertical[_ngcontent-%COMP%]{transform:scaleY(-1)}.blue-button[_ngcontent-%COMP%]{border-radius:141.176px;background:#0b57d0}.horizontal[_ngcontent-%COMP%]{display:flex}.spaced-evenly[_ngcontent-%COMP%]{justify-content:space-evenly;width:100%}.link[_ngcontent-%COMP%]{text-decoration-line:underline;text-decoration-style:solid;color:#707070}.vertical-bar[_ngcontent-%COMP%]{height:100%;width:1px;background-color:#aaa;margin:0 5px;cursor:pointer}.screenshot-image[_ngcontent-%COMP%]{border-radius:10px;max-width:300px;width:auto;height:auto;max-height:300px;margin:auto}.blue-button[_ngcontent-%COMP%]{border-radius:100px;background:#0b57d0;color:#fff;margin:auto;width:fit-content;padding:10px 24px;font-size:14px;cursor:pointer}"],data:{animation:[(0,s.hZ)("dialogState",[(0,s.wk)("expanded",(0,s.iF)({opacity:1,transform:"scale(1)"})),(0,s.wk)("minimized",(0,s.iF)({opacity:0,transform:"scale(0)"})),(0,s.kY)("expanded => minimized",[(0,s.i0)("300ms ease-out")]),(0,s.kY)("minimized => expanded",[(0,s.i0)("300ms ease-in")])])]}})}}return n})()}}]);