DICOM預(yù)處理函數(shù)計算之路

自從阿里云推出函數(shù)計算(FC)以來,一直期待著能用Java語言實現(xiàn)FC,今年早些時候發(fā)現(xiàn)已經(jīng)放出了Java FC的實現(xiàn),這樣我們的DICOM預(yù)處理就可以做成函數(shù)了。這周終于空閑下來,決定來踩坑。

按照阿里云Java教程很容易寫了一個DemoFC,不過在用fcli發(fā)布函數(shù)的時候該教程的命令是不太對的,mkf 命令應(yīng)該使用參數(shù) -f YourPackage.jar 來指定要上傳的jar包。完整的命令如下:

?mkf demo-java -t java8 -h com.lifeccp.fc.dcmpp.DemoFC::handleRequest -f fc-dcmpp-1.0.0.jar

接下來就開始將dcm4che引入項目了。

首先遇到的第一個坑是maven不能下載dcm4che。

Java and Let's Encrypt Certificates

DCM4CHE自己有一個maven repository,啟用了HTTPS,并且使用的是Let's Encrypt的證書(全世界碼農(nóng)的選擇都一樣)。JDK8U101之前的版本沒有裝入Let's Encrypt的根證書,導(dǎo)致maven下載依賴包的時候出錯:

Failed to collect dependencies at org.dcm4che:dcm4che-core:jar:5.14.0: Failed to read artifact descriptor for org.dcm4che:dcm4che-core:jar:5.14.0: Could not transfer artifact org.dcm4che:dcm4che-core:pom:5.14.0 from/to www.dcm4che.org (https://www.dcm4che.org/maven2/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

最簡單的解決辦法:升級JDK到8U101以后版本。

參考這篇blog: https://www.compose.com/articles/compose-notes-java-and-lets-encrypt-certificates/

OpenCV

Java底下一直沒有很好的JPEGLS/JPEG2K支持,之前dcm4che用的是一個很久不更新的jai_imageio(版本1.2-pre-dr-b04,對,一直停留在pre-b04版本號上),而且底層還依賴clipwrap的jni,這個native依賴常常讓預(yù)處理器崩潰。dcm4che 5.0以后引入了OpenCV這個強(qiáng)大的圖像庫來提供圖像IO,我們在生產(chǎn)環(huán)境上升級dcm4che 5.0以后,處理JPG編碼的DICOM沒有再奔潰了。不過OpenCV還是native依賴的,不知道阿里云的FC環(huán)境是否能夠支持呢?

先試試再說,加上opencv依賴:

<dependency>

? ? ? ? ? ? <groupId>org.dcm4che</groupId>

? ? ? ? ? ? <artifactId>dcm4che-imageio-opencv</artifactId>

? ? ? ? ? ? <version>5.14.0</version>

? </dependency>??

構(gòu)建過程中并沒有自動包native包拉進(jìn)來,還得將需要的native包依賴上才行。雖然構(gòu)建后發(fā)現(xiàn)已經(jīng)將libopencv_java-3.4.0-dcmR3-linux-x86-64.so 拷貝到lib了,但還是找不到opencv_java的本地依賴包。上面的方法拷貝的.so文件名并不是OpenCV core去加載的文件名,還得把名稱改成libopencv_java.so (在mac則是libopencv_java.jnilib)才行。使用maven-dependenciey-plugin:copy 來完成。

<plugin>

? ? ? ? ? ? ? ? <groupId>org.apache.maven.plugins</groupId>

? ? ? ? ? ? ? ? <artifactId>maven-dependency-plugin</artifactId>

? ? ? ? ? ? ? ? <version>3.1.1</version>

? ? ? ? ? ? ? ? <executions>


? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <id>copy-dependencies</id>

? ? ? ? ? ? ? ? ? ? ? ? <phase>prepare-package</phase>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>copy-dependencies</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <includeScope>runtime</includeScope>

? ? ? ? ? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? ? ? <!-- copy libopencv_java.so for linux-x86-64 for distribution and testing,

? ? ? ? ? ? ? ? ? ? run package goal once before test on linux, otherwise vm can't find native library -->

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <id>copy</id>

? ? ? ? ? ? ? ? ? ? ? ? <phase>prepare-package</phase>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>copy</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactItems>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactItem>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <groupId>org.weasis.thirdparty.org.opencv</groupId>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactId>libopencv_java</artifactId>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <type>so</type>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <version>${weasis.opencv.native.version}</version>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <classifier>linux-x86-64</classifier>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <destFileName>libopencv_java.so</destFileName>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </artifactItem>

? ? ? ? ? ? ? ? ? ? ? ? ? ? </artifactItems>

? ? ? ? ? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? ? ? <!-- copy libopencv_java.jnilib for macosx-x86-64 for testing under my Mac -->

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <id>copy-mac</id>

? ? ? ? ? ? ? ? ? ? ? ? <phase>process-test-classes</phase>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>copy</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactItems>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactItem>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <groupId>org.weasis.thirdparty.org.opencv</groupId>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <artifactId>libopencv_java</artifactId>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <type>jnilib</type>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <version>${weasis.opencv.native.version}</version>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <classifier>macosx-x86-64</classifier>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <outputDirectory>${project.build.directory}/test-classes/lib</outputDirectory>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <destFileName>libopencv_java.jnilib</destFileName>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </artifactItem>

? ? ? ? ? ? ? ? ? ? ? ? ? ? </artifactItems>

? ? ? ? ? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? </executions>

? ? ? ? ? ? </plugin>

同時需要配置maven-surefire-plugin ,加上<argLine>-Djava.library.path=./target/test-classes/lib:./target/classes/lib</argLine>,不然test的時候還是找不到本地依賴,mvn -Djava.library.path=./target/test-classes/lib? 指定都不管用,因為test啟動的是另外的vm。

? <!-- specify java.library.path for testing -->

? ? ? ? ? ? <plugin>

? ? ? ? ? ? ? ? <groupId>org.apache.maven.plugins</groupId>

? ? ? ? ? ? ? ? <artifactId>maven-surefire-plugin</artifactId>

? ? ? ? ? ? ? ? <version>2.22.0</version>

? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? <argLine>-Djava.library.path=./target/test-classes/lib:./target/classes/lib</argLine>

? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? </plugin>

接下來就是激動人心的上FC真實環(huán)境測試了。按照上面pom的配置,libopencv_java.so 拷貝到lib目錄并且打包到j(luò)ar以后,vm能夠成功加載native包。FC上的Java runtime:

user.dir:/code

java.library.path:/code/:/code//lib:/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib

>fcli shell

Welcome to the function compute world. Have fun!

>>> cd deidentifier

>>> ls

dcminfo

demo-java

>>> invk dcminfo -s samples/CT1_J2KR

loading native library:opencv_java...

native library loaded.

samples/CT1_J2KR 512x512px

color model:ColorModel: #pixelBits = 8 numComponents = 1 color space = java.awt.color.ICC_ColorSpace@12ab536b transparency = 1 has alpha = false isAlphaPre = false

Job done!?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,641評論 19 139
  • 簡介 概述 Maven 是一個項目管理和整合工具 Maven 為開發(fā)者提供了一套完整的構(gòu)建生命周期框架 Maven...
    閩越布衣閱讀 4,535評論 6 39
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,279評論 6 342
  • 真的是非常不喜歡“盡力”。 “盡力”字面所沒有表達(dá)出來的意思,是,我沒有辦法了,我繳械投降了...以及,一切和我沒...
    小糖人閱讀 254評論 0 1
  • 耿丹學(xué)院招生問題匯總 1. 關(guān)于學(xué)校面試問題,給我一個不錄取你的理由 自身原因來說 分?jǐn)?shù)不夠 沒有回答出老師...
    周yao閱讀 427評論 0 0

友情鏈接更多精彩內(nèi)容