首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >视频识别 动作识别 实时异常行为识别 等所有行为识别

视频识别 动作识别 实时异常行为识别 等所有行为识别

原创
作者头像
青年夏日
修改于 2021-04-19 02:53:47
修改于 2021-04-19 02:53:47
4.9K00
代码可运行
举报
文章被收录于专栏:青年夏日青年夏日
运行总次数:0
代码可运行

大家好,我是cv君,很多大创,比赛,项目,工程,科研,学术的炼丹术士问我上述这些识别,该怎么做,怎么选择框架,今天可以和大家分析一下一些方案:

用单帧目标检测做的话,前后语义相关性很差(也有优化版),效果不能达到实际项目需求,尤其是在误检上较难,并且目标检测是需要大量数据来拟合的。标注需求极大。

用姿态加目标检测结合的方式,效果是很不错的,不过一些这样类似Two stage的方案,速度较慢(也有很多实时的),同样有着一些不能通过解决时间上下文的问题。

即:摔倒检测 我们正常是应该有一个摔倒过程,才能被判断为摔倒的,而不是人倒下的就一定是摔倒(纯目标检测弊病)

运动检测 比如引体向上,和高抬腿计数,球类运动,若是使用目标检测做,那么会出现什么问题呢? 引体向上无法实现动作是否规范(当然可以通过后处理判断下巴是否过框,效果是不够人工智能的),高抬腿计数,目标检测是无法计数的,判断人物的球类运动,目标检测是有很大的误检的:第一种使用球检测,误检很大,第二种使用打球手势检测,遇到人物遮挡球类,就无法识别目标,在标注上也需要大量数据

今天cv君铺垫了这么多,只是为了给大家推荐一个全新出炉视频序列检测方法,目前代码已开源至Githubhttps://github.com/xiaobingchan/CV-Action 欢迎star~

欢迎移步。只需要很少的训练数据,就可以拟合哦!不信你来试试吧~几个训练集即可。

神经网络使用的是这两个月开源的实时动作序列强分类神经网络:realtimenet 。

我的github将收集 所有的上述说到的动作序列视频数据,训练出能实用的检测任务:目前实现了手势控制的检测,等等,大家欢迎关注公众号,后续会接着更新。

开始

目前以手势和运动识别为例子,因为cv君没什么数据哈哈

项目演示:

本人做的没转gif,所以大家可以看看其他的演示效果图,跟我的是几乎一样的~ 只是训练数据不同

一、 基本过程和思想

基本思想是将数据集中视频及分类标签转换为图像(视频帧)和其对应的分类标签,也可以不标注,单独给一个小视频标注上分类类别,再采用CNN网络对图像进行训练学习和测试,将视频分类问题转化为图形分类问题。具体步骤包括:

(1) 对每个视频(训练和测试视频)以一定的FPS截出视频帧(jpegs)保存为训练集和测试集,将对图像的分类性能作为所对应视频的分类性能

(2)训练一个人物等特征提取模型,并采用模型融合策略,一个特征提取,一个分类模型。特征工程部分通用人物行为,分类模型,训练自己的类别的分类模型即可。

(4) 训练完成后载入模型对test set内所有的视频帧进行检查验证,得出全测试集上的top1准确率和top5准确率输出。

(5)实时检测。

二 、视频理解还有哪些优秀框架

第一个 就是我github这个了,比较方便,但不敢排前几,因为没有什么集成,

然后MMaction ,就是视频理解框架了,众所周知,他们家的东西很棒

第二个就是facebook家的一些了,

再下来基本上就不多了,全面好用的实时框架。

好,所以我们先来说说我的使用过程。

三、效果体验~使用

体验官方的一些模型 (模型我已经放在里面了)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install -r requirements.txt

将模型放置此处:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resources
├── backbone
│   ├── strided_inflated_efficientnet.ckpt
│   └── strided_inflated_mobilenet.ckpt
├── fitness_activity_recognition
│   └── ...
├── gesture_recognition
│   └── ...
└── ...

首先,请试用我们提供的演示。在sense/examples目录中,您将找到3个Python脚本, run_gesture_recognition.py ,健身_跟踪器 run_fitness_tracker.py .py,并运行卡路里_估算 run_calorie_estimation .py. 启动每个演示就像在终端中运行脚本一样简单,如下所述。

手势:

cd examples/

python run_gesture_recognition.py

健身_跟踪器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python examples/run_fitness_tracker.py --weight=65 --age=30 --height=170 --gender=female
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  --camera_id=CAMERA_ID           ID of the camera to stream from
  --path_in=FILENAME              Video file to stream from. This assumes that the video was encoded at 16 fps.

卡路里计算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python examples/run_calorie_estimation.py --weight=65 --age=30 --height=170 --gender=female

三、训练自己数据集步骤

首先 clone一下我的github,或者原作者github,

然后自己录制几个视频,比如我这里capture 一个类别,录制了几个视频,可以以MP4 或者avi后缀,再来个类别,再录制一些视频,以名字为类别。

然后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd tools\sense_studio\sense_studio.py
  • 1

这一步,会显示:

然后,打开这个网址:

来到前端界面

点击一下start new project

这样编写

然后点击create project 即可制作数据。

但是官方的制作方法是有着严重bug的~我们该怎么做呢!

下面,我修改后,可以这样!

这里请仔细看:

我们在sense_studio 文件夹下,新建一个文件夹:我叫他cvdemo1

然后新建两个文件夹:videos_train 和videos_valid 里面存放的capture是你的类别名字的数据集,capture存放相关的训练集,click存放click的训练集,同样的videos_valid 存放验证集,

在cvdemo1文件夹下新建project_config.json ,里面写什么呢? 可以复制我的下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "name": "cvdemo1", 
  "date_created": "2021-02-03",
  "classes": {
    "capture": [
      "capture",
      "capture"
    ],
    "click": [
      "click",
      "click"
    ]
  }
}

里面的name 改成你的文件夹名字即可。

就这么简单!

然后就可以训练: python train_classifier.py 你可以将main中修改一下。

将path in修改成我们的训练数据地址,即可,其他的修改不多,就按照我的走即可,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    # Parse arguments
    # args = docopt(__doc__)
    path_in = './sense_studio/cvdemo1/'
    path_out = path_in
    os.makedirs(path_out, exist_ok=True)
    use_gpu = True
    path_annotations_train = None
    path_annotations_valid =None
    num_layers_to_finetune = 9
    temporal_training = False

    # Load feature extractor
    feature_extractor = feature_extractors.StridedInflatedEfficientNet()
    checkpoint = torch.load('../resources/backbone/strided_inflated_efficientnet.ckpt')
    feature_extractor.load_state_dict(checkpoint)
    feature_extractor.eval()

    # Get the require temporal dimension of feature tensors in order to
    # finetune the provided number of layers.
    if num_layers_to_finetune > 0:
        num_timesteps = feature_extractor.num_required_frames_per_layer.get(-num_layers_to_finetune)
        if not num_timesteps:
            # Remove 1 because we added 0 to temporal_dependencies
            num_layers = len(feature_extractor.num_required_frames_per_layer) - 1
            raise IndexError(f'Num of layers to finetune not compatible. '
                             f'Must be an integer between 0 and {num_layers}')
    else:
        num_timesteps = 1

训练特别快,10分钟即可,

然后,你可以运行run_custom_classifier.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   # Parse arguments
    # args = docopt(__doc__)
    camera_id = 0
    path_in = None
    path_out = None
    custom_classifier = './sense_studio/cvdemo1/'
    title = None
    use_gpu = True

    # Load original feature extractor
    feature_extractor = feature_extractors.StridedInflatedEfficientNet()
    feature_extractor.load_weights_from_resources('../resources/backbone/strided_inflated_efficientnet.ckpt')
    # feature_extractor = feature_extractors.StridedInflatedMobileNetV2()
    # feature_extractor.load_weights_from_resources(r'../resources\backbone\strided_inflated_mobilenet.ckpt')
    checkpoint = feature_extractor.state_dict()

    # Load custom classifier
    checkpoint_classifier = torch.load(os.path.join(custom_classifier, 'classifier.checkpoint'))
    # Update original weights in case some intermediate layers have been finetuned
    name_finetuned_layers = set(checkpoint.keys()).intersection(checkpoint_classifier.keys())
    for key in name_finetuned_layers:
        checkpoint[key] = checkpoint_classifier.pop(key)
    feature_extractor.load_state_dict(checkpoint)
    feature_extractor.eval()
    print('[debug] net:', feature_extractor)
    with open(os.path.join(custom_classifier, 'label2int.json')) as file:
        class2int = json.load(file)
    INT2LAB = {value: key for key, value in class2int.items()}

    gesture_classifier = LogisticRegression(num_in=feature_extractor.feature_dim,
                                            num_out=len(INT2LAB))
    gesture_classifier.load_state_dict(checkpoint_classifier)
    gesture_classifier.eval()
    print(gesture_classifier)

同样修改路径即可。

结果就可以实时检测了

原代码解读

同样的,我们使用的是使用efficienct 来做的特征,你也可以改成mobilenet 来做,有示例代码,就是训练的时候,用mobilenet ,检测的时候也是,只需要修改几行代码即可。

efficienct 提取特征部分代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class StridedInflatedEfficientNet(StridedInflatedMobileNetV2):

    def __init__(self):

        super().__init__()

        self.cnn = nn.Sequential(
            ConvReLU(3, 32, 3, stride=2),
            InvertedResidual(32, 24, 3, spatial_stride=1),
            InvertedResidual(24, 32, 3, spatial_stride=2, expand_ratio=6),
            InvertedResidual(32, 32, 3, spatial_stride=1, expand_ratio=6, temporal_shift=True),
            InvertedResidual(32, 32, 3, spatial_stride=1, expand_ratio=6),
            InvertedResidual(32, 32, 3, spatial_stride=1, expand_ratio=6),
            InvertedResidual(32, 56, 5, spatial_stride=2, expand_ratio=6),
            InvertedResidual(56, 56, 5, spatial_stride=1, expand_ratio=6, temporal_shift=True, temporal_stride=True),
            InvertedResidual(56, 56, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(56, 56, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(56, 112, 3, spatial_stride=2, expand_ratio=6),
            InvertedResidual(112, 112, 3, spatial_stride=1, expand_ratio=6, temporal_shift=True),
            InvertedResidual(112, 112, 3, spatial_stride=1, expand_ratio=6),
            InvertedResidual(112, 112, 3, spatial_stride=1, expand_ratio=6),
            InvertedResidual(112, 112, 3, spatial_stride=1, expand_ratio=6, temporal_shift=True, temporal_stride=True),
            InvertedResidual(112, 112, 3, spatial_stride=1, expand_ratio=6),
            InvertedResidual(112, 160, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(160, 160, 5, spatial_stride=1, expand_ratio=6, temporal_shift=True),
            InvertedResidual(160, 160, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(160, 160, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(160, 160, 5, spatial_stride=1, expand_ratio=6, temporal_shift=True),
            InvertedResidual(160, 160, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(160, 272, 5, spatial_stride=2, expand_ratio=6),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6, temporal_shift=True),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6, temporal_shift=True),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(272, 272, 5, spatial_stride=1, expand_ratio=6),
            InvertedResidual(272, 448, 3, spatial_stride=1, expand_ratio=6),
            ConvReLU(448, 1280, 1)
        )

这个InvertedResidual 在这,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class InvertedResidual(nn.Module):  # noqa: D101

    def __init__(self, in_planes, out_planes, spatial_kernel_size=3, spatial_stride=1, expand_ratio=1,
                 temporal_shift=False, temporal_stride=False, sparse_temporal_conv=False):
        super().__init__()
        assert spatial_stride in [1, 2]
        hidden_dim = round(in_planes * expand_ratio)
        self.use_residual = spatial_stride == 1 and in_planes == out_planes
        self.temporal_shift = temporal_shift
        self.temporal_stride = temporal_stride

        layers = []
        if expand_ratio != 1:
            # Point-wise expansion
            stride = 1 if not temporal_stride else (2, 1, 1)
            if temporal_shift and sparse_temporal_conv:
                convlayer = SteppableSparseConv3dAs2d
                kernel_size = 1
            elif temporal_shift:
                convlayer = SteppableConv3dAs2d
                kernel_size = (3, 1, 1)
            else:
                convlayer = nn.Conv2d
                kernel_size = 1
            layers.append(ConvReLU(in_planes, hidden_dim, kernel_size=kernel_size, stride=stride,
                                   padding=0, convlayer=convlayer))

        layers.extend([
            # Depth-wise convolution
            ConvReLU(hidden_dim, hidden_dim, kernel_size=spatial_kernel_size, stride=spatial_stride,
                     groups=hidden_dim),
            # Point-wise mapping
            nn.Conv2d(hidden_dim, out_planes, 1, 1, 0),
            # nn.BatchNorm2d(out_planes)
        ])
        self.conv = nn.Sequential(*layers)

    def forward(self, input_):  # noqa: D102
        output_ = self.conv(input_)
        residual = self.realign(input_, output_)
        if self.use_residual:
            output_ += residual
        return output_

    def realign(self, input_, output_):  # noqa: D102
        n_out = output_.shape[0]
        if self.temporal_stride:
            indices = [-1 - 2 * idx for idx in range(n_out)]
            return input_[indices[::-1]]
        else:
            return input_[-n_out:]

我们finetune自己的数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def extract_features(path_in, net, num_layers_finetune, use_gpu, num_timesteps=1):
    # Create inference engine
    inference_engine = engine.InferenceEngine(net, use_gpu=use_gpu)

    # extract features
    for dataset in ["train", "valid"]:
        videos_dir = os.path.join(path_in, f"videos_{dataset}")
        features_dir = os.path.join(path_in, f"features_{dataset}_num_layers_to_finetune={num_layers_finetune}")
        video_files = glob.glob(os.path.join(videos_dir, "*", "*.avi"))

        print(f"\nFound {len(video_files)} videos to process in the {dataset}set")

        for video_index, video_path in enumerate(video_files):
            print(f"\rExtract features from video {video_index + 1} / {len(video_files)}",
                  end="")
            path_out = video_path.replace(videos_dir, features_dir).replace(".mp4", ".npy")

            if os.path.isfile(path_out):
                print("\n\tSkipped - feature was already precomputed.")
            else:
                # Read all frames
                compute_features(video_path, path_out, inference_engine,
                                 num_timesteps=num_timesteps, path_frames=None, batch_size=16)

        print('\n')

构建数据的dataloader

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def generate_data_loader(dataset_dir, features_dir, tags_dir, label_names, label2int,
                         label2int_temporal_annotation, num_timesteps=5, batch_size=16, shuffle=True,
                         stride=4, path_annotations=None, temporal_annotation_only=False,
                         full_network_minimum_frames=MODEL_TEMPORAL_DEPENDENCY):
    # Find pre-computed features and derive corresponding labels
    tags_dir = os.path.join(dataset_dir, tags_dir)
    features_dir = os.path.join(dataset_dir, features_dir)
    labels_string = []
    temporal_annotation = []
    if not path_annotations:
        # Use all pre-computed features
        features = []
        labels = []
        for label in label_names:
            feature_temp = glob.glob(f'{features_dir}/{label}/*.npy')
            features += feature_temp
            labels += [label2int[label]] * len(feature_temp)
            labels_string += [label] * len(feature_temp)
    else:
        with open(path_annotations, 'r') as f:
            annotations = json.load(f)
        features = ['{}/{}/{}.npy'.format(features_dir, entry['label'],
                                          os.path.splitext(os.path.basename(entry['file']))[0])
                    for entry in annotations]
        labels = [label2int[entry['label']] for entry in annotations]
        labels_string = [entry['label'] for entry in annotations]

    # check if annotation exist for each video
    for label, feature in zip(labels_string, features):
        classe_mapping = {0: "counting_background",
                          1: f'{label}_position_1', 2:
                              f'{label}_position_2'}
        temporal_annotation_file = feature.replace(features_dir, tags_dir).replace(".npy", ".json")
        if os.path.isfile(temporal_annotation_file):
            annotation = json.load(open(temporal_annotation_file))["time_annotation"]
            annotation = np.array([label2int_temporal_annotation[classe_mapping[y]] for y in annotation])
            temporal_annotation.append(annotation)
        else:
            temporal_annotation.append(None)

    if temporal_annotation_only:
        features = [x for x, y in zip(features, temporal_annotation) if y is not None]
        labels = [x for x, y in zip(labels, temporal_annotation) if y is not None]
        temporal_annotation = [x for x in temporal_annotation if x is not None]

    # Build dataloader
    dataset = FeaturesDataset(features, labels, temporal_annotation,
                              num_timesteps=num_timesteps, stride=stride,
                              full_network_minimum_frames=full_network_minimum_frames)
    data_loader = torch.utils.data.DataLoader(dataset, shuffle=shuffle, batch_size=batch_size)

    return data_loader

如何实时检测视频序列的?

这个问题,主要是通过 系列时间内帧间图像组合成一个序列,送到网络中进行分类的,可以在许多地方找到相关参数,比如 display.py :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DisplayClassnameOverlay(BaseDisplay):
    """
    Display recognized class name as a large video overlay. Once the probability for a class passes the threshold,
    the name is shown and stays visible for a certain duration.
    """

    def __init__(
            self,
            thresholds: Dict[str, float],
            duration: float = 2.,
            font_scale: float = 3.,
            thickness: int = 2,
            border_size: int = 50,
            **kwargs
    ):
        """
        :param thresholds:
            Dictionary of thresholds for all classes.
        :param duration:
            Duration in seconds how long the class name should be displayed after it has been recognized.
        :param font_scale:
            Font scale factor for modifying the font size.
        :param thickness:
            Thickness of the lines used to draw the text.
        :param border_size:
            Height of the border on top of the video display. Used for correctly centering the displayed class name
            on the video.
        """
        super().__init__(**kwargs)
        self.thresholds = thresholds
        self.duration = duration
        self.font_scale = font_scale
        self.thickness = thickness
        self.border_size = border_size

        self._current_class_name = None
        self._start_time = None

    def _get_center_coordinates(self, img: np.ndarray, text: str):
        textsize = cv2.getTextSize(text, FONT, self.font_scale, self.thickness)[0]

        height, width, _ = img.shape
        height -= self.border_size

        x = int((width - textsize[0]) / 2)
        y = int((height + textsize[1]) / 2) + self.border_size

        return x, y

    def _display_class_name(self, img: np.ndarray, class_name: str):
        pos = self._get_center_coordinates(img, class_name)
        put_text(img, class_name, position=pos, font_scale=self.font_scale, thickness=self.thickness)

    def display(self, img: np.ndarray, display_data: dict):
        now = time.perf_counter()

        if self._current_class_name and now - self._start_time < self.duration:
            # Keep displaying the same class name
            self._display_class_name(img, self._current_class_name)
        else:
            self._current_class_name = None
            for class_name, proba in display_data['sorted_predictions']:
                if class_name in self.thresholds and proba > self.thresholds[class_name]:
                    # Display new class name
                    self._display_class_name(img, class_name)
                    self._current_class_name = class_name
                    self._start_time = now
                    break
        return img

每个类别只需要5个左右的视频,即可得到不错的效果嗷~ 欢迎Star github~

.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Nature封面:科学颠覆性进步明显「降速」,物理研究下跌100%
---- 新智元报道   作者:学术头条 编辑:好困 【新智元导读】过去几十年,虽然科技研究论文的发表数量猛增,但与之相对的是,这些成果的颠覆程度却大不如前。 每一个科学和技术上的颠覆性突破,都会为人类社会带来长远的进步。其中的一种突破表现是,颠覆现有知识体系、引导科学技术向新的方向发展。 万有引力定律统一了地面物体和宇宙天体的运动规律;麦克斯韦方程组以一种近乎完美的方式统一了电和磁,并预言光就是一种电磁波;相对论和量子力学的提出,奠定了现代物理学的基础。 在人类历史长河中,为现实生活带来质变的科学
新智元
2023/02/24
2410
Nature封面:科学颠覆性进步明显「降速」,物理研究下跌100%
“颠覆性”科学已经衰落了
在过去的几十年中,发表的科学和技术研究论文的数量急剧增加,但根据对论文与以往文献的差异的分析,这些论文的“颠覆性”已经下降[1]。
zhangrelay
2023/01/11
4960
“颠覆性”科学已经衰落了
Nature发文:基础科学创新速度放缓,已经进入「增量时代」
来源:机器之心本文约1700字,建议阅读6分钟在过去的半个世纪里,能够「将一个领域推向全新方向」的研究比例急剧下降。 过去几十年里,全世界范围内科学技术研究论文发表的数量激增。但根据对论文与以前的文献的分析,科学家们发现,这些论文的「颠覆性」在急剧下降。 来自数百万份手稿的数据显示,与 20 世纪中期相比,21 世纪以来完成的研究更像是「逐步地」推动科学领域内的发展,而不是开拓一个新的方向并让以前的工作彻底过时。对 1976 年至 2010 年的专利分析显示了同样的趋势。 这份报告于 1 月 4 日发表在
数据派THU
2023/03/29
2680
Nature发文:基础科学创新速度放缓,已经进入「增量时代」
Nature:近年来论文数量激增,但科技界没有创新
科研创新的黄金时代不再。 作者 | 王永昂 编辑 | 董子博 在人们的普遍认知上,科研论文和专利是推动科技界发展的重要因素,也是企业产学研结合的重要一环。 但Nature在年初最新发布的文章中,展示了对科研论文发展现状的悲观态度。Nature认为,近年来科研论文数量激增,但没有颠覆性创新。 论文地址:https://www.nature.com/articles/s41586-022-05543-x 文章对6个大型数据库中的4500万篇论文和390万项专利进行了分析。研究人员从不同研究领域出发,分析了19
AI科技评论
2023/02/23
3190
Nature:近年来论文数量激增,但科技界没有创新
AI论文激增,出现引用10万+的ResNet是好是坏?这研究有结论了
当一个领域的规模越来越大,每年发表的论文越多越多时,对于该领域来说,是好事还是坏事呢?
机器之心
2021/12/28
5320
AI论文激增,出现引用10万+的ResNet是好是坏?这研究有结论了
国际顶刊PNAS发文:“同质化”论文暴增,从根本上阻碍了科学的进步!
从2012年至今,我国科研论文的发表数量一直在持续增长。据Web of science数据统计,近10年中国科研人员发表 SCI 论文总数已累计339.7万篇,反超美国跃居全球榜首。
AI科技评论
2021/10/21
7920
PNAS: 论文越多,科学进展越慢
为什么一个领域每年发表的太多论文会导致停滞而不是进步。新论文的泛滥可能会剥夺审稿人和读者充分认识和理解新想法所需的认知能力。许多新想法之间的竞争可能会阻碍集中注意力到一个有希望的新想法。
Listenlii-生物信息知识分享
2021/12/13
4540
PNAS: 论文越多,科学进展越慢
2018未来科学大奖揭晓:袁隆平、马大为、林本坚等7位科学家获奖
9 月 8 日下午,第三届未来科学大奖在北京公布最终获奖者,李家洋、袁隆平、张启发获生命科学奖;马大为、冯小明、周其林获物质科学奖;林本坚获数学与计算机科学奖。
AI科技大本营
2018/09/28
7530
2018未来科学大奖揭晓:袁隆平、马大为、林本坚等7位科学家获奖
诺奖前夜,Nature发文ChatGPT终极预测!mRNA疫苗能否锁定大奖
Nature最新文章称,微调后的大模型,包括ChatGPT在内,都能大大增强预测诺奖得主的能力。
公众号-arXiv每日学术速递
2023/10/06
2020
诺奖前夜,Nature发文ChatGPT终极预测!mRNA疫苗能否锁定大奖
李学龙、戴琼海、任奎等上榜,科睿唯安公布2021全球高被引科学家名单,中国科学家占比14.2%
作者 | 莓酊 编辑 | 青暮 2021年11月16,科睿唯安(Clarivate Analytics)发布2021年度“高被引科学家(Highly-Cited Researchers 2021)”名单,全球70多个国家6602人次科学家入选本年度名单。特定领域高被引研究人次3,774,跨领域高被引研究人次2,828。来自法国、意大利、日本、韩国、新加坡和美国六个国家的16位世界顶尖研究人员获得2021年度“引文桂冠奖”。迄今为止,已有59位 “引文桂冠奖” 得主荣获诺贝尔奖。高被引科学家的遴选方法由科睿唯
AI科技评论
2023/04/26
5490
李学龙、戴琼海、任奎等上榜,科睿唯安公布2021全球高被引科学家名单,中国科学家占比14.2%
基因突变不是随机的?!Nature最新论文挑战进化论
博雯 丰色 发自 凹非寺 量子位 | 公众号 QbitAI 基因突变,不是随机的? 这与当前教材里的结论,截然相反。 还记得中学生物课本里一众白眼果蝇、白毛小牛、或者长颈鹿、短颈鹿吗? 在这些例子中,突变要么由外界人为导致,要么就是随机,只有自然选择能决定哪些突变会出现在生物体内。 但现在,一篇刊登在Nature上的最新论文,用实验结果提出了这样一个颠覆性的观点: 突变出现的基因组区域有着明显的规律性,并非随机! 比如说,在对生存起决定性作用的必需基因区域,其突变率就几乎下降了2/3。 论文开门见山地表示
量子位
2022/03/04
3530
Nature:百名科学家自引用率超50%,最高自引94%
导语中提到的数据库全称是「A standardized citation metrics author database annotated for scientific field」(科学领域标准化引用计量作者数据库),其中包含过去 20 年 176 个子领域被引用最多的 100,000 名研究者的标准化引用数据,包括引用量、h-index、合著-校正 hm-index 等指标。该数据集由斯坦福大学、爱思唯尔等机构的研究者共同创建,数据来自爱思唯尔专有的 Scopus 数据库。该团队希望找到那些有助于提高引用量的因素。
机器之心
2019/08/22
1.3K0
Nature:百名科学家自引用率超50%,最高自引94%
靠WiFi信号就能检测呼吸跌倒!北大这项硬科技研究越来越藏不住了
而落到感知层上的研究方向,叫做泛在感知。(泛在指利用广泛使用的设备,比如手机、手表、WiFi路由器等)
量子位
2023/03/01
4820
靠WiFi信号就能检测呼吸跌倒!北大这项硬科技研究越来越藏不住了
曾被纳粹德国查禁,见证了DNA结构的发现和阿尔法狗诞生,Nature 150岁啦!
150年过去了,作为一本始终专注科技进展的媒体,Nature见证了科学史上一次又一次的重要突破:从DNA双螺旋结构和胰岛的发现,到Alphago的胜利……
大数据文摘
2019/11/08
5810
曾被纳粹德国查禁,见证了DNA结构的发现和阿尔法狗诞生,Nature 150岁啦!
AlphaFold 3一夜预测地球所有生物分子,谷歌DeepMind颠覆生物学登Nature头版!
今天,升级后的AlphaFold 3能够以前所未有的「原子精度」,预测出所有生物分子的结构和相互作用。
新智元
2024/05/14
2290
AlphaFold 3一夜预测地球所有生物分子,谷歌DeepMind颠覆生物学登Nature头版!
AI颠覆材料学!DeepMind重磅研究登Nature,预测220万晶体结构赢人类800年
陶哲轩一直看好,ChatGPT将颠覆数学证明,而如今,AI在化学领域的潜力同样深不可测。
新智元
2023/12/01
4090
AI颠覆材料学!DeepMind重磅研究登Nature,预测220万晶体结构赢人类800年
这位顶尖科学家正式回国!29岁教授博导,11篇Nature、Science
他是中国科大培养的天才科学家,读博士时就发表40篇论文,并获选全国百篇博士优秀论文,同时提前一年毕业。
新智元
2019/05/17
7490
谷歌研究科学家:ChatGPT 秘密武器的演进与局限
以下文章来源于OneFlow ,作者OneFlow社区 来源|TalkRL OneFlow 编译 翻译|徐佳渝、贾川 同样是基于GPT预训练模型,为什么ChatGPT的效果要远远超出GPT-3等前几代模型?答案已经揭晓,成就ChatGPT的秘密武器在于RLHF,也就是人类反馈的强化学习。 在预训练阶段,GPT模型学习关于这个世界的一切,而在RLHF阶段,ChatGPT更关注的让模型输出正确、有益的恰当结果,并对结果不断进行微调。 具体而言,RLHF阶段的调优又分为三大步骤:第一步:通过监督学习,用人类对
AI科技评论
2023/04/19
2920
谷歌研究科学家:ChatGPT 秘密武器的演进与局限
Nature | 我的研究对后人毫无用途:21%的学术论文自发布后从未被引用
大数据文摘作品 作者:Richard Van Noorden 编译:Shan LIU、大茜、叶一、Yawei Xia 究竟有多少学术最终以“零次”引文终结命运?最近,《Nature》学术期刊做了一个研究,分析了那些0引用的学术论文。今天,文摘菌带大家一起来看一看那些被打入“冷宫”的科学文献:发布在哪里的文章更难被引用?哪些领域的论文更容易被打入冷宫?哪些国家的论文更不被知晓? 插画作者SERGE BLOCH 遗传学家奥利佛•史密斯今年1月逝世,享年91岁。这位诺贝尔获奖者常以一段著名的失败经历自嘲: 他发表
大数据文摘
2018/05/24
9880
Earth's Future: 全球变暖未来情景下天气指数保险的应用效益研究
北京师范大学国家安全与应急管理学院、应急管理部—教育部减灾与应急管理研究院张朝教授团队在Earth’s Future发表研究长文探讨了全球变暖的未来情景下天气指数保险的应用效益。
气象学家
2022/11/29
7560
Earth's Future: 全球变暖未来情景下天气指数保险的应用效益研究
推荐阅读
Nature封面:科学颠覆性进步明显「降速」,物理研究下跌100%
2410
“颠覆性”科学已经衰落了
4960
Nature发文:基础科学创新速度放缓,已经进入「增量时代」
2680
Nature:近年来论文数量激增,但科技界没有创新
3190
AI论文激增,出现引用10万+的ResNet是好是坏?这研究有结论了
5320
国际顶刊PNAS发文:“同质化”论文暴增,从根本上阻碍了科学的进步!
7920
PNAS: 论文越多,科学进展越慢
4540
2018未来科学大奖揭晓:袁隆平、马大为、林本坚等7位科学家获奖
7530
诺奖前夜,Nature发文ChatGPT终极预测!mRNA疫苗能否锁定大奖
2020
李学龙、戴琼海、任奎等上榜,科睿唯安公布2021全球高被引科学家名单,中国科学家占比14.2%
5490
基因突变不是随机的?!Nature最新论文挑战进化论
3530
Nature:百名科学家自引用率超50%,最高自引94%
1.3K0
靠WiFi信号就能检测呼吸跌倒!北大这项硬科技研究越来越藏不住了
4820
曾被纳粹德国查禁,见证了DNA结构的发现和阿尔法狗诞生,Nature 150岁啦!
5810
AlphaFold 3一夜预测地球所有生物分子,谷歌DeepMind颠覆生物学登Nature头版!
2290
AI颠覆材料学!DeepMind重磅研究登Nature,预测220万晶体结构赢人类800年
4090
这位顶尖科学家正式回国!29岁教授博导,11篇Nature、Science
7490
谷歌研究科学家:ChatGPT 秘密武器的演进与局限
2920
Nature | 我的研究对后人毫无用途:21%的学术论文自发布后从未被引用
9880
Earth's Future: 全球变暖未来情景下天气指数保险的应用效益研究
7560
相关推荐
Nature封面:科学颠覆性进步明显「降速」,物理研究下跌100%
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 一、 基本过程和思想
  • 二 、视频理解还有哪些优秀框架
  • 三、效果体验~使用
  • 手势:
  • 健身_跟踪器:
  • 卡路里计算
  • 三、训练自己数据集步骤
    • 然后,打开这个网址:
    • 点击一下start new project
  • 但是官方的制作方法是有着严重bug的~我们该怎么做呢!
  • 原代码解读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档