Chainer의 extensions.snapshot()에서 생성된 여러 스냅샷에서 추론 실행

Chainer에는 extensions.snapshot() 라는 스냅샷을 출력하는 기능이 있으므로, 그것을 사용하여 학습의 추이를 비교하고 싶다. 소스 코드는 여기

【추기】 predictor 앞에 with chainer.using_config('train', False):를 설정하지 않으면 오차 전번이 실행되어 버리므로주의

운영 환경


  • 우분투 16.04.3 LTS
  • Python 3.5.2
  • chainer 3.2
  • opencv-python 3.2

  • 실행 이미지



    가장 왼쪽이 정답 이미지로, 오른쪽으로 갈수록 학습이 진행된 스냅샷이 된다. 학습이 진행될수록 문자가 선명하게 되어 있는 것을 확인할 수 있다.



    코드



    메인부 main()



    [1]에서 네트워크 레이어 설정, [2]에서 입력하는 이미지 생성, [3]에서 스냅샷 호출 학습 모델 생성 및 추론 실행, [4]에서 각 스냅샷에서 생성된 출력 이미지를 연결 그런 다음 표시 및 저장을 수행합니다.

    predict_some_snapshot.py
    import cv2
    import numpy as np
    import chainer
    import chainer.links as L
    from Lib.network import JC
    import Lib.imgfunc as IMG
    import Tools.func as F
    from predict import getModelParam, predict, isImage, checkModelType
    
    def main(args):
        # [1]
        snapshot_path, param = getSnapshotAndParam(args.snapshot_and_json)
        unit, ch, layer, sr, af1, af2 = getModelParam(param)
        model = L.Classifier(JC(
            n_unit=unit, n_out=ch, layer=layer, rate=sr,
            actfun_1=af1, actfun_2=af2
        ))
        # [2]
        img = getImage(args.jpeg, ch, args.random_seed)
        out_imgs = [img]
        # [3]
        for s in snapshot_path:
            load_path = checkModelType(s)
            try:
                chainer.serializers.load_npz(s, model, path=load_path)
            except:
                import traceback
                traceback.print_exc()
                print(F.fileFuncLine())
                exit()
    
            if args.gpu >= 0:
                chainer.cuda.get_device_from_id(args.gpu).use()
                model.to_gpu()
    
            with chainer.using_config('train', False):        
                out_imgs.append(predict(model, args, img, ch, -1))
    
        # [4]
        img = stackImages(out_imgs, args.img_rate)
        cv2.imshow('predict some snapshots', img)
        cv2.waitKey()
        cv2.imwrite(F.getFilePath(args.out_path, 'snapshots.jpg'), img)
    
    

    추론 실행 predict()


    predict() 를 비롯한 일부 함수는 자작이다. 소스 코드는 동일한 리포지토리에 있습니다. [1]로 화상을 압축하여 열화시키고 [2]로 분할한다. [3]에서 배치 사이즈마다 실행하고, [4]로 분할한 화상을 다시 결합하고, [5]로 크기를 입력 화상과 동일하게 하고 [6]에 저장한다.

    predict.py
    import cv2
    import numpy as np
    import chainer
    import chainer.links as L
    from chainer.cuda import to_cpu
    from Lib.network import JC
    import Lib.imgfunc as IMG
    import Tools.func as F
    
    def predict(model, args, img, ch, val):
    
        org_size = img.shape
        # [1]
        comp = IMG.encodeDecode([img], IMG.getCh(ch), args.quality)
        if(val >= 0):
            cv2.imwrite(
                F.getFilePath(args.out_path, 'comp-' +
                              str(val * 10).zfill(3), '.jpg'),
                comp[0]
            )
    
        # [2]
        comp, size = IMG.split(comp, args.img_size)
        imgs = []
        # [3]
        for i in range(0, len(comp), args.batch):
            x = IMG.imgs2arr(comp[i:i + args.batch], gpu=args.gpu)
            y = model.predictor(x)
            y = to_cpu(y.array)
            y = IMG.arr2imgs(y, ch, args.img_size * 2)
            imgs.extend(y)
    
        # [4]
        buf = [np.vstack(imgs[i * size[0]: (i + 1) * size[0]])
               for i in range(size[1])]
        img = np.hstack(buf)
        # [5]
        h = 0.5
        half_size = (int(img.shape[1] * h), int(img.shape[0] * h))
        flg = cv2.INTER_NEAREST
        img = cv2.resize(img, half_size, flg)
        img = img[:org_size[0], :org_size[1]]
        # [6]
        if(val >= 0):
            name = F.getFilePath(args.out_path, 'comp-' + str(val * 10 + 1).zfill(3), '.jpg')
            print('save:', name)
            cv2.imwrite(name, img)
    
        return img
    

    이상.

    좋은 웹페이지 즐겨찾기