コード例 #1
0
def save_class_scores_hdf(path, bin_id, scores, roi_ids, classes):
    np_scores = np.array(scores)
    #print('length compare:  len(scores)==len(inputs)  -> {}=={} -> {}'.format(len(scores),len(roi_ids),len(scores)==len(roi_ids)))
    #print('class compare: len(score[0])==len(classes) -> {}=={} -> {}'.format(len(scores[0]),len(classes),len(scores[0])==len(classes)))
    assert np_scores.shape[0] == len(roi_ids), 'wrong number of ROI numbers'
    assert np_scores.shape[1] == len(classes), 'wrong number of class labels'
    roi_numbers = [ifcb.Pid(roi_id).target for roi_id in roi_ids]
    try:
        with h5.File(path, 'w') as f:
            ds = f.create_dataset('scores',
                                  data=np_scores,
                                  compression='gzip',
                                  dtype='float16')
            ds.attrs['bin_id'] = bin_id
            ds.attrs['class_labels'] = [l.encode('ascii') for l in classes]
            f.create_dataset('roi_numbers',
                             data=roi_numbers,
                             compression='gzip',
                             dtype='int16')
    except RuntimeError as e:
        # RuntimeError: Unable to create attribute (object header message is too large)
        # see: https://github.com/h5py/h5py/issues/1053#issuecomment-525363860
        print('   ', type(e), e, 'SWITCHING TO CSV OUTPUT')
        path = path.replace('.h5', '.csv').replace('.hdf', '.csv')
        save_class_scores_csv(path, bin_id, scores, roi_ids, classes)
コード例 #2
0
def save_class_scores_mat(path, bin_id, scores, roi_ids, classes):
    from scipy.io import savemat
    np_scores = np.array(scores)
    roi_numbers = [ifcb.Pid(roi_id).target for roi_id in roi_ids]
    d = {
        'version': 2,
        'roinum': roi_numbers,
        'TBscores': np_scores.astype('f4'),
        'class2useTB': np.asarray(classes + ['unclassified'], dtype='object')
    }
    savemat(path, d, do_compression=True)
コード例 #3
0
def save_run_results(input_images,
                     output_scores,
                     class_labels,
                     timestamp,
                     outdir,
                     outfile,
                     model_id=None,
                     input_obj=None):
    output_classranks = np.max(output_scores, axis=1)
    output_classes = np.argmax(output_scores, axis=1)

    assert output_scores.shape[0] == len(
        output_classes), 'wrong number inputs-to-outputs'
    assert output_scores.shape[1] == len(
        class_labels), 'wrong number of class labels'

    results = dict(version='v3',
                   model_id=model_id,
                   timestamp=timestamp,
                   class_labels=class_labels,
                   input_images=input_images,
                   output_classes=output_classes,
                   output_scores=output_scores)

    outfile = os.path.join(outdir, outfile)
    if isinstance(input_obj, ifcb.Pid):
        bin_obj = input_obj
        results['bin_id'] = bin_obj.pid
        results['roi_numbers'] = [ifcb.Pid(img).target for img in input_images]
        outfile_dict = dict(BIN_ID=bin_obj.pid,
                            INPUT_SUBDIRS=bin_obj.namespace,
                            BIN_YEAR=bin_obj.year,
                            BIN_DATE=bin_obj.yearday)
        outfile = outfile.format(**outfile_dict).replace(2 * os.sep, os.sep)
        os.makedirs(os.path.dirname(outfile), exist_ok=True)
        _save_run_results(outfile, results)
    else:  # ImageDataset
        if '{INPUT_SUBDIRS}' in outfile:
            dir_groups = {}
            input_src = input_obj if os.path.isdir(input_obj) else ''
            for img_path, img_classidx, img_scores in zip(
                    input_images, output_classes, output_scores):
                parent_dir = os.path.dirname(img_path.replace(input_src,
                                                              ''))  #+os.sep

                if parent_dir not in dir_groups:
                    dir_groups[parent_dir] = {
                        k: v if k not in [
                            'input_images', 'output_classes', 'output_scores'
                        ] else []
                        for k, v in results.items()
                    }
                dir_groups[parent_dir]['input_images'].append(
                    os.path.basename(img_path))
                dir_groups[parent_dir]['output_classes'].append(img_classidx)
                dir_groups[parent_dir]['output_scores'].append(img_scores)
            for parent_dir, sub_results in dir_groups.items():
                sub_outfile = outfile.format(INPUT_SUBDIRS=parent_dir)
                os.makedirs(os.path.dirname(sub_outfile), exist_ok=True)
                sub_results['output_classes'] = np.asarray(
                    sub_results['output_classes'],
                    dtype=results['output_classes'].dtype)
                sub_results['output_scores'] = np.asarray(
                    sub_results['output_scores'],
                    dtype=results['output_scores'].dtype)
                _save_run_results(sub_outfile, sub_results)

        else:  #easy
            os.makedirs(os.path.dirname(outfile), exist_ok=True)
            _save_run_results(outfile, results)
コード例 #4
0
 def target_id(self, target_number):
     return ifcb.Pid(self.pid).with_target(target_number)