Há este programa mri_synthstrip que insere um arquivo de ressonância magnética cerebral e produz o mesmo arquivo de ressonância magnética cerebral excluindo o crânio. Este é um passo inicial básico para pré-processar ressonâncias magnéticas cerebrais para pesquisa.
O programa é maravilhoso e a sintaxe para remover a pele do crânio de uma única ressonância magnética é simples se você instalar o programa no seu computador:
mri_synthstrip -i input.nii.gz -o stripped.nii.gz
Os autores são muito simpáticos e até criaram uma imagem Docker que você pode extrair do Dockerhub com docker pull freesurfer/synthstrip
nesse caso a sintaxe para retirar o crânio de uma ressonância magnética do cérebro é
docker run -v C:/Users/ch134560/Desktop/MRI_files://data freesurfer/synthstrip -i //data/input.nii.gz -o //data/stripped.nii.gz
O que estou tentando fazer é criar uma imagem Docker que rode todos os arquivos MRI em um diretório e faça skull strips com synthstrip. Achei que isso seria fácil.
Meu Dockerfile multiestágio se parece com isso, mas não funciona porque não reconhece o comando no loop
freesurfer/synthstrip -i "$file" -o "$file"
ou
mri_synthstrip -i "$file" -o "$file"
Acho que não sei como chamar um comando específico dentro de um loop Unix.
#########STAGE 1: CREATE THE MOUNT AND COPY THE MRIs TO BE SKULL-STRIPPED#########
# Use ubuntu as base image
FROM ubuntu AS prepare
# Set working directory
WORKDIR /app
# Copy all MRIs
COPY . .
#########STAGE 2: USE SYNTHSTRIP#########
FROM freesurfer/synthstrip
# Set working directory
WORKDIR /app
# Copy all MRIs
COPY --from=prepare . .
# Create a loop that runs through the MRIs
RUN for file in .; do freesurfer/synthstrip -i "$file" -o "$file"; done
ENTRYPOINT ["ls"]
Outra opção que pensei é criar uma compilação de vários estágios na qual primeiro importo o programa synthstrip e depois faço um loop pelos arquivos MRI e chamo o synthstrip, mas, novamente, não sei exatamente como chamar o comando para executar o synthstrip a partir do python.
Arquivo Docker
#########STAGE 1: CREATE THE SYNTHSTRIP CONTAINER###########
# Use synthstrip AS base image
FROM freesurfer/synthstrip as builder
# Set working directory
WORKDIR /app
#########STAGE 2: CREATE THE ANACONDA CONTAINER###########
# Use miniconda as base image
FROM continuumio/miniconda3
# Set working directory
WORKDIR /app
# Copy the initial image
COPY --from=builder . .
# Create the environment
COPY environment.yml .
RUN conda env create -f environment.yml
# Make run commands use the new environment
SHELL ["conda", "run", "-n", "app", "bin/bash", "-c"]
# Code to run when the container is started
COPY main.py .
ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "app", "python", "main.py"]
arquivo main.py
import os
import subprocess
for MRI in os.listdir('./file_with_MRIs'):
print(MRI)
proc = subprocess.Popen(['docker run freesurfer/synthstrip -i ', MRI, ' -o', MRI],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE
)
(out, err) = proc.communicate()
print (out)
Outra opção é criar uma imagem Docker menor que percorra os arquivos MRI e apenas chame a imagem Docker do synthstrip para cada um deles e colete a saída, mas não tenho certeza de como fazer isso.
Você pode criar um script de shell que itera sobre os arquivos em um diretório e executa o comando mri_synthstrip em cada arquivo. Algo como isso que itera sobre os arquivos em
/input
e coloca os arquivos de saída em/output
.Chame o arquivo
entrypoint.sh
e marque-o como executável comchmod +x entrypoint.sh
.Então você pode criar uma imagem Docker com o seguinte Dockerfile
Crie a imagem usando
docker build -t my_mri_synthstrip .
.Em seguida, coloque todos os seus arquivos de entrada em um diretório e crie um diretório de saída para os arquivos removidos e execute o contêiner usando
Neste comando de exemplo, o diretório de entrada é C:/Users/ch134560/Desktop/MRI_files e o diretório de saída é C:/Users/ch134560/Desktop/Stripped_MRI_files.
Muito obrigado, Hans Kilian. Estou trabalhando nisso há dias e não teria encontrado a solução sozinho. Muito obrigado.
Eu embelezei um pouco a solução de Hans Killian com mais espaçamento e negrito no texto, mas foi só isso. Está funcionando muito bem.
Além disso, se você estiver trabalhando no Windows, certifique-se de usar o notepad+ (não o notepad) e de alterar o modo para LF. O modo padrão do Windows causou alguns problemas inicialmente.
Caso alguém queira os arquivos finais que usei:
Arquivo Docker