• [技术干货] 【人工智能】MindSpore Hub-转载
    前言MindSpore着重提升易用性并降低AI开发者的开发门槛,MindSpore原生适应每个场景包括端、边缘和云,并能够在按需协同的基础上,通过实现AI算法即代码,使开发态变得更加友好,显著减少模型开发时间,降低模型开发门槛。通过MindSpore自身的技术创新及MindSpore与华为昇腾AI处理器的协同优化,实现了运行态的高效,大大提高了计算性能;MindSpore也支持GPU、CPU等其它处理器。一、什么是MindSpore Hub1.简单介绍官方版本的预训练模型中心库---MindSpore Hubmindspore_hub 是一个Python库下载网址:点击跳转2.MindSpore Hub包含功能即插即用的模型加载简单易用的迁移学习import mindsporeimport mindspore_hub as mshubfrom mindspore import set_context, GRAPH_MODEset_context(mode=GRAPH_MODE,device_target="Ascend",device_id=0)model = "mindspore/1.6/googlenet_cifar10"# Initialize the number of classes based on the pre-trained model.network = mshub.load(model, num_classes=10)network.set_train(False)# ...3.MindSpore Hub使用场景· 推理验证:mindspore_hub.load用于加载预训练模型,可以实现一行代码完成模型的加载。· 迁移学习:通过mindspore_hub.load完成模型加载后,可以增加一个额外的参数项只加载神经网络的特征提取部分,这样就能很容易地在之后增加一些新的层进行迁移学习。· 发布模型:可以将自己训练好的模型按照指定的步骤发布到MindSpore Hub中,以供其他用户进行下载和使用。二、安装MindSpore Hub1.确认系统环境信息硬件平台支持Ascend、GPU和CPU。确认安装Python 3.7.5版本。MindSpore Hub与MindSpore的版本需保持一致。MindSpore Hub支持使用x86 64位或ARM 64位架构的Linux发行版系统。在联网状态下,安装whl包时会自动下载setup.py中的依赖项,其余情况需自行安装。2.安装在命令行中输入下面代码进行下载MindSpore Hub whl包pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/Hub/any/mindspore_hub-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple3.下载源码从Gitee下载源码。git clone https://gitee.com/mindspore/hub.git -b r1.9编译安装MindSpore Hub。cd hub ##切换到hub文件下python setup.py install ## 下载4.进行验证在能联网的环境中执行以下命令,验证安装结果。import mindspore_hub as mshubmodel = mshub.load("mindspore/1.6/lenet_mnist", num_class=10)如果出现下列提示,说明安装成功:Downloading data from url https://gitee.com/mindspore/hub/raw/r1.9/mshub_res/assets/mindspore/1.6/lenet_mnist.mdDownload finished!File size = 0.00 MbChecking /home/ma-user/.mscache/mindspore/1.6/lenet_mnist.md...Passed!三、加载模型1.介绍于个人开发者来说,从零开始训练一个较好模型,需要大量的标注完备的数据、足够的计算资源和大量训练调试时间。使得模型训练非常消耗资源,提升了AI开发的门槛,针对以上问题,MindSpore Hub提供了很多训练完成的模型权重文件,可以使得开发者在拥有少量数据的情况下,只需要花费少量训练时间,即可快速训练出一个较好的模型。2.推理验证##使用url完成模型的加载import mindspore_hub as mshubimport mindsporefrom mindspore import Tensor, nn, Model, set_context, GRAPH_MODEfrom mindspore import dtype as mstypeimport mindspore.dataset.vision as visionset_context(mode=GRAPH_MODE,device_target="Ascend",device_id=0)model = "mindspore/1.6/googlenet_cifar10"# Initialize the number of classes based on the pre-trained model.network = mshub.load(model, num_classes=10)network.set_train(False)最后使用MindSpore进行推理3.迁移学习#使用url进行MindSpore Hub模型的加载,注意:include_top参数需要模型开发者提供。import osimport mindspore_hub as mshubimport mindsporefrom mindspore import Tensor, nn, set_context, GRAPH_MODEfrom mindspore.nn import Momentumfrom mindspore import save_checkpoint, load_checkpoint,load_param_into_netfrom mindspore import opsimport mindspore.dataset as dsimport mindspore.dataset.transforms as transformsimport mindspore.dataset.vision as visionfrom mindspore import dtype as mstypefrom mindspore import Modelset_context(mode=GRAPH_MODE, device_target="Ascend", device_id=0)model = "mindspore/1.6/mobilenetv2_imagenet2012"network = mshub.load(model, num_classes=500, include_top=False, activation="Sigmoid")network.set_train(False)#在现有模型结构基础上,增加一个与新任务相关的分类层。class ReduceMeanFlatten(nn.Cell):def __init__(self):super(ReduceMeanFlatten, self).__init__()self.mean = ops.ReduceMean(keep_dims=True)self.flatten = nn.Flatten()def construct(self, x):x = self.mean(x, (2, 3))x = self.flatten(x)return x# Check MindSpore Hub website to conclude that the last output shape is 1280.last_channel = 1280# The number of classes in target task is 10.num_classes = 10reducemean_flatten = ReduceMeanFlatten()classification_layer = nn.Dense(last_channel, num_classes)classification_layer.set_train(True)train_network = nn.SequentialCell([network, reducemean_flatten, classification_layer])#定义数据集加载函数。def create_cifar10dataset(dataset_path, batch_size, usage='train', shuffle=True):data_set = ds.Cifar10Dataset(dataset_dir=dataset_path, usage=usage, shuffle=shuffle)# define map operationstrans = [vision.Resize((256, 256)),vision.RandomHorizontalFlip(prob=0.5),vision.Rescale(1.0 / 255.0, 0.0),vision.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),vision.HWC2CHW()]type_cast_op = transforms.TypeCast(mstype.int32)data_set = data_set.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=8)# apply batch operationsdata_set = data_set.batch(batch_size, drop_remainder=True)return data_set# Create Datasetdataset_path = "/path_to_dataset/cifar-10-batches-bin"dataset = create_cifar10dataset(dataset_path, batch_size=32, usage='train', shuffle=True)#为模型训练选择损失函数、优化器和学习率。def generate_steps_lr(lr_init, steps_per_epoch, total_epochs):total_steps = total_epochs * steps_per_epochdecay_epoch_index = [0.3*total_steps, 0.6*total_steps, 0.8*total_steps]lr_each_step = []for i in range(total_steps):if i < decay_epoch_index[0]:lr = lr_initelif i < decay_epoch_index[1]:lr = lr_init * 0.1elif i < decay_epoch_index[2]:lr = lr_init * 0.01else:lr = lr_init * 0.001lr_each_step.append(lr)return lr_each_step# Set epoch sizeepoch_size = 60# Wrap the backbone network with loss.loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")loss_net = nn.WithLossCell(train_network, loss_fn)steps_per_epoch = dataset.get_dataset_size()lr = generate_steps_lr(lr_init=0.01, steps_per_epoch=steps_per_epoch, total_epochs=epoch_size)# Create an optimizer.optim = Momentum(filter(lambda x: x.requires_grad, classification_layer.get_parameters()), Tensor(lr, mindspore.float32), 0.9, 4e-5)train_net = nn.TrainOneStepCell(loss_net, optim)#开始重训练。for epoch in range(epoch_size):for i, items in enumerate(dataset):data, label = itemsdata = mindspore.Tensor(data)label = mindspore.Tensor(label)loss = train_net(data, label)print(f"epoch: {epoch}/{epoch_size}, loss: {loss}")# Save the ckpt file for each epoch.if not os.path.exists('ckpt'):os.mkdir('ckpt')ckpt_path = f"./ckpt/cifar10_finetune_epoch{epoch}.ckpt"save_checkpoint(train_network, ckpt_path)#在测试集上测试模型精度。model = "mindspore/1.6/mobilenetv2_imagenet2012"network = mshub.load(model, num_classes=500, pretrained=True, include_top=False, activation="Sigmoid")network.set_train(False)reducemean_flatten = ReduceMeanFlatten()classification_layer = nn.Dense(last_channel, num_classes)classification_layer.set_train(False)softmax = nn.Softmax()network = nn.SequentialCell([network, reducemean_flatten, classification_layer, softmax])# Load a pre-trained ckpt file.ckpt_path = "./ckpt/cifar10_finetune_epoch59.ckpt"trained_ckpt = load_checkpoint(ckpt_path)load_param_into_net(classification_layer, trained_ckpt)loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")# Define loss and create model.eval_dataset = create_cifar10dataset(dataset_path, batch_size=32, do_train=False)eval_metrics = {'Loss': nn.Loss(),'Top1-Acc': nn.Top1CategoricalAccuracy(),'Top5-Acc': nn.Top5CategoricalAccuracy()}model = Model(network, loss_fn=loss, optimizer=None, metrics=eval_metrics)metrics = model.eval(eval_dataset)print("metric: ", metrics)四、模型发布#将你的预训练模型托管在可以访问的存储位置。参照模板,在你自己的代码仓中添加模型生成文件mindspore_hub_conf.py,文件放置的位置如下:googlenet├── src│ ├── googlenet.py├── script│ ├── run_train.sh├── train.py├── test.py├── mindspore_hub_conf.py#参照模板,在hub/mshub_res/assets/mindspore/1.6文件夹下创建{model_name}_{dataset}.md文件,其中1.6为MindSpore的版本号,hub/mshub_res的目录结构为:hub├── mshub_res│ ├── assets│ ├── mindspore│ ├── 1.6│ ├── googlenet_cifar10.md│ ├── tools│ ├── get_sha256.py│ ├── load_markdown.py│ └── md_validator.py————————————————版权声明:本文为CSDN博主「跳楼梯企鹅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_50481708/article/details/127952827
  • [技术干货] 教你用300行Python代码实现一个人脸识别系统-转载
     用300行Python代码实现一个人脸识别系统 最近又多了不少朋友关注,先在这里谢谢大家。关注我的朋友大多数都是大学生,而且我简单看了一下,低年级的大学生居多,大多数都是为了完成课程设计,作为一个过来人,还是希望大家平时能多抽出点时间学习一下,这种临时抱佛脚的策略要少用嗷。今天我们来python实现一个人脸识别系统,主要是借助了dlib这个库,相当于我们直接调用现成的库来进行人脸识别,就省去了之前教程中的数据收集和模型训练的步骤了。 注:直接安装dlib库可能会有编译错误,可以通过下列方式获取编译好的dlib库  获取方式1: 直接从付费资源下载  人脸识别系统+windows64位-dlib-19.17.0-cp37-cp37m-win_amd64.zip-深度学习文档类资源-CSDN文库  获取方式2: 在B站视频三连并在评论区留下你的邮箱地址  用300行代码实现人脸识别系统_哔哩哔哩_bilibili  获取方式3:  在CSDN博客中三连并在评论区留下你的邮箱地址  用300行Python代码实现一个人脸识别系统_dejahu的博客-CSDN博客  基本原理 人脸识别和目标检测这些还不太一样,比如大家传统的训练一个目标检测模型,你只有对这个目标训练了之后,你的模型才能找到这样的目标,比如你的目标检测模型如果是检测植物的,那显然就不能检测动物。但是人脸识别就不一样,以你的手机为例,你发现你只录入了一次你的人脸信息,不需要训练,他就能准确的识别你,这里识别的原理是通过人脸识别的模型提取你脸部的特征向量,然后将实时检测到的你的人脸同数据库中保存的人脸进行比对,如果相似度超过一定的阈值之后,就认为比对成功。不过我这里说的只是简化版本的人脸识别,现在手机和门禁这些要复杂和安全的多,也不是简单平面上的人脸识别。  总结下来可以分为下面的步骤:  上传人脸到数据库 人脸检测 数据库比对并返回结果 这里我做了一个简答的示意图,可以帮助大家简单理解一下。   代码实现 废话不多说,这里就是我们的代码实现,代码我已经上传到码云,大家直接下载就行,地址就在博客开头。  不会安装python环境的兄弟请看这里:如何在pycharm中配置anaconda的虚拟环境_dejahu的博客-CSDN博客_如何在pycharm中配置anaconda  创建虚拟环境 创建虚拟环境前请大家先下载博客开头的码云源码到本地。  本次我们需要使用到python3.7的虚拟环境,命令如下:  conda create -n face python==3.7.3 conda activate face 1 2 安装必要的库 pip install -r requirements.txt 1 愉快地开始你的人脸识别吧! 执行下面的主文件即可  python UI.py 1 或者在pycharm中按照下面的方式直接运行即可   首先将你需要识别的人脸上传到数据库中   通过第二个视频检测功能识别实时的人脸   详细的代码如下:  # -*- coding: utf-8 -*- """ ------------------------------------------------- Project Name: yolov5-jungong File Name: window.py.py Author: chenming Create Date: 2021/11/8 Description:图形化界面,可以检测摄像头、视频和图片文件 ------------------------------------------------- """ # 应该在界面启动的时候就将模型加载出来,设置tmp的目录来放中间的处理结果 import shutil import PyQt5.QtCore from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * import threading import argparse import os import sys from pathlib import Path import cv2 import torch import torch.backends.cudnn as cudnn import os.path as osp FILE = Path(__file__).resolve() ROOT = FILE.parents[0]  # YOLOv5 root directory if str(ROOT) not in sys.path:     sys.path.append(str(ROOT))  # add ROOT to PATH ROOT = Path(os.path.relpath(ROOT, Path.cwd()))  # relative  from models.common import DetectMultiBackend from utils.datasets import IMG_FORMATS, VID_FORMATS, LoadImages, LoadStreams from utils.general import (LOGGER, check_file, check_img_size, check_imshow, check_requirements, colorstr,                            increment_path, non_max_suppression, print_args, scale_coords, strip_optimizer, xyxy2xywh) from utils.plots import Annotator, colors, save_one_box from utils.torch_utils import select_device, time_sync  # 添加一个关于界面 # 窗口主类 class MainWindow(QTabWidget):     # 基本配置不动,然后只动第三个界面     def __init__(self):         # 初始化界面         super().__init__()         self.setWindowTitle('Target detection system')         self.resize(1200, 800)         self.setWindowIcon(QIcon("images/UI/lufei.png"))         # 图片读取进程         self.output_size = 480         self.img2predict = ""         self.device = 'cpu'         # # 初始化视频读取线程         self.vid_source = '0'  # 初始设置为摄像头         self.stopEvent = threading.Event()         self.webcam = True         self.stopEvent.clear()         self.model = self.model_load(weights="runs/train/exp_yolov5s/weights/best.pt",                                      device="cpu")  # todo 指明模型加载的位置的设备         self.initUI()         self.reset_vid()      '''     ***模型初始化***     '''     @torch.no_grad()     def model_load(self, weights="",  # model.pt path(s)                    device='',  # cuda device, i.e. 0 or 0,1,2,3 or cpu                    half=False,  # use FP16 half-precision inference                    dnn=False,  # use OpenCV DNN for ONNX inference                    ):         device = select_device(device)         half &= device.type != 'cpu'  # half precision only supported on CUDA         device = select_device(device)         model = DetectMultiBackend(weights, device=device, dnn=dnn)         stride, names, pt, jit, onnx = model.stride, model.names, model.pt, model.jit, model.onnx         # Half         half &= pt and device.type != 'cpu'  # half precision only supported by PyTorch on CUDA         if pt:             model.model.half() if half else model.model.float()         print("模型加载完成!")         return model      '''     ***界面初始化***     '''     def initUI(self):         # 图片检测子界面         font_title = QFont('楷体', 16)         font_main = QFont('楷体', 14)         # 图片识别界面, 两个按钮,上传图片和显示结果         img_detection_widget = QWidget()         img_detection_layout = QVBoxLayout()         img_detection_title = QLabel("图片识别功能")         img_detection_title.setFont(font_title)         mid_img_widget = QWidget()         mid_img_layout = QHBoxLayout()         self.left_img = QLabel()         self.right_img = QLabel()         self.left_img.setPixmap(QPixmap("images/UI/up.jpeg"))         self.right_img.setPixmap(QPixmap("images/UI/right.jpeg"))         self.left_img.setAlignment(Qt.AlignCenter)         self.right_img.setAlignment(Qt.AlignCenter)         mid_img_layout.addWidget(self.left_img)         mid_img_layout.addStretch(0)         mid_img_layout.addWidget(self.right_img)         mid_img_widget.setLayout(mid_img_layout)         up_img_button = QPushButton("上传图片")         det_img_button = QPushButton("开始检测")         up_img_button.clicked.connect(self.upload_img)         det_img_button.clicked.connect(self.detect_img)         up_img_button.setFont(font_main)         det_img_button.setFont(font_main)         up_img_button.setStyleSheet("QPushButton{color:white}"                                     "QPushButton:hover{background-color: rgb(2,110,180);}"                                     "QPushButton{background-color:rgb(48,124,208)}"                                     "QPushButton{border:2px}"                                     "QPushButton{border-radius:5px}"                                     "QPushButton{padding:5px 5px}"                                     "QPushButton{margin:5px 5px}")         det_img_button.setStyleSheet("QPushButton{color:white}"                                      "QPushButton:hover{background-color: rgb(2,110,180);}"                                      "QPushButton{background-color:rgb(48,124,208)}"                                      "QPushButton{border:2px}"                                      "QPushButton{border-radius:5px}"                                      "QPushButton{padding:5px 5px}"                                      "QPushButton{margin:5px 5px}")         img_detection_layout.addWidget(img_detection_title, alignment=Qt.AlignCenter)         img_detection_layout.addWidget(mid_img_widget, alignment=Qt.AlignCenter)         img_detection_layout.addWidget(up_img_button)         img_detection_layout.addWidget(det_img_button)         img_detection_widget.setLayout(img_detection_layout)          # todo 视频识别界面         # 视频识别界面的逻辑比较简单,基本就从上到下的逻辑         vid_detection_widget = QWidget()         vid_detection_layout = QVBoxLayout()         vid_title = QLabel("视频检测功能")         vid_title.setFont(font_title)         self.vid_img = QLabel()         self.vid_img.setPixmap(QPixmap("images/UI/up.jpeg"))         vid_title.setAlignment(Qt.AlignCenter)         self.vid_img.setAlignment(Qt.AlignCenter)         self.webcam_detection_btn = QPushButton("摄像头实时监测")         self.mp4_detection_btn = QPushButton("视频文件检测")         self.vid_stop_btn = QPushButton("停止检测")         self.webcam_detection_btn.setFont(font_main)         self.mp4_detection_btn.setFont(font_main)         self.vid_stop_btn.setFont(font_main)         self.webcam_detection_btn.setStyleSheet("QPushButton{color:white}"                                                 "QPushButton:hover{background-color: rgb(2,110,180);}"                                                 "QPushButton{background-color:rgb(48,124,208)}"                                                 "QPushButton{border:2px}"                                                 "QPushButton{border-radius:5px}"                                                 "QPushButton{padding:5px 5px}"                                                 "QPushButton{margin:5px 5px}")         self.mp4_detection_btn.setStyleSheet("QPushButton{color:white}"                                              "QPushButton:hover{background-color: rgb(2,110,180);}"                                              "QPushButton{background-color:rgb(48,124,208)}"                                              "QPushButton{border:2px}"                                              "QPushButton{border-radius:5px}"                                              "QPushButton{padding:5px 5px}"                                              "QPushButton{margin:5px 5px}")         self.vid_stop_btn.setStyleSheet("QPushButton{color:white}"                                         "QPushButton:hover{background-color: rgb(2,110,180);}"                                         "QPushButton{background-color:rgb(48,124,208)}"                                         "QPushButton{border:2px}"                                         "QPushButton{border-radius:5px}"                                         "QPushButton{padding:5px 5px}"                                         "QPushButton{margin:5px 5px}")         self.webcam_detection_btn.clicked.connect(self.open_cam)         self.mp4_detection_btn.clicked.connect(self.open_mp4)         self.vid_stop_btn.clicked.connect(self.close_vid)         # 添加组件到布局上         vid_detection_layout.addWidget(vid_title)         vid_detection_layout.addWidget(self.vid_img)         vid_detection_layout.addWidget(self.webcam_detection_btn)         vid_detection_layout.addWidget(self.mp4_detection_btn)         vid_detection_layout.addWidget(self.vid_stop_btn)         vid_detection_widget.setLayout(vid_detection_layout)          # todo 关于界面         about_widget = QWidget()         about_layout = QVBoxLayout()         about_title = QLabel('欢迎使用目标检测系统\n\n 提供付费指导:有需要的好兄弟加下面的QQ即可')  # todo 修改欢迎词语         about_title.setFont(QFont('楷体', 18))         about_title.setAlignment(Qt.AlignCenter)         about_img = QLabel()         about_img.setPixmap(QPixmap('images/UI/qq.png'))         about_img.setAlignment(Qt.AlignCenter)          # label4.setText("<a href='https://oi.wiki/wiki/学习率的调整'>如何调整学习率</a>")         label_super = QLabel()  # todo 更换作者信息         label_super.setText("<a href='https://blog.csdn.net/ECHOSON'>或者你可以在这里找到我-->肆十二</a>")         label_super.setFont(QFont('楷体', 16))         label_super.setOpenExternalLinks(True)         # label_super.setOpenExternalLinks(True)         label_super.setAlignment(Qt.AlignRight)         about_layout.addWidget(about_title)         about_layout.addStretch()         about_layout.addWidget(about_img)         about_layout.addStretch()         about_layout.addWidget(label_super)         about_widget.setLayout(about_layout)          self.left_img.setAlignment(Qt.AlignCenter)         self.addTab(img_detection_widget, '图片检测')         self.addTab(vid_detection_widget, '视频检测')         self.addTab(about_widget, '联系我')         self.setTabIcon(0, QIcon('images/UI/lufei.png'))         self.setTabIcon(1, QIcon('images/UI/lufei.png'))         self.setTabIcon(2, QIcon('images/UI/lufei.png'))      '''     ***上传图片***     '''     def upload_img(self):         # 选择录像文件进行读取         fileName, fileType = QFileDialog.getOpenFileName(self, 'Choose file', '', '*.jpg *.png *.tif *.jpeg')         if fileName:             suffix = fileName.split(".")[-1]             save_path = osp.join("images/tmp", "tmp_upload." + suffix)             shutil.copy(fileName, save_path)             # 应该调整一下图片的大小,然后统一防在一起             im0 = cv2.imread(save_path)             resize_scale = self.output_size / im0.shape[0]             im0 = cv2.resize(im0, (0, 0), fx=resize_scale, fy=resize_scale)             cv2.imwrite("images/tmp/upload_show_result.jpg", im0)             # self.right_img.setPixmap(QPixmap("images/tmp/single_result.jpg"))             self.img2predict = fileName             self.left_img.setPixmap(QPixmap("images/tmp/upload_show_result.jpg"))             # todo 上传图片之后右侧的图片重置,             self.right_img.setPixmap(QPixmap("images/UI/right.jpeg"))      '''     ***检测图片***     '''     def detect_img(self):         model = self.model         output_size = self.output_size         source = self.img2predict  # file/dir/URL/glob, 0 for webcam         imgsz = 640  # inference size (pixels)         conf_thres = 0.25  # confidence threshold         iou_thres = 0.45  # NMS IOU threshold         max_det = 1000  # maximum detections per image         device = self.device  # cuda device, i.e. 0 or 0,1,2,3 or cpu         view_img = False  # show results         save_txt = False  # save results to *.txt         save_conf = False  # save confidences in --save-txt labels         save_crop = False  # save cropped prediction boxes         nosave = False  # do not save images/videos         classes = None  # filter by class: --class 0, or --class 0 2 3         agnostic_nms = False  # class-agnostic NMS         augment = False  # ugmented inference         visualize = False  # visualize features         line_thickness = 3  # bounding box thickness (pixels)         hide_labels = False  # hide labels         hide_conf = False  # hide confidences         half = False  # use FP16 half-precision inference         dnn = False  # use OpenCV DNN for ONNX inference         print(source)         if source == "":             QMessageBox.warning(self, "请上传", "请先上传图片再进行检测")         else:             source = str(source)             device = select_device(self.device)             webcam = False             stride, names, pt, jit, onnx = model.stride, model.names, model.pt, model.jit, model.onnx             imgsz = check_img_size(imgsz, s=stride)  # check image size             save_img = not nosave and not source.endswith('.txt')  # save inference images             # Dataloader             if webcam:                 view_img = check_imshow()                 cudnn.benchmark = True  # set True to speed up constant image size inference                 dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt and not jit)                 bs = len(dataset)  # batch_size             else:                 dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt and not jit)                 bs = 1  # batch_size             vid_path, vid_writer = [None] * bs, [None] * bs             # Run inference             if pt and device.type != 'cpu':                 model(torch.zeros(1, 3, *imgsz).to(device).type_as(next(model.model.parameters())))  # warmup             dt, seen = [0.0, 0.0, 0.0], 0             for path, im, im0s, vid_cap, s in dataset:                 t1 = time_sync()                 im = torch.from_numpy(im).to(device)                 im = im.half() if half else im.float()  # uint8 to fp16/32                 im /= 255  # 0 - 255 to 0.0 - 1.0                 if len(im.shape) == 3:                     im = im[None]  # expand for batch dim                 t2 = time_sync()                 dt[0] += t2 - t1                 # Inference                 # visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False                 pred = model(im, augment=augment, visualize=visualize)                 t3 = time_sync()                 dt[1] += t3 - t2                 # NMS                 pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)                 dt[2] += time_sync() - t3                 # Second-stage classifier (optional)                 # pred = utils.general.apply_classifier(pred, classifier_model, im, im0s)                 # Process predictions                 for i, det in enumerate(pred):  # per image                     seen += 1                     if webcam:  # batch_size >= 1                         p, im0, frame = path[i], im0s[i].copy(), dataset.count                         s += f'{i}: '                     else:                         p, im0, frame = path, im0s.copy(), getattr(dataset, 'frame', 0)                     p = Path(p)  # to Path                     s += '%gx%g ' % im.shape[2:]  # print string                     gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh                     imc = im0.copy() if save_crop else im0  # for save_crop                     annotator = Annotator(im0, line_width=line_thickness, example=str(names))                     if len(det):                         # Rescale boxes from img_size to im0 size                         det[:, :4] = scale_coords(im.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 save_txt:  # Write to file                                 xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(                                     -1).tolist()  # normalized xywh                                 line = (cls, *xywh, conf) if save_conf else (cls, *xywh)  # label format                                 # with open(txt_path + '.txt', 'a') as f:                                 #     f.write(('%g ' * len(line)).rstrip() % line + '\n')                              if save_img or save_crop or view_img:  # Add bbox to image                                 c = int(cls)  # integer class                                 label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')                                 annotator.box_label(xyxy, label, color=colors(c, True))                                 # if save_crop:                                 #     save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg',                                 #                  BGR=True)                     # Print time (inference-only)                     LOGGER.info(f'{s}Done. ({t3 - t2:.3f}s)')                     # Stream results                     im0 = annotator.result()                     # if view_img:                     #     cv2.imshow(str(p), im0)                     #     cv2.waitKey(1)  # 1 millisecond                     # Save results (image with detections)                     resize_scale = output_size / im0.shape[0]                     im0 = cv2.resize(im0, (0, 0), fx=resize_scale, fy=resize_scale)                     cv2.imwrite("images/tmp/single_result.jpg", im0)                     # 目前的情况来看,应该只是ubuntu下会出问题,但是在windows下是完整的,所以继续                     self.right_img.setPixmap(QPixmap("images/tmp/single_result.jpg"))      # 视频检测,逻辑基本一致,有两个功能,分别是检测摄像头的功能和检测视频文件的功能,先做检测摄像头的功能。      '''     ### 界面关闭事件 ###      '''     def closeEvent(self, event):         reply = QMessageBox.question(self,                                      'quit',                                      "Are you sure?",                                      QMessageBox.Yes | QMessageBox.No,                                      QMessageBox.No)         if reply == QMessageBox.Yes:             self.close()             event.accept()         else:             event.ignore()      '''     ### 视频关闭事件 ###      '''      def open_cam(self):         self.webcam_detection_btn.setEnabled(False)         self.mp4_detection_btn.setEnabled(False)         self.vid_stop_btn.setEnabled(True)         self.vid_source = '0'         self.webcam = True         th = threading.Thread(target=self.detect_vid)         th.start()      '''     ### 开启视频文件检测事件 ###      '''      def open_mp4(self):         fileName, fileType = QFileDialog.getOpenFileName(self, 'Choose file', '', '*.mp4 *.avi')         if fileName:             self.webcam_detection_btn.setEnabled(False)             self.mp4_detection_btn.setEnabled(False)             # self.vid_stop_btn.setEnabled(True)             self.vid_source = fileName             self.webcam = False             th = threading.Thread(target=self.detect_vid)             th.start()      '''     ### 视频开启事件 ###      '''      # 视频和摄像头的主函数是一样的,不过是传入的source不同罢了     def detect_vid(self):         # pass         model = self.model         output_size = self.output_size         # source = self.img2predict  # file/dir/URL/glob, 0 for webcam         imgsz = 640  # inference size (pixels)         conf_thres = 0.25  # confidence threshold         iou_thres = 0.45  # NMS IOU threshold         max_det = 1000  # maximum detections per image         # device = self.device  # cuda device, i.e. 0 or 0,1,2,3 or cpu         view_img = False  # show results         save_txt = False  # save results to *.txt         save_conf = False  # save confidences in --save-txt labels         save_crop = False  # save cropped prediction boxes         nosave = False  # do not save images/videos         classes = None  # filter by class: --class 0, or --class 0 2 3         agnostic_nms = False  # class-agnostic NMS         augment = False  # ugmented inference         visualize = False  # visualize features         line_thickness = 3  # bounding box thickness (pixels)         hide_labels = False  # hide labels         hide_conf = False  # hide confidences         half = False  # use FP16 half-precision inference         dnn = False  # use OpenCV DNN for ONNX inference         source = str(self.vid_source)         webcam = self.webcam         device = select_device(self.device)         stride, names, pt, jit, onnx = model.stride, model.names, model.pt, model.jit, model.onnx         imgsz = check_img_size(imgsz, s=stride)  # check image size         save_img = not nosave and not source.endswith('.txt')  # save inference images         # Dataloader         if webcam:             view_img = check_imshow()             cudnn.benchmark = True  # set True to speed up constant image size inference             dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt and not jit)             bs = len(dataset)  # batch_size         else:             dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt and not jit)             bs = 1  # batch_size         vid_path, vid_writer = [None] * bs, [None] * bs         # Run inference         if pt and device.type != 'cpu':             model(torch.zeros(1, 3, *imgsz).to(device).type_as(next(model.model.parameters())))  # warmup         dt, seen = [0.0, 0.0, 0.0], 0         for path, im, im0s, vid_cap, s in dataset:             t1 = time_sync()             im = torch.from_numpy(im).to(device)             im = im.half() if half else im.float()  # uint8 to fp16/32             im /= 255  # 0 - 255 to 0.0 - 1.0             if len(im.shape) == 3:                 im = im[None]  # expand for batch dim             t2 = time_sync()             dt[0] += t2 - t1             # Inference             # visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False             pred = model(im, augment=augment, visualize=visualize)             t3 = time_sync()             dt[1] += t3 - t2             # NMS             pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)             dt[2] += time_sync() - t3             # Second-stage classifier (optional)             # pred = utils.general.apply_classifier(pred, classifier_model, im, im0s)             # Process predictions             for i, det in enumerate(pred):  # per image                 seen += 1                 if webcam:  # batch_size >= 1                     p, im0, frame = path[i], im0s[i].copy(), dataset.count                     s += f'{i}: '                 else:                     p, im0, frame = path, im0s.copy(), getattr(dataset, 'frame', 0)                 p = Path(p)  # to Path                 # save_path = str(save_dir / p.name)  # im.jpg                 # txt_path = str(save_dir / 'labels' / p.stem) + (                 #     '' if dataset.mode == 'image' else f'_{frame}')  # im.txt                 s += '%gx%g ' % im.shape[2:]  # print string                 gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh                 imc = im0.copy() if save_crop else im0  # for save_crop                 annotator = Annotator(im0, line_width=line_thickness, example=str(names))                 if len(det):                     # Rescale boxes from img_size to im0 size                     det[:, :4] = scale_coords(im.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 save_txt:  # Write to file                             xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(                                 -1).tolist()  # normalized xywh                             line = (cls, *xywh, conf) if save_conf else (cls, *xywh)  # label format                             # with open(txt_path + '.txt', 'a') as f:                             #     f.write(('%g ' * len(line)).rstrip() % line + '\n')                          if save_img or save_crop or view_img:  # Add bbox to image                             c = int(cls)  # integer class                             label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')                             annotator.box_label(xyxy, label, color=colors(c, True))                             # if save_crop:                             #     save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg',                             #                  BGR=True)                 # Print time (inference-only)                 LOGGER.info(f'{s}Done. ({t3 - t2:.3f}s)')                 # Stream results                 # Save results (image with detections)                 im0 = annotator.result()                 frame = im0                 resize_scale = output_size / frame.shape[0]                 frame_resized = cv2.resize(frame, (0, 0), fx=resize_scale, fy=resize_scale)                 cv2.imwrite("images/tmp/single_result_vid.jpg", frame_resized)                 self.vid_img.setPixmap(QPixmap("images/tmp/single_result_vid.jpg"))                 # self.vid_img                 # if view_img:                 # cv2.imshow(str(p), im0)                 # self.vid_img.setPixmap(QPixmap("images/tmp/single_result_vid.jpg"))                 # cv2.waitKey(1)  # 1 millisecond             if cv2.waitKey(25) & self.stopEvent.is_set() == True:                 self.stopEvent.clear()                 self.webcam_detection_btn.setEnabled(True)                 self.mp4_detection_btn.setEnabled(True)                 self.reset_vid()                 break         # self.reset_vid()      '''     ### 界面重置事件 ###      '''      def reset_vid(self):         self.webcam_detection_btn.setEnabled(True)         self.mp4_detection_btn.setEnabled(True)         self.vid_img.setPixmap(QPixmap("images/UI/up.jpeg"))         self.vid_source = '0'         self.webcam = True      '''     ### 视频重置事件 ###      '''      def close_vid(self):         self.stopEvent.set()         self.reset_vid()  if __name__ == "__main__":     app = QApplication(sys.argv)     mainWindow = MainWindow()     mainWindow.show()     sys.exit(app.exec_()) ———————————————— 版权声明:本文为CSDN博主「肆十二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ECHOSON/article/details/122404926 
  • [热门活动] AI作诗已完成
    徐俊雄20221202已完成
  • [其他] 浅谈遗传算法遗传算法(Genetic Algorithm,GA)
    遗传算法(Genetic Algorithm,GA)       最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域遗传算法的起源可追溯到20世纪60年代初期。1967年,美国密歇根大学J. Holland教授的学生 Bagley在他的博士论文中首次提出了遗传算法这一术语,并讨论了遗传算法在博弈中的应用,但早期研究缺乏带有指导性的理论和计算工具的开拓。1975年, J. Holland等提出了对遗传算法理论研究极为重要的模式理论,出版了专著《自然系统和人工系统的适配》,在书中系统阐述了遗传算法的基本理论和方法,推动了遗传算法的发展。20世纪80年代后,遗传算法进入兴盛发展时期,被广泛应用于自动控制、生产计划、图像处理、机器人等研究领域。编码由于遗传算法不能直接处理问题空间的参数,因此必须通过编码将要求解的问题表示成遗传空间的染色体或者个体。这一转换操作就叫做编码,也可以称作(问题的)表示(representation)。评估编码策略常采用以下3个规范:a)完备性(completeness):问题空间中的所有点(候选解)都能作为GA空间中的点(染色体)表现。b)健全性(soundness): GA空间中的染色体能对应所有问题空间中的候选解。c)非冗余性(nonredundancy):染色体和候选解一一对应。  适应度函数进化论中的适应度,是表示某一个体对环境的适应能力,也表示该个体繁殖后代的能力。遗传算法的适应度函数也叫评价函数,是用来判断群体中的个体的优劣程度的指标,它是根据所求问题的目标函数来进行评估的。  遗传算法在搜索进化过程中一般不需要其他外部信息,仅用评估函数来评估个体或解的优劣,并作为以后遗传操作的依据。由于遗传算法中,适应度函数要比较排序并在此基础上计算选择概率,所以适应度函数的值要取正值。由此可见,在不少场合,将目标函数映射成求最大值形式且函数值非负的适应度函数是必要的。适应度函数的设计主要满足以下条件:a)单值、连续、非负、最大化b) 合理、一致性c)计算量小  d)通用性强。在具体应用中,适应度函数的设计要结合求解问题本身的要求而定。适应度函数设计直接影响到遗传算法的性能。  初始群体选取遗传算法中初始群体中的个体是随机产生的。一般来讲,初始群体的设定可采取如下的策略:a)根据问题固有知识,设法把握最优解所占空间在整个问题空间中的分布范围,然后,在此分布范围内设定初始群体。b)先随机生成一定数目的个体,然后从中挑出最好的个体加到初始群体中。这种过程不断迭代,直到初始群体中个体数达到了预先确定的规模。
  • [分享交流] 沃土云创计划·高校开课申报模板
    加入沃土云创高校计划后,如何申请开课?1、请登录华为云账号,下载附件中的开课申请表和课程大纲模板(开课申请表有样例,可参考)2、并参考附件指导书中第五大点,在线提交开课计划(开课申请表需请二级学院盖章)3、预计3个工作日进行课程审核关于开课有任何问题可联系张女士13753491670(微信同号)
  • [其他] 浅谈GNN的应用
    GNN的适用范围非常广泛,既可以处理具有显式关联结构的数据,如药物分子、电路网络等,也可以处理具有隐式关联结构的数据,如图像、文本等。近年来,GNN被用于解决各行各业的问题,如生物化学领域中的分子指纹识别、药物分子设计、疾病分类等,交通领域中对交通需求的预测、对道路速度的预测,计算机图像处理领域中的目标检测、视觉推理等,自然语言领域中的实体关系抽取、关系推理等。在引文 [1] 中分成6个方向:自然语言处理、计算机视觉、自然科学研究、知识图谱、组合优化、图生成,对GNN的应用做出了较为全面且细致的归纳总结。纵观GNN的各类应用,GNN表现出了如下3个优势:(1)GNN具有强大的图数据拟合能力。作为一种建立在图上的端对端学习框架,GNN展示出了强大的图数据拟合能力。图数据是科学与工程学领域中一种十分常见的数据研究对象,因此,GNN也被应用到了很多相关场景下,并且都取得了不错的效果。通常这些应用均会利用GNN去拟合研究对象的一些理化性质,从而指导或加速相应的科研与开发工作。比如引文 [2] 利用GNN去拟合两图中节点对的组合性质,从而提升蛋白质相互作用点预测的精度,而蛋白质相互作用点预测是药物分子发现与设计工作的重要构成部分;引文 [3] 将高频电路抽象成图数据,利用GNN去拟合其电磁学性质,相较于严格的电磁学仿真计算,该方法能极大地加速高频电路(比如5G芯片)的设计工作。(2)GNN具有强大的推理能力。计算机要完成推理任务,离不开对语义实体的识别以及实体之间关系的抽取,GNN理所当然地被应用到了很多推理任务的场景中去。相较于之前大多基于关系三元组的建模方式,GNN能够对表征语义关系的网络进行整体性的建模,习得更加复杂与丰富的语义信息,这对提升推理任务的效果大有裨益。深度学习经过近几年的发展,在许多识别相关人物上都取得了前所未有的成果,基于此,需要更深程度地理解数据的推理任务被提出,比如计算机视觉中的视觉问答(Visual Question Answering)、视觉推理(Visual Reasoning),自然语言处理中的多跳推理(Multi-hop Reasoning)等。随着GNN的流行,很多工作也尝试将GNN以一种端对端的形式嵌入到学习系统中去,以提升相关任务的效果。我们举两个例子来说明:一是基于事实的视觉问答中(Fact-based Visual Question Answering)中,问题中不再直接包含答案内容,需要学习系统经过推理将问题中的事实关系正确映射到答案中的实体上。在引文 [4] 中通过引入GCN同时建模多条事实来提高对答案推理的正确性,这一方法在相关数据集上取得了极大的效果提升。二是多跳推理,相比于之前的阅读理解任务,多跳推理需要跨越多个段落甚至多个文档来寻找实体之间的多跳关系,这是一个更加开放、更加复杂的推理任务。在引文 [5] 中通过嵌入GNN,构造了一个抽取加推理的双线学习框架,使得学习系统在可解释性提高的同时也在相关数据集上获得了极大的效果提升。(3)GNN与知识图谱结合,可以将先验知识以端对端的形式高效地嵌入到学习系统中去。人类在学习后习得的知识,会被大脑神经系统进行系统的加工并存储起来,作为之后相关活动发生时的一种先验知识高效地提升人类的应对表现,并且往往知识之间会产生各种关联,形成“知识地图”。这种机制对应着数据科学领域中一字儿技术如知识图谱的广泛应用。从数据建模的层面来看,这些知识(或者规则、经验、常识、事实等)为模型提供了额外的相关信息,可以有效提升学习系统的效果。作为一种端对端的图数据学习模型,GNN结合知识图谱,可以将先验知识高效地嵌入到任意一种学习系统中去,从而替身任务效果。比如引文 [6] 在零样本学习任务中利用GCN对词汇网络(WordNet进行建模),实现了类别之间的语义关系到其视觉表示上的迁移,从而大大提升视觉模型在一些完全不提供训练样本的类别上的分类准确率。引文 [7] 通过补充额外的知识图谱信息,将知识图谱与用户-商品二部图构成一种合成的图结构,然后利用GNN进行推荐任务建模,同时增强了推荐系统的准确率、多样性与可解释性。
  • [其他] 浅谈DDPG算法
    DDPG算法简介DDPG是DQN连续动作的扩展版本。DDPG全称Deep Deterministic Policy Gradient在DDPG算法之前,我们在求解连续动作空间问题时,主要有两种方式:一是对连续动作做离散化处理,然后再利用强化学习算法(例如DQN)进行求解。二是使用Policy Gradient (PG)算法 (例如Reinforce) 直接求解。但是对于方式一,离散化处理在一定程度上脱离了工程实际;对于方式二,PG算法在求解连续控制问题时效果往往不尽人意。为此,DDPG算法横空出世,在许多连续控制问题上取得了非常不错的效果。DDPG算法是Actor-Critic (AC) 框架下的一种在线式深度强化学习算法,因此算法内部包括Actor网络和Critic网络,每个网络分别遵从各自的更新法则进行更新,从而使得累计期望回报最大化。DDPG算法将确定性策略梯度算法和DQN算法中的相关技术结合在一起,之前我们在讲DQN算法时,详细说明了其中的两个重要的技术:经验回放和目标网络。具体而言,DDPG算法主要包括以下三个关键技术:(1)经验回放:智能体将得到的经验数据(s,a,r,s^{'},done)放入Replay Buffer中,更新网络参数时按照批量采样。(2)目标网络:在Actor网络和Critic网络外再使用一套用于估计目标的Target Actor网络和Target Critic网络。在更新目标网络时,为了避免参数更新过快,采用软更新方式。(3)噪声探索:确定性策略输出的动作为确定性动作,缺乏对环境的探索。在训练阶段,给Actor网络输出的动作加入噪声,从而让智能体具备一定的探索能力。
  • [其他] 浅谈VGG模型
    VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG模型在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。它的缺点在于,参数量有140M之多,需要更大的存储空间。但是这个模型很有研究价值。VGG网络是2014年由牛津大学著名研究组VGG (Visual Geometry Group) 提出的。在2014到2016年(ResNet提出之前),VGG网络可以说是当时最火并被广泛应用的Backbone。后面由于各种新的网络提出,论精度VGG比不上ResNet,论速度和参数数量VGG比不过MobileNet等轻量级网络,慢慢的VGG开始淡出人们的视线。当VGG已经被大家遗忘时,2021年清华大学、旷视科技以及香港科技大学等机构共同提出了RepVGG网络,希望能够让VGG-style网络Great Again。RepVGG无论是在精度还是速度上都已经超过了ResNet、EffcientNet以及ReNeXt等网络。那RepVGG究竟用了什么方法使得VGG网络能够获得如此大的提升呢,在论文的摘要中,作者提到了structural re-parameterization technique方法,即结构重参数化。实际上就是在训练时,使用一个类似ResNet-style的多分支模型,而推理时转化成VGG-style的单路模型。模型的名称——“VGG”代表了牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人。下面是一段来自网络对同年GoogLeNet和VGG的描述:“GoogLeNet和VGG的Classification模型从原理上并没有与传统的CNN模型有太大不同。大家所用的Pipeline也都是:训练时候:各种数据Augmentation(剪裁,不同大小,调亮度,饱和度,对比度,偏色),剪裁送入CNN模型,Softmax,Backprop。测试时候:尽量把测试数据又各种Augmenting(剪裁,不同大小),把测试数据各种Augmenting后在训练的不同模型上的结果再继续Averaging出最后的结果。”需要注意的是,在VGGNet的6组实验中,后面的4个网络均使用了pre-trained model A的某些层来做参数初始化。虽然提出者没有提该方法带来的性能增益。先来看看VGG的特点:    小卷积核。作者将卷积核全部替换为3x3(极少用了1x1);    小池化核。相比AlexNet的3x3的池化核,VGG全部为2x2的池化核;    层数更深特征图更宽。基于前两点外,由于卷积核专注于扩大通道数、池化专注于缩小宽和高,使得模型架构上更深更宽的同时,计算量的增加放缓;    全连接转卷积。网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。论文名称:RepVGG: Making VGG-style ConvNets Great Again论文下载地址:https://arxiv.org/abs/2101.03697官方源码(Pytorch实现):https://github.com/DingXiaoH/RepVGG
  • [生态建设] WeAutomate自定义扩展-屏幕文字
    缘 起给客户做PoC,把脚本运行的过程录屏发给客户,客户之前没有接触过RPA,表示看不懂,只看到鼠标键盘进行了一系列的操作,于是给视频加上了字幕,对每个步骤进行了讲解,客户一下就看懂了。电脑面前没人的时候,正在运行RPA脚本的电脑看起来怪怪的,明明没人电脑却操作的行云流水,如果有一个提示就好了。WeAutomate在运行时可以通过消息框或实时日志给予用户提示,消息框文字很小,需要用户点击关闭或延时消失,用户可能会忽略,而日志基本上是给技术人员准备的,信息太多,滚动太快,有么有更好的方式?如果你有上面的痒点,那么华为WeAutomate的这款插件-屏幕文字可能适合你。屏幕文字可以在屏幕上显示一行文字,这行文字没有窗体,永远位于顶层,背景透明,就像这样:​以优雅、非阻塞(Non-Blocking)的方式在屏幕上直接显示提示信息。类似的功能UiBot也有,称为写屏,不得不说这个功能很好用。UiBot的RPA运行时典型界面是这样的:屏幕上像字幕一样显示:”机器人正在运行,期间请勿操作鼠标键盘”,”正在处理数据文件xxx.xlsx”,”调用OCR识别发票文件xxxx,当前处理到13/137”,”登录XXX系统失败,尝试再次登录2/3”……前段时间成都因为疫情静默了15天,闲着也是闲着,开发了WeAutomate的插件-TextScreen 屏幕文字,自家买菜用,也希望能帮到你。功能:在屏幕上显示一行文字,在机器人运行期间给用户最直观的提示。文字水平自动居中,可选大小、颜色、垂直靠上、居中、向下。文字无窗体,背景透明,永远位于顶层不会被遮挡。文字将持续显示,直到被新的文字替换或关闭。非阻塞运行(Non-Blocking)插件包括三个命令:初始化屏幕文字、在屏幕上显示单行文本、关闭屏幕文字。​初始化和关闭除了超时时间和执行前延时不需要特别的参数。在屏幕上显示单行文本可选文字内容(默认一个空格)、文字颜色(#000000格式,默认绿色)、文字大小(默认50)、设置文字垂直位置(上VTOP、中VCENTER、下VBOTTOM,默认垂直居中)。我们来看下使用效果:几个技巧Tips:流程结束前记得要关闭屏幕文字,不然文字将一直存在。文字创建后将一直显示,除非被新的文字替换或关闭。如果需要清除文字,可以在屏幕上显示空格,默认就是一个空格。自定义扩展可以发布到管理中心,执行器运行调用使用了自定义扩展的脚本时可下拉安装,如果没有管理中心,执行器手动安装自定义扩展较为繁琐,有一个笨方法是装一个Studio,在Studio中安装自定义扩展,执行器也会识别到自定义扩展。
  • [优秀实践] 华夏天信携手华为云开天aPaaS,打造安全、高效、节能的主煤流运输系统
    据权威数据显示,2021年我国煤炭消费占一次能源消费总量的比重达到56.0%,煤炭在我国能源供给结构中的“压舱石”地位由此可见一斑。然而如此重要的一个行业,长期以来处于信息化建设的洼地,给外界以“环境恶劣”、“技术落后”、“事故频发”等印象。为了保障煤炭行业的安全高效生产,国家发改委和能源局等八部委于2021年发布了《关于加快煤矿智能化发展的指导意见》,从而,掀起了我国煤矿智能化建设的高潮。而主煤流运输系统作为煤矿生产的重要环节,是煤矿智能化的必建项目,因此,如何提高主煤流运输系统的智能化水平,以实现主煤流运输系统的安全、高效运转,是煤矿行业亟需解决的难题。▲ 主煤流运输系统示意图由于主煤流运输路途长,单个主运输里程都在几十公里以上,且沿途环节复杂,当前的监控、运维手段存在着对于主煤流运输系统整体设备状态、人员信息、环境信息感知不全面,皮带物料状态不清、人员违章无法监控等痛点,并且由于煤矿开采的不均衡性,导致带式输送机常处于“大马拉小车”的非最优运行状态,不仅造成了电能浪费,也使带式输送机传动系统、转动部件、输送带形成无效磨损,缩短了设备使用寿命。那么,要如何彻底、高效地解决这些痛点呢?在2022华为开发者大赛上,华夏天信给出了他们的方案——智能主煤流运输监控系统,基于华为云开天aPaaS集成工作台,集合了华为云AI、ROMA等多个云服务的能力,实现了主煤流运输系统多源异构数据的融合,皮带物料、人员违章的智能感知以及皮带的智能控制。● 多源数据集成融合:实现 “人、机、环、管”四要素的协同管控通过将主煤流运输系统的皮带集控和人员定位、安全监控、视频监控、AI隐患分析、电力监控系统、GIS以及其它系统设备的数据,基于时间与空间的特征进行融合,华夏天信打通了多源数据之间的壁垒,实现了主煤流运输生产活动中“人、机、环、管”四大要素的协同管控。● 皮带告警联动和通讯调度:实现皮带启停/调速控制及主运系统的功能闭环华夏天信对接煤矿军团盘古大模型皮带异物AI识别算法,能够对皮带异常、人员违规、皮带煤量进行实时监控,并结合GIS地图,准确地显示并跟踪皮带告警及异常位置。当智能主煤流运输监控系统收到皮带告警后,会根据告警的级别对皮带进行降速或停机操作;同时与通信系统联动,通过短信、广播、矿灯、5G手机、固定电话等,及时调度相关人员到现场排除故障,从而实现了整个主煤流运输系统的“发现问题、确认问题、解决问题、关闭问题”的业务闭环。● 根据煤量自动调节皮带运行速度:实现节能降耗、安全高效运输在智能主煤流运输监控系统中,AI识别煤量后,可自动调节皮带的运行速度,从而达到皮带“多煤快跑、少煤慢跑、无煤待机”的运行状态,实现了节能降耗,带来了切实好处。一是,有助于实现智能矿山建设中“集中远控、少人/无人值守”的目标。按每条皮带减少1名巡检工来说,5条皮带、3个班次便可减少15人,这不仅可以满足智能矿山建设“减人、少人”的验收标准,还可以有效减少甚至避免人员伤亡;二是,为煤矿提产增效。智能主煤流运输监控系统,可大大缩短由堆煤或皮带撕裂导致的停机时间。以某年产1000万吨的煤矿来看,传统方式管理下,每年平均因堆煤导致156个小时的停机时间,使用智能主煤流运输监控系统后,通过提前感知及自动化调度,一年可缩减停机时间约84小时,这可为客户增产16万吨煤,按每吨600元计算,可增收9600多万元。● 基于华为云开天aPaaS:实现灵活架构和快速集成、开发从IoT、AI到通信、GIS,智能主煤流运输监控系统涉及到了方方面面的能力,业务流程相当复杂。按照传统开发模式的话,开发这样一套系统需要进行技术选型->开发人员对每个系统进行对接开发->在动态的煤矿场景中,维护不同系统的联动……花费的时间、人力可想而知。那华夏天信在此次开发者大赛上,是怎样快速、高效地构建这套系统的呢?基于华为云开天aPaaS,搭建更加灵活的技术架构并进行高效的集成和开发,从而快速实现视频AI与传感器监控、综合保护装置的联动保护控制、煤流量联动控制、集中协同控制、语音自动报警等功能。首先,将井下不同系统的数据统一接入到集成平台上,再通过开天aPaaS集成工作台进行连接器的开发;其次,根据业务联动的需要,在集成工作台通过拖、拉、拽对业务流进行编排,实现智能化的联动,后续如果业务有变动,也可以在此基础上进行快速的编排,无需重新开发代码。最后,在开天集成工作台中开发好的连接器和业务流,在DMAX中开发卡片的时候可以直接调用,最终基于华夏天信的RED-MOS平台通过低码化的方式对这些卡片进行组装、展示。由此,华夏天信的智能主煤流监控系统就完成了。通过这种方式,不仅降低了数据和应用集成的复杂度,也极大提升了创新应用的开发效率。《关于加快煤矿智能化发展的指导意见》规划了从2021年到2035年的持续建设任务,“智能主运系统”作为必建项目之一,需覆盖全国煤矿4500多座,除此之外还有3万多座非煤矿山,由此可见,智能主运系统的建设任重而道远。未来,华为云开天aPaaS希望能继续携手华夏天信,在完善智能主煤流运输监控系统的同时,打造更多煤矿行业创新应用,为煤矿的智能化建设提速!
  • 已完成
    已完成已完成已完成已完成
  • [行业动态] 浅谈分子图像自监督学习框架ImageMol
    分子图像自监督学习框架ImageMol分子的表征学习(Molecular Representation Learning)是近年来非常热门的方向,目前可分为诸多门派:计算药学家说:分子可以表示为一串指纹,或者描述符,如上海药物所提出的 AttentiveFP,是这方面的杰出代表。NLPer 说:分子可以表示为 SMILES(序列),然后当作自然语言处理,如百度的 X-Mol,是这方面的杰出代表。图神经网络研究者说:分子可以表示为一个图(Graph),也就是邻接矩阵,然后使用图神经网络处理,如腾讯的 GROVER, MIT 的 DMPNN,CMU 的 MOLCLR 等方法,都是这方面的杰出代表。但是,目前的表征方法仍存在一些局限性。比如,序列表征缺乏分子的显式结构信息,现有图神经网络的表达能力仍有诸多局限(中科院计算所沈华伟老师对此有论述,见沈老师报告“图神经网络的表达能力”)。有趣的是,在高中化学学习分子的时候,我们看到的是分子的图像,化学家在设计分子时,也是对照分子图像进行观察和思考。一个自然的想法油然而生:“为什么不直接用分子图像来表征分子呢?”ImageMol 的整体架构如下图所示,总共分为三部分:(1) 设计一个分子编码器 ResNet18(浅蓝色),能够从约 1000 万张分子图像中提取潜在特征 (a) 。(2)考虑分子图像中的化学知识和结构信息,利用五个预训练策略(MG3C、MRD、JPP、MCL、MIR)来优化分子编码器的潜在表示 (b) 。具体来说为:① MG3C(Muti-granularity chemical clusters classification 多粒度化学簇分类):其中的结构分类器 Structure classifier(深蓝色)用于预测分子图像中的化学结构信息;② MRD(Molecular rationality discrimination 分子合理性判别器):其中的合理性分类器 Rationality classifier(绿色),它用于区分合理与不合理的分子;③ JPP(Jigsaw puzzle predicition 拼图预测):其中的拼图分类器 Jigsaw classifier(浅灰色)用于预测分子的合理排列;④ MCL(MASK-based contrastive learning 基于 MASK 的对比学习):其中的对比分类器 Contrastive classifier(深灰色)用于最大化原始图像和 mask 图像之间的相似性;⑤ MIR(Molecular image reconstruction 分子图像重建):其中的生成器 Generator(黄色)用于将潜在特征恢复分子图像,判别器 Discriminator(紫色)用于区分真实图像和生成器生成的假的分子图像。论文链接:https://www.nature.com/articles/s42256-022-00557-6.pdf
  • [热门活动] AI诗歌创作,效果不错哦
    完成了
  • 2022华为开发者大赛暨HCSD校园沙龙落地宁波,共攀技术高峰
    9月21日,【华为开发者大赛暨HCSD校园沙龙】走进宁波大学科学技术学院。本次活动由华为技术有限公司主办,宁波大学科学技术学院、华为云开发者联盟产品部以及华为云宁波沃土工场联合承办。2022华为开发者大赛联合高校圈层活动品牌HCSD(Huawei Cloud Student Developers)推出【华为开发者大赛暨HCSD校园沙龙】活动,旨在协权威专家走进校园,与高校开发者共话行业技术、勇攀技术高峰,共建高校生态,助力院校人才培养。活动现场助力产教融合,架起高校学子和“云服务”连接桥梁活动伊始,宁波大学科学技术学院副院长朱世华在活动当天的发言中表示华为作为我国民营高科技企业,在引领产业发展和人才培养方面均提供了很好的资源与平台,希望同学们好好利用本次机会,积极参与活动。本次沙龙活动促进了校企合作实质性开展。宁波大学科学技术学院副院长 朱世华“如今数字产业在迅速发展,而构建产业生态,人才是关键;数字人才,高校学生是核心;未来,高校人才是数字产业的践行者。”华为云中国区副总裁陈玙说,华为公司将继续紧密携手宁波大学科学技术学院,从人才培养、科学研究、师资建设到产学研合作,形成体系化及常态化的校企合作,助力高校数字人才的培养。华为云中国区副总裁 陈玙深化人才培养,华为开发者大赛与校园沙龙并驾齐驱华为云赋能云生态总监程国春从产业发展与人才培养双向驱动的角度出发,分享了基于开发者旅程,高校生态助力人才培养的发展战略。华为云持续参与教育部项目,通过贡献丰富的资源、活动和赛事全面助力产教融合,旨在持续深化校企合作,打造人才培养闭环,助力数字人才输出,共建优良高校生态。他表示,华为云将持续为院校提供优质的资源,共同打造值得信赖、共创共享共赢的生态体系,共谱人才培养新乐章。华为云赋能云生态总监 程国春接着,华为大赛运营专家郑彭元详细介绍了华为开发者大赛,“开发者是数字时代勇于创新的中坚力量,每一个开发者都了不起。”本次大赛以Spark Infinity 创想无限为主题。面向开发者开放华为云能力,为广大开发者提供了海量API接口。也期待各位开发者通过大赛这个顶级竞技舞台,可以发挥想象力进行创新创造,结合实际场景,解决行业痛点,共建云生态。华为大赛运营专家 郑彭元2022年,华为云推出了高校圈层活动品牌HCSD(Huawei Cloud Student Developers),即华为云学生开发者,由校园大使为代表的校园开发者组织,旨在通过树立榜样培养更多优秀的?校开发者。本次活动现场,信息工程学院院长钟才明和华为浙江宁波云业务部总经理吕想为优秀的校园大使卢羽、杨永祺同学进行颁发证书。AI实操升级,行业专家现场支招如今,以云和AI为核心的全场景智慧时代正在加速到来,各行各业将通过新技术进行数字化转型,重构体验、优化流程、使能创新,打造面向未来的核心竞争力。那么高校开发者如何抓住时代机遇,学好AI呢?华为云EI开发者生态工程师岩风针对人工智能定位、人工智能技术发展历程、人工智能入门难点及AI工程师面临的问题和挑战、华为云一站式AI开发管理平台ModelArts、AI Gallery社区、华为云开发者认证简介和华为云开发者认证权益等方面问题,进行了深入浅出的讲解。还带领学生体验了华为云开发者认证中的热门实验,学习了解如何识别OCR服务,既提升了同学们的运用能力,也带领同学们通过实践体验开发乐趣,增强同学们考取华为云开发者认证的信心。华为云EI开发者生态工程师 岩风活动现场,同学们踊跃参与,氛围十分活跃,不少同学抓住机会与专家进行互动问答,切磋交流。转眼活动进入尾声,还为同学们开放了华为云开发者认证考试券名额,旨在通过开发者认证体系,帮助同学们学习并考取认证,真正在云上作业,懂开发会开发,进而助力数字产业人才生态发展。师生现场互动指导实操
  • 江苏首场!2022华为开发者大赛暨HCSD校园沙龙落地无锡
    9⽉14⽇,【华为开发者大赛暨HCSD校园沙龙】走进无锡南洋职业技术学院。本次活动由华为技术有限公司主办,华为云开发者联盟产品部、华为无锡软件开发云创新中心联合承办,无锡南洋职业技术学院·智能装备与信息工程学院协办。2022华为开发者大赛联合高校圈层活动品牌HCSD(Huawei Cloud Student Developers)推出【华为开发者大赛暨HCSD校园沙龙】活动,旨在协华为专家走进校园,与高校开发者共话行业技术、勇攀技术高峰,共建高校生态,助力院校人才培养。活动现场合照活动伊始,无锡市计算机学会副理事长兼秘书长致辞表示,华为在人才培养方面提供了很好的资源与平台,希望同学们好好利用本次机会,积极参与活动。本次沙龙活动促进了校企合作实质性深层次开展。无锡市计算机学会副理事长兼秘书长随后,华为大赛运营专家刘雅婕详细介绍了华为开发者大赛江苏赛区,本届大赛江苏赛区以“Spark Infinity 创想无限”为主题。此次在无锡正式启动的2022华为开发者大赛江苏赛区是中国赛区的一个重要组成部分。面向开发者开放华为云能力,为广大开发者提供了海量API接口。也期待各位开发者通过大赛这个顶级竞技舞台,可以发挥想象力进行创新创造,结合实际场景,解决行业痛点,共建云生态。参赛者可在华为云官网报名,作品征集将持续至2022年10月8日,开发者可以充分发挥想象力进行创新创造,解决实际问题。华为开发者大赛运营专家 刘雅婕如今,以云和AI为核心的全场景智慧时代正在加速到来,各行各业将通过新技术进行数字化转型,重构体验、优化流程、使能创新,打造面向未来的核心竞争力。那么高校开发者如何抓住时代机遇学好AI呢?华为云EI开发者生态工程师青姚老师人工智能定位、人工智能技术发展历程、人工智能入门难点及AI工程师面临的问题和挑战、华为云一站式AI开发管理平台ModelArts、AI Gallery社区、华为云开发者认证简介和华为云开发者认证权益等方面问题,进行了深入浅出的讲解。还带领学生体验了华为云开发者认证中的热门实验,学习了解如何使用文字识别OCR服务,既提升了同学们的运用能力,也带领同学们通过实践体验开发乐趣,增强同学们考取华为云开发者认证的信心。华为云EI开发者生态工程师 青姚活动现场,同学们踊跃参与,氛围十分活跃,不少同学抓住机会与专家进行互动问答,切磋交流。转眼活动进入尾声,还为同学们开放了华为云开发者认证考试券名额,旨在通过开发者认证体系,帮助同学们学习并考取认证,真正在云上作业,懂开发会开发,进而助力数字产业人才生态发展。活动现场学生实操
总条数:7896 到第 页
上滑加载中