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)
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)
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)
def target_id(self, target_number): return ifcb.Pid(self.pid).with_target(target_number)