Olá, testei seu modelo lançado, meu código é referente ao seu notebook. meu código é
`caffe.set_mode_gpu()
caffe.set_device(2)
net_liver = caffe.Net('/home/zhou/zou/Cascaded-FCN/models/cascadedfcn/step1/step1_deploy.prototxt', '/home/zhou/zou/Cascaded-FCN/models/cas cadedfcn/step1/step1_weights. caffemodel', caffe.TEST)
img=read_dicom_series("../train_image/3Dircadb1.17/PATIENT_DICOM/")
lbl=read_liver_lesion_masks("../train_image/3Dircadb1.17/MASKS_DICOM/")
S = 90
img_p = step1_preprocess_img_slice(img[...,S])
lbl_p = preprocess_lbl_slice(lbl[...,S])
net_liver.blobs['data'].data[0,0,...] = img_p
pred = net_liver.forward()['prob'][0,1] > 0,5
plt.figure(figsize=(3*5,10))
plt.subtrama(1, 3, _1)
plt.title('CT')
plt.imshow(img_p[92:-92,92:-92], 'cinza')
plt.subtrama(1, 3, 2)
plt.title('GT')
plt.imshow(lbl_p, 'cinza')
plt.subtrama(1, 3, 3)
plt.title('pred')
plt.imshow(pred, 'cinza')`
mas o resultado é muito ruim assim
Existe algum truque que eu tenha negligenciado?
O resultado parece estranho. Certifique-se de poder executar o notebook como está e obter resultados corretos, antes de fazer modificações.
O código é o mesmo que você mostra no notebook, assim não consigo encontrar onde o código está errado, você pode me dar uma orientação? obrigada
Eu encontrei o mesmo problema com você, você descobriu? Eu apreciaria se você pudesse compartilhar sua saída. @manutdzou
Acho que o modelo lançado está errado, quando eu treino meu próprio modelo e uso o código acima ele funciona bem, e o resultado é bom
@RenieWell @mohamed-ezz
Isso é uma ótima notícia @manutdzou . Você é mais do que bem-vindo para escrever um pull request e oferecer seu modelo treinado ao público. Basta enviar seu modelo para um hoster de arquivos público e modificar o leia-me com o link e seu nome.
Uau, obtive o mesmo resultado estranho que o seu primeiro resultado. Então tenho certeza que esse modelo lançado não é tão bom. De qualquer forma eu reconstruo o U-Net no TensorFlow, meu resultado de previsão não é tão bom, mas não é estranho.
@manutdzou . Olá pessoal, você pode compartilhar seu código?
Muito obrigado.
Oi a todos,
Acabei de atualizar o Readme e adicionei imagens docker, que executam nosso código sem problemas.
Consulte o Leiame para obter mais detalhes sobre como iniciar a imagem do docker.
O resultado esperado deve se parecer com esta impressão.
Muitas felicidades,
Patrick
cascaded_unet_inference.pdf.pdf
@PatrickChrist Oi Patrick, obrigado pelo ótimo trabalho, mas quando tento usar o modelo pré-treinado, acho que o nvidia-docker é difícil de instalar e você poderia compartilhar um modelo pré-treinado correto sem usar o nvidia-docker
@zakizhou Acho que, por ser um problema de reprodutibilidade, o Docker é nossa melhor aposta para conseguir isso.
nvidia-docker
é necessário apenas se você deseja processar os arquivos na GPU. Você pode, no entanto, apenas usar docker
se estiver de acordo com a execução na CPU.
Se você está rodando na distro linux, quais são os problemas que você está enfrentando para instalar nvidia-docker
?
Os modelos também são compartilhados em https://github.com/IBBM/Cascaded-FCN/tree/master/models/cascadedfcn , você pode usá-los em seu ambiente host (sem Docker)
@mohamed-ezz obrigado pela sua resposta, estou usando o Ubuntu sem gpus, na verdade, tentei docker
em vez de nvidia-docker
mas infelizmente quando tentei importar o modelo caffe pré-treinado, o núcleo do jupyter notebook despejado e não entendo o porquê. Como o que @manutdzou disse nesta edição, o modelo pré-treinado aqui https://github.com/IBBM/Cascaded-FCN/tree/master/models/cascadedfcn tem um desempenho ruim na imagem de amostra. Instalei o caffe com conda, você acha que é a versão errada do caffe que causou esse problema?
Sim, é provável que seja a versão caffe. Por favor, use a imagem do docker.
Em 4 de julho de 2017, 17h45, "Jie Zhou" [email protected] escreveu:
@mohamed-ezz https://github.com/mohamed-ezz obrigado pela sua resposta, eu sou
usando o ubuntu sem gpus, na verdade eu tentei o docker em vez de
nvidia-docker, mas infelizmente quando tentei importar o modelo caffe pré-treinado,
o núcleo do notebook jupyter foi despejado e não entendo o porquê. Como o quê
@manutdzou https://github.com/manutdzou disse nesta edição, o
modelo pré-treinado aqui https://github.com/IBBM/Cascaded-FCN/tree/master/
models/cascadedfcn tem um desempenho ruim na imagem de amostra. instalei o café
com conda, você acha que é a versão errada do caffe que causou isso
problema?—
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/IBBM/Cascaded-FCN/issues/13#issuecomment-312908109 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/ADqENQMhAJvhyvV1SZ5ApQelMqNhBlTMks5sKl39gaJpZM4M4ckQ
.
@mohamed-ezz OK, eu tentaria o modelo em um servidor com gpu, obrigado novamente!
Não há necessidade de uma gpu, basta usar o docker com a imagem no README.md, em vez disso
do nvidia-docker.
Em 4 de julho de 2017, 18h59, "Jie Zhou" [email protected] escreveu:
@mohamed-ezz https://github.com/mohamed-ezz OK, eu tentaria o modelo em um
servidor com gpu, obrigado novamente!—
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/IBBM/Cascaded-FCN/issues/13#issuecomment-312919887 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/ADqENQh6pIiGyQYTbKSOx_2reMDlja3Cks5sKm-GgaJpZM4M4ckQ
.
Eu lancei uma versão do fígado direito e modelo de lesão no Baidu pode usar este modelo assim
`importar sys,os
sys.path.insert(0, '/home/zhou/zou/caffe_ws/python')
sys.path.insert(0,'/home/zhou/zou/Cascaded-FCN/lib')
importar numpy como np
de matplotlib importar pyplot como plt
importar café
caminho_resultado = "/home/zhou/zou/Cascaded-FCN/code/result/"
se não os.path.exists(result_path):
os.makedirs(caminho_resultado)
im_list = open('test_lesion_list.txt', 'r').read().splitlines()
caffe.set_mode_gpu()
caffe.set_device(0)
net_liver = caffe.Net('deploy.prototxt', 'liver.caffemodel', caffe.TEST)
net_lesion = caffe.Net('deploy.prototxt', 'lesion.caffemodel', caffe.TEST)
fígado = 1
lesão = 2
para i em range(0,len(im_list)):
im = np.load(im_list[i].split(' ')[0])
mascara = np.load(im_list[i].split(' ')[1])
in_ = np.array(im, dtype=np.float32)
in_expand = in_[np.newaxis, ...]
blob = in_expand[np.newaxis, :, :, :]
net_liver.blobs['data'].reshape(*blob.shape)
net_liver.blobs['data'].data[...] = blob
net_liver.forward()
output_liver = net_liver.blobs['prob'].data[0].argmax(axis=0)
net_lesion.blobs['data'].reshape(*blob.shape)
net_lesion.blobs['data'].data[...] = blob
net_lesion.forward()
output_lesion = net_lesion.blobs['prob'].data[0].argmax(axis=0)
output = output_liver
ind_1 = np.where(output_liver ==0)
output_lesion[ind_1] = 255
ind_2 = np.where(output_lesion ==0)
output[ind_2] = 2
plt.figure(figsize=(3*5,10))
plt.subplot(1, 3, 1)
plt.title('CT')
plt.imshow(im[92:-92,92:-92], 'gray')
plt.subplot(1, 3, 2)
plt.title('GT')
plt.imshow(mask, 'gray')
plt.subplot(1, 3, 3)
plt.title('pred')
plt.imshow(output, 'gray')
path = result_path + im_list[i].split(' ')[0].split('/')[-1][0:-3] +'jpg'
plt.savefig(path)
plt.close()
`
algum resultado é mostrado
@mohamed-ezz @RenieWell @mjiansun @PatrickChrist @PiaoLiangHXD
camada {
nome: "dados"
digite: "Entrada"
topo: "dados"
input_param { shape: { dim: 1 dim: 1 dim: 572 dim: 572 } }
}
camada {
nome: "conv_d0a-b"
digite: "convolução"
inferior: "dados"
topo: "d0b"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 64
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d0b"
digite: "ReLU"
inferior: "d0b"
topo: "d0b"
}
camada {
nome: "conv_d0b-c"
digite: "convolução"
inferior: "d0b"
topo: "d0c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 64
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d0c"
digite: "ReLU"
inferior: "d0c"
topo: "d0c"
}
camada {
nome: "pool_d0c-1a"
tipo: "Conjunto"
inferior: "d0c"
topo: "d1a"
pooling_param {
piscina: MÁX.
kernel_size: 2
passo: 2
}
}
camada {
nome: "conv_d1a-b"
digite: "convolução"
inferior: "d1a"
topo: "d1b"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 128
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d1b"
digite: "ReLU"
inferior: "d1b"
topo: "d1b"
}
camada {
nome: "conv_d1b-c"
digite: "convolução"
inferior: "d1b"
topo: "d1c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 128
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d1c"
digite: "ReLU"
inferior: "d1c"
topo: "d1c"
}
camada {
nome: "pool_d1c-2a"
tipo: "Conjunto"
inferior: "d1c"
topo: "d2a"
pooling_param {
piscina: MÁX.
kernel_size: 2
passo: 2
}
}
camada {
nome: "conv_d2a-b"
digite: "convolução"
inferior: "d2a"
topo: "d2b"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 256
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d2b"
digite: "ReLU"
inferior: "d2b"
topo: "d2b"
}
camada {
nome: "conv_d2b-c"
digite: "convolução"
inferior: "d2b"
topo: "d2c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 256
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d2c"
digite: "ReLU"
inferior: "d2c"
topo: "d2c"
}
camada {
nome: "pool_d2c-3a"
tipo: "Conjunto"
inferior: "d2c"
topo: "d3a"
pooling_param {
piscina: MÁX.
kernel_size: 2
passo: 2
}
}
camada {
nome: "conv_d3a-b"
digite: "convolução"
inferior: "d3a"
topo: "d3b"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 512
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d3b"
digite: "ReLU"
inferior: "d3b"
topo: "d3b"
}
camada {
nome: "conv_d3b-c"
digite: "convolução"
inferior: "d3b"
topo: "d3c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 512
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d3c"
digite: "ReLU"
inferior: "d3c"
topo: "d3c"
}
camada {
nome: "pool_d3c-4a"
tipo: "Conjunto"
inferior: "d3c"
topo: "d4a"
pooling_param {
piscina: MÁX.
kernel_size: 2
passo: 2
}
}
camada {
nome: "conv_d4a-b"
digite: "convolução"
inferior: "d4a"
topo: "d4b"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 1024
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d4b"
digite: "ReLU"
inferior: "d4b"
topo: "d4b"
}
camada {
nome: "conv_d4b-c"
digite: "convolução"
inferior: "d4b"
topo: "d4c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 1024
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_d4c"
digite: "ReLU"
inferior: "d4c"
topo: "d4c"
}
camada {
nome: "upconv_d4c_u3a"
digite: "Deconvolução"
inferior: "d4c"
topo: "u3a"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 512
almofada: 0
kernel_size: 2
passo: 2
peso_enchimento {
tipo: "xavier"
}
}
}
camada {
nome: "relu_u3a"
digite: "ReLU"
inferior: "u3a"
topo: "u3a"
}
camada {
nome: "crop_d3c-d3cc"
tipo: "Cortar"
inferior: "d3c"
inferior: "u3a"
topo: "d3cc"
}
camada {
nome: "concat_d3cc_u3a-b"
tipo: "Concat"
inferior: "u3a"
inferior: "d3cc"
topo: "u3b"
}
camada {
nome: "conv_u3b-c"
digite: "convolução"
inferior: "u3b"
topo: "u3c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 512
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u3c"
digite: "ReLU"
inferior: "u3c"
topo: "u3c"
}
camada {
nome: "conv_u3c-d"
digite: "convolução"
inferior: "u3c"
topo: "u3d"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 512
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u3d"
digite: "ReLU"
inferior: "u3d"
topo: "u3d"
}
camada {
nome: "upconv_u3d_u2a"
digite: "Deconvolução"
inferior: "u3d"
topo: "u2a"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 256
almofada: 0
kernel_size: 2
passo: 2
peso_enchimento {
tipo: "xavier"
}
}
}
camada {
nome: "relu_u2a"
digite: "ReLU"
inferior: "u2a"
topo: "u2a"
}
camada {
nome: "crop_d2c-d2cc"
tipo: "Cortar"
inferior: "d2c"
inferior: "u2a"
topo: "d2cc"
}
camada {
nome: "concat_d2cc_u2a-b"
tipo: "Concat"
inferior: "u2a"
inferior: "d2cc"
topo: "u2b"
}
camada {
nome: "conv_u2b-c"
digite: "convolução"
inferior: "u2b"
topo: "u2c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 256
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u2c"
digite: "ReLU"
inferior: "u2c"
topo: "u2c"
}
camada {
nome: "conv_u2c-d"
digite: "convolução"
inferior: "u2c"
topo: "u2d"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 256
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u2d"
digite: "ReLU"
inferior: "u2d"
topo: "u2d"
}
camada {
nome: "upconv_u2d_u1a"
digite: "Deconvolução"
inferior: "u2d"
topo: "u1a"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 128
almofada: 0
kernel_size: 2
passo: 2
peso_enchimento {
tipo: "xavier"
}
}
}
camada {
nome: "relu_u1a"
digite: "ReLU"
inferior: "u1a"
topo: "u1a"
}
camada {
nome: "crop_d1c-d1cc"
tipo: "Cortar"
inferior: "d1c"
inferior: "u1a"
topo: "d1cc"
}
camada {
nome: "concat_d1cc_u1a-b"
tipo: "Concat"
inferior: "u1a"
inferior: "d1cc"
topo: "u1b"
}
camada {
nome: "conv_u1b-c"
digite: "convolução"
inferior: "u1b"
topo: "u1c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 128
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u1c"
digite: "ReLU"
inferior: "u1c"
topo: "u1c"
}
camada {
nome: "conv_u1c-d"
digite: "convolução"
inferior: "u1c"
topo: "u1d"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 128
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u1d"
digite: "ReLU"
inferior: "u1d"
topo: "u1d"
}
camada {
nome: "upconv_u1d_u0a_NEW"
digite: "Deconvolução"
inferior: "u1d"
topo: "u0a"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 64
almofada: 0
kernel_size: 2
passo: 2
peso_enchimento {
tipo: "xavier"
}
}
}
camada {
nome: "relu_u0a"
digite: "ReLU"
inferior: "u0a"
topo: "u0a"
}
camada {
nome: "crop_d0c-d0cc"
tipo: "Cortar"
inferior: "d0c"
inferior: "u0a"
topo: "d0cc"
}
camada {
nome: "concat_d0cc_u0a-b"
tipo: "Concat"
inferior: "u0a"
inferior: "d0cc"
topo: "u0b"
}
camada {
nome: "conv_u0b-c_New"
digite: "convolução"
inferior: "u0b"
topo: "u0c"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 64
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u0c"
digite: "ReLU"
inferior: "u0c"
topo: "u0c"
}
camada {
nome: "conv_u0c-d_New"
digite: "convolução"
inferior: "u0c"
topo: "u0d"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 64
almofada: 0
kernel_size: 3
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "relu_u0d"
digite: "ReLU"
inferior: "u0d"
topo: "u0d"
}
camada {
nome: "conv_u0d-score_New"
digite: "convolução"
inferior: "u0d"
melhor pontuação"
parametro {
lr_mult: 1
decaimento_mult: 1
}
parametro {
lr_mult: 2
decaimento_mult: 0
}
convolution_param {
num_output: 2
almofada: 0
kernel_size: 1
peso_enchimento {
tipo: "xavier"
}
motor: CAFE
}
}
camada {
nome: "problema"
tipo: "Softmax"
inferior: "pontuação"
topo: "prob"
}
Ótimo trabalho @manutdzou
Obrigado por seu apoio. Você se importaria de comprometer seu trabalho neste repositório?
Poderíamos ter uma pasta model-zoo/manutdzou na qual você poste seu código como notebook e seu prototxt e os links para baidu como arquivo de texto? Outros usuários definitivamente apreciarão. Se você tiver um artigo sobre seu trabalho, também podemos adicionar isso.
Ok, se meu código e modelo funcionarem bem, ficarei feliz em me comprometer neste repositório!
发自网易邮箱大师
Em 07/07/2017 17:33, Patrick Christ escreveu:
Ótimo trabalho @manutdzou
Obrigado por seu apoio. Você se importaria de comprometer seu trabalho neste repositório?
Poderíamos ter uma pasta model-zoo/manutdzou na qual você poste seu código como notebook e seu prototxt e os links para baidu como arquivo de texto? Outros usuários definitivamente apreciarão. Se você tiver um artigo sobre seu trabalho, também podemos adicionar isso.
—
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou silencie a conversa.
Comentários muito úteis
Acho que o modelo lançado está errado, quando eu treino meu próprio modelo e uso o código acima ele funciona bem, e o resultado é bom
@RenieWell @mohamed-ezz