tracerboy 发布的文章

安装

sudo yum update
sudo yum install pptpd
或者
sudo apt update
sudo apt install pptpd

配置

主要为四个文件

/etc/pptpd.conf 配置点对点的网段

localip 10.6.0.1
remoteip 10.6.0.2-254

/etc/ppp/chap-secrets 认证的账号密码

username pptpd passwd *

/etc/ppp/options.pptpd 配置要使用的协议,推荐这么配置

# PPTP连接的名称
name pptpd
# 锁定TTY设备以防止其他进程访问
lock
# 要求使用128位MPPE加密
require-mppe-128
# 要求使用MS-CHAP版本2身份验证协议
require-mschap-v2
# 设置最大传输单元大小为1496字节
mtu 1496
# 拒绝使用PAP身份验证
refuse-pap
# 拒绝使用EAP身份验证
refuse-eap
# 拒绝使用CHAP身份验证
refuse-chap
# 拒绝使用MS-CHAP身份验证
refuse-mschap
# 不启用BSD压缩
nobsdcomp
# 不进行压缩
nodeflate
# 指定第一个DNS服务器为114.114.114.114
ms-dns 114.114.114.114
# 指定第二个DNS服务器为8.8.4.4
ms-dns 8.8.4.4

如果dns不生效配置/etc/ppp/options

# /etc/ppp/options 配置文件
# 禁用Async Map,将所有字符都传输
asyncmap 0
# 使用用户认证,允许用户名和密码验证
auth
# 使用RTS/CTS硬件流控制
crtscts
# 锁定TTY设备以防止其他进程访问
lock
# 隐藏密码(在日志等输出中)
hide-password
# 模拟调制解调器连接
modem
# 设置LCP Echo间隔为30秒
lcp-echo-interval 30
# 设置LCP Echo失败计数为4次
lcp-echo-failure 4
# 禁用IPX协议
noipx
# 指定第一个DNS服务器为114.114.114.114
ms-dns 114.114.114.114
# 指定第二个DNS服务器为8.8.4.4
ms-dns 8.8.4.4

防火墙和转发

# 向sysctl.conf文件中追加net.ipv4.ip_forward的设置,启用IP转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

# 使sysctl.conf中的修改生效
sysctl -p

# 停止并禁用firewalld服务(CentOS 7默认的防火墙服务)
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 安装iptables-services软件包,该软件包包含iptables命令
sudo yum install iptables-services

# 启用iptables服务,使其在系统启动时自动启动
sudo systemctl enable iptables

# 启动iptables服务
sudo systemctl start iptables

# 清空所有iptables规则
sudo iptables -F

# 将INPUT链的默认策略设置为ACCEPT(允许所有输入流量)
sudo iptables -P INPUT ACCEPT

# 将FORWARD链的默认策略设置为ACCEPT(允许所有转发流量)
sudo iptables -P FORWARD ACCEPT

# 将OUTPUT链的默认策略设置为ACCEPT(允许所有输出流量)
sudo iptables -P OUTPUT ACCEPT

# 在NAT表中添加一个POSTROUTING规则,实现内网地址转换(NAT)并启用MASQUERADE功能
# 将10.6.0.0/24网段的数据包通过ens192网卡进行出口转发
iptables -t nat -A POSTROUTING -j MASQUERADE -s 10.6.0.0/24 -o 主网卡名称

# 添加一个FORWARD规则,修改TCP数据包的最大段大小(MSS)为1300字节
# 该规则适用于来自10.6.0.0/24网段的TCP连接的数据包
iptables -A FORWARD -p tcp --syn -s 10.6.0.0/24 -j TCPMSS --set-mss 1300

启动

systemctl enable pptpd
systemctl start pptpd

openwrt 上使用

在/etc/config/network添加以下内容重启network服务


config interface 'vpn2'
    option proto 'pptp'
    option username 'myusername'
    option buffering '1'
    option ipv6 '0'
    option auto '1'
    option server 'myip'
    option password 'mypasswd'
    #option encryption 'mppe'
    #option pppd_options 'ms-dns 8.8.8.8 ms-dns 8.8.4.4 noaccomp noccp nobsdcomp nodeflate'

坑0 cv::Mat对象内存问题

image-20230601123926445

同时 OpenCV使用引用计数机制来管理cv::Mat对象的内存,这意味着当复制一个cv::Mat对象时,实际上只会增加引用计数,而不会复制底层数据。

坑1 cv::imwrite()保存问题

cv::imwrite()函数用于将图像保存到文件中。默认情况下,它期望输入图像的像素类型是8位无符号整数(CV_8U)。如果使用

convertTo(normalized_image, CV_32FC3, 1.0 / 255.0);

转成了fp32格式,将无法使用cv::imwrite()保存。

坑2 “通道转换”和“convertTo”归一化的先后顺序问题

由于读取cv::imread("inference/car.jpg")读取的cv::Mat,在内存中的typeCV_8UC3,使用resized_image.convertTo(normalized_image, CV_32FC3, 1.0 / 255.0);会将其转换成fp32,在内存中占用内存空间不同,之后使用cv::cvtColor(image, converted_image, cv::COLOR_BGR2RGB);会造成一些奇奇怪怪的错误.......

坑3 opencv读取的格式和yolov5推理格式的区别

这里说的格式,代表opencv 读取的数据通道顺序为(高,宽,BGR),而yolov5需要的是(RGB,高,宽),顺序不同,且色彩通道顺序也不同。在数据处理时需要额外注意!!!

结论

cv::Mat convertBGRtoRGB(const cv::Mat& image)
{
    cv::Mat converted_image;
    cv::cvtColor(image, converted_image, cv::COLOR_BGR2RGB);
    return converted_image;
}
cv::Mat padToSquare(const cv::Mat& image, const cv::Scalar& color)
{
    int max_dim = std::max(image.rows, image.cols);
    int top = 0, bottom = 0, left = 0, right = 0;

    if (image.rows < max_dim) {
        int diff = max_dim - image.rows;
        top = diff / 2;
        bottom = diff - top;
    }
    else if (image.cols < max_dim) {
        int diff = max_dim - image.cols;
        left = diff / 2;
        right = diff - left;
    }

    cv::Mat padded_image;
    cv::copyMakeBorder(image, padded_image, top, bottom, left, right, cv::BORDER_CONSTANT, color);
    return padded_image;
}
void preprocess(cv::Mat &src,cv::Mat &dst){
  cv::Mat coner_img = convertBGRtoRGB(src);    # 先bgr转rgb
  cv::Scalar fill_color(116, 116, 116);
  cv::Mat squared_image = padToSquare(coner_img, fill_color);  # 补灰色到图片成为方形
  cv::Mat resized_image;
  cv::Size target_size(640, 640);                             
  cv::resize(squared_image, resized_image, target_size);            # resize 640 不会变形
  src = resized_image;
  cv::Mat normalized_image;
  resized_image.convertTo(normalized_image, CV_32FC3, 1.0 / 255.0);    # 归一化/255
  dst = normalized_image;
}

在copy内存前做 (高,宽, RGB)=>>>>(RGB,高,宽)

struct Image {
  const float *rgbprt = nullptr;   // 32fp指针
  int width = 0, height = 0, size = 0;  // 多少个float
  Image() = default;
  Image(const float *rgbprt, int width, int height,int size) : rgbprt(rgbprt), width(width), height(height),size(size){}
};

yolo::Image cvimg(const cv::Mat &image) { 
  std::shared_ptr<std::vector<float>> inputData = std::make_shared<std::vector<float>>();
  inputData->reserve(image.cols * image.rows * 3);
  for (int c = 0; c < 3; ++c) {
      for (int i = 0; i < image.rows; ++i) {
          for (int j = 0; j < image.cols; ++j) {
              float tmp = image.at<cv::Vec3f>(i, j)[c];
              inputData->push_back(tmp);
          }
      }
  }
  return yolo::Image(inputData->data(), image.cols, image.rows,image.cols*image.rows*image.channels()); 
}

0.安装说明

CUDA_PATH       = /usr/local/cuda
TRT_PATH    = /opt/TensorRT-8.6.1.6

1.CMakeLists.txt

cmake_minimum_required(VERSION 3.14) ##最低版本

project(main) ##项目名称

#cuda TensorRT opencv2的include路径
include_directories(/usr/local/cuda/include)
include_directories(/opt/TensorRT-8.6.1.6/include)
include_directories(/usr/include/opencv2)
#编译器相关设置
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(CMAKE_CXX_COMPILER "/usr/local/cuda/bin/nvcc")
add_compile_options(-std=c++14 -O3 -UDEBUG -Xcompiler -fPIC -use_fast_math -g)
#set(CMAKE_CXX_FLAGS "-std=c++14 -O3 -UDEBUG -Xcompiler  -fPIC -use_fast_math")
#为工程添加可执行文件
set(CMAKE_VERBOSE_MAKEFILE on)
set ( PRJ_SRC_LIST )
file ( GLOB root_src_files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" )
list ( APPEND PRJ_SRC_LIST ${root_src_files} )
# file ( GLOB root_src_files "${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp" )
# list ( APPEND PRJ_SRC_LIST ${root_src_files} )

# 指定链接库的路径
link_directories(/usr/local/cuda/lib64 /opt/TensorRT-8.6.1.6/lib /opt/TensorRT-8.6.1.6/lib/stubs /usr/local/lib)

# 编译所有cpp
add_executable(main ${PRJ_SRC_LIST})


set ( PRJ_LIBRARIES )
# 指定.a静态链接库 和 .so 动态链接库  名称 
# target_link_libraries(onnxTmp ${PRJ_LIBRARIES} cudart_static nvrtc nvptxcompiler_static nvonnxparser nvinfer_static cudnn_static_stub_trt cublas_static_stub_trt cublasLt_static_stub_trt)
target_link_libraries(main ${PRJ_LIBRARIES} cudart_static nvrtc nvptxcompiler_static nvonnxparser nvinfer cudnn_static_stub_trt cublas_static_stub_trt cublasLt_static_stub_trt opencv_gapi opencv_highgui opencv_ml opencv_objdetect opencv_photo opencv_stitching opencv_video opencv_calib3d opencv_features2d opencv_dnn opencv_flann opencv_videoio opencv_imgcodecs opencv_imgproc opencv_core)

# 
#使用cuda
set_target_properties(Main PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

# cmake .. -DCMAKE_SKIP_BUILD_RPATH=TRUE

2.编译CMD

mkdir build
cd build
cmake .. -DCMAKE_SKIP_BUILD_RPATH=TRUE
make

0.安装说明

CUDA_PATH       = /usr/local/cuda
TRT_PATH    = /opt/TensorRT-8.6.1.6

1.Makefile.inc

CUDA_PATH       = /usr/local/cuda
TRT_PATH    = /opt/TensorRT-8.6.1.6
CXX            = $(CUDA_PATH)/bin/nvcc
CXXFLAGS         = -std=c++14 -O0 -UDEBUG -Xcompiler -fPIC -use_fast_math  $(INCLUDE) -g
INCLUDE        += -I. -I../../include -I../../../include
INCLUDE          = -I$(CUDA_PATH)/include
INCLUDE         += -I$(TRT_PATH)/include
INCLUDE        += -I/usr/include/opencv2
LDFLAGS          = -L$(CUDA_PATH)/lib64 -lcudart -lnvrtc -lnvptxcompiler_static
LDFLAGS         += -L$(TRT_PATH)/lib -lnvinfer_static -lcudnn -lnvonnxparser 
LDFLAGS         += -L$(TRT_PATH)/lib/stubs/ -lcublas_static_stub_trt -lcublasLt_static_stub_trt
LDFLAGS         += -L/usr/local/lib -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

2.Makefile

include Makefile.inc

SRC1         = ${wildcard *.cpp}
SRC2         = ${wildcard *.cu}
OBJ1         = $(SRC1:.cpp=.o)
OBJ2         = $(SRC2:.cu=.o)
OBJ          = $(OBJ1) $(OBJ2) 

$(info $(OBJ))

TARGET1 = main
TARGET2 = test

all:$(TARGET1)

$(TARGET1):$(OBJ)
    $(CXX) -g $(LDFLAGS) -o $@ $^

%.o: %.cpp
    $(CXX) -g $(CXXFLAGS) -c -o $@ $^
%.o: %.cu
    $(CXX) -g $(CXXFLAGS) -c -o $@ $^



clean:
    rm -rf ./*.d ./*.o ./*.so $(TARGET1) ./*.plan ./*.jpg

1、安装证书

打开re管理器/mt管理器,找到/data/data/com.guoshi.httpcanary/cache/HttpCanary.pem

复制一份拿到用户路径。

使用系统设置内的证书管理安装这个证书

但新版的小黄鸟还是会显示你没有安装证书,无法正常使用

2、欺骗程序安装了证书

打开re管理器/mt管理器,找到/data/data/com.guoshi.httpcanary/cache/HttpCanary.pem

复制一份并改名为HttpCanary.jks

退出重新进入小黄鸟,便会显示已经安装证书。

3、使用面具的Move Certificates插件

https://github.com/Magisk-Modules-Repo/movecert

目的:将用户下的证书移动到system下

由于安卓10以后,system是无法挂载的,必须使用此方法

安装10之前的,直接root后挂载system移动证书即可。

1、地图二进制分析

file = open("ditu.pgm",mode="rb")
data = file.read()
print(data[:15])

打开地图输出前15个字节,输出为

b'P6\n747\n596\n255\n'

分别代表,p6地图格式,757为宽,596为高,255为色彩饱和度为0-255

print(len(data))

输出文件的总长度为1335651个字节

1335651

1335651 - 15 = 747 X 596 X 3

刚好是3通道的747 * 596的像素点

2、代码

转换为numpy列表,shape必须是(height, weight, 3),opencv的imwrite才可以导出

整体代码

import numpy as np
import cv2
file = open("ditu.pgm",mode="rb")
data = file.read()
data = data[15:]
weight = 747
height = 596
data = map(lambda x:int(x),data)
data = list(data)
data = np.array(data)
data = data.reshape((height, weight, 3))
data = data[:,:,[2, 1, 0]]   # rgb的通道顺序转换
# data = data/255
cv2.imwrite("1.png",data)

一、多模态分类网络产生训练不平衡的原因

1.多模态分类网络模型结构

image-20221117144023103

2.参数的梯度分别为

image-20221117144141679

image-20221117144318379

将(5)式带入上面即可获得梯度。我们假设a模态的特征提取的效果更好,根据softmax的特性Wa·φa的张量形式更接近one-hot,假设此时v模态的特征提取不如a模态,Wv·φv的张量类似均匀分布(每个类别的置信度都差不多,无法判断类别)。导致模型在全局收敛的后,v模态仍无法很好提取特征,从而出现模态不平衡优化的现象。

二、解决方案

1.梯度指导

Balanced Multimodal Learning via On-the-fly Gradient Modulation

https://arxiv.org/abs/2203.15332

image-20221117150237974

image-20221117150252513

image-20221117150306183

根据梯度的不平衡,计算指导因子k,通过k去指导梯度下降,降低模态间的影响。

2.单模态教师

Improving Multi-Modal Learningwith Uni-Modal Teachers

https://arxiv.org/abs/2106.11059

image-20221117150828420

通过预训练得到优化相对较好的单模态模型(可以提取一些特征),用单模态网络,在训练的过程中指导多模态网络。

image-20221117151004030

(3)式第一项为普通的分类损失,第二项如下:

image-20221117151033320

三、在多模态生成模型上的尝试

1.在MVAE上基于POE方法,使用梯度分析不平衡的出现

image-20221117152221440

image-20221117152243633

image-20221117152303012

根据最终计算的梯度无法从中看出各个模特的不平衡优化......

2.在MVAE上基于POE方法,用过实验观察不平衡的出现

mnist 单模态

generator_acc: 96.33%

lantents Accuracy: 88.69%

svhn单模态

generator_acc: 62.93%

lantents classified Accuracy: 23.23%

mutimodel_poe

muti_net_generator_mnist_acc: 94.22%
muti_net_generator_svhn_acc: 66.31%
lantents Accuracy: 89.81%

其中

generator_acc 指测试集重构生成的准确度

lantents classified Accuracy 指测试集隐空间分类准确度

四、猜测

基于poe的融合方法是否真的存在不平衡的优化问题,如果存在,应该用什么样的评价指标观测

问题描述

配置完基础路由后页面不显示,且报错

vue.esm.js?efeb:5103 [Vue warn]: Error in render: "TypeError: Cannot read properties of undefined (reading 'matched')"

found in

---> <App> at src/App.vue
       <Root>
vue.esm.js?efeb:3765 TypeError: Cannot read properties of undefined (reading 'matched')
    at render (vue-router.esm.js?94f4:354:1)
    at createFunctionalComponent (vue.esm.js?efeb:4855:1)
    at createComponent (vue.esm.js?efeb:4995:1)
    at _createElement (vue.esm.js?efeb:1821:1)
    at createElement$1 (vue.esm.js?efeb:1771:1)
    at vm._c (vue.esm.js?efeb:2489:1)
    at Proxy.render (App.vue?edc5:17:1)
    at Vue._render (vue.esm.js?efeb:2538:1)
    at VueComponent.updateComponent (vue.esm.js?efeb:2978:1)
    at Watcher.get (vue.esm.js?efeb:4162:1)

image-20221109192435653

代码如下

image-20221109192509522

解决

导入路由必须是小写 router

import router from './router/'

代码修改为

import Vue from 'vue'
import App1 from './App'
import router from './router/'

Vue.config.productionTip = false;

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App1 },
  template: '<App1/>'
})