def save_cate(cate_list, image_dir, res_dir): """ 保存裁剪的图像 """ # 保存image_dir下所有图像,以便后续查询 image_dict = dict() image_name_list = os.listdir(image_dir) for name in image_name_list: image_path = os.path.join(image_dir, name) img = cv2.imread(image_path) image_dict[name.split('.')[0]] = img # 遍历所有类别,保存标注的图像 for i in range(20): cate_name = alphabets[i] cate_dir = os.path.join(res_dir, cate_name) util.check_dir(cate_dir) for item in cate_list[i]: img_name = item['img_name'] xmin, ymin, xmax, ymax = item['rect'] rect_img = image_dict[img_name][ymin:ymax, xmin:xmax] img_path = os.path.join( cate_dir, '%s-%d-%d-%d-%d.png' % (img_name, xmin, ymin, xmax, ymax)) cv2.imwrite(img_path, rect_img)
def _resume_checkpoint(self, path): check_dir(path) self.logger.debug('Loading checkpoint: {}...'.format(path)) checkpoint = torch.load(path) self.start_epoch = checkpoint['epoch'] + 1 self.best_score = checkpoint['best_score'] self.model.load_state_dict(checkpoint['state_dict']) if checkpoint['config']['optimizer'] != self.cfg['optimizer']: self.logger.debug("Optimizer type given in config file is different from that of checkpoint." "Optimizer parameters not being resumed.") else: self.optimizer.load_state_dict(checkpoint['optimizer']) self.logger.debug("Checkpoint loaded. Resume training from epoch {}".format(self.start_epoch))
def record_voice(files, base_path): for file_path in files: play_audio(file_path) audio = pyaudio.PyAudio() stream = audio.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=SIZE) names = file_path.split('/') print("--- ", end="") print(os.path.join(base_path, names[1], names[2])) frames = [] for i in range( 0, int(16000 / SIZE * get_duration('dataset/' + file_path))): data = stream.read(SIZE) frames.append(data) stream.stop_stream() stream.close() audio.terminate() util.check_dir(path=base_path + names[1]) util.save_wav(frames, file_path=os.path.join(base_path, names[1], names[2]))
criterion = SmoothLabelCritierion(label_smoothing=0.1) # criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4) scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, num_epochs - 5, eta_min=1e-4) lr_scheduler = GradualWarmupScheduler(optimizer, multiplier=1, total_epoch=5, after_scheduler=scheduler) optimizer.zero_grad() optimizer.step() lr_scheduler.step() util.check_dir('../data/models/') best_model, loss_dict, top1_acc_dict, top5_acc_dict = train_model( data_loaders, data_sizes, name, model, criterion, optimizer, lr_scheduler, num_epochs=num_epochs, device=device) # 保存最好的模型参数 # util.save_model(best_model.cpu(), '../data/models/best_%s.pth' % name) res_loss[name] = loss_dict res_top1_acc[name] = top1_acc_dict
if 0.1 <= iou_score < 0.5: # 负样本 negative_list.append(rects[i]) else: pass # 添加标注边界框到正样本列表 positive_list.extend(bndboxs) return positive_list, negative_list if __name__ == '__main__': car_root_dir = '../../data/voc_car/' finetune_root_dir = '../../data/finetune_car/' check_dir(finetune_root_dir) gs = selectivesearch.get_selective_search() for name in ['train', 'val']: src_root_dir = os.path.join(car_root_dir, name) src_annotation_dir = os.path.join(src_root_dir, 'Annotations') src_jpeg_dir = os.path.join(src_root_dir, 'JPEGImages') dst_root_dir = os.path.join(finetune_root_dir, name) dst_annotation_dir = os.path.join(dst_root_dir, 'Annotations') dst_jpeg_dir = os.path.join(dst_root_dir, 'JPEGImages') check_dir(dst_root_dir) check_dir(dst_annotation_dir) check_dir(dst_jpeg_dir) total_num_positive = 0
model = model.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=15, gamma=0.1) best_model, loss_dict, acc_dict = train_model(model, criterion, optimizer, lr_scheduler, data_sizes, data_loaders, num_epochs=50, device=device) # 保存最好的模型参数 util.check_dir(model_dir) torch.save(best_model.state_dict(), os.path.join(model_dir, '%s.pth' % name)) res_loss[name] = loss_dict res_acc[name] = acc_dict print('train %s done' % name) print() util.save_png('loss', res_loss) util.save_png('acc', res_acc)
src_jpeg_path = os.path.join(voc_jpeg_dir, sample_name + suffix_jpeg) dst_jpeg_path = os.path.join(data_jpeg_dir, sample_name + suffix_jpeg) shutil.copyfile(src_jpeg_path, dst_jpeg_path) csv_path = os.path.join(data_root_dir, 'car.csv') np.savetxt(csv_path, np.array(car_samples), fmt='%s') if __name__ == '__main__': samples = { 'train': parse_train_val(car_train_path), 'val': parse_train_val(car_val_path) } print(samples) # samples = sample_train_val(samples) # print(samples) check_dir(car_root_dir) for name in ['train', 'val']: data_root_dir = os.path.join(car_root_dir, name) data_annotation_dir = os.path.join(data_root_dir, 'Annotations') data_jpeg_dir = os.path.join(data_root_dir, 'JPEGImages') check_dir(data_root_dir) check_dir(data_annotation_dir) check_dir(data_jpeg_dir) save_car(samples[name], data_root_dir, data_annotation_dir, data_jpeg_dir) print('done')
cate_dir = os.path.join(res_dir, cate_name) util.check_dir(cate_dir) for item in cate_list[i]: img_name = item['img_name'] xmin, ymin, xmax, ymax = item['rect'] rect_img = image_dict[img_name][ymin:ymax, xmin:xmax] img_path = os.path.join( cate_dir, '%s-%d-%d-%d-%d.png' % (img_name, xmin, ymin, xmax, ymax)) cv2.imwrite(img_path, rect_img) if __name__ == '__main__': util.check_dir(root_dir) util.check_dir(train_dir) util.check_dir(val_dir) train_name_list = np.loadtxt(train_txt_path, dtype=np.str) print(train_name_list) cate_list = find_all_cate_rects(annotation_dir, train_name_list) print([len(x) for x in cate_list]) save_cate(cate_list, jpeg_image_dir, train_dir) val_name_list = np.loadtxt(val_txt_path, dtype=np.str) print(val_name_list) cate_list = find_all_cate_rects(annotation_dir, val_name_list) print([len(x) for x in cate_list]) save_cate(cate_list, jpeg_image_dir, val_dir)
rect_size = (ymax - ymin) * (xmax - xmin) iou_score = iou_list[i] if 0 < iou_score <= 0.3 and rect_size > maximum_bndbox_size / 5.0: # 负样本 negative_list.append(rects[i]) else: pass return bndboxs, negative_list if __name__ == '__main__': car_root_dir = '../../data/voc_car/' classifier_root_dir = '../../data/classifier_car/' check_dir(classifier_root_dir) gs = selectivesearch.get_selective_search() for name in ['train', 'val']: src_root_dir = os.path.join(car_root_dir, name) src_annotation_dir = os.path.join(src_root_dir, 'Annotations') src_jpeg_dir = os.path.join(src_root_dir, 'JPEGImages') dst_root_dir = os.path.join(classifier_root_dir, name) dst_annotation_dir = os.path.join(dst_root_dir, 'Annotations') dst_jpeg_dir = os.path.join(dst_root_dir, 'JPEGImages') check_dir(dst_root_dir) check_dir(dst_annotation_dir) check_dir(dst_jpeg_dir) total_num_positive = 0
model.load_state_dict(best_model_weights) return model if __name__ == '__main__': device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") data_loaders, data_sizes = load_data('./data/finetune_car') model = models.alexnet(pretrained=True) # print(model) num_features = model.classifier[6].in_features model.classifier[6] = nn.Linear(num_features, 2) # print(model) model = model.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=1e-3, momentum=0.9) lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1) best_model = train_model(data_loaders, model, criterion, optimizer, lr_scheduler, device=device, num_epochs=25) # 保存最好的模型参数 check_dir('./models') torch.save(best_model.state_dict(), 'models/alexnet_car.pth')
""" voc_car_train_dir = '../../data/voc_car/train' # ground truth gt_annotation_dir = os.path.join(voc_car_train_dir, 'Annotations') jpeg_dir = os.path.join(voc_car_train_dir, 'JPEGImages') classifier_car_train_dir = '../../data/finetune_car/train' # positive positive_annotation_dir = os.path.join(classifier_car_train_dir, 'Annotations') dst_root_dir = '../../data/bbox_regression/' dst_jpeg_dir = os.path.join(dst_root_dir, 'JPEGImages') dst_bndbox_dir = os.path.join(dst_root_dir, 'bndboxs') dst_positive_dir = os.path.join(dst_root_dir, 'positive') util.check_dir(dst_root_dir) util.check_dir(dst_jpeg_dir) util.check_dir(dst_bndbox_dir) util.check_dir(dst_positive_dir) samples = util.parse_car_csv(voc_car_train_dir) res_samples = list() total_positive_num = 0 for sample_name in samples: # 提取正样本边界框坐标(IoU>=0.5) positive_annotation_path = os.path.join(positive_annotation_dir, sample_name + '_1.csv') positive_bndboxes = np.loadtxt(positive_annotation_path, dtype=np.int, delimiter=' ') # 提取标注边界框 gt_annotation_path = os.path.join(gt_annotation_dir, sample_name + '.xml') bndboxs = util.parse_xml(gt_annotation_path) # 计算符合条件(IoU>0.6)的候选建议