【目标检测】Faster R-CNN的复现

2023-10-26

Faster Rcnn

  • Faster Rcnn:
    1.Conv layers
    使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
    2.Region Proposal Networks
    RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
    3.Roi Pooling
    该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
    4.Classification
    利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
    在这里插入图片描述
    基于VGG16的网络:
    在这里插入图片描述

  • RPN: 生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
    RPN结构示意图:
    网络上层: 通过softmax分类anchors获得positive和negative分类。
    网络下层: 用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
    Proposal: 综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。
    在这里插入图片描述
    在这里插入图片描述

anchors:
其中每行的4个值(x1, y1, x2, y2) 表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为(H:W, 1:1, 1:2, 2:1) 三种,实际上通过anchors就引入了检测中常用到的多尺度方法。
在这里插入图片描述 在这里插入图片描述
为每个feature maps上的点提供一个anchors。
每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2•k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4•k coordinates。

全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练
在这里插入图片描述

  • Bounding Box Regression:
    绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。
    在这里插入图片描述在这里插入图片描述
    红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’。即可以利用线性回归关系,使得A -> G’。

  • Anchor&Proposal layer: 获得精准的proposal
    执行流程:

    for each (H, W) location i
        1.在i位置生成A个anchor box
    	2.把预测的包围盒变量应用于每个位置的每个锚点
    	3.使用预测盒剪切图片
    	4.去掉宽和长小于阈值的包围盒
    	5.从高到低对所有proposal,score 序列排序
    	6.选择topN, 应用非极大值抑制, 使用0.7做阈值
    按照Batch返回TopN
    

    可理解为:

    0.输入之前RPN两条支路中所生成的
    	rpn_cls_prob_reshape,
    	(1 , H , W , Ax2)
    	rpn_bbox_pred,
    	(1 , H , W , Ax4)
    	以及原始图像的信息
    	[image_height, image_width, scale_ratios]
    1.基于feature map 尺寸,按照指定的长宽大小组合生成所有pixel位置的 anchor(shift base_anchors)
    2.对这些anchor做剪枝(clip,transfrom,filter,NMS),TopN备选
    3.把剪枝后的anchor包装为proposal
    
  • NMS(Non-Max Suppression,非极大值抑制):

     NMS算法一般是为了去掉模型预测后的多余框,其一般设有一个nms_threshold=0.5,具体的实现思路如下:
     
     选取这类box中scores最大的那一个,记为box_best,并保留它
     计算box_best与其余的box的IOU
     如果其IOU>0.5了,那么就舍弃这个box(由于可能这两个box表示同一目标,所以保留分数高的那一个)
     从最后剩余的boxes中,再找出最大scores的那一个,如此循环往复
     
     可以理解为:
     先假设有6个输出的矩形框(即proposal_clip_box),根据分类器类别分类概率做排序,从小到大分别属于车辆的概率(scores)
     分别为A、B、C、D、E、F。
     (1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
    
     (2)假设B、D与F的重叠度(IOU)超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
    
     (3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
     
     就这样一直重复,找到所有被保留下来的矩形框。
    

    输入:
    在这里插入图片描述
    输出:
    在这里插入图片描述

  • ROI-Pooling:
    目标检测 two stage typical architecture 通常可以分为两个阶段:
    (1)region proposal: 给定一张输入image找出objects可能存在的所有位置。这一阶段的输出应该是一系列object可能位置的bounding box。(regions or ROIs)

    (2)final classification: 确定上一阶段的每个region proposal是否属于目标类别或者背景。

    ROI Pooling的目的就是使用MaxPooling针对不定尺寸的输入,产生指定尺寸的feature map。

    这个architecture存在的一些问题是:

    1,产生大量的region proposals 会导致性能问题,实时性能会大大降低
    2,在处理速度方面是suboptimal。
    3,无法做到端到端的训练

    由于这个步骤没有得到大多数神经网络库的支持,所以需要实现足够快的ROI Pooling操作,这就需要使用C来执行,在GPU条件下需要CUDA来执行

    ROI pooling具体操作如下:

    (1)根据输入image,将ROI映射到feature map对应位置;
    (2)将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
    (3)对每个sections进行max pooling操作;

    这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。
    如下图所示:

    在这里插入图片描述
    以下为一个 ROI pooling 的例子
    考虑一个8×8大小的feature map,一个ROI,以及输出大小为2×2.
    (1)输入的固定大小的 feature map
    (2)region proposal 投影之后位置(左上角,右下角坐标):(0,3),(7,0)。
    (3)将其划分为(2×2)个sections(因为输出大小为2×2)
    (4)对每个section做max pooling,可以得到:

    请添加图片描述

  • Classification:
    Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。

在这里插入图片描述
回归主要完成:
1.通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了。
2.再次对proposals进行bounding box regression,获取更高精度的rect box。
全连接示意图:
在这里插入图片描述
公式:
在这里插入图片描述
其中W和bias B都是预先训练好的,即大小是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性。

Faster Rcnn代码导读: https://zhuanlan.zhihu.com/p/145842317

0. 利用Git下载Code

1. 数据准备

  • 切换路径到faster-rcnn.pytorch下,并在其目录下创建data文件夹:

     xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/$ cd faster-rcnn && mkdir data
    
  • 下载数据至data文件夹:
    切换路径到data下

    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python$ cd faster-rcnn
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ cd data
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/data$ 
    

    开始下载压缩文件,执行如下命令,下载VOV2007标准数据集的相关数据。

    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
    

    执行下方命令解压缩数据到data/VOCdevkit

    tar xvf VOCtrainval_06-Nov-2007.tar
    tar xvf VOCtest_06-Nov-2007.tar
    tar xvf VOCdevkit_08-Jun-2007.tar
    

    cd 进入data文件夹下,创建软链接

    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/data$ pwd
    /home/xiaoxie/data/yx/python/faster-rcnn/data
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/data$ ln -s /home/xiaoxie/data/yx/python/faster-rcnn/data/VOCdevkit VOCdevkit2007
    

    数据集的详细解释:
    https://blog.csdn.net/qq_38273984/article/details/90749314
    https://blog.csdn.net/weixin_42782150/article/details/109820615

2. 模型加载

  • 下载预训练模型:
    首先,在/data/下创建子文件夹/data/pretrained_model;然后,下载预训练模型到/data/pretrained_model下,如VGG16,ResNet101等。

    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/data$ sudo mkdir pretrained_model
    

    VGG16: Dropbox VT Server
    ResNet101: Dropbox VT Server
    注: 下载结束后,将这两个模型都放进/data/pretrained_model/文件夹中。

  • 编译:
    使用pip安装所有python依赖包,cd 进入requirements.txt文件所在的路径下:

    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ pip install -r requirements.txt
    

    当使用pip下载不成功时,可以使用以下命令:

    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
    

    编译CUDA依赖环境:
    这里为pytroch1.0的编译设置,编辑所需的cuda环境后,回到主目录。

    cd lib
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/lib$ sudo python setup.py build develop
    # 不要使用sh make.sh
    

3. 模型训练

在训练之前需要根据自己的环境将trainval_net.py和test_net.py中的两个参数save_dir和load_dir进行更改。

  • VGG16在pascal_voc上训练faster R-CNN使用如下命令(具体参数根据自己的需要修改):

     CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
                       --dataset pascal_voc --net vgg16 \
                       --bs $BATCH_SIZE --nw $WORKER_NUMBER \
                       --lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \
                       --cuda
    
  • RES101训练命令行示例:

    CUDA_VISIBLE_DEVICES=0 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 0 --lr 0.001 --lr_decay_step 5 --cuda
    

    或者

    CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py --dataset pascal_voc --net res101 --cuda
    

    这里使用如下命令:

    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/lib$ cd ..
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ 
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ CUDA_VISIBLE_DEVICES=0 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 0 --lr 0.001 --lr_decay_step 5 --cuda
    

    参数:

      - CUDA_VISIBLE_DEVICES:指gpu的id,这得看你实验室服务器哪块gpu是闲置的。
      - dataset:指训练数据集名称,此处以pascal-voc为例。
      - net:你要使用的预训练模型,可以换为resnet101。
      - bs:指的batch size。
      - epoch:指要训练的轮数。
      - nw:指的是worker number,取决于你的Gpu能力,我用的是Titan Xp
      - 12G,所以选择4。稍微差一些的gpu可以选小一点的值。
      - lr:指学习率
      - cuda:指的是使用gpu。
      - BATCH_SIZE 和 WORKER_NUMBER 可以根据你的GPU情况来设置。
      - 训好的model会存到models文件夹底下,此处暂时使用默认的训练参数。
    

    出现问题: ImportError: cannot import name '_mask'
    解决问题: https://blog.csdn.net/qq_44747572/article/details/121020895
    出现问题: ImportError: cannot import name 'imread'
    解决问题: xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ pip install scipy==1.2.1 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

4. 模型测试

评估res101预训练模型在pascal_voc测试集上的表现,使用如下命令:

python test_net.py --dataset pascal_voc --net res101 \
                   --checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \
                   --cuda

设置示例:

python test_net.py --dataset pascal_voc --net res101 --checksession 1 --checkepoch 20 --checkpoint 2504 --cuda

注意,这里的三个check参数,是定义了训好的检测模型名称,我训好的名称为faster_rcnn_1_20_2504,代表了checksession = 1,checkepoch = 20, checkpoint = 2504,这样才可以读到模型“faster_rcnn_1_20_2504”。训练中,源码代码默认设置的epoch为20,所以checkepoch选择20,也就是选择最后那轮训好的模型,理论上应该是效果最好的。下图就是我20次epochs的模型。

测试时,出现 Segmentation fault (core dumped)
改用anaconda管理环境

  • 创建anaconda新环境
    https://blog.csdn.net/anpwu/article/details/110290310
    问题:CondaHTTPError: HTTP 000 CONNECTION FAILED
    解决:https://blog.csdn.net/anniaxie/article/details/107197513
    若不能解决尝试添加其他镜像源:https://blog.csdn.net/yst990102/article/details/106730382

  • 安装各种库
    requirements.txt包含项目所需要的库

    (TargetDetect) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ pip install -r requirements.txt
    

    编译CUDA依赖环境:
    这里为pytroch1.0的编译设置,编辑所需的cuda环境后,回到主目录。

    cd lib
    xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/lib$ sudo python setup.py build develop
    # 不要使用sh make.sh
    

    pytorch安装: https://blog.csdn.net/mao_hui_fei/article/details/112078113
    在这里插入图片描述 在这里插入图片描述
    安装指定版本的torch/torchvision (离线下载对应版本的torch/torchvision,保存到运行路径下,使用pip进行导入)
    torch/torchvision: https://download.pytorch.org/whl/torch_stable.html

    (yx_env) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ pip install torch-1.5.0+cu101-cp36-cp36m-linux_x86_64.whl
    (yx_env) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ pip install torchvision-0.6.0+cu101-cp36-cp36m-linux_x86_64.whl
    

    在这里插入图片描述

  • 运行faster rcnn程序

    (TargetDetect) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ python test_net.py --dataset pascal_voc --net res101 --checksession 1 --checkepoch 20 --checkpoint 2504 --cuda
    

    问题:

    ImportError: /home/xiaoxie/data/yx/python/faster-rcnn/lib/model/_C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c104cuda20getCurrentCUDAStreamEa
    

    解决:

    conda install pytorch==1.0.0 torchvision==0.2.1 cuda100 -c pytorch
    

    问题:

    ImportError: libtorch_cpu.so: cannot open shared object file: No such file or directory
    

    解决:

    (yx_env) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn$ cd lib
    (yx_env) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/lib$ rm -r build
    (yx_env) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/faster-rcnn/lib$ python setup.py develop
    

    问题:

    TypeError: load() missing 1 required positional argument: 'Loader'
    

    解决:

    yaml_cfg = edict(yaml.load(f, Loader=yaml.FullLoader))
    

    问题:

    _pickle.UnpicklingError: A load persistent id instruction was encountered,
    but no persistent_load function was specified.
    

    解决:
    保存模型和合并模型时pytorch版本不一致。合并模型时切换为保存模型的pytorch版本即可。
    重新训练。(这里我选择了重新训练)

5. 运行demo.py

如果你想要运行预训练模型去检测新的test图片,要先下载预训练模型或者训练你自己模型,然后把图片放到工作目录下(示例路径:~/images)的images文件夹里,再运行如下命令:

python demo.py --net vgg16 \
               --checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \
               --cuda --load_dir + 模型存放文件夹

示例:

python demo.py --net res101  --checksession 1  --checkepoch 20 --checkpoint 2504 --cuda --load_dir models

结果:
在这里插入图片描述

6. 训练自定义Images文件和对应XML文件的model

https://blog.csdn.net/weixin_42782150/article/details/109820615
(先码着,后面需要再学习)

参考:
https://zhuanlan.zhihu.com/p/31426458
https://blog.csdn.net/weixin_42782150/article/details/109820615
https://blog.csdn.net/ThunderF/article/details/100294913
https://blog.csdn.net/admintan/article/details/91366551

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【目标检测】Faster R-CNN的复现 的相关文章

  • rshd.c 源代码中缺少 pam_appl.h 和 pam_misc.h

    我正在研究一个CentOS 5 5 操作系统 它显示错误 security pam appl h 和 security misc h 文件丢失 实际上我的 rshd c 没有加载 PAM 模块 可能是通过放置这个库 它可以帮助我很好地工作我
  • Linux - 查找特定文件之后和之前的文件

    我试图在我的计算机上查找特定文件创建前 1 小时和创建后 1 小时创建的文件 这是我尝试过的方法 find root newermt 2012 10 04 1800 and newermt 2012 10 04 2000 exec ls l
  • 监控(嗅探)由 FTDI USB 串行转换器创建的 /dev/ttyUSB0

    我想监视 嗅探 由 FTDI USB 串行转换器创建的 dev ttyUSB0 的流量 我已经在 Windows 中编写了自己的应用程序 现在我尝试将其移植到 Linux 并使用 dev tty USB0 我想调试实际发生的通信 软件 st
  • IPC:在两个程序之间使用 C++ 中的命名管道

    我试图在同一台机器上运行的两个不同程序之间实现IPC 在我的例子中是CentOS7 为了实现一种松散耦合 我决定对 IPC 使用命名管道 因此 我正在使用以下示例并遇到了不同的问题 创建并写入管道 include
  • Linux 服务器的 CPU 使用百分比

    我想从 linux 服务器获取 CPU 使用率百分比 我通过 python 连接到我的 linux 服务器 shell spur SshShell hostname ip username root password password mi
  • 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

    例如 此行失败 nohup for i in mydir fasta do myscript sh i done gt output txt bash syntax error near unexpected token do 正确的做法是
  • 如何将动态链接的应用程序转换为静态链接的应用程序?

    我有一个应用程序 例如 gedit 它是动态链接的 但我没有源代码 所以我不能按我喜欢的方式编译它 我想要做的是将其静态链接并将其移动到没有运行该应用程序所需的库的系统 那么是否可以做到以及如何做到呢 理论上是可能的 您基本上必须执行与动态
  • 错误:‘:’标记之前需要初始化程序

    我正在尝试编译一些 C 代码 可以在 Windows 上使用 Visual Studio 2012 进行编译 g 4 4 我有这段代码 const std string cnw restoreSession const std vector
  • 何时调用setsockopt?在bind()和connect()之前?

    我继承了一些 TCP 代码 调用 bind tcpSocket struct sockaddr server addr sizeof server addr 在致电之前 setsockopt tcpSocket SOL SOCKET SO
  • gai_cancel() 需要很长时间才能成功

    我正在尝试在 C 中异步查找域 原因是我希望能够有效地添加超时期限 以防系统无法查找域 我遇到了 getaddrinfo a 命令 所以我决定尝试一下 然而 在我的机器上取消任何不会成功的 dns 查找 例如没有互联网连接时 永远不会花费少
  • 如何使用Python distutils?

    我用 python 编写了一个快速程序 将 gtk GUI 添加到 cli 程序中 我想知道如何使用 distutils 创建安装程序 因为它只是命令行应用程序的 GUI 前端 所以它只能在 nix 中工作 所以我不担心它是跨平台的 我的主
  • Linux 上共享内存的生命周期是多长

    我正在使用 ftok shmget shmat shmdt 函数在 Linux 上创建 写入和读取共享段 如果我写入一个程序中的段 然后退出 然后稍后从另一个程序中读取该段 我会惊讶地发现数据仍然存在 我预计当共享一个段的最后一个进程执行
  • 将条目添加到 Linux 内核 .config 文件

    如何手动将 CONFIG XILINX FIXED DEVTREE ADDR y 行添加到 Linux 配置文件中 当我构建内核时它不断被覆盖 您可以通过以下方式构建make CONFIG XILINX FIXED DEVTREE ADDR
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • 如何配置和采样英特尔进程内性能计数器

    简而言之 我试图在用户级基准测试进程中实现以下目标 伪代码 假设 x86 64 和 UNIX 系统 results for iteration 0 iteration lt num iterations iteration pctr sta
  • 使用 sysfs 的 Linux 用户空间 GPIO 中断

    我想使用 sysfs 在用户空间上使用 GPIO 中断 我使用这些命令 root at91 gpio109 gt echo 109 gt export root at91 gpio109 gt cd gpio109 root at91 gp
  • 强制 shell 在 SunGrid 引擎中使用 conda 变量中的 python [重复]

    这个问题在这里已经有答案了 我正在尝试在 SunGrid 引擎中执行 python 文件 并且从 anaconda3 环境变量中执行它 我的代码很简单 from future import print function import url
  • 在Linux服务器中安装ZLIB

    我要安装ZLIB http www techsww com tutorials libraries zlib installation installing zlib on ubuntu linux php在Linux服务器中 我的服务器帐

随机推荐

  • 常用几何算法

    1 矢量减法设二维矢量 P x1 y1 Q x2 y2 则矢量减法定义为 P Q x1 x2 y1 y2 显然有性质 P Q Q P 如不加说明 下面所有的点都看作矢量 两点的减法就是矢量相减 2 矢量叉积设矢量P x1 y1 Q x2 y
  • 这个高仿小米商城项目太惊艳了

    我的引语 晚上好 我是吴小龙同学 我的公众号 菜鸟翻身 会推荐 GitHub 上好玩的项目 一分钟 get 一个优秀的开源项目 挖掘开源的价值 欢迎关注我 平时总觉得还有很多事情要去做 然而当真的闲下来时却不一定去做 比如今年这个天天在家窝
  • LPMM阅读笔记

    https www cnblogs com ChipView p 9278614 html LPMM阅读笔记 第1章 引言 LPMM阅读笔记 1 写给自己 转眼间我已经工作了两年 在这两年里 为了工作需要我看了很多相关书籍 在我看书的时候都
  • Linux·软中断&tasklet

    目录 软中断 中断服务接口管理 tasklet 软中断 首先明确一个概念软中断 不是软件中断int n 总来来说软中断就是内核在启动时为每一个内核创建了一个特殊的进程 这个进程会不停的poll检查是否有软中断需要执行 如果需要执行则调用注册
  • 网络爬虫js逆向解决网站登录RSA加密问题,不使用selenium如何实现登录,session维持登录状态请求爬取

    记录中大网校破解登录后爬取的方法 案例请求地址 中大网校会员中心 登陆入口 中大网校 使用工具 打码平台 超级鹰 分析请求 分析此请求 得知没有data 保持状态登录需要服务器知道是这个用户对应请求的相应验证码 所以要用session来维护
  • Spring Boot中自定义注解

    在Spring Boot中 我们可以通过自定义注解来实现一些特定的功能 自定义注解可以让我们的代码更加简洁 易于维护 并且可以提高代码的可读性和可扩展性 本文将介绍如何在Spring Boot中自定义注解 定义注解 首先 我们需要定义一个注
  • Qt读写CSV文件的几种方式及优劣

    前言 作为一种常见的数据交换格式 CSV Comma Separated Values 文件常常用于数据导出和导入等场合 在实际开发中 我们也需要使用Qt来实现CSV文件的读写操作 本篇博客将介绍使用Qt实现CSV读写的方法 并分析每种实现
  • ttlink无线打印服务器固件,TTLINK TT-180U1打印机服务器 TCP/IP添加打印机的教程

    使用TT 180U1 LPR添加方式 本教程以打印机为兄弟HL 2140激光打印机为实例 系统为Windows 7 64位系统 打印服务器IP固定为192 168 1 220 优点 不用安装软件 打印速度快 稳定性好 可跨网段打印 缺点 只
  • Python

    实现思路 分为两部分 第一部分 获取网页上数据并使用xlwt生成excel 当然你也可以选择保存到数据库 第二部分获取网页数据使用IO流将图片保存到本地 一 爬取所有英雄属性并生成excel 1 代码 import json import
  • Windows系统安装及初步使用ImageMagick

    最近在网上搜索了很多关于 Windows系统安装及如何使用ImageMagick 的相关文章 都没有详细说明如何使用 经过自己的摸索才明白如何使用 所以今天把它记录下来 1 首先第一步肯定是去官网下载安装包 http www imagema
  • Zotero(2)---使用Sci-hub插件下载文献

    Sci hub插件配置 如果没有安装zotero可以参考https blog csdn net u011895157 article details 126144104 spm 1001 2014 3001 5501 1 首先打开zoter
  • HTML常用的标签

    目录 1 段落 行内 换行标签 2 文本样式标签 3 表格标签 4 表单标签 1 表单域 2 表单控件 5 列表标签 6 超链接标签 7 图像标签 1 段落 行内 换行标签 为了让网页的文字有条理的显示出来 HTML有 p 段落标签 和 s
  • excel中如何将3'30"格式的分秒转换成以秒为单位的数字?

    在excel中 如记录比赛成绩的格式为3 30 要转换成以秒为单位的数字 如210秒的方式 请问该如何操作 假设你的数据在A列 A1 A100 在B1输入下面的公式 然后向下填充 TEXT 00 SUBSTITUTE LEFT A1 LEN
  • C# SuperSocket利用FixedHeaderReceiveFilter或BeginEndMarkReceiveFilter进行通信

    SuperSocket 是一个轻量级 跨平台而且可扩展的 Net Mono Socket 服务器程序框架 你无须了解如何使用 Socket 如何维护 Socket 连接和 Socket 如何工作 我们可以有更多的时间用在业务逻辑上 Supe
  • 大一python作业

    1 字典操作综合练习一 定义一个字典 goods Apple 4999 华为 3600 Vivo 2999 OPPO 3200 三星 4300 向字典新增一个 小米 手机 价格为2800 将字典中 华为 品牌手机价格修改为3999 输入任一
  • 淘宝的双11、春运时的抢票、微博大V的热点新闻,Alibaba双11的高并发实战经验,被这份文档诠释的极透彻

    前言 高并发意味着大流量 需要运用技术手段抵抗流量的冲击 这些手段好比操作流量 能让流量更平稳地被系统所处理 带给用户更好的体验 我们常见的高并发场景有 淘宝的双11 春运时的抢票 微博大V的热点新闻等 除了这些典型事情 每秒几十万请求的秒
  • React中的路由懒加载是什么?原理是什么?

    React lazy 是什么 随着前端应用体积的扩大 资源加载的优化是我们必须要面对的问题 动态代码加载就是其中的一个方案 webpack 提供了符合 ECMAScript 提案 的 import 语法 让我们来实现动态地加载模块 注 re
  • C++模板 类模板成员函数类外实现 类模板分文件编写的问题与解决方法 类模板配合友元函数的类内和类外实现

    文章目录 1 类模板成员函数类外实现 2 类模板分文件编写 3 类模板友元 1 类模板成员函数类外实现 学习目标 能够掌握类模板中的成员函数类外实现 场景描述 创建一个类 类中只写函数的声明 类外写实现 template
  • Git第五讲 git pull/git fetch与 git rebase/git merge

    当你和其他开发者一起协作开发项目时 经常会遇到需要更新代码的情况 Git提供了多种方式来获取最新代码并将其合并到你的本地仓库中 在本篇博客中 我们将详细介绍git pull和git fetch命令的使用 以及git rebase和git m
  • 【目标检测】Faster R-CNN的复现

    文章目录 Faster Rcnn 0 利用Git下载Code 1 数据准备 2 模型加载 3 模型训练 4 模型测试 5 运行demo py 6 训练自定义Images文件和对应XML文件的model Faster Rcnn Faster