请帮我翻译每一句代码:def parse_opt(): parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='D://Net//pytorch//yolov5-master//yolov5-master//runs//train//exp3//weights//best.pt', help='model path or triton URL') parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob/screen/0(webcam)') parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='(optional) dataset.yaml path') parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[480], help='inference size h,w') parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold') parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='show results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--visualize', action='store_true', help='visualize features')

时间: 2023-06-15 09:04:47 浏览: 342
def parse_opt(): # 定义 argparse 解析器 parser = argparse.ArgumentParser() # 添加命令行参数 parser.add_argument('--weights', nargs='+', type=str, default='D://Net//pytorch//yolov5-master//yolov5-master//runs//train//exp3//weights//best.pt', help='model path or triton URL') parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob/screen/0(webcam)') parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='(optional) dataset.yaml path') parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[480], help='inference size h,w') parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold') parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='show results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--visualize', action='store_true', help='visualize features') # 返回解析器 return parser

相关推荐

代码解释 if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='yolov7.pt', help='model.pt path(s)') parser.add_argument('--source', type=str, default='inference/images', help='source') # file/folder, 0 for webcam parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='display results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--update', action='store_true', help='update all models') parser.add_argument('--project', default='runs/detect', help='save results to project/name') parser.add_argument('--name', default='exp', help='save results to project/name') parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment') parser.add_argument('--no-trace', action='store_true', help='dont trace model') opt = parser.parse_args() print(opt) #check_requirements(exclude=('pycocotools', 'thop'))

super(Ui_MainWindow, self).__init__(parent) parser_car_det = argparse.ArgumentParser() # parser.add_argument('--weights', type=str, default='weights-s/best1.pt', help='model.pt path') parser_car_det.add_argument('--weights', type=str, default='weights-s/best1.pt', help='model.pt path') parser_car_det.add_argument('--source', type=str, default='input/3.mp4', help='source') # file/folder, 0 for webcam # parser.add_argument('--source', type=str, default='rtsp://admin:hik12345@192.168.1.64:554//Streaming/Channels/101', help='source') # file/folder, 0 for webcam parser_car_det.add_argument('--output', type=str, default='inference/output', help='output folder') # output folder parser_car_det.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser_car_det.add_argument('--conf-thres', type=float, default=0.4, help='object confidence threshold') parser_car_det.add_argument('--iou-thres', type=float, default=0.5, help='IOU threshold for NMS') parser_car_det.add_argument('--fourcc', type=str, default='mp4v', help='output video codec (verify ffmpeg support)') parser_car_det.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser_car_det.add_argument('--view-img', action='store_true', help='display results') parser_car_det.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser_car_det.add_argument('--classes', nargs='+', type=int, help='filter by class') parser_car_det.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser_car_det.add_argument('--augment', action='store_true', help='augmented inference') parser_car_det.add_argument('--idx', default='2', help='idx') self.opt_car_det = parser_car_det.parse_args() self.opt_car_det.img_size = check_img_size(self.opt_car_det.img_size) half = 0 source_car_det, weights_car_det, view_img_car_det, save_txt_car_det, imgsz_car_det = self.opt_car_det.source, self.opt_car_det.weights, self.opt_car_det.view_img, self.opt_car_det.save_txt, self.opt_car_det.img_size self.device_car_det = torch_utils.select_device(self.opt_car_det.device) self.half_car_det = 0 # half precision only supported on CUDA cudnn.benchmark = True

def parse_opt(): parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL') parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob/screen/0(webcam)') parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='(optional) dataset.yaml path') parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w') parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold') parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='show results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--visualize', action='store_true', help='visualize features') parser.add_argument('--update', action='store_true', help='update all models') parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name') parser.add_argument('--name', default='exp', help='save results to project/name') parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment') parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)') parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels') parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences') parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference') parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference') parser.add_argument('--vid-stride', type=int, default=1, help='video frame-rate stride')

解释parser.add_argument( "-r", "--resume", default=None, help="weights path for resume") parser.add_argument( "--slim_config", default=None, type=str, help="Configuration file of slim method.") parser.add_argument( "--enable_ce", type=bool, default=False, help="If set True, enable continuous evaluation job." "This flag is only used for internal test.") parser.add_argument( "--fp16", action='store_true', default=False, help="Enable mixed precision training.") parser.add_argument( "--fleet", action='store_true', default=False, help="Use fleet or not") parser.add_argument( "--use_vdl", type=bool, default=False, help="whether to record the data to VisualDL.") parser.add_argument( '--vdl_log_dir', type=str, default="vdl_log_dir/scalar", help='VisualDL logging directory for scalar.') parser.add_argument( '--save_prediction_only', action='store_true', default=False, help='Whether to save the evaluation results only') args = parser.parse_args() return args def run(FLAGS, cfg): # init fleet environment if cfg.fleet: init_fleet_env() else: # init parallel environment if nranks > 1 init_parallel_env() if FLAGS.enable_ce: set_random_seed(0) # build trainer trainer = Trainer(cfg, mode='train') # load weights if FLAGS.resume is not None: trainer.resume_weights(FLAGS.resume) elif 'pretrain_weights' in cfg and cfg.pretrain_weights: trainer.load_weights(cfg.pretrain_weights) # training trainer.train(FLAGS.eval) def main(): FLAGS = parse_args() cfg = load_config(FLAGS.config) cfg['fp16'] = FLAGS.fp16 cfg['fleet'] = FLAGS.fleet cfg['use_vdl'] = FLAGS.use_vdl cfg['vdl_log_dir'] = FLAGS.vdl_log_dir cfg['save_prediction_only'] = FLAGS.save_prediction_only merge_config(FLAGS.opt) place = paddle.set_device('gpu' if cfg.use_gpu else 'cpu') if 'norm_type' in cfg and cfg['norm_type'] == 'sync_bn' and not cfg.use_gpu: cfg['norm_type'] = 'bn' if FLAGS.slim_config: cfg = build_slim_model(cfg, FLAGS.slim_config) check.check_config(cfg) check.check_gpu(cfg.use_gpu) check.check_version() run(FLAGS, cfg)

### 回答1: 这个错误通常是因为你没有在代码中定义 opt 变量,但是在后面的代码中又使用了它。opt 通常是一个存储程序运行选项的变量。你需要在代码中找到 opt 的定义,或者手动定义一个 opt 变量并设置它的值,使得程序正确运行。 一般来说,你应该在程序的开头定义 opt,例如: import argparse parser = argparse.ArgumentParser() parser.add_argument('--device', type=str, default='cpu', help='选择计算设备') # 添加其他选项 opt = parser.parse_args() 在这个例子中,我们使用 argparse 模块来解析命令行参数,并将结果保存在 opt 变量中。你可以根据自己的需求来定义 opt,只要保证在代码中使用之前进行定义即可。 ### 回答2: 在这个错误提示中,我们可以看到 NameError: name 'opt' is not defined。这个错误的意思是在这个代码行中,opt 这个变量没有被定义。所以,我们需要检查一下这段代码中是否定义了 opt。 首先,我们需要确认 torch_utils.select_device 是一个来自于 torch_utils 模块的函数。如果是的话,我们需要找到当前代码的导入语句,看是否正确导入了 torch_utils 模块。 其次,我们需要找到在调用 torch_utils.select_device 之前是否有一个 opt 变量的定义。根据错误提示,这里可能发生在 device = torch_utils.select_device(opt.device) 这个语句之前。我们需要检查一下是否在之前的代码行中定义了 opt 变量,如果没有定义,那么需要先定义 opt 变量。 当我们找到了 opt 变量的定义之后,我们可以继续检查一下它的值,确保它是一个具有 device 属性的对象。如果 opt 变量没有 device 属性,那么将会导致这个错误。在这种情况下,我们需要修改 opt 变量的定义,使其具有一个合适的 device 属性。 总的来说,解决这个问题的关键是确保正确导入了模块并定义了合适的 opt 变量。 ### 回答3: 错误的原因是在调用 torch_utils.select_device(opt.device) 函数时,没有定义变量 opt。变量 opt 可能是用于存储设备类型选项的对象或字典。修复此错误的方法取决于 opt 的定义方式。 如果 opt是一个对象,你需要确保在调用 torch_utils.select_device() 之前对 opt 进行初始化。例如: python import torch_utils # 初始化opt对象 opt = Option() # 假设Option是opt的类 # 调用select_device函数 device = torch_utils.select_device(opt.device) 如果 opt 是一个字典,你需要确保在调用 torch_utils.select_device() 之前对 opt 进行定义和赋值。例如: python import torch_utils # 定义opt字典 opt = { 'device': 'cuda' # 或其他设备类型选项 } # 调用select_device函数 device = torch_utils.select_device(opt['device']) 总之,修复此错误的方法是确保在调用 torch_utils.select_device() 之前正确定义并赋值了 opt。
您好!YOLOv5是一个目标检测算法,test.py是其中的一个测试脚本。以下是YOLOv5中test.py的运行代码示例: python import torch import argparse import sys sys.path.append('path/to/yolov5') # 替换为YOLOv5的路径 from models.experimental import attempt_load from utils.general import check_img_size, non_max_suppression, scale_coords from utils.torch_utils import select_device, time_synchronized def main(): parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)') parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--classes', nargs='+', type=int, help='filter by class') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') opt = parser.parse_args() # 设置设备 opt.device = select_device(opt.device) # 加载模型 model = attempt_load(opt.weights, map_location=opt.device) imgsz = check_img_size(opt.img_size, s=model.stride.max()) # 设置模型为评估模式 model.eval() # 进行推理 with torch.no_grad(): for path, img, im0s, _ in dataset: img = torch.from_numpy(img).to(opt.device) img = img.float() # 图片预处理 img /= 255.0 if img.ndimension() == 3: img = img.unsqueeze(0) # 推理 pred = model(img)[0] pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms) # 处理预测结果 for i, det in enumerate(pred): if len(det): det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0s.shape).round() # 绘制边界框、标签等 for *xyxy, conf, cls in reversed(det): label = f'{names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, im0s, label=label, color=colors[int(cls)], line_thickness=3) # 显示结果 cv2.imshow('', im0s) cv2.waitKey(0) # 按任意键退出 if __name__ == '__main__': main() 请注意,以上代码只是示例代码,具体使用时需要根据您的环境和需求进行相应的修改。
下面是一个简单的YOLOv5训练程序(仅供参考): python import torch import argparse from pathlib import Path from models import * # 导入YOLOv5模型 from utils.datasets import * # 导入数据集 from utils.utils import * # 导入一些工具函数 # 设置参数 parser = argparse.ArgumentParser() parser.add_argument('--epochs', type=int, default=300, help='number of epochs') parser.add_argument('--batch-size', type=int, default=16, help='size of each batch') parser.add_argument('--img-size', type=int, default=640, help='size of input image') parser.add_argument('--data', type=str, default='data/coco.yaml', help='path to data.yaml') parser.add_argument('--weights', type=str, default='yolov5s.pt', help='path to weights file') opt = parser.parse_args() # 加载数据集 data = yaml.load(open(opt.data)) train_dataset = LoadImagesAndLabels(data['train'], opt.img_size, batch_size=opt.batch_size, augment=True) test_dataset = LoadImagesAndLabels(data['val'], opt.img_size, batch_size=opt.batch_size, augment=False) # 初始化模型 model = YOLOv5(opt.img_size) # 加载预训练权重 if opt.weights.endswith('.pt'): # 如果是.pt文件 model.load_state_dict(torch.load(opt.weights, map_location=torch.device('cpu'))['model'].float().state_dict()) else: # 如果是.weights文件 load_darknet_weights(model, opt.weights) # 设置优化器和学习率衰减策略 optimizer = torch.optim.Adam(model.parameters()) scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=opt.epochs) # 开始训练 for epoch in range(opt.epochs): for i, (imgs, targets, paths, _) in enumerate(train_dataset): # 将数据送入GPU imgs = imgs.cuda() targets = targets.cuda() # 计算损失 loss, loss_items = model(imgs, targets) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印损失和学习率 if i % 10 == 0: print(f'Epoch {epoch+1}/{opt.epochs}, Batch {i+1}/{len(train_dataset)}, Loss {loss.item():.4f}, LR {scheduler.get_lr()[0]:.6f}') # 更新学习率 scheduler.step() # 在测试集上测试模型 model.eval() with torch.no_grad(): mAP, _, _ = test(model, test_dataset) print(f'Epoch {epoch+1}/{opt.epochs}, mAP {mAP:.4f}') # 保存模型 if epoch % 10 == 0: torch.save(model.state_dict(), f'yolov5_epoch{epoch+1}.pt') 这个程序假设你已经有了一个数据集,其中包含一个data.yaml文件,描述了训练和测试数据的路径和标签等信息。它还假设你已经实现了一个LoadImagesAndLabels类,用于加载数据集。如果你还没有这个类,可以参考YOLOv5的源代码实现一个。 除了使用torch定义的优化器和学习率衰减策略,我们还使用了一个自己实现的test函数来测试模型在测试集上的表现。该函数的实现可以参考YOLOv5的源代码。注意,我们每10个epoch就保存一次模型。
如果你已经训练好了一个目标检测模型,可以使用 detect.py 脚本来进行对象检测。可以将该脚本作为一个函数来调用,以便在其他代码中使用。 以下是一个示例代码,展示如何在 Python 中调用 detect.py 脚本: python import argparse import torch from models import * from utils.datasets import * from utils.utils import * def detect(): parser = argparse.ArgumentParser() parser.add_argument('--cfg', type=str, default='cfg/yolov3.cfg', help='*.cfg path') parser.add_argument('--names', type=str, default='data/coco.names', help='*.names path') parser.add_argument('--weights', type=str, default='weights/yolov3.weights', help='weights path') parser.add_argument('--source', type=str, default='data/samples', help='source') # input file/folder, 0 for webcam parser.add_argument('--output', type=str, default='output', help='output folder') # output folder parser.add_argument('--img-size', type=int, default=416, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.3, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.6, help='IOU threshold for NMS') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='display results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--classes', nargs='+', type=int, help='filter by class') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') opt = parser.parse_args() with torch.no_grad(): if opt.classes: opt.filter_classes = True device = torch_utils.select_device(opt.device) print(f'Using {device}') # Initialize model model = Darknet(opt.cfg, img_size=opt.img_size) attempt_download(opt.weights) if opt.weights.endswith('.pt'): # pytorch format model.load_state_dict(torch.load(opt.weights, map_location=device)['model']) else: # darknet format load_darknet_weights(model, opt.weights) model.to(device).eval() # Get dataloader dataset = LoadImages(opt.source, img_size=opt.img_size) # Run inference t0 = time.time() for path, img, im0s, vid_cap in dataset: img = torch.from_numpy(img).to(device) img = img.float() / 255.0 if img.ndimension() == 3: img = img.unsqueeze(0) # Inference pred = model(img)[0] # Apply NMS pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms) # Process detections for i, det in enumerate(pred): # detections for image i p, s, im0 = path[i], f'{i}: ', im0s[i].copy() save_path = str(Path(opt.output) / Path(p).name) txt_path = str(Path(opt.output) / Path(p).stem) + ('' if opt.save_txt else '.nobak') + '.txt' s += '%gx%g ' % img.shape[2:] # print string gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh if det is not None and len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # Print results for c in det[:, -1].unique(): n = (det[:, -1] == c).sum() # detections per class s += f'{n} {names[int(c)]}s, ' # add to string # Write results for *xyxy, conf, cls in det: if opt.save_txt: # Write to file xyxy = torch.tensor(xyxy).view(1, 4) # convert to tensor xyxy = xyxy / gn[:2] + torch.tensor([0, 0, 1, 1]).float().cuda() # normalized to img0 0-1 line = (cls, *xyxy[0], conf) if opt.save_txt else (cls, conf) with open(txt_path, 'a') as f: f.write(('%g ' * len(line)).rstrip() % line + '\n') if opt.view_img: # Add bbox to image c = int(cls) # integer class label = None if opt.hide_labels else (names[c] if opt.hide_conf else f'{names[c]} {conf:.2f}') plot_one_box(xyxy, im0, label=label, color=colors(c, True), line_thickness=opt.line_thickness) # Print time (inference + NMS) print(f'{s}Done. ({time.time() - t0:.3f}s)') # Save results (image with detections) if opt.save_img: cv2.imwrite(save_path, im0) print(f'Done. ({time.time() - t0:.3f}s)') 上述代码中 detect() 函数中包含了 detect.py 的全部代码。在这个函数中,我们使用 argparse 模块来处理命令行参数,并在模型加载后对传入的图片进行目标检测。最后,我们可以选择将结果保存到文件或显示在屏幕上。 你可以在你自己的代码中调用此函数,以便在其他应用程序中使用目标检测模型。
重写 YOLOv5 的 val.py 可以通过以下步骤完成: 1. 导入必要的库和模块: import argparse import os import time import torch import torch.backends.cudnn as cudnn from numpy import random from models.experimental import attempt_load from utils.datasets import LoadImages from utils.general import check_img_size, non_max_suppression, scale_coords from utils.plots import plot_one_box from utils.torch_utils import select_device, time_synchronized 2. 设置命令行参数并解析: parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)') parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS') parser.add_argument('--max-det', type=int, default=1000, help='maximum number of detections per image') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='display results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--update', action='store_true', help='update all models') parser.add_argument('--project', default='runs/detect', help='save results to project/name') parser.add_argument('--name', default='exp', help='save results to project/name') parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment') opt = parser.parse_args() 3. 加载模型: device = select_device(opt.device) half = device.type != 'cpu' # half precision only supported on CUDA # Load model model = attempt_load(opt.weights, map_location=device) # load FP32 model if half: model.half() # to FP16 # Set Dataloader vid_path, vid_writer = None, None if opt.source.endswith('.txt'): with open(opt.source, 'r') as f: dataset = [x.strip() for x in f.readlines()] elif opt.source.endswith(('mp4', 'avi', 'mov')): vid_path = opt.source if not os.path.exists(opt.source): raise FileNotFoundError(f'File not found: {opt.source}') dataset = [opt.source] else: dataset = LoadImages(opt.source, img_size=opt.img_size) # Get names and colors names = model.module.names if hasattr(model, 'module') else model.names colors = [[random.randint(0, 255) for _ in range(3)] for _ in names] 4. 设置图片大小和推理模式: imgsz = check_img_size(opt.img_size, s=model.stride.max()) # check img_size if opt.device.type != 'cpu': cudnn.benchmark = True # set True to speed up constant image size inference 5. 对每张图片进行推理: for path, img, im0s, vid_cap in dataset: t1 = time_synchronized() # Get detections img = torch.from_numpy(img).to(device) if img.ndimension() == 3: img = img.unsqueeze(0) pred = model(img, augment=opt.augment)[0] # Apply NMS pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, opt.classes, opt.agnostic_nms, max_det=opt.max_det) t2 = time_synchronized() # Process detections for i, det in enumerate(pred): # detections per image if webcam: p, s, im0 = path[i], f'{i}: ', im0s[i].copy() else: p, s, im0 = path, '', im0s save_path = str(Path(opt.project) / Path(p).name) txt_path = str(Path(opt.project) / Path(p).stem) + ('' if dataset.mode == 'image' else f'_{dataset.count}.txt') # txt filename s += '%gx%g ' % img.shape[2:] # print string gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh if det is not None and len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # Print results for c in det[:, -1].unique(): n = (det[:, -1] == c).sum() # detections per class s += f"{n} {names[int(c)]}{'s' * (n > 1)}, " # add to string # Write results for *xyxy, conf, cls in reversed(det): if opt.save_txt: # Write to file xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh with open(txt_path, 'a') as f: f.write(('%g ' * 5 + '\n') % (cls, *xywh, conf)) if opt.save_crop or opt.save_conf: # Save cropped prediction boxes save_one_box(xyxy, im0, file=save_path, BGR=True) if opt.view_img: # Add bbox to image label = f'{names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3) # Print time (inference + NMS) print(f'{s}Done. ({t2 - t1:.3f}s)') # Stream results if opt.view_img: cv2.imshow(p, im0) if cv2.waitKey(1) == ord('q'): # q to quit raise StopIteration 6. 保存结果: # Save results (image with detections) if not opt.nosave: if dataset.mode == 'images': cv2.imwrite(save_path, im0) else: if vid_path != vid_writer: # new video vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*opt.fourcc), vid_cap.get(cv2.CAP_PROP_FPS), (round(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)), round(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))) vid_writer.write(im0) 以上就是重写 YOLOv5 的 val.py 的主要步骤,可以根据实际需求进行调整和修改。
yolov7train.py 是使用 YOLOv7 算法进行目标检测的训练脚本。下面对 yolov7train.py 的主要代码进行简单的解释: 1. 导入相关库 python import argparse import yaml import time import torch from torch.utils.data import DataLoader from torchvision import datasets from models.yolov7 import Model from utils.datasets import ImageFolder from utils.general import ( check_img_size, non_max_suppression, apply_classifier, scale_coords, xyxy2xywh, plot_one_box, strip_optimizer, set_logging) from utils.torch_utils import ( select_device, time_synchronized, load_classifier, model_info) 这里导入了 argparse 用于解析命令行参数,yaml 用于解析配置文件,time 用于记录时间,torch 用于神经网络训练,DataLoader 用于读取数据集,datasets 和 ImageFolder 用于加载数据集,Model 用于定义 YOLOv7 模型,各种工具函数用于辅助训练。 2. 定义命令行参数 python parser = argparse.ArgumentParser() parser.add_argument('--data', type=str, default='data.yaml', help='dataset.yaml path') parser.add_argument('--hyp', type=str, default='hyp.yaml', help='hyperparameters path') parser.add_argument('--epochs', type=int, default=300) parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs') parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes') parser.add_argument('--rect', action='store_true', help='rectangular training') parser.add_argument('--resume', nargs='?', const='yolov7.pt', default=False, help='resume most recent training') parser.add_argument('--nosave', action='store_true', help='only save final checkpoint') parser.add_argument('--notest', action='store_true', help='only test final epoch') parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters') parser.add_argument('--bucket', type=str, default='', help='gsutil bucket') opt = parser.parse_args() 这里定义了许多命令行参数,包括数据集路径、超参数路径、训练轮数、批量大小、图片大小、是否使用矩形训练、是否从最近的检查点恢复训练、是否只保存最终的检查点、是否只测试最终的模型、是否进行超参数进化、gsutil 存储桶等。 3. 加载数据集 python with open(opt.data) as f: data_dict = yaml.load(f, Loader=yaml.FullLoader) train_path = data_dict['train'] test_path = data_dict['test'] num_classes = data_dict['nc'] names = data_dict['names'] train_dataset = ImageFolder(train_path, img_size=opt.img_size[0], rect=opt.rect) test_dataset = ImageFolder(test_path, img_size=opt.img_size[1], rect=True) batch_size = opt.batch_size train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=8, pin_memory=True, collate_fn=train_dataset.collate_fn) test_dataloader = DataLoader(test_dataset, batch_size=batch_size * 2, num_workers=8, pin_memory=True, collate_fn=test_dataset.collate_fn) 这里读取了数据集的配置文件,包括训练集、测试集、类别数和类别名称等信息。然后使用 ImageFolder 加载数据集,设置图片大小和是否使用矩形训练。最后使用 DataLoader 加载数据集,并设置批量大小、是否 shuffle、是否使用 pin_memory 等参数。 4. 定义 YOLOv7 模型 python model = Model(opt.hyp, num_classes, opt.img_size) model.nc = num_classes device = select_device(opt.device, batch_size=batch_size) model.to(device).train() criterion = model.loss optimizer = torch.optim.SGD(model.parameters(), lr=hyp['lr0'], momentum=hyp['momentum'], weight_decay=hyp['weight_decay']) scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=1, T_mult=2) start_epoch = 0 best_fitness = 0.0 这里使用 Model 类定义了 YOLOv7 模型,并将其放到指定设备上进行训练。使用交叉熵损失函数作为模型的损失函数,使用 SGD 优化器进行训练,并使用余弦退火学习率调整策略。定义了起始轮数、最佳精度等变量。 5. 开始训练 python for epoch in range(start_epoch, opt.epochs): model.train() mloss = torch.zeros(4).to(device) # mean losses for i, (imgs, targets, paths, _) in enumerate(train_dataloader): ni = i + len(train_dataloader) * epoch # number integrated batches (since train start) imgs = imgs.to(device) targets = targets.to(device) loss, _, _ = model(imgs, targets) loss.backward() optimizer.step() optimizer.zero_grad() mloss = (mloss * i + loss.detach().cpu()) / (i + 1) # update mean losses # Print batch results if ni % 20 == 0: print(f'Epoch {epoch}/{opt.epochs - 1}, Batch {i}/{len(train_dataloader) - 1}, lr={optimizer.param_groups[0]["lr"]:.6f}, loss={mloss[0]:.4f}') # Update scheduler scheduler.step() # Update Best fitness with torch.no_grad(): fitness = model_fitness(model) if fitness > best_fitness: best_fitness = fitness # Save checkpoint if (not opt.nosave) or (epoch == opt.epochs - 1): ckpt = { 'epoch': epoch, 'best_fitness': best_fitness, 'state_dict': model.state_dict(), 'optimizer': optimizer.state_dict() } torch.save(ckpt, f'checkpoints/yolov7_epoch{epoch}.pt') # Test if not opt.notest: t = time_synchronized() model.eval() for j, (imgs, targets, paths, shapes) in enumerate(test_dataloader): if j == 0: pred = model(imgs.to(device)) pred = non_max_suppression(pred, conf_thres=0.001, iou_thres=0.6) else: break t1 = time_synchronized() if isinstance(pred, int) or isinstance(pred, tuple): print(f'Epoch {epoch}/{opt.epochs - 1}, test_loss={mloss[0]:.4f}, test_mAP={0.0}') else: pred = pred[0].cpu() iou_thres = 0.5 niou = [iou_thres] * num_classes ap, p, r = ap_per_class(pred, targets, shapes, iou_thres=niou) mp, mr, map50, f1, _, _ = stats(ap, p, r, gt=targets) print(f'Epoch {epoch}/{opt.epochs - 1}, test_loss={mloss[0]:.4f}, test_mAP={map50:.2f} ({mr*100:.1f}/{mp*100:.1f})') # Plot images if epoch == 0 and j == 0: for i, det in enumerate(pred): # detections per image img = cv2.imread(paths[i]) # BGR img = plot_results(img, det, class_names=names) cv2.imwrite(f'runs/test{i}.jpg', img) if i == 3: break 这里进行了多个 epoch 的训练。在每个 epoch 中,对于每个批量的数据,先将数据移动到指定设备上,然后计算模型的损失函数,并进行反向传播和梯度下降。在每个 epoch 结束时,更新学习率调整策略和最佳精度,保存当前的检查点。如果 opt.notest 为 False,则进行测试,并输出测试结果。最后,如果是第一个 epoch,则绘制部分图像用于可视化。
YoloV7是目标检测算法YOLO的最新版本,相较于之前的版本,它在模型结构、训练策略和速度等方面都有了较大的改进。test.py文件是用于测试已经训练好的模型的脚本,下面是对test.py文件的详细解释: 1. 导入必要的库和模块 python import argparse import os import platform import shutil import time from pathlib import Path import cv2 import torch import torch.backends.cudnn as cudnn import numpy as np from models.experimental import attempt_load from utils.datasets import LoadStreams, LoadImages from utils.general import check_img_size, check_requirements, check_imshow, \ non_max_suppression, apply_classifier, scale_coords, xyxy2xywh, strip_optimizer, set_logging from utils.plots import plot_one_box from utils.torch_utils import select_device, load_classifier, time_synchronized 这里导入了一些必要的库和模块,比如PyTorch、OpenCV、NumPy等,以及用于测试的模型、数据集和一些工具函数。 2. 定义输入参数 python parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)') parser.add_argument('--source', type=str, default='data/images', help='source') parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='display results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--update', action='store_true', help='update all models') parser.add_argument('--project', default='runs/detect', help='save results to project/name') parser.add_argument('--name', default='exp', help='save results to project/name') parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment') opt = parser.parse_args() 这里使用Python的argparse库来定义输入参数,包括模型权重文件、输入数据源、推理尺寸、置信度阈值、NMS阈值等。 3. 加载模型 python # 加载模型 model = attempt_load(opt.weights, map_location=device) # load FP32 model imgsz = check_img_size(opt.img_size, s=model.stride.max()) # check img_size if device.type != 'cpu': model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters()))) # run once 这里使用attempt_load()函数来加载模型,该函数会根据传入的权重文件路径自动选择使用哪个版本的YoloV7模型。同时,这里还会检查输入图片的大小是否符合模型的要求。 4. 设置计算设备 python # 设置计算设备 device = select_device(opt.device) half = device.type != 'cpu' # half precision only supported on CUDA # Initialize model model.to(device).eval() 这里使用select_device()函数来选择计算设备(GPU或CPU),并将模型移动到选择的设备上。 5. 加载数据集 python # 加载数据集 if os.path.isdir(opt.source): dataset = LoadImages(opt.source, img_size=imgsz) else: dataset = LoadStreams(opt.source, img_size=imgsz) 根据输入参数中的数据源,使用LoadImages()或LoadStreams()函数来加载数据集。这两个函数分别支持从图片文件夹或摄像头/视频中读取数据。 6. 定义类别和颜色 python # 定义类别和颜色 names = model.module.names if hasattr(model, 'module') else model.names colors = [[np.random.randint(0, 255) for _ in range(3)] for _ in names] 这里从模型中获取类别名称,同时为每个类别随机生成一个颜色,用于在图片中绘制框和标签。 7. 定义输出文件夹 python # 定义输出文件夹 save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok)) # increment run (save_dir / 'labels' if opt.save_txt else save_dir).mkdir(parents=True, exist_ok=True) # make dir 这里使用increment_path()函数来生成输出文件夹的名称,同时创建相应的文件夹。 8. 开始推理 python # 开始推理 for path, img, im0s, vid_cap in dataset: t1 = time_synchronized() # 图像预处理 img = torch.from_numpy(img).to(device) img = img.half() if half else img.float() img /= 255.0 if img.ndimension() == 3: img = img.unsqueeze(0) # 推理 pred = model(img)[0] # 后处理 pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms) t2 = time_synchronized() # 处理结果 for i, det in enumerate(pred): # detections per image if webcam: # batch_size >= 1 p, s, im0 = path[i], f'{i}: ', im0s[i].copy() else: p, s, im0 = path, '', im0s save_path = str(save_dir / p.name) txt_path = str(save_dir / 'labels' / p.stem) + ('' if dataset.mode == 'image' else f'_{counter}') + '.txt' if det is not None and len(det): det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() for *xyxy, conf, cls in reversed(det): c = int(cls) label = f'{names[c]} {conf:.2f}' plot_one_box(xyxy, im0, label=label, color=colors[c], line_thickness=3) if opt.save_conf: with open(txt_path, 'a') as f: f.write(f'{names[c]} {conf:.2f}\n') if opt.save_crop: w = int(xyxy[2] - xyxy[0]) h = int(xyxy[3] - xyxy[1]) x1 = int(xyxy[0]) y1 = int(xyxy[1]) x2 = int(xyxy[2]) y2 = int(xyxy[3]) crop_img = im0[y1:y2, x1:x2] crop_path = save_path + f'_{i}_{c}.jpg' cv2.imwrite(crop_path, crop_img) # 保存结果 if opt.nosave: pass elif dataset.mode == 'images': cv2.imwrite(save_path, im0) else: if vid_path != save_path: # new video vid_path = save_path if isinstance(vid_writer, cv2.VideoWriter): vid_writer.release() # release previous video writer fourcc = 'mp4v' # output video codec fps = vid_cap.get(cv2.CAP_PROP_FPS) w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*fourcc), fps, (w, h)) vid_writer.write(im0) # 打印结果 print(f'{s}Done. ({t2 - t1:.3f}s)') # 释放资源 if cv2.waitKey(1) == ord('q'): # q to quit raise StopIteration elif cv2.waitKey(1) == ord('p'): # p to pause cv2.waitKey(-1) 这里使用一个循环来遍历数据集中的所有图像或视频帧,对每张图像或视频帧进行以下操作: - 图像预处理:将图像转换为PyTorch张量,并进行归一化和类型转换。 - 推理:将图像张量传入模型进行推理,得到预测结果。 - 后处理:对预测结果进行非极大值抑制、类别筛选等后处理操作,得到最终的检测结果。 - 处理结果:对每个检测框进行标签和颜色的绘制,同时可以选择保存检测结果的图片或视频以及标签信息的TXT文件。 - 释放资源:根据按键输入决定是否退出或暂停程序。 9. 总结 以上就是YoloV7的测试脚本test.py的详细解释,通过这个脚本可以方便地测试已经训练好的模型,并对检测结果进行可视化和保存等操作。

最新推荐

定制linux内核(linux2.6.32)汇编.pdf

定制linux内核(linux2.6.32)汇编.pdf

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

图像处理进阶:基于角点的特征匹配

# 1. 图像处理简介 ## 1.1 图像处理概述 图像处理是指利用计算机对图像进行获取、存储、传输、显示和图像信息的自动化获取和处理技术。图像处理的主要任务包括图像采集、图像预处理、图像增强、图像复原、图像压缩、图像分割、目标识别与提取等。 ## 1.2 图像处理的应用领域 图像处理广泛应用于医学影像诊断、遥感图像处理、安检领域、工业自动化、计算机视觉、数字图书馆、人脸识别、动作捕捉等多个领域。 ## 1.3 图像处理的基本原理 图像处理的基本原理包括数字图像的表示方式、基本的图像处理操作(如灰度变换、空间滤波、频域滤波)、图像分割、特征提取和特征匹配等。图像处理涉及到信号与系统、数字

Cannot resolve class android.support.constraint.ConstraintLayout

如果您在Android Studio中遇到`Cannot resolve class android.support.constraint.ConstraintLayout`的错误,请尝试以下解决方案: 1. 确认您的项目中是否添加了ConstraintLayout库依赖。如果没有,请在您的build.gradle文件中添加以下依赖: ```groovy dependencies { implementation 'com.android.support.constraint:constraint-layout:<version>' } ``` 其中`<version>`为您想要

Solaris常用命令_多路径配置.doc

Solaris常用命令_多路径配置.doc

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依

Apache HTTP Server动静资源分离下的Nginx对比分析

# 1. 引言 ## 1.1 背景介绍 在Web服务器领域,Apache HTTP Server(简称Apache)一直是广泛应用的开源软件之一,提供了稳定、可靠的服务。随着网络技术的不断发展,网站对于动态和静态资源的需求也越来越复杂。为了更好地提升网站的性能和效率,动静资源分离成为了一个重要的优化方向。而在动静资源分离方面,Nginx作为备受关注的替代品备受瞩目。 ## 1.2 目的和意义 本文旨在探讨Apache HTTP Server和Nginx在动静资源分离方面的特点及优势,通过对比它们在性能、效率和安全性方面的表现,帮助读者更好地了解如何在实际应用中选择合适的服务器软件。

Html css JS promise await 形式 实现红绿灯变化

好的,我了解你的问题。这里我将使用HTML、CSS和JavaScript语言来实现红绿灯的promise和await实现。 首先,我们需要定义一个HTML页面,包含一个div元素和三个button元素。这个div元素用来模拟红绿灯,三个button元素用来控制红绿灯的变化。 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>红绿灯</title> <style> #light { width: 100px; height: 100px; border

LOGO语言辅导.ppt

LOGO语言辅导.ppt

关系数据表示学习

关系数据卢多维奇·多斯桑托斯引用此版本:卢多维奇·多斯桑托斯。关系数据的表示学习机器学习[cs.LG]。皮埃尔和玛丽·居里大学-巴黎第六大学,2017年。英语。NNT:2017PA066480。电话:01803188HAL ID:电话:01803188https://theses.hal.science/tel-01803188提交日期:2018年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaireUNIVERSITY PIERRE和 MARIE CURIE计算机科学、电信和电子学博士学院(巴黎)巴黎6号计算机科学实验室D八角形T HESIS关系数据表示学习作者:Ludovic DOS SAntos主管:Patrick GALLINARI联合主管:本杰明·P·伊沃瓦斯基为满足计算机科学博士学位的要求而提交的论文评审团成员:先生蒂埃里·A·退休记者先生尤尼斯·B·恩