当前位置: 首页 > news >正文

读3dsr代码①测试

前置任务

  1. 首先是作者不公开checkpoints,需要自己训练一遍
    这里先不载入模型单纯过一遍流程
    而且因为没有说明是否需要去背景(之后再过一下论文),所以反正先用去过背景的数据debug一下

  2. 3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in divide
    dist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
    这是因为有除零风险,所以加个eps

test_dsr

他这个代码风格还是挺“亲民”的,不像method那种那么复杂

初始化

total_pixel_scores = np.zeros((img_dim * img_dim * len(dataset)))
total_gt_pixel_scores = np.zeros((img_dim * img_dim * len(dataset)))
total_pixel_scores_2d = np.zeros((len(dataset),img_dim, img_dim))
total_gt_pixel_scores_2d = np.zeros((len(dataset),img_dim, img_dim))

取数据
如果当前取到的是“good”类型正常样本,那么直接transform_image;否则带上gt
pc和rgb还是800,800,3,resize成384,384,3(这个384是固定预设的);gt是800,800-》384,384,归一化
pc拷贝为image_t,同时取出最后一通道有image 384,384

zero_mask = np.where(image == 0, np.ones_like(image), np.zeros_like(image))

相当于判断image中为0的项记作1,不为0的位置记作0

get_plane_mask(等于说这里其实是在去背景?)

  1. 输入image_t->depth_image

  2. ** depth_image 被重塑为形状 147456,3的 points

  3. 变量 p1, p2, p3, p4

    • 这些变量通过对 depth_image 中特定区域的元素进行求和和平均操作得到,具体来说,是对四个角的3x3区域进行操作。
    • p1, p2, p3, p4 是通过对这些3x3区域中的像素求和后,除以最后一通道上该对应角落区域中非零元素的数量(加上一个非常小的数避免除以零)来计算的。
  4. 函数 get_plane_from_points(p1, p2, p3)

    • p1, p2, p3 三点计算一个平面,返回平面的系数 (a, b, c, d),对应于平面方程 (ax + by + cz = d)。
  5. 函数 get_distance_to_plane(points, plane)

    • 计算每个点到平面的距离 ∣ a x + b y + c z − d ∣ a 2 + b 2 + c 2 \frac{|ax + by + cz - d|}{\sqrt{a^2 + b^2 + c^2}} a2+b2+c2 ax+by+czd
    • 返回 point_distance 147456,
  6. 根据根据点到平面的距离point_distance创建一个掩码points_mask,距离大于 0.005 的位置被设置为 1,其余为 0。从而0是背景,1是前景

  7. points_mask 重塑回plane_mask 384,384,1并返回,以匹配原始图像的高度和宽度,但只有一个通道,表示每个像素是否属于计算得到的平面。

这个过程主要用于图像深度信息的分析,通过计算深度图中特定区域的平均值和对整个图像每个点进行平面拟合,最终生成一个掩码,指示哪些点近似位于同一平面上。

  1. 更新 plane_mask

    • plane_mask[:, :, 0] = plane_mask[:, :, 0] * (1.0 - zero_mask):这行代码使用 zero_mask 更新 plane_mask。如果 zero_mask 在某个位置为1,相应的 plane_mask 位置会被置为0。这个操作的目的是在 plane_mask 中移除由 zero_mask 指定的区域。
  2. 平面掩码处理:

    • plane_mask = fill_plane_mask(plane_mask):调用 fill_plane_mask 函数来进一步处理 plane_mask。这个函数使用形态学闭运算来改进掩码,以平滑和填充掩码中的小空洞和间隙或移除小的噪声点。将闭运算的结果重新赋值给 plane_mask 的第一个通道。
  3. 更新 image

    • image = image * plane_mask[:,:,0]:用更新后的 plane_mask的第一个通道(也就是闭运算的那一层)来更新 image,实质上是保留了与平面对应的部分,移除其他部分。
  4. 重新计算 zero_mask 和调整 image

    • zero_mask 被重新计算,基于新的 image
    • im_minim_max 用于对 image 进行标准化。

    计算 im_min 特殊一些

    1. 非零元素处理: image * (1.0 - zero_mask) 通过将 image(1.0 - zero_mask) 相乘,将 image 中对应 zero_mask 中为1的位置 (即原图中为0的位置) 置为0。这一步确保取最小值只考虑 image 中原本非零的元素。。
    2. 零元素处理: 1000 * zero_mask 则是将 zero_mask 中为1的位置 (即非零元素处理后原图中为0的位置) 设置为1000。这一步骤是为了在接下来寻找最小值时彻底排除原图中为0的像素点。
    • image 通过减去 im_min 并除以 (im_max - im_min) 进行归一化,再经过缩放和偏移调整到 [0.1, 0.9] 的范围内。不过除此以外还是有为0的missing pixel
  5. 深度图填充 fill_depth_map 函数:

    • 该函数旨在填充深度图中的缺失值missing pixel。通过2轮迭代地应用 unfoldfold 操作,基于周围的有效像素值来估计缺失的像素值。
    • 使用一个3x3的窗口对每个像素的深度值进行处理,如果中心像素值为0(缺失),则用周围非零像素的平均值替代。
    1. unfold 函数将图像分解为多个小块,这里每个小块的大小为 3×3。这个操作允许我们对每个 3×3 的区域进行局部处理。也就是1,1,384,384-》1,9,147456
    2. 计算非零值的总和(dimg_t_nonzero_sum)和值的总和(dimg_t_sum)
    3. dimg_t_filtered = dimg_t_sum / (dimg_t_nonzero_sum + 1e-12)
    4. fold 函数将处理后的小块1,1,147456重新组合成完整的图像1,1,384,384

从而最后取到sample字典里有:image bs,1,384,384->depth_image;rgb bs,3,384,384;mask bs,1,384,384->true_mask_cv 384,384,1;plane_mask bs,1,384,384->fg_mask;has_anomaly bs,1 (1异常0正常)->is_normal;idx 样本索引

depth_image和rgb再拼接得到in_image 1,4,384,384输入给model(DiscreteLatentModelGroups)

DiscreteLatentModelGroups((_encoder_b): EncoderBot((input_conv_depth): Conv2d(1, 64, kernel_size=(1, 1), stride=(1, 1))把in_image的第一通道也就是深度那一层经过这个得到1,64,384,384(input_conv_rgb): Conv2d(3, 64, kernel_size=(1, 1), stride=(1, 1))in_image的剩余rgb三层通过这个得到1,64,384,384两个输出拼接得到1,128,384,384(relu): ReLU()(_conv_1): Conv2d(128, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)(relu): ReLU()1,128,192,192(_conv_2): Conv2d(128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)(relu): ReLU()1,256,96,96(_conv_3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2)(relu): ReLU()1,256,96,96(_residual_stack): ResidualStack((_layers): ModuleList((0): Residual((_block): Sequential((0): ReLU()(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2, bias=False)(2): ReLU()(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), groups=2, bias=False)))这里是两个残差块也就是每个block的输入和输出相加(1): Residual((_block): Sequential((0): ReLU()(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2, bias=False)(2): ReLU()(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), groups=2, bias=False))))(relu): ReLU())    )  从而有输出enc_b 1,256,96,96输入给下面(_encoder_t): EncoderTop((_conv_1): Conv2d(256, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)(relu): ReLU()1,256,48,48(_conv_2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2)(relu): ReLU()1,256,48,48(_residual_stack): ResidualStack((_layers): ModuleList((0): Residual((_block): Sequential((0): ReLU()(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2, bias=False)(2): ReLU()(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), groups=2, bias=False)))(1): Residual((_block): Sequential((0): ReLU()(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2, bias=False)(2): ReLU()(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), groups=2, bias=False))))(relu): ReLU())    )输出enc_t 1,256,48,48(_pre_vq_conv_top): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), groups=2)输出zt 1,256,48,48(_vq_vae_top): VectorQuantizerEMA(重塑出inputs 1,48,48,256、flat_input 2304,256(_embedding): Embedding(2048, 256)这里是计算flat_input和_embedding.weight的欧氏距离但是_embedding.weight的尺寸是2048,256,二者尺寸不适配所以用了完全平方公式展开计算得到distances 2304,2048有distances的最小值索引encoding_indices 2304,1,这也就是每行flat_input在嵌入空间中最近的嵌入向量的索引初始化一个全零的encodings 2304,2048encodings.scatter_(1, encoding_indices, 1) 这是一个就地操作,它根据 encoding_indices 中的索引,在 encodings 的对应位置填充1具体来说,如果某个输入向量最接近第 i 个嵌入向量,则在该输入向量对应的编码行的第 i 列会被设置为1encodings和_embedding.weight计算矩阵乘法后重塑得到quantized 1,48,48,256由quantized和inputs计算mse损失e_latent_loss与预设的self._commitment_cost=0.25相乘得到loss(所谓承诺成本)quantized = inputs + (quantized - inputs).detach()并重塑为1,256,48,48计算encodings的均值avg_probs 2048,从而有perplexity=exp[-∑avg_probs · log(avg_probs)]这个困惑度是衡量编码分布多样性的指标困惑度低表示大多数输入都被映射到少数几个编码上高困惑度表示输入被均匀映射到许多编码上在这里,困惑度通过计算编码概率的熵来得出,然后取指数。)返回loss->loss_t、quantized->quantized_t、perplexity->perplexity_t、encodings->encodings_t(upsample_t): ConvTranspose2d(256, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)对quantized_t上采样得到up_quantized_t 1,256,96,96将enc_b与其拼接有feat 1,512,96,96(_pre_vq_conv_bot): PreVQBot(feat输入后先取enc_b的部分记作in_enc_b后半部分记作in_up_t再对in_enc_b折半得到in_enc_b_d和in_enc_b_rgb 分别1,128,96,96in_up_t折半得到in_up_b_d和in_up_b_rgb然后再按照in_enc_b_d,in_up_t_d, in_enc_b_rgb,in_up_t_rgb的顺序拼接回1,512,96,96(这绕的)(_pre_vq_conv_bot): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), groups=2))输出一个zb 1,256,96,96(_vq_vae_bot): VectorQuantizerEMA((_embedding): Embedding(2048, 256)和_vq_vae_top一样的操作区别就在于输入的特征图尺寸不一样)输出loss_b、quantized_b 1,256,96,96、perplexity_b、encodings_b 9216,2048up_quantized_t和quantized_b拼接得到quant_join 1,512,96,96(_decoder_b): DecoderBot(quant_join输入进来先均分四份:in_t_d、in_t_rgb、in_b_d、in_b_rgb然后在按照in_t_d,in_b_d, in_t_rgb,in_b_rgb的顺序拼接回去得到in_joined(_conv_1): Conv2d(512, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2)得到1,256,96,96(_residual_stack): ResidualStack((_layers): ModuleList((0): Residual((_block): Sequential((0): ReLU()(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2, bias=False)(2): ReLU()(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), groups=2, bias=False)))(1): Residual((_block): Sequential((0): ReLU()(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2, bias=False)(2): ReLU()(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), groups=2, bias=False))))(relu): ReLU())得到1,256,96,96(_conv_trans_1): ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)(relu): ReLU()得到1,128,192,192(_conv_trans_2): ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)得到1,64,384,384折半得到x_d和x_rgb,分别1,32,384,384分别给到下面的卷积(_conv_out_depth): Conv2d(32, 1, kernel_size=(1, 1), stride=(1, 1))得到out_d 1,1,384,384(_conv_out_rgb): Conv2d(32, 3, kernel_size=(1, 1), stride=(1, 1))得到out_d 1,3,384,384拼接输出recon_fin 1,4,384,384)
)

输出loss_b, loss_t, recon_fin->recon_out->recon_image_general, quantized_t->embeddings_lo, quantized_b->embeddings_hi

sub_res_model_hi

输入embeddings_hi, embedder_hi->quantization
其中embedder_hi是上面的_vq_vae_bot

SubspaceRestrictionModule((unet): SubspaceRestrictionNetwork((encoder): FeatureEncoder(embeddings_hi 1,256,96,96输入到这里(block1): Sequential((0): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b1 1,128,96,96(mp1): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))mp1 1,128,48,48(block2): Sequential((0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b2 1,256,48,48(mp2): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))mp2 1,256,24,24(block3): Sequential((0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b3 1,512,24,24)输出b1,b2,b3(decoder): FeatureDecoder(只用到b3(up2): Sequential((0): Upsample(scale_factor=2.0, mode=bilinear)(1): Conv2d(512, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True))up2 1,256,48,48(db2): Sequential((0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))db2 1,256,48,48(up3): Sequential((0): Upsample(scale_factor=2.0, mode=bilinear)(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(2): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True))up3 1,128,96,96(db3): Sequential((0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))db3 1,128,96,96(fin_out): Sequential((0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))))
)

输出output 1,256,96,96

  (_vq_vae_bot): VectorQuantizerEMA(也就是embedder_hi(_embedding): Embedding(2048, 256))

输出loss_b、quantized_b 1,256,96,96、perplexity_b、encodings_b 9216,2048

最终输出output->_、quantized_b->recon_embeddings_hi、loss_b->_

sub_res_model_lo

同理输入embeddings_lo, embedder_lo(_vq_vae_top)
最终输出recon_embeddings_lo

(upsample_t): ConvTranspose2d(256, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), groups=2)

recon_embeddings_lo上采样为up_quantized_recon_t 1,256,96,96
再拿他和recon_embeddings_hi拼接为quant_join 1,512,96,96输入到下面

model_decode

ImageReconstructionNetwork((block1): Sequential((0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(512, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(1024, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))1,1024,96,96(mp1): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))1,1024,48,48(block2): Sequential((0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(1024, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(1024, 2048, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(2048, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))1,2048,48,48(mp2): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))1,1024,24,24(pre_vq_conv): Conv2d(2048, 64, kernel_size=(1, 1), stride=(1, 1))1,64,24,24(upblock1): ConvTranspose2d(64, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))relu1,64,48,48(upblock2): ConvTranspose2d(64, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))relu1,64,96,96(_conv_1): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))1,256,96,96(_residual_stack): ResidualStack((_layers): ModuleList((0): Residual((_block): Sequential((0): ReLU(inplace=True)(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(2): ReLU(inplace=True)(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)))(1): Residual((_block): Sequential((0): ReLU(inplace=True)(1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(2): ReLU(inplace=True)(3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)))))1,256,96,96(_conv_trans_1): ConvTranspose2d(256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))relu1,128,192,192(_conv_trans_2): ConvTranspose2d(128, 4, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
)

最终输出recon_image_recon 1,4,384,384

decoder_seg

把recon_image_recon->image_real和recon_image_general->image_anomaly去梯度后输入

AnomalyDetectionModule(拼接得到img_x 1,8,384,384(unet): UnetModel(这次是个ED之间有跳跃连接的unet了(encoder): UnetEncoder((block1): Sequential((0): Conv2d(8, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(32, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(32, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b1 1,32,384,384(mp1): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))mp1 1,32,192,192(block2): Sequential((0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b2 1,64,192,192(mp2): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))mp2 1,64,96,96(block3): Sequential((0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b3 1,128,96,96(mp3): Sequential((0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))mp3 1,128,48,48(block4): Sequential((0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))b4 1,128,48,48)输入b1,b2,b3,b4(decoder): UnetDecoder((up1): Sequential((0): Upsample(scale_factor=2.0, mode=bilinear)(1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(2): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True))输入b4得到up1 1,128,96,96和b3拼接得到 cat1 1,256,96,96(db1): Sequential((0): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))输入cat1得到db1 1,128,96,96(up2): Sequential((0): Upsample(scale_factor=2.0, mode=bilinear)(1): Conv2d(128, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(2): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True))输入db1得到up2 1,64,192,192和b2拼接得到cat2 1,128,192,192(db2): Sequential((0): Conv2d(128, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))输入cat2得到db2 1,64,192,192(up3): Sequential((0): Upsample(scale_factor=2.0, mode=bilinear)(1): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(2): InstanceNorm2d(32, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True))输入db2得到up3 1,32,384,384和b1拼接得到cat3 1,64,384,384(db3): Sequential((0): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): InstanceNorm2d(32, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(2): ReLU(inplace=True)(3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): InstanceNorm2d(32, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(5): ReLU(inplace=True))输入cat3得到db3 1,32,384,384(fin_out): Sequential((0): Conv2d(32, 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))))
)

输出out_mask 1,2,384,384
softmax之后取他的第2通道平均池化得到out_mask_averaged 1,1,384,384
再有它最大值image_score

再取第1通道拍平得到flat_out_mask 147456,

flat_true_mask = true_mask_cv.flatten()
147456,
total_pixel_scores[mask_cnt * img_dim * img_dim:(mask_cnt + 1) * img_dim * img_dim] = flat_out_mask
这里的mask_cnt是每一个batch累加一
total_gt_pixel_scores[mask_cnt * img_dim * img_dim:(mask_cnt + 1) * img_dim * img_dim] = flat_true_mask
total_pixel_scores_2d[mask_cnt] = out_mask_averaged[0,0,:,:]
total_gt_pixel_scores_2d[mask_cnt] = true_mask_cv[:,:,0]
mask_cnt += 1

总之最后auc的计算还是靠的sklearn,顺带还算了ap,也是图级像素级,也是sklearn
pro也是用的cpmf、sg那一套

(cpmf) pengpeng@pengpeng-X79:/media/pengpeng/新加卷/3DSR$ python test_dsr.py --gpu_id 0 --data_path /media/pengpeng/新加卷/mvtec3d/new/ --out_path checkpoints --run_name 3dsr_depth_MODEL
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
bagel
AUC Image: 0.48295454545454547
AP Image: 0.8303980866193896
AUC Pixel: 0.8653512617500728
AP Pixel: 0.0027919836111362077
AUPRO: 0.6409741619885146
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
cable_gland
AUC Image: 0.38204707170224417
AP Image: 0.7543322533620077
AUC Pixel: 0.3191318201560968
AP Pixel: 0.0012690916945081912
AUPRO: 0.11711088222595595
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
carrot
AUC Image: 0.5145903479236813
AP Image: 0.8586393671379533
AUC Pixel: 0.7002368997022665
AP Pixel: 0.0028430123250470962
AUPRO: 0.5335603331938935
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
cookie
AUC Image: 0.4618585298196949
AP Image: 0.7708466572657134
AUC Pixel: 0.5833117101238113
AP Pixel: 0.0041975325858495125
AUPRO: 0.2375673997345978
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
dowel
AUC Image: 0.6194526627218934
AP Image: 0.8756597485734436
AUC Pixel: 0.8712298011132138
AP Pixel: 0.041571855979198304
AUPRO: 0.6949830659963853
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
foam
AUC Image: 0.50875
AP Image: 0.8136079544186484
AUC Pixel: 0.1103978803713763
AP Pixel: 0.0003780426904060454
AUPRO: 0.0
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
peach
AUC Image: 0.43287373004354135
AP Image: 0.7901264692416418
AUC Pixel: 0.14096067314659547
AP Pixel: 0.00037021432963991514
AUPRO: 0.0003233022044344373
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
potato
AUC Image: 0.5696640316205533
AP Image: 0.8396992944310544
AUC Pixel: 0.24822617017575851
AP Pixel: 0.0002800779041878196
AUPRO: 0.1580423488325828
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
rope
AUC Image: 0.5163043478260869
AP Image: 0.7099800925148527
AUC Pixel: 0.8200974765135473
AP Pixel: 0.0029663631237565164
AUPRO: 0.5942897059926104
/media/pengpeng/新加卷/3DSR/geo_utils.py:61: RuntimeWarning: invalid value encountered in dividedist = np.abs(np.sum(points * plane_rs[:,:-1], axis=1) - plane[-1])/ np.sum(plane[:-1]**2)**0.5
------------------
tire
AUC Image: 0.550344827586207
AP Image: 0.7836263304448925
AUC Pixel: 0.822602468380847
AP Pixel: 0.012433688865297466
AUPRO: 0.6727794170154127
--------MEAN---------------------------------------
AUC Image: 0.5038840094698447
AP Image: 0.8026916254009597
AUC Pixel: 0.5481546161433586
AP Pixel: 0.006910186310902708
AUPRO: 0.3649630617184388
AUC 48.3 38.2 51.46 46.19 61.95 50.88 43.29 56.97 51.63 55.03 50.39
AUCp 86.54 31.91 70.02 58.33 87.12 11.04 14.1 24.82 82.01 82.26 54.82
AUPRO 64.1 11.71 53.36 23.76 69.5 0.0 0.03 15.8 59.43 67.28 36.5
AP 83.04 75.43 85.86 77.08 87.57 81.36 79.01 83.97 71.0 78.36 80.27

相关文章:

读3dsr代码①测试

前置任务 首先是作者不公开checkpoints,需要自己训练一遍 这里先不载入模型单纯过一遍流程 而且因为没有说明是否需要去背景(之后再过一下论文),所以反正先用去过背景的数据debug一下 3DSR/geo_utils.py:61: RuntimeWarning: inv…...

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…...

【力扣】55.跳跃游戏、45.跳跃游戏Ⅱ

55.跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&a…...

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…...

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示(PC端、手机端、平板端)

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示&#xff08;PC端、手机端、平板端&#xff09; 智慧工地系统多端展示&#xff08;PC端、手机端、平板端&#xff09;;数字孪生可视化大屏&#xff0c;一张图掌握项目整体情况;使用轻量化模型&#xff0c;部署三…...

深度学习Top10算法之深度神经网络DNN

深度神经网络&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;是人工神经网络&#xff08;Artificial Neural Networks&#xff0c;ANN&#xff09;的一种扩展。它们通过模仿人脑的工作原理来处理数据和创建模式&#xff0c;广泛应用于图像识别、语音识别、自然语…...

【智能算法】海马优化算法(SHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Zhao等人受到海马自然社会行为启发&#xff0c;提出了海马优化算法&#xff08;Sea-horse Optimizer, SHO&#xff09;。 2.算法原理 2.1算法思想 SHO模拟了海马群在自然界中的…...

AI大模型学习的伦理与社会影响

AI大模型学习 随着人工智能技术的快速发展&#xff0c;AI大模型学习成为当前热门研究领域之一。AI大模型学习是指基于大规模数据集和深度学习模型进行训练&#xff0c;以实现更高的准确性和复杂性。这些大模型已经在几乎所有领域都取得了显著的成就&#xff0c;包括自然语言处…...

记录些LangChain相关的知识

RAG的输出准确率 RAG的输出准确率 向量信息保留率 * 语义搜索准确率 * LLM准确率RAG的输出准确率由三个因素共同决定&#xff1a;向量信息保留率、语义搜索准确率以及LLM准确率。这三个因素是依次作用的&#xff0c;因此准确率实际上是它们的乘积。这意味着&#xff0c;任何一…...

C语言例4-7:格式字符f的使用例子

%f&#xff0c;实型&#xff0c;小数部分为6位 代码如下&#xff1a; //格式字符f的使用例子 #include<stdio.h> int main(void) {float f 123.456;double d1, d2;d11111111111111.111111111;d22222222222222.222222222;printf("%f,%12f,%12.2f,%-12.2f,%.2f\n&qu…...

[蓝桥杯 2019 省 A] 修改数组

题目链接 [蓝桥杯 2019 省 A] 修改数组 题目描述 给定一个长度为 N N N 的数组 A [ A 1 , A 2 , A 3 , . . . , A N ] A [A_1, A_2, A_3, ...,A_N] A[A1​,A2​,A3​,...,AN​]&#xff0c;数组中有可能有重复出现的整数。 现在小明要按以下方法将其修改为没有重复整数的…...

Git基础(25):Cherry Pick合并指定commit id的提交

文章目录 前言指定commit id合并使用TortoiseGit执行cherry-pick命令 前言 开发中&#xff0c;我们会存在多个分支开发的情况&#xff0c;比如dev&#xff0c;test, prod分支&#xff0c;dev分支在开发新功能&#xff0c;prod作为生产分支已发布。如果某个时候&#xff0c;我们…...

C语言结构体之位段

位段&#xff08;节约内存&#xff09;&#xff0c;和王者段位联想记忆 位段是为了节约内存的。刚好和结构体相反。 那么什么是位段呢&#xff1f;我们现引入情景&#xff1a;我么如果要记录一个人是男是女&#xff0c;用数字0 1表示。我们发现只要一个bit内存就可以完成我们想…...

2016年认证杯SPSSPRO杯数学建模D题(第二阶段)NBA是否有必要设立四分线全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现&#xff1a; NBA 联盟从 1946 年成立到今天&#xff0c;一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的&#xff0c;比如 1973 年在技术统计中增加了抢断和盖帽数据&#xff1b;有应运而生、力…...

登录校验解决方案JWT

目录 &#x1f397;️1.JWT介绍 &#x1f39e;️2.应用场景 &#x1f39f;️3.结构组成 &#x1f3ab;4.JWT优点 &#x1f3a0;5.封装成通用方法 &#x1f6dd;6.JWT自动刷新 1.JWT介绍 官网&#xff1a;JWT官网 JSON Web Token (JWT) 是一个开放标准&#xff0c;它…...

Flutter开发进阶之瞧瞧BuildOwner

Flutter开发进阶之瞧瞧BuildOwner 上回说到关于Element Tree的构建还缺最后一块拼图&#xff0c;build的重要过程中会调用_element!.markNeedsBuild();&#xff0c;而markNeedsBuild会调用owner!.scheduleBuildFor(this);。 在Flutter框架中&#xff0c;BuildOwner负责管理构建…...

大量免费工具使用(提供api接口)

标题: 免费工具集使用 - 简化你的任务 介绍&#xff1a; 在数字化时代&#xff0c;我们经常需要使用各种工具来完成各种任务。本文将介绍一个免费工具集&#xff0c;它提供了多种实用工具&#xff0c;帮助简化你的任务。这些工具可以在网站 https://tool.kertennet.com 上找到…...

网络探测工具Nmap介绍

1. Nmap简介 Nmap是一款用于网络发现和安全审计的网络安全工具。可用于列举网络主机清单、管理服务升级调度、监控主机、监控主机服务运行状况、检测目标主机是否在线和端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等。 2. 命令大纲 3. 命令详细介绍…...

20240319-2-机器学习基础面试题

⽼板给了你⼀个关于癌症检测的数据集&#xff0c;你构建了⼆分类器然后计算了准确率为 98%&#xff0c; 你是否对这个模型很满意&#xff1f;为什么&#xff1f;如果还不算理想&#xff0c;接下来该怎么做&#xff1f; 首先模型主要是找出患有癌症的患者&#xff0c;模型关注的…...

0202矩阵的运算-矩阵及其运算-线性代数

文章目录 一、矩阵的加法二、数与矩阵相乘三、矩阵与矩阵相乘四、矩阵的转置五、方阵的行列式结语 一、矩阵的加法 定义2 设有两个 m n m\times n mn橘子 A ( a i j ) 和 B ( b i j ) A(a_{ij})和B(b_{ij}) A(aij​)和B(bij​),那么矩阵A与B的和记为AB,规定为 A B ( a 11…...

python中的__dict__

类的__dict__返回的是&#xff1a;类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里的&#xff0c; 而实例化对象的&#xff1a;__dict__中存储了一些类中__init__的一些属性值。 import的py文件 __dict__返回的是&#xff1a;__init__的…...

数学分析复习:无穷乘积

文章目录 无穷乘积定义&#xff1a;无穷乘积的收敛性命题&#xff1a;无穷乘积的Cauchy收敛准则正项级数和无穷乘积的联系 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 无穷乘积 设复数列 { a n } n ≥ 1 \{a_n\}_{n\geq 1} {an​}n≥1​&#xff0c;设对任意 …...

02 React 组件使用

import React, { useState } from react;// 定义一个简单的函数式组件 function Counter() {// 使用 useState hook 来创建一个状态变量 count&#xff0c;并提供修改该状态的函数 setCountconst [count, setCount] useState(0);// 在点击按钮时增加计数器的值const increment…...

你就是上帝

你就是上帝&#xff1a;Jv程序员&#xff0c;请你站在上帝或神的角度 1.万物皆有裂缝 按照西方文化&#xff08;宗教神话&#xff0c;古希腊、古罗马等&#xff09;&#xff0c;上帝创建了人&#xff1b; 创建人之前&#xff0c;还创建了人的居所或地盘/栖息地&#xff08;伊…...

Spring Cloud: openFegin使用

文章目录 一、OpenFeign简介二、Springboot集成OpenFeign1、引入依赖2、EnableFeignClients注解&#xff08;1&#xff09;应用&#xff08;2&#xff09;属性解析 3、 FeignClient&#xff08;1&#xff09;应用&#xff08;2&#xff09;属性解析&#xff08;3&#xff09;向…...

流畅的 Python 第二版(GPT 重译)(二)

第三章&#xff1a;字典和集合 Python 基本上是用大量语法糖包装的字典。 Lalo Martins&#xff0c;早期数字游牧民和 Pythonista 我们在所有的 Python 程序中都使用字典。即使不是直接在我们的代码中&#xff0c;也是间接的&#xff0c;因为dict类型是 Python 实现的基本部分。…...

Flutter 旋转动画 线性变化的旋转动画

直接上代码 图片自己添加一张就好了 import dart:math;import package:flutter/material.dart;import package:flutter/animation.dart;void main() > runApp(MyApp()); //旋转动画 class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {re…...

【Web应用技术基础】HTML(5)——案例1:展示简历信息

样式&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>展示简历信息…...

ethers.js:wallet(创建钱包,导入助记词,导入私钥)

Wallet Wallet类继承了Signer,可以使用私钥作为外部拥有帐户(EOA)的标准对交易和消息进行签名。 npm install ethers@5.4.0// 引入 import {ethers } from ethers创建新钱包 this.provider = new ethers.providers.Web3Provider(window...

面试笔记——Java集合篇

Java集合框架体系 重点&#xff1a;单列集合——ArrayList、LinkedList&#xff1b;双列集合——HashMap、ConcurrentHashMap。 List相关 数组&#xff08;Array&#xff09; 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 数组获取其他元素&#xff1a; 为什…...