keras-1에서 pix2pix

5310 단어 DeepLearning
대원의 코드는 루아,torch7이지만,python을 사용하고 싶어서요.
https://github.com/phillipi/pix2pix
keras 소스
https://github.com/tdeboissiere/DeepLearningImplementations/tree/master/pix2pix

필요한 라이브러리


keras, theano or tensorflow backend
h5py
matplotlib
opencv 3
numpy
tqdm
parmap

keras 정보


keras-2 지점의 이름이 바뀌었기 때문에 낡은 코드를 이동할 때 주의해야 한다
Convolution 2D → Conv2D 등
sudo pip install keras==1.2.0

pydot 등 설치

sudo apt-get install graphviz
pip install graphviz
pip install pydot==1.1.0

프로파일 수정


/etc/matplotlibrc
Agg로 변경합니다.
  • backend : TkAgg
  • backend : Agg
  • 데이터 처리


    facades 데이터 세트 다운로드

    git clone https://github.com/phillipi/pix2pix.git
    cd pix2pix
    bash ./datasets/download_dataset.sh facades
    

    HDF5 데이터 세트를 위한 facades 구축

    python make_dataset.py /home/user/GitHub/pix2pix/datasets/facades 3 --img_size 256
    

    학습

    git clone https://github.com/tdeboissiere/DeepLearningImplementations.git
    cd DeepLearningImplementations/pix2pix/src/model
    python main.py 64 64 --backend tensorflow
    

    원본 코드 분석


    train.lua


    환경 변수를 분석하고 기본값을 덮어씁니다.tonumber는 문자열에서 숫자로 전환하는 루아의 함수입니다.
    http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html#lua_tonumber
    for k,v in pairs(opt) do opt[k] = tonumber(os.getenv(k)) or os.getenv(k) or opt[k] end
    
    manualSeed는 torch 함수에서 무작위 생성기의 피드를 지정한 수량으로 설정합니다.
    setdefaulttensor type은torch 함수에 기본 장량 형식을 설정합니다.
    torch.manualSeed(opt.manualSeed)
    torch.setdefaulttensortype('torch.FloatTensor')
    
    
    시작은 별거 아니야.
    데이터 가져오기
    -- create data loader
    local data_loader = paths.dofile('data/data.lua')
    print('#threads...' .. opt.nThreads)
    local data = data_loader.new(opt.nThreads, opt)
    print("Dataset Size: ", data:size())
    tmp_d, tmp_paths = data:getBatch()
    
    
    권중 초기화 방법
    local function weights_init(m)
       local name = torch.type(m)
       if name:find('Convolution') then
          m.weight:normal(0.0, 0.02)
          m.bias:fill(0)
       elseif name:find('BatchNormalization') then
          if m.weight then m.weight:normal(1.0, 0.02) end
          if m.bias then m.bias:fill(0) end
       end
    end
    
    생성기와 판단기 정의
    function defineG(input_nc, output_nc, ngf)
        local netG = nil
        if     opt.which_model_netG == "encoder_decoder" then netG = defineG_encoder_decoder(input_nc, output_nc, ngf)
        elseif opt.which_model_netG == "unet" then netG = defineG_unet(input_nc, output_nc, ngf)
        elseif opt.which_model_netG == "unet_128" then netG = defineG_unet_128(input_nc, output_nc, ngf)
        else error("unsupported netG model")
        end
    
        netG:apply(weights_init)
    
        return netG
    end
    
    function defineD(input_nc, output_nc, ndf)
        local netD = nil
        if opt.condition_GAN==1 then
            input_nc_tmp = input_nc
        else
            input_nc_tmp = 0 -- only penalizes structure in output channels
        end
    
        if     opt.which_model_netD == "basic" then netD = defineD_basic(input_nc_tmp, output_nc, ndf)
        elseif opt.which_model_netD == "n_layers" then netD = defineD_n_layers(input_nc_tmp, output_nc, ndf, opt.n_layers_D)
        else error("unsupported netD model")
        end
    
        netD:apply(weights_init)
    
        return netD
    end
    
    가중 읽기 처리
    if opt.continue_train == 1 then
       print('loading previously trained netG...')
       netG = util.load(paths.concat(opt.checkpoints_dir, opt.name, 'latest_net_G.t7'), opt)
       print('loading previously trained netD...')
       netD = util.load(paths.concat(opt.checkpoints_dir, opt.name, 'latest_net_D.t7'), opt)
    else
      print('define model netG...')
      netG = defineG(input_nc, output_nc, ngf)
      print('define model netD...')
      netD = defineD(input_nc, output_nc, ndf)
    end
    
    이미지를 생성하여 진위 판정을 하는 방법
    torch.캣이 뒤에 붙어있어요.
    function createRealFake()
        -- load real
        data_tm:reset(); data_tm:resume()
        local real_data, data_path = data:getBatch()
        data_tm:stop()
    
        real_A:copy(real_data[{ {}, idx_A, {}, {} }])
        real_B:copy(real_data[{ {}, idx_B, {}, {} }])
    
        if opt.condition_GAN==1 then
            real_AB = torch.cat(real_A,real_B,2)
        else
            real_AB = real_B -- unconditional GAN, only penalizes structure in B
        end
    
        -- create fake
        fake_B = netG:forward(real_A)
    
        if opt.condition_GAN==1 then
            fake_AB = torch.cat(real_A,fake_B,2)
        else
            fake_AB = fake_B -- unconditional GAN, only penalizes structure in B
        end
    end
    
    

    좋은 웹페이지 즐겨찾기