User Management System

项目名称:用户管理系统
编程语言:PHP
配置:阿里云


阿里云配置

服务器配置

1. Apache
2. MySQL
3. PHP


功能简介

主要用于对用户信息的管理。整个系统还包括:第一,把接收到的位置信息转化为地图上的视图信息,用户可以在地图上查看自己的位置信息,并且显示周围的停车站点;第二,防盗管理,位置信息也可以用于防盗,管理后台把非正常开启,位置移动的车辆进行标记。最后通过电车停止的位置信息,判断电车是否被盗;第三,电量与骑行距离管理,管理后台可以根据当前的电量和当前的车速计算出用户可以的骑行距离,该距离是实时,会根据车速的变化而变化,保证准确性;第四,充电管理,用于管理电车电池充电,需要结合位置规划;第五,投放量管理,管理电车的投放量,防止很多城市出现过度投放的问题;第六,停车位置规划,停车场和充电桩必须合理规划,否者又会出现乱停乱放的问题。


系统体验

该地址只能进入首界面,后续界面由于只设计了管理员用户的,所以普通用户无法登陆,防止对数据和服务器造成破坏,如果想要查看,联系管理员

地址:www.learncv.cn/php

注意:最好用谷歌浏览器打开,其他浏览器可能出现图片加载不了的情况。


界面展示

登录界面
主界面
用户管理界面
文件管理界面
小游戏界面
卫星地图
接收来自GPS的定位图
运动路线图

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Plate Recognition

项目名称:车牌识别
编程语言:C++/Python

电脑配置:
name: GeForce GTX 1060 major: 6 minor: 1 memoryClockRate(GHz): 1.6705
pciBusID: 0000:01:00.0
totalMemory: 5.94GiB freeMemory: 5.86GiB


Introduction:

        该项目是本人申请的研究生创新项目中的一部分,上接行人和车辆检测,当物体检测模型检测出行人和车辆以后,会把检测到的物体切割出来,然后把这些物体中的车辆图片输送到车牌识别模型中去,让系统模型去识别车牌,获取车辆的备案登记信息。


Framework:

HyperLPR 高性能开源中文车牌识别框架,  底层是用C/C++实现,支持多平台使用,这里只介绍linux系统上的使用。可以源码安装,也可以通过pip安装库文件,如下所示:

>> sudo pip install hyperlpr  (linux system)

这里还介绍一下另一个车牌识别框架EasyPR,该框架也是C/C++实现,支持多平台,该框架与HyperLPR最大的区别在于EasyPR的实现都是通过传统的图像处理方法实现的,就最后的字符识别使用了ANN,对于初学者使用有很大的知识积累和提高。


Demo:

# -*- coding:utf-8 -*-
"""
   the program only add nms to remove duplicate license plates on the original basis
   python:3.5
"""

import sys
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import hyperlpr as pr

# 當python版本爲2.7時,使用下面語句,解決編碼問題
# reload(sys)
# sys.setdefaultencoding('utf-8')


def _interval_overlap(interval_a, interval_b):
    x1, x2 = interval_a
    x3, x4 = interval_b

    if x3 < x1:
        if x4 < x1:
            return 0
        else:
            return min(x2, x4) - x1
    else:
        if x2 < x3:
            return 0
        else:
            return min(x2, x4) - x3


def bbox_iou(box1, box2):
    intersect_w = _interval_overlap([box1[0], box1[2]], [box2[0], box2[2]])
    intersect_h = _interval_overlap([box1[1], box1[3]], [box2[1], box2[3]])
    intersect = intersect_w * intersect_h

    w1, h1 = box1[2] - box1[0], box1[3] - box1[1]
    w2, h2 = box2[2] - box2[0], box2[3] - box2[1]
    union = w1 * h1 + w2 * h2 - intersect

    return float(intersect) / union


def nms(plate, thresh):
    plate = [idx for idx in sorted(plate, key=lambda x: x[1], reverse=True)]
    nums = len(plate)
    bbox = [pt[2] for pt in plate]

    for i in range(nums):
        for j in range(i + 1, nums):
            if bbox_iou(bbox[i], bbox[j]) >= thresh:
                plate.pop(j)

    return plate

if __name__=="__main__":
    image = cv2.imread("timg.jpg")
    plate = pr.HyperLPR_PlateRecogntion(image)
    nums = len(plate)

    if nums > 0:
        plate = nms(plate, 0.5)
        for i in range(len(plate)):
            p = plate[i][0]
            # p.decode('utf-8') # python2.7使用
            box = plate[i][2]
            cv2.rectangle(image, (box[0], box[1]), (box[2], box[3]), (0, 0, 255), 2)

            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            image = Image.fromarray(image)
            draw = ImageDraw.Draw(image)
            # simsun.ttc字体包可以从wins系统C:\Windows\Fonts复制到该项目下面
            font = ImageFont.truetype("simsun.ttc", 30, encoding='utf-8')
            draw.text((box[0], box[1] - 33), p, (255, 255, 0), font=font)
            image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)

        cv2.imwrite("res.jpg", image)
    else:
        print("The code cannot detect plates in the picture !")

Test:

原始图片
预测结果

分析:大体上预测结果还行,但是最左面这辆车却没有预测出来,模型预测一般。


Question:

pycharm导模块,模块名下有横线,且鼠标放上面,显示import resolves to its containing file  问题。

Traceback (most recent call last):
File "/home/ubuntu/dir/projects/hyperlpr/hyperlpr1/hyperlpr.py", line 60, in <module>  
plate = pr.HyperLPR_PlateRecogntion(image)
AttributeError: module 'hyperlpr' has no attribute 'HyperLPR_PlateRecogntion'

解决办法:这个问题其实很简单,是因为当前程序目录下有与模块名相同的程序文件,或者自己当前程序文件的名就是该模块名。把这个程序文件名换了就行了。

注:这里有点浪了,把代码的文件名和庫的文件名搞重复了,修改代码里面文件名即可。


参考链接:

1. HyperLPR Codes
2. 问题
3. HyperLPR 使用
4. HyperLPR 代码解读
5. EasyPR Codes
6. EasyPR Blog

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Face Detection

项目名称:人脸检测
编程语言:Tensorflow/Python

电脑配置:
name: GeForce GTX 1060 major: 6 minor: 1 memoryClockRate(GHz): 1.6705
pciBusID: 0000:01:00.0
totalMemory: 5.94GiB freeMemory: 5.86GiB


Introduction:

        该项目是本人申请的研究生创新项目中的一部分,上接行人和车辆检测,当物体检测模型检测出行人和车辆以后,会把检测到的物体切割出来,然后把这些物体中的行人图片输送到人脸检测模型中去,让人脸检测模型去检测出人脸,如果有人脸识别功能的话,还可以实现人脸信息的识别。


Model:

PyramidBox Model

PyramidBox的优点

1.本文提出了一种基于 anchor 的环境辅助方法,即 PyramidAnchors,从而引入有监督的信息来为较小的、模糊的和部分遮挡的人脸学习环境特征。
2.我们设计了低层级特征金字塔网络 (LFPN) 来更好地融合环境特征和面部特征。同时,该方法可以在单步中较好地处理不同尺度的人脸。
3.我们提出了一种环境敏感的预测模型,该模型由混合网络结构和 max-in-out 层组成,从融合的特征中学习准确的定位和分类。
4.我们提出了一种关注尺度的 data-anchor-sampling 策略,改变训练样本的分布,重点关注较小的人脸。
5.在通用人脸检测基准 FDDB 和 WIDER FACE 上,我们达到了当前最佳水平。


Train:

模型训练使用的是WIDER FACE数据集,基础模型用的是VGG 16,训练时可以使用预训练的VGG 16模型,具体训练过程不在详细叙述,参考代码


Test:

原始图片
预测结果

上述bounding box的得分情况如下:

1. 0.997
2. 0.748
3. 0.769
4. 0.932
5. 0.989
6. 0.989
7. 0.915


使用切割图进行检测:

第三个预测结果并不好,因为是切割的图像,分辨率非常低,导致预测精度比较低,容易出现误判的情况,可以对比完整图像和切割图像的准确度。


Question:

1. E [tensorflow/stream_executor/cuda/cuda_driver.cc:466] failed call to cuInit: CUDA_ERROR_NO_DEVICE
I [tensorflow/stream_executor/cuda/cuda_diagnostics.cc:86] kernel driver does not appear to be running on this host (ubuntu-G2): /proc/driver/nvidia/version does not exist
执行nvidia-smi显示: NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
解决办法:这是linux kernel 4.4.0-116-generic的一个小bug,降级到linux kernel 4.4.0-112-generic,再重装一下driver(不用重装cuda)问题就解决了,参考安装


参考链接:

1. PyramidBox
2. Paper 翻译
3. Codes
4. FPN
5. SSH
6. S³FD
7. DataSets  提取码: 6crf

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Person And Car Detection

项目名称:行人和车辆检测
编程语言:Keras/Python

电脑配置:
name: GeForce GTX 1060 major: 6 minor: 1 memoryClockRate(GHz): 1.6705
pciBusID: 0000:01:00.0
totalMemory: 5.94GiB freeMemory: 5.86GiB


Introduction:

        该项目是本人申请的研究生创新项目中的一部分,主要原理就是在交通路口通过摄像头拍摄某些时刻的照片,然后把这些拍摄的照片通过深度模型进行检测,查找出拍摄照片中的所有行人和车辆,供后续的人脸检测和车牌识别系统使用。


Model:

注:下面图片是Darknet-53的网络结构,本文使用的是Res-101的结构,原理一样,只是Block的数量不一样而已。

Darknet-53

Res-101:

Res 101
模型训练

Train:

这里数据用的是PASCAL VOC2012数据集,由于该项目只需要检测行人和车辆,所以这里数据还需要筛选,只保留下面标签数据
1. person
2. bicycle
3. car
4. motorbike
5. bus
6. truck
具体训练不做太多介绍,参考代码


Test:

原始图片
检测结果

上述bounding box的得分情况如下:

1. person: 98.00898432731628%
2. person: 89.7001564502716%
3. person: 99.30801391601562%
4. person: 97.35298156738281%
5. person: 99.17157888412476%
6. person: 99.18015003204346%
7. motorbike: 81.28312230110168%
8. motorbike: 82.47367143630981%
9. person: 99.39936399459839%
10. car: 71.61051034927368%
11. car: 81.30868077278137%
12. car: 80.75195550918579%
13. person: 71.83517813682556%
14. car: 97.70704507827759%

部分切割图:


Question:

这里很多问题非常的奇葩,大多数情况都是环境配置引起的,如果在使用中出现问题,最好根据问题去重新配置环境。本人亲测在python 2.7台式机上没有一点问题就可以运行,而在python 3.5的笔记本上就遇到了下面的奇葩问题。

1. Exception ignored in: <bound method BaseSession.__del__ of <tensorflow.python.client.session.Session object at 0x7fecee6109b0>>
Traceback (most recent call last):
File “/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py”, line 686, in __del__
TypeError: ‘NoneType’ object is not callable
解决办法:这个问题不是大问题,就算不解决也可以使用,在代码中加入如下语句。 2. TypeError: slice indices must be integers or None or have an __index__ method
解决办法: 这个问题一般都是数组在进行切片时,下标不是int型类型导致的,根据错误位置,修改下标为int型即可。

参考链接:

1. Yolo v3
2. 官方网站
3. Yolo v1
4. Yolo v2
5. Yolo v1-v2 Codes
6. Yolo v3 Codes
7. Pascal VOC    提取码:iz2d
8. Yolo weights    提取码:ahs4
9. Yolo v1-v3总结
10. 标注工具

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Semantic Segmentation Codes

Semantic segmentation

Instance aware segmentation

Weakly-supervised segmentation

RNN

GANS

Graphical Models (CRF, MRF)

Datasets:

Benchmarks

Annotation Tools:

Results:

Metrics

Other lists

Medical image segmentation:

Satellite images segmentation

Video segmentation

Networks by framework (Older list)

Papers and Code (Older list)

To look at

Blog posts, other:

原文链接:

https://blog.csdn.net/u012426298/article/details/81364080

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Pooling分析

        由Yann Lecun, Yoshua Bengio, Geoffery Hinto撰写的Deep Learning Review(发表在Nature)中提到了池化层能够reduce the dimensionality of the representation, create an invariance to small shifts and distortions. 池化层能够降低特征表示的维度这个很好理解,伴随来的副作用是局部特征信息的损失,想象如果池化层的filtering bank不是通常的2×2维的矩阵,而是更大维度的矩阵,用max pooling 或者average pooling,信息会损失更多,而且因为每层卷积后都跟着池化层,实际上是相当于在特征的每个提取阶段,从低级特征到中级特征再到高级特征,都有略微的信息损失,因为做了多层的pooling,而不是只做一次pooling,这也是设计上的一个trick啊.这是计算复杂度和性能的trade-off, 信息如果不损失,模型的性能当然会更好,最后得到的特征表示更全面,随着计算能力的提高,这一点也在逐渐得到缓和。
         第二个作用是具有一定程度上的平移和失真不变性,注意原文是说small shifts and distortions,我把他翻译成一定程度,这个程度我认为取决于pooling层中的filtering bank的维度大小,维度越高,在保持性能相同的前提下,图像可平移的距离越大,当然这本身就和上面的信息损失相冲突. 对于失真的理解,假设有一副包含人脸的图像64×64 维,你把图像左边这一列或者前几列的像素值都人为置为[0,255]中的某一个数,这时候池化层反而在一定程度上能够过滤掉这些不相关的像素值(通过max或average掉filtering bank对应的像素值)。

Pooling 的意义:
  • 减少参数。通过对 Feature Map 降维,有效减少后续层需要的参Translation
  • Invariance。它表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就使网络的鲁棒性增强了,有一定抗扰动的作用。
  • 可以显著的增加接受野
Pool的问题:
  • 池化导致信息损失。想想最大池化的例子,n个数字中我们只保留最大的,把余下的 n-1 完全舍弃了。
池化的平移不变性:
        如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征
注意这两点:
1、连续范围
2、池化相同隐藏单元产生的特征
         这意思是指,在池化单元内部能够具有平移的不变性,它的平移范围也是有一定范围的,因为每个池化单元都是连续的,所以能够保证图像整体上发生了平移一样能提取特征进行匹配。
        无论是max还是average都是在提取区域特征,均相当于一种抽象,抽象就是过滤掉了不必要的信息(当然也会损失信息细节),所以在抽象层次上可以进行更好的识别。         至于max与average效果是否一样,还是要看需要识别的图像细节特征情况,这个不一定的,不过据说差异不会超过2%。
不过仔细点说的话,评估特征提取的误差主要来自两个方面:
(1)邻域大小受限造成的估计值方差增大,average能减小这种误差。
(2)卷积层参数误差造成估计均值的偏移,max能减小这种误差。
        也就是说,average对背景保留更好,max对纹理提取更好,如果是识别字体什么的,应该考虑max.
        在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。

获取high-level需要多个池化操作:
  • 池化操作减少feature的空间分辨率的同时增加了模型接受野,这也是模型应对小型平移具有鲁棒性的根本。多次使用池化操作就很难追踪low-level的feature了(例如边沿,边界等)。这就让识别和准确定位产生了矛盾。
  • 如果网络不采取任何池化操作,这在目标边界定位上效果较好(卷积的目的是为了得到物体的边缘形状),但是识别性能差。
参考链接:
  1. https://blog.csdn.net/qq_18644873/article/details/84949649
  2. https://blog.csdn.net/u011974639/article/details/79561297
  3. https://www.zhihu.com/question/34898241
  4. https://arxiv.org/pdf/1804.04438.pdf

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

Hebbian principle

1、什么是Hebbian原理? 
        神经反射活动的持续与重复会导致神经元连续稳定性持久提升,当两个神经元细胞A和B距离很近,并且A参与了对B重复、持续的兴奋,那么某些代谢会导致A将作为使B兴奋的细胞。总结一下:“一起发射的神经元会连在一起”,学习过程中的刺激会使神经元间突触强度增加。

2、目前图像领域的深度学习,是使用更深的网络提升representation power,从而提高准确率,但是这会导致网络需要更新的参数爆炸式增长,导致两个严重的问题
a. 网络更容易过拟合,当数据集不全的时候,过拟合更容易发生,于是我们需要为网络feed大量的数据,但是制作样本集本身就是一件复杂的事情。
b. 大量需要更新的参数就会导致需要大量的计算资源,而当下即使硬件快速发展,这样庞大的计算也是很昂贵的

3、解决办法
        解决以上问题的根本方法就是把全连接的网络变为稀疏连接(卷积层其实就是一个稀疏连接),当某个数据集的分布可以用一个稀疏网络表达的时候就可以通过分析某些激活值的相关性,将相关度高的神经元聚合,来获得一个稀疏的表示。
        这种方法也呼应了Hebbian principle,一个很通俗的现象,先摇铃铛,之后给一只狗喂食,久而久之,狗听到铃铛就会口水连连。这也就是狗的“听到”铃铛的神经元与“控制”流口水的神经元之间的链接被加强了,而Hebbian principle的精确表达就是如果两个神经元常常同时产生动作电位,或者说同时激动(fire),这两个神经元之间的连接就会变强,反之则变弱(neurons that fire together, wire together)

涉及文章:Inception V1 – Going deeper with convolutions

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

super().__init__

super() 的入门使用

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如:

在上面,Animal 是父类,Dog 是子类,我们在 Dog 类重定义了 greet 方法,为了能同时实现父类的功能,我们又调用了父类的方法,看下面的使用:

super 的一个最常见用法可以说是在子类中调用父类的初始化方法了,比如:

深入 super()

看了上面的使用,你可能会觉得 super 的使用很简单,无非就是获取了父类,并调用父类的方法。其实,在上面的情况下,super 获得的类刚好是父类,但在其他情况就不一定了,super 其实和父类没有实质性的关联

让我们看一个稍微复杂的例子,涉及到多重继承,代码如下:

其中,Base 是父类,A, B 继承自 Base, C 继承自 A, B,它们的继承关系如下:

现在,让我们看一下使用:

如果你认为 super 代表『调用父类的方法』,那你很可能会疑惑为什么 enter A 的下一句不是 enter Base 而是 enter B。原因是,super 和父类没有实质性的关联,现在让我们搞清 super 是怎么运作的。

MRO 列表

事实上,对于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表它代表了类继承的顺序,我们可以使用下面的方式获得某个类的 MRO 列表:

那这个 MRO 列表的顺序是怎么定的呢,它是通过一个 C3 线性化算法来实现的,这里我们就不去深究这个算法了,感兴趣的读者可以自己去了解一下,总的来说,一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则:

  • 子类永远在父类前面
  • 如果有多个父类,会根据它们在列表中的顺序被检查
  • 如果对下一个类存在两个合法的选择,选择第一个父类

super 原理

super 的工作原理如下:

其中,cls 代表类,inst 代表实例,上面的代码做了两件事:

  • 获取 inst 的 MRO 列表
  • 查找 cls 在当前 MRO 列表中的 index, 并返回它的下一个类,即 mro[index + 1]

当你使用 super(cls, inst) 时,Python 会在 inst 的 MRO 列表上搜索 cls 的下一个类。

现在,让我们回到前面的例子。

首先看类 C 的 __init__ 方法:

这里的 self 是当前 C 的实例,self.__class__.mro() 结果是:

可以看到,C 的下一个类是 A,于是,跳到了 A 的 __init__,这时会打印出 enter A,并执行下面一行代码:

注意,这里的 self 也是当前 C 的实例,MRO 列表跟上面是一样的,搜索 A 在 MRO 中的下一个类,发现是 B,于是,跳到了 B 的 __init__,这时会打印出 enter B,而不是 enter Base。

整个过程还是比较清晰的,关键是要理解 super 的工作方式,而不是想当然地认为 super 调用了父类的方法。

小结

  • 事实上,super 和父类没有实质性的关联。
  • super(cls, inst) 获得的是 cls 在 inst 的 MRO 列表中的下一个类。

本文由 funhacks 发表于个人博客,采用 Creative Commons BY-NC-ND 4.0(自由转载-保持署名-非商用-禁止演绎)协议发布。
非商业转载请注明作者及出处。商业转载请联系作者本人。
本文标题为: Flask 插件系列 – Flask-SQLAlchemy
本文链接为: https://funhacks.net/2016/11/…

参考资料

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com

目标检测领域还有什么可以做的?

作者:种树的左耳

来源:知乎

链接:https://www.zhihu.com

感觉已经饱和了,很难再出顶级算法的样子。我所指的饱和是说围绕目标检测感觉没有什么好文章能发出来了,现有算法很难在短时间有突破了。想请教大家有什么好做的点子么?

种树的左耳答案
饱和是相对于占坑来说的,对于去探索未来踩坑来说,目标检测还远远没有达到饱和的地步。只是说想发简单的好论文越来越难了,并不是说不会有什么突破了。单就检测来说,2018年顶会出的目标检测论文也并不算少。
下面是我个人就目标检测算法在深度学习领域未来研究的一些看法:
1.从专注精度的Faster RCNN、RFCN相关系列,以及专注速度的YOLO系列,未来的方向更专注于精度和速度的结合,这也是过去的很多模型在SSD系列上产生的原因,主要代表有RefineDet、RFBNet等。所以SSD系列的研究会成为主流。

2.目标选框从Region Based 和Anchor Based到基于角点,甚至是基于segmentation,包括semantic segmentation 和 instance segmentation 。今年比较有代表的CornerNet和Grid RCNN是一个开拓思路的方向,细节就不用说了吧。。。未来的目标选框方法依旧是研究的一个重要方向。

3.多尺度问题(尺度变换问题),目前常见的三种思路,采用专门设计的尺度变换模块,可以参考STDN: Scale-Transferrable Object Detection。多个scale的目标检测设计,没记错的话之前有在Faster RCNN基础上,做多个scale的rpn。当然最新的SNIP也是多个RPN。还有就是SNIPER,先用SNIPER的模块进行一个粗检测,检测出多个scale关注区域,然后再进行细检测。目前的问题是,如果是才有scale transfer moudle的话,可能会丢失一些信息,也就是多scale融合学习存在问题,那么如何设计一个单scale模型transfer moudle进行有效学习,这一点我是存疑的,总感觉这个多scale融合哪里存在问题。同时,采用多scale的先初步多scale检测再细检测会增加计算时间,如何有效的将两个模块进行结合,进行进一步的再设计是未来一个重点。

4.重新思考目标检测的训练,凯明今年的新作Rethinking imagenet pre-training已经验证了一个问题,pre-training再training和training from scratch这一点在目标检测问题理论上也是适用的。当目标检测数据集达到一定规模,目标选框问题是否可以单独抽离出来,做好更精确的选框预训练,再在具体的数据集上主要进行选框适应性训练和分类训练?另外由于目前的目标检测backbone网络都是从图像分类网络过来的,图像分类网络之前的提法是尺度不变性,而目标检测有尺度变化性,今年清华的一篇文章就是做了这个问题,设计了一个专门针对目标检测问题的backbone,但是还是基于ImgNet进行了预训练,那么不在ImgNet进行预训练是否可行?另外如何从一个小的数据集上进行一个转向任务的无预训练的学习 or 有预训练的小规模数据学习训练。目标检测的小规模数据训练是在实际工程应用中,尤其是工业化场景中一个比较需要关注的问题。

5.重新思考卷积神经网络的旋转不变性和尺度变化,有一些我在上面已经提到了,从一些论文的研究表明,卷积神经网络的旋转不变性似乎是一个伪命题,卷积网络的旋转不变性主要是通过数据的增强和大样本的学习获取的,本身应该不具备旋转不变性。这个问题我看一些研究者提到过,我的感觉是应该是不具备旋转不变性的,可能需要进行进一步的研究进行分析。旋转不变性和尺度变化会影响目标检测算法的基本框架。

6.目标检测以及深度学习的分割、关键点检测、跟踪都需要在数据标注上耗费巨大的成本,如何采用算法进行更有效的标注是一个核心的问题,包括上面4中提到的如何用更少的样本进行学习是关键。如果不能进行无监督的话,那么小规模数据的监督学习如何更有效进行训练达到大幅度精度提升将会是研究的重点。还有就是采用单图像单类别的弱标注,不进行选框标注,通过对大型目标检测数据集进行预训练,然后在这种单类单图像场景进行弱监督多类检测学习,进而泛化到多类单图像检测。

7.IOU的算法设计和阈值的选择,今年比较有特点的是IOUNet和Cascade RCNN。

8.更好的NMS。

9.one shot learning,我看来一个样本和小样本的数据增强和学习,也会有一些有意思的研究。参考评论里面的提到的参考文章:LSTD: A Low-Shot Transfer Detector for Object Detection  发表在AAAI2018。

10.如何实现未知目标类的检测,也就是我们常说的zero shot learning。从结合语义等信息从已知类别的目标检测,迁移到对未知类别的目标进行检测。参考论文Zero-Shot Object Detection(ECCV2018)。

11. 如何从已经训练的模型去迁移到新增数据、新增类别的学习,也就是增量学习(Incremental Learning)。可以参考的论文有Incremental Learning of Object Detectors without Catastrophic Forgetting(ICCV2017)目标检测的论文以及End-to-End Incremental Learning(ECCV2018)。

12. CNN、Pooling、Loss 目前都有各种各样的变体,更有效的CNN、Pooling、Loss依旧会出现。

13. 将目标检测方法的一些研究迁移到SOT(Single Object Tracking)和MOT(Multiple Object Tracking),可以有效的观察到今年表现比较好的SOT算法和MOT算法都有和检测的结合出现。单目标跟踪可参考商汤和中科院计算所的SiameseRPN:High Performance Visual Tracking with Siamese Region Proposal Network(CVPR2018)以及最新的SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks(刚刚发布)。多目标跟踪可参考清华艾海舟组的REAL-TIME MULTIPLE PEOPLE TRACKING WITH DEEPLY LEARNED CANDIDATE SELECTION AND PERSON RE-IDENTIFICATION(CVPR2018)

14. 目标检测的FineGrained问题。

15. 模型的轻量级化,从目前的轻量级网络对于计算资源的压缩上,主要是集中在对于backebone的压缩,那么对于模型整体上针对目标检测的考虑进行再设计是否可行?

16. 大尺寸图像的目标检测问题,目前很多检测的基本主要集中在512×512和1000×600左右的图像操作,但是在未来,4k图像和视频会成为主流,大尺寸图像的目标检测、跟踪都会成为主流,今年CVPR2018有一篇文章Dynamic Zoom-in Network for Fast Object Detection in Large Images是进行大尺寸图像的目标检测,主要是做的2k,设计了一个粗检测和精细检测的模块。所以针对大尺度的图像如何进行计算资源的压缩、有效的目标检测or跟踪是一个非常有前瞻性的研究工作。尤其是未来的网络电视剧、电影、短视频会出现更多的4k内容。

17.AR场景下的跨类检测融合,这个属于我的想象,一个简单的比如是AR眼镜会跟人类的眼睛一样的视野。那么在这个场景下对于视觉获取内容的有效提取包括图像里面就包括文字、商标、各类目标等等内容的融合检测。

18. 3d 激光雷达lidar和深度相机的目标检测,在自动驾驶这一块用的比较多,但是更精细的应用场景还是很多的,还有很多的应用场景比如裁判之类的要求更精细化的检测(包括关键点检测分割之类的)。

19.视频流的检测,主要是应用到移动端场景的手机或者FPGA。由于视频流的图片信息具有时间和空间相关性,相邻帧之间的特城提取网络会输出有冗余的特征图信息,会造成没必要的计算浪费。同时图片的目标检测算法在目标物体运动模糊,拍摄焦距失调,物体部分遮挡,非刚性物体罕见变形姿态的情况下,很难获得较为准确的结果。同时权衡精度、计算时间以及计算资源变得尤为重要。可参考论文包括Towards High Performance Video Object Detection for Mobiles(Arxiv Tech Report 2018)、Towards High Performance Video Object Detection(CVPR2018)、Fully Motion-Aware Network for Video Object Detection(ECCV2018),ECCV2018和CVPR2018都有两三篇,主要贴一下Jifeng Dai的工作,其它就不贴了。

本文总结于网络文章,加入了个人理解,仅用于个人学习研究,不得用于其他用途,如涉及版权问题,请联系邮箱513403849@qq.com