Yolo算法代码实现

  • 前言
  • Yolov3
    • Anchor设置
      • Anchor计算
      • 通过聚类生成anchor box
    • 数据处理
      • 转换成tfrecord格式数据
      • 加载数据
    • 模型加载
      • Yolov3
    • 训练
      • Transfer Learning
      • 优化函数
      • 损失函数

前言

本篇博客主要是根据yolo系列的算法代码,总结Yolo系列用到的技术,包括anchor box设置,数据的读入以及处理,即插即用的注意力机制模块、loss function设置等。本篇博客主要根据的代码来源是Yolov3和Yolov4,代码都是基于tensorflow框架的,原理可以参考我之前写的一些博客:目标检测综述、目标检测yolo系列和目标检测YOLO系列算法。相关的论文:Yolov3和Yolov4。原版的代码:Yolov4和Yolov3.Yolov4详细请参考我的git仓库的Readme.md文件。

Yolov3

Yolov3的网络结构图如下图所示:
在这里插入图片描述
在这里插入图片描述

Anchor设置

CxC_xCxCyC_yCy表示待检测目标中心点的坐标所在的grid的左上角的坐标,下图CxC_xCxCyC_yCy则为(1,1)。σ(tx)\sigma(t_x)σ(tx)σ(ty)\sigma(t_y)σ(ty)表示偏移量,用sigmoid将tx,ty压缩到[0,1]区间內,可以有效的确保目标中心处于执行预测的网格单元中,防止偏移过多PwP_wPwPhP_hPh表示anchor box映射到feature map中的宽和高,用到指数是因为twt_wtw,tht_hthlog⁡\loglog尺度缩放到对数空间。终得到的边框坐标值是bxb_xbx,byb_yby,bwb_wbw,bhb_hbh即边界框bbox相对于feature map的位置和大小,是模型需要的预测输出坐标。但网络实际上的学习目标是txt_xtx,tyt_yty,twt_wtw,tht_hth这4个offsets,其中txt_xtx,tyt_yty是预测的坐标偏移值,twt_wtw,tht_hth是尺度缩放,有了这4个offsets,自然可以根据之前的公式去求得真正需要的bxb_xbx,byb_yby,bwb_wbw,bhb_hbh4个坐标。关于图像的缩放同时需要保持图像的长宽比例,然后用padding进行补充。
在这里插入图片描述

在yolov3中与faster-rcnn系列文章用到的公式在前两行是不同的,yolov3里PxP_xPxPyP_yPy就换为了feature map上的grid cell左上角坐标CxC_xCx,CyC_yCy了,即在yolov3里是GxG_xGx,GyG_yGy减去grid cell左上角坐标CxC_xCx,CyC_yCyxxx,yyy坐标并没有针对anchon box求偏移量,所以并不需要除以PwP_wPw,PhP_hPh。也就是tx=Gx−Cxt_x = G_x - C_xtx=GxCxty=Gy−Cyt_y = G_y - C_yty=GyCy这样就可以直接求bbox中心距离grid cell左上角的坐标的偏移量。twt_wtwtht_hth的公式yolov3和faster-rcnn系列是一样的,是物体所在边框的长宽和anchor box长宽之间的比率,不管Faster-RCNN还是YOLO,都不是直接回bounding box的长宽而是尺度缩放到对数空间,是怕训练会带来不稳定的梯度。因为如果不做变换,直接预测相对形变twt_wtw,那么要求tw>0t_w>0tw>0,因为框的宽高不可能是负数。这样,是在做一个有不等式条件约束的优化问题,没法直接用SGD来做。所以先取一个对数变换,将其不等式约束去掉。

在这里插入图片描述

Anchor box的作用是第一是提高召回率,当多个目标中心位于同一个cell内时,不同比例的预测框可以预测不同类别的物体。第二是降低学习难度,anchor给出目标宽高的绝对量,只需要回归偏移量即可。

在这里插入图片描述

Anchor计算

设矩形框的面积为sss,矩形框的宽为www,高为hhh,则有:{wh=ratiow×h=s⇒{ratio×h2=sw=ratio⋅h\{^{w\times h = s}_{\frac{w}{h}=ratio} \Rightarrow \{^{w = ratio \cdot h}_{ratio\times h^2 = s}{hw=ratiow×h=s{ratio×h2=sw=ratioh最终得到:{w=ratio⋅h=s⋅ratioh=s/ratio\{^{h = \sqrt{s/ratio}}_{w=ratio\cdot h = \sqrt{s\cdot ratio}}{w=ratioh=sratioh=s/ratio不同尺度上缩放scale,则有:{w=ratio⋅h=scale⋅s⋅ratioh=sacle⋅s/ratio\{^{h = \sqrt{sacle\cdot s/ratio}}_{w=ratio\cdot h = \sqrt{scale \cdot s\cdot ratio}}{w=ratioh=scalesratioh=sacles/ratio

通过聚类生成anchor box

原理可以参考:K-means聚类生成Anchor box
要注意的是标准的K-means算法一般使用的是欧式距离作为样本的度量,在生成anchor box的任务中,并不能使用欧式距离,因为大小不一的anchor box的产生误差不一样,大box簇会比小box簇产生更大的误差。
代码如下:

#coding=utf-8
import xml.etree.ElementTree as ET
import numpy as np
import glob
import sys
sys.path.append('.')
import config as sys_config
from tqdm import tqdmdef iou(box, clusters):"""计算一个ground truth边界盒和k个先验框(Anchor)的交并比(IOU)值。参数box: 元组或者数据,代表ground truth的长宽。参数clusters: 形如(k,2)的numpy数组,其中k是聚类Anchor框的个数返回:ground truth和每个Anchor框的交并比。"""x = np.minimum(clusters[:, 0], box[0])y = np.minimum(clusters[:, 1], box[1])if np.count_nonzero(x == 0) > 0 or np.count_nonzero(y == 0) > 0:raise ValueError("Box has no area")interp = x * ybox_area = box[0] * box[1]cluster_area = clusters[:, 0] * clusters[:, 1]iou_ = interp / (box_area + cluster_area - interp)return iou_def avg_iou(boxes, clusters):"""计算一个ground truth和k个Anchor的交并比的均值。"""return np.mean([np.max(iou(boxes[i], clusters)) for i in range(boxes.shape[0])])def kmeans(boxes, k, dist=np.median):"""利用IOU值进行K-means聚类参数boxes: 形状为(r, 2)的ground truth框,其中r是ground truth的个数参数k: Anchor的个数参数dist: 距离函数返回值:形状为(k, 2)的k个Anchor框"""# 即是上面提到的rrows = boxes.shape[0]# 距离数组,计算每个ground truth和k个Anchor的距离distances = np.empty((rows, k))# 上一次每个ground truth"距离"最近的Anchor索引last_clusters = np.zeros((rows,))# 设置随机数种子np.random.seed()# 初始化聚类中心,k个簇,从r个ground truth随机选k个clusters = boxes[np.random.choice(rows, k, replace=False)]# 开始聚类while True:# 计算每个ground truth和k个Anchor的距离,用1-IOU(box,anchor)来计算for row in range(rows):distances[row] = 1 - iou(boxes[row], clusters)# 对每个ground truth,选取距离最小的那个Anchor,并存下索引nearest_clusters = np.argmin(distances, axis=1)# 如果当前每个ground truth"距离"最近的Anchor索引和上一次一样,聚类结束if (last_clusters == nearest_clusters).all():break# 更新簇中心为簇里面所有的ground truth框的均值for cluster in range(k):clusters[cluster] = dist(boxes[nearest_clusters == cluster], axis=0)# 更新每个ground truth"距离"最近的Anchor索引last_clusters = nearest_clustersreturn clusters# 加载自己的数据集,只需要所有labelimg标注出来的xml文件即可
def load_dataset(path):dataset = []for xml_file in tqdm(glob.glob("{}/*xml".format(path))):tree = ET.parse(xml_file)# 图片高度height = int(tree.findtext("./size/height"))# 图片宽度width = int(tree.findtext("./size/width"))for obj in tree.iter("object"):# 偏移量xmin = int(obj.findtext("bndbox/xmin")) / widthymin = int(obj.findtext("bndbox/ymin")) / heightxmax = int(obj.findtext("bndbox/xmax")) / widthymax = int(obj.findtext("bndbox/ymax")) / heightxmin = np.float64(xmin)ymin = np.float64(ymin)xmax = np.float64(xmax)ymax = np.float64(ymax)if xmax == xmin or ymax == ymin:print(xml_file)# 将Anchor的长宽放入dateset,运行kmeans获得Anchordataset.append([xmax - xmin, ymax - ymin])return np.array(dataset)if __name__ == '__main__':import osANNOTATIONS_PATH = os.path.join(sys_config.dataset_base_path, 'Annotations')# ANNOTATIONS_PATH = r'D:\Datasets\VOC\VOCtest_06-Nov-2007\VOCdevkit\VOC2007\Annotations'CLUSTERS = 9 #聚类数量,anchor数量INPUTDIM = sys_config.imagesize #输入网络大小data = load_dataset(ANNOTATIONS_PATH)out = kmeans(data, k=CLUSTERS)print('Boxes:')print(np.array(out)*INPUTDIM)print("Accuracy: {:.2f}%".format(avg_iou(data, out) * 100))       final_anchors = np.around(out[:, 0] / out[:, 1], decimals=2).tolist()print("Before Sort Ratios:\n {}".format(final_anchors))print("After Sort Ratios:\n {}".format(sorted(final_anchors)))

数据处理

转换成tfrecord格式数据

在代码Yolov3里面,数据的格式是采样tfrecord进行输入。TFRecord是Google官方推荐的一种数据格式,实际上它是一种二进制文件,其能更好地利用内存,其内部包含了多个tf.train.Example,而Exampleprotocol buffer数据标准的实现,在一个Example消息体重包含了一系列的tf.train.feature属性,每一个feature是一个key-value形式的键值对。value的取值有以下三种:

  • bytes_list:可以存储string和byte两种数据类型。
  • float_list:可以存储float(float32)与double(float64)两种数据类型。
  • int64_list:可以存储bool,enum,int32,uint32,int64,uint64

生成tfrecord的代码:

#该函数传入的是xml里面的annotation,class_map表示classid:以及class_name
def build_example(annotation, class_map):img_path = os.path.join(FLAGS.data_dir, 'JPEGImages', annotation['filename'])print(img_path)img_raw = open(img_path, 'rb').read()key = hashlib.sha256(img_raw).hexdigest()width = int(annotation['size']['width'])height = int(annotation['size']['height'])xmin = []ymin = []xmax = []ymax = []classes = []classes_text = []truncated = []views = []difficult_obj = []if 'object' in annotation:for obj in annotation['object']:difficult = bool(int(obj['difficult']))difficult_obj.append(int(difficult))xmin.append(float(obj['bndbox']['xmin']) / width)ymin.append(float(obj['bndbox']['ymin']) / height)xmax.append(float(obj['bndbox']['xmax']) / width)ymax.append(float(obj['bndbox']['ymax']) / height)classes_text.append(obj['name'].encode('utf8'))classes.append(class_map[obj['name']])truncated.append(int(obj['truncated']))views.append(obj['pose'].encode('utf8'))example = tf.train.Example(features=tf.train.Features(feature={'image/height': tf.train.Feature(int64_list=tf.train.Int64List(value=[height])),'image/width': tf.train.Feature(int64_list=tf.train.Int64List(value=[width])),'image/filename': tf.train.Feature(bytes_list=tf.train.BytesList(value=[annotation['filename'].encode('utf8')])),'image/source_id': tf.train.Feature(bytes_list=tf.train.BytesList(value=[annotation['filename'].encode('utf8')])),'image/key/sha256': tf.train.Feature(bytes_list=tf.train.BytesList(value=[key.encode('utf8')])),'image/encoded': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw])),'image/format': tf.train.Feature(bytes_list=tf.train.BytesList(value=['jpeg'.encode('utf8')])),'image/object/bbox/xmin': tf.train.Feature(float_list=tf.train.FloatList(value=xmin)),'image/object/bbox/xmax': tf.train.Feature(float_list=tf.train.FloatList(value=xmax)),'image/object/bbox/ymin': tf.train.Feature(float_list=tf.train.FloatList(value=ymin)),'image/object/bbox/ymax': tf.train.Feature(float_list=tf.train.FloatList(value=ymax)),'image/object/class/text': tf.train.Feature(bytes_list=tf.train.BytesList(value=classes_text)),'image/object/class/label': tf.train.Feature(int64_list=tf.train.Int64List(value=classes)),'image/object/difficult': tf.train.Feature(int64_list=tf.train.Int64List(value=difficult_obj)),'image/object/truncated': tf.train.Feature(int64_list=tf.train.Int64List(value=truncated)),'image/object/view': tf.train.Feature(bytes_list=tf.train.BytesList(value=views)),}))return example

通过以下函数可以查看tfrecord到底记录了什么:

# 解析parse_tfrecord
def parse_tfrecord(tfrecord, class_table, size):x = tf.io.parse_single_example(tfrecord, IMAGE_FEATURE_MAP)x_train = tf.image.decode_jpeg(x['image/encoded'], channels=3)x_train = tf.image.resize(x_train, (size, size))class_text = tf.sparse.to_dense(x['image/object/class/text'], default_value='')labels = tf.cast(class_table.lookup(class_text), tf.float32)y_train = tf.stack([tf.sparse.to_dense(x['image/object/bbox/xmin']),tf.sparse.to_dense(x['image/object/bbox/ymin']),tf.sparse.to_dense(x['image/object/bbox/xmax']),tf.sparse.to_dense(x['image/object/bbox/ymax']),labels], axis=1)paddings = [[0, FLAGS.yolo_max_boxes - tf.shape(y_train)[0]], [0, 0]]y_train = tf.pad(y_train, paddings)return x_train, y_train
def load_tfrecord_dataset(file_pattern, class_file, size=416):LINE_NUMBER = -1  # TODO: use tf.lookup.TextFileIndex.LINE_NUMBER'''tf.lookup.StaticHashTable:建立类别与数字的关联关系keys_tensor = tf.constant([1, 2])vals_tensor = tf.constant([3, 4])input_tensor = tf.constant([1, 5])table = tf.lookup.StaticHashTable(tf.lookup.KeyValueTensorInitializer(keys_tensor, vals_tensor), -1)print(table.lookup(input_tensor))output:tf.Tensor([ 3 -1], shape=(2,), dtype=int32)tf.lookup.TextFileInitializer:Table initializers from a text file.'''class_table = tf.lookup.StaticHashTable(tf.lookup.TextFileInitializer(class_file, tf.string, 0, tf.int64, LINE_NUMBER, delimiter="\n"), -1)files = tf.data.Dataset.list_files(file_pattern)dataset = files.flat_map(tf.data.TFRecordDataset)return dataset.map(lambda x: parse_tfrecord(x, class_table, size))
import sys
import os
path = os.path.abspath(os.path.join(os.getcwd()))
sys.path.append(path)
print(sys.path)
import time
from absl import app, flags, logging
from absl.flags import FLAGS
import cv2
import numpy as np
import tensorflow as tf
from yolov3_tf2.models import (YoloV3, YoloV3Tiny
)
from yolov3_tf2.dataset import load_tfrecord_dataset, transform_images
from yolov3_tf2.utils import draw_outputsflags.DEFINE_string('classes', './data/voc2012_trainbin.names', 'path to classes file')
flags.DEFINE_integer('size', 416, 'resize images to')
flags.DEFINE_string('dataset', './data/voc_train_trashBin.tfrecord', 'path to dataset')
flags.DEFINE_string('output', './output.jpg', 'path to output image')def main(_argv):class_names = [c.strip() for c in open(FLAGS.classes).readlines()]logging.info('classes loaded')dataset = load_tfrecord_dataset(FLAGS.dataset, FLAGS.classes, FLAGS.size)dataset = dataset.shuffle(512)for image, labels in dataset.take(4):boxes = []scores = []classes = []for x1, y1, x2, y2, label in labels:if x1 == 0 and x2 == 0:continueboxes.append((x1, y1, x2, y2))scores.append(1)classes.append(label)nums = [len(boxes)]boxes = [boxes]scores = [scores]classes = [classes]logging.info('labels:')for i in range(nums[0]):logging.info('\t{}, {}, {}'.format(class_names[int(classes[0][i])],np.array(scores[0][i]),np.array(boxes[0][i])))img = cv2.cvtColor(image.numpy(), cv2.COLOR_RGB2BGR)img = draw_outputs(img, (boxes, scores, classes, nums), class_names)cv2.imwrite(FLAGS.output, img)logging.info('output saved to: {}'.format(FLAGS.output))if __name__ == '__main__':app.run(main)

在这一块代码我还得要仔细看看。

加载数据

加载数据后需要进行分批,打乱,resize。

train_dataset = train_dataset.shuffle(buffer_size=512)train_dataset = train_dataset.batch(FLAGS.batch_size)train_dataset = train_dataset.map(lambda x, y: (dataset.transform_images(x, FLAGS.size),dataset.transform_targets(y, anchors, anchor_masks, FLAGS.size)))train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

模型加载

Yolov3

其实对着上面的图看代码就非常容易理解。

def DarknetResidual(x, filters):prev = xx = DarknetConv(x, filters // 2, 1)x = DarknetConv(x, filters, 3)x = Add()([prev, x])return xdef DarknetBlock(x, filters, blocks):x = DarknetConv(x, filters, 3, strides=2)for _ in range(blocks):x = DarknetResidual(x, filters)return xdef Darknet(name=None):x = inputs = Input([None, None, 3])x = DarknetConv(x, 32, 3)x = DarknetBlock(x, 64, 1)x = DarknetBlock(x, 128, 2)  # skip connectionx = x_36 = DarknetBlock(x, 256, 8)  # skip connectionx = x_61 = DarknetBlock(x, 512, 8)x = DarknetBlock(x, 1024, 4)return tf.keras.Model(inputs, (x_36, x_61, x), name=name)
def YoloV3(size=None, channels=3, anchors=yolo_anchors,masks=yolo_anchor_masks, classes=80, training=False):x = inputs = Input([size, size, channels], name='input')x_36, x_61, x = Darknet(name='yolo_darknet')(x)x = YoloConv(512, name='yolo_conv_0')(x)output_0 = YoloOutput(512, len(masks[0]), classes, name='yolo_output_0')(x)# 这里做了concatx = YoloConv(256, name='yolo_conv_1')((x, x_61))output_1 = YoloOutput(256, len(masks[1]), classes, name='yolo_output_1')(x)# 这里做了concat,用到python里面的函数定义函数。x = YoloConv(128, name='yolo_conv_2')((x, x_36))output_2 = YoloOutput(128, len(masks[2]), classes, name='yolo_output_2')(x)# 如果需要训练的话则返回模型,否则返回输出if training:return Model(inputs, (output_0, output_1, output_2), name='yolov3')boxes_0 = Lambda(lambda x: yolo_boxes(x, anchors[masks[0]], classes),name='yolo_boxes_0')(output_0)boxes_1 = Lambda(lambda x: yolo_boxes(x, anchors[masks[1]], classes),name='yolo_boxes_1')(output_1)boxes_2 = Lambda(lambda x: yolo_boxes(x, anchors[masks[2]], classes),name='yolo_boxes_2')(output_2)outputs = Lambda(lambda x: yolo_nms(x, anchors, masks, classes),name='yolo_nms')((boxes_0[:3], boxes_1[:3], boxes_2[:3]))return Model(inputs, outputs, name='yolov3')
# As tensorflow lite doesn't support tf.size used in tf.meshgrid, 
# we reimplemented a simple meshgrid function that use basic tf function.
def _meshgrid(n_a, n_b):return [tf.reshape(tf.tile(tf.range(n_a), [n_b]), (n_b, n_a)),tf.reshape(tf.repeat(tf.range(n_b), n_a), (n_b, n_a))]def yolo_boxes(pred, anchors, classes):# pred: (batch_size, grid, grid, anchors, (x, y, w, h, obj, ...classes))grid_size = tf.shape(pred)[1:3]box_xy, box_wh, objectness, class_probs = tf.split(pred, (2, 2, 1, classes), axis=-1)# 将预测的数据归一化到[0, 1]区间box_xy = tf.sigmoid(box_xy)objectness = tf.sigmoid(objectness)class_probs = tf.sigmoid(class_probs)pred_box = tf.concat((box_xy, box_wh), axis=-1)  # original xywh for loss# !!! grid[x][y] == (y, x)grid = _meshgrid(grid_size[1],grid_size[0])grid = tf.expand_dims(tf.stack(grid, axis=-1), axis=2)  # [gx, gy, 1, 2]box_xy = (box_xy + tf.cast(grid, tf.float32)) / \tf.cast(grid_size, tf.float32)# 这个是因为在设置的时候已经被log了box_wh = tf.exp(box_wh) * anchorsbox_x1y1 = box_xy - box_wh / 2box_x2y2 = box_xy + box_wh / 2bbox = tf.concat([box_x1y1, box_x2y2], axis=-1)return bbox, objectness, class_probs, pred_box

训练

eager模式下即调试模式下写的代码,我怕是写不出这样的代码

    if FLAGS.mode == 'eager_tf':# Eager mode is great for debugging# Non eager graph mode is recommended for real trainingavg_loss = tf.keras.metrics.Mean('loss', dtype=tf.float32)avg_val_loss = tf.keras.metrics.Mean('val_loss', dtype=tf.float32)for epoch in range(1, FLAGS.epochs + 1):for batch, (images, labels) in enumerate(train_dataset):with tf.GradientTape() as tape:outputs = model(images, training=True)regularization_loss = tf.reduce_sum(model.losses)pred_loss = []for output, label, loss_fn in zip(outputs, labels, loss):pred_loss.append(loss_fn(label, output))total_loss = tf.reduce_sum(pred_loss) + regularization_lossgrads = tape.gradient(total_loss, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))logging.info("{}_train_{}, {}, {}".format(epoch, batch, total_loss.numpy(),list(map(lambda x: np.sum(x.numpy()), pred_loss))))avg_loss.update_state(total_loss)for batch, (images, labels) in enumerate(val_dataset):outputs = model(images)regularization_loss = tf.reduce_sum(model.losses)pred_loss = []for output, label, loss_fn in zip(outputs, labels, loss):pred_loss.append(loss_fn(label, output))total_loss = tf.reduce_sum(pred_loss) + regularization_losslogging.info("{}_val_{}, {}, {}".format(epoch, batch, total_loss.numpy(),list(map(lambda x: np.sum(x.numpy()), pred_loss))))avg_val_loss.update_state(total_loss)logging.info("{}, train: {}, val: {}".format(epoch,avg_loss.result().numpy(),avg_val_loss.result().numpy()))avg_loss.reset_states()avg_val_loss.reset_states()model.save_weights('checkpoints/yolov3_train_{}.tf'.format(epoch))

Transfer Learning

# Configure the model for transfer learningif FLAGS.transfer == 'none':pass  # Nothing to doelif FLAGS.transfer in ['darknet', 'no_output']:# Darknet transfer is a special case that works# with incompatible number of classes# reset top layersif FLAGS.tiny:model_pretrained = YoloV3Tiny(FLAGS.size, training=True, classes=FLAGS.weights_num_classes or FLAGS.num_classes)else:model_pretrained = YoloV3(FLAGS.size, training=True, classes=FLAGS.weights_num_classes or FLAGS.num_classes)# finetune if FLAGS.pretrain:model_pretrained.load_weights(FLAGS.weights)if FLAGS.transfer == 'darknet':model.get_layer('yolo_darknet').set_weights(model_pretrained.get_layer('yolo_darknet').get_weights())freeze_all(model.get_layer('yolo_darknet'))elif FLAGS.transfer == 'no_output':for l in model.layers:if not l.name.startswith('yolo_output'):l.set_weights(model_pretrained.get_layer(l.name).get_weights())freeze_all(l)else:# All other transfer require matching classesmodel.load_weights(FLAGS.weights)if FLAGS.transfer == 'fine_tune':# freeze darknet and fine tune other layersdarknet = model.get_layer('yolo_darknet')freeze_all(darknet)elif FLAGS.transfer == 'frozen':# freeze everythingfreeze_all(model)

优化函数

使用Adam

model.compile(optimizer=optimizer, loss=loss,run_eagerly=(FLAGS.mode == 'eager_fit'))

损失函数

def YoloLoss(anchors, classes=80, ignore_thresh=0.5):def yolo_loss(y_true, y_pred):# 1. transform all pred outputs# y_pred: (batch_size, grid, grid, anchors, (x, y, w, h, obj, ...cls))pred_box, pred_obj, pred_class, pred_xywh = yolo_boxes(y_pred, anchors, classes)pred_xy = pred_xywh[..., 0:2]pred_wh = pred_xywh[..., 2:4]# 2. transform all true outputs# y_true: (batch_size, grid, grid, anchors, (x1, y1, x2, y2, obj, cls))true_box, true_obj, true_class_idx = tf.split(y_true, (4, 1, 1), axis=-1)true_xy = (true_box[..., 0:2] + true_box[..., 2:4]) / 2true_wh = true_box[..., 2:4] - true_box[..., 0:2]# give higher weights to small boxesbox_loss_scale = 2 - true_wh[..., 0] * true_wh[..., 1]# 3. inverting the pred box equationsgrid_size = tf.shape(y_true)[1]grid = tf.meshgrid(tf.range(grid_size), tf.range(grid_size))grid = tf.expand_dims(tf.stack(grid, axis=-1), axis=2)true_xy = true_xy * tf.cast(grid_size, tf.float32) - \tf.cast(grid, tf.float32)true_wh = tf.math.log(true_wh / anchors)true_wh = tf.where(tf.math.is_inf(true_wh),tf.zeros_like(true_wh), true_wh)# 4. calculate all masksobj_mask = tf.squeeze(true_obj, -1)# ignore false positive when iou is over thresholdbest_iou = tf.map_fn(lambda x: tf.reduce_max(broadcast_iou(x[0], tf.boolean_mask(x[1], tf.cast(x[2], tf.bool))), axis=-1),(pred_box, true_box, obj_mask),tf.float32)ignore_mask = tf.cast(best_iou < ignore_thresh, tf.float32)# 坐标使用平方误差# 5. calculate all lossesxy_loss = obj_mask * box_loss_scale * \tf.reduce_sum(tf.square(true_xy - pred_xy), axis=-1)wh_loss = obj_mask * box_loss_scale * \tf.reduce_sum(tf.square(true_wh - pred_wh), axis=-1)# 置信度使用的是二分类交叉熵obj_loss = binary_crossentropy(true_obj, pred_obj)obj_loss = obj_mask * obj_loss + \(1 - obj_mask) * ignore_mask * obj_loss# TODO: use binary_crossentropy instead# 类别使用交叉熵损失class_loss = obj_mask * sparse_categorical_crossentropy(true_class_idx, pred_class)# 6. sum over (batch, gridx, gridy, anchors) => (batch, 1)xy_loss = tf.reduce_sum(xy_loss, axis=(1, 2, 3))wh_loss = tf.reduce_sum(wh_loss, axis=(1, 2, 3))obj_loss = tf.reduce_sum(obj_loss, axis=(1, 2, 3))class_loss = tf.reduce_sum(class_loss, axis=(1, 2, 3))return xy_loss + wh_loss + obj_loss + class_lossreturn yolo_loss
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. nginx代理的域名对应的ip更换后还解析到之前的ip

    问题 使用nginx做反向代理&#xff0c;将请求发送到一个域名(例如: proxy_pass http://www.test.com 该域名对应的IP是A) &#xff0c;刚开始运行一切正常&#xff0c;但是当运行了一段时间以后&#xff0c;域名对应的IP变了(例如http://www.test.com对应的IP由A变为B)&#x…...

    2024/4/18 21:46:14
  2. idea内置maven得setting.xml文件位置

    D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.2.3\plugins\maven\lib\maven3\conf\settings.xml...

    2024/4/23 19:21:45
  3. STM32串口DMA方式发送数据

    文章目录一、DMA介绍1.概括2.DMA由来2.1程序传送方式2.2中断传送方式2.3DMA原理3.DMA具有的功能4.DMA传输方式5.DMA主要特征6.DMA处理7.DMA工作框图8.DMA工作传送过程二、串口DMA方式发送数据1.题目要求2.工程建立3.代码编写4.烧录测试五、参考一、DMA介绍 1.概括 DMA(Direct…...

    2024/4/7 1:11:57
  4. 双11将至,实在RPA轻松解决电商客服难题

    近日&#xff0c;58同城招聘研究院发布了《“双11”客服类岗位就业报告》显示&#xff0c;淘宝客服招聘需求达到高峰&#xff0c;求职需求增幅达15.8%&#xff0c;平均薪资环比增长34.7%&#xff0c;平均月薪达7230元。由于网店客服是各大电商的标配岗位&#xff0c;再加上今年…...

    2024/4/20 17:13:31
  5. 在centos7中部署Python3.6.5环境

    大家好&#xff0c;今天来给大家分享一下如何在Linux中部署python3.6.5环境 [rootlocalhost ~]# cat /etc/redhat-release //看一下当前的系统环境 CentOS Linux release 7.5.1804 (Core) [rootlocalhost ~]# ping www.baidu.com //测试上网&#xff0c; PING www.a.shifen.c…...

    2024/4/7 1:11:54
  6. 设计模式与范式:结构型(二)

    文章目录桥接模式桥接模式的原理解析桥接模式的应用举例装饰器模式什么是装饰器模式&#xff1f;基于装饰器模式的设计方案代理模式和装饰器模式区别适配器模式适配器模式的原理与实现适配器模式应用场景总结代理、桥接、装饰器、适配器 4 种设计模式的区别桥接模式 桥接模式的…...

    2024/4/23 16:13:05
  7. LINUX系统篇-安装cmatrix

    cmatrix 命令执行后的效果类似于黑客帝国数字矩阵&#xff0c;感觉还是挺酷的。 1、安装aalib wget https://nchc.dl.sourceforge.net/project/aa-project/aa-lib/1.4rc5/aalib-1.4rc5.tar.gz tar xf aalib-1.4rc5.tar.gz cd aalib-1.4.0/ ./configure make make install 2、…...

    2024/4/19 14:09:37
  8. IBM新设计,Linux 性能有望大幅提升

    IBM新设计&#xff0c;Linux 性能有望大幅提升 命名空间&#xff08;Namespace&#xff09;是 Linux 内核的一个特性&#xff0c;它对内核资源进行分区&#xff0c;使得一组进程看到一组资源&#xff0c;而另一组进程看到一组不同的资源。该功能的工作原理是为一组资源和进程使…...

    2024/4/23 17:13:51
  9. 中国4K/8K超高清电视机行业发展研究与投资战略分析报告2021年版

    第1章&#xff1a;4K/8K超高清电视机行业概念界定及发展环境分析1.1 4K/8K超高清电视机行业定义及分类 1.1.1 行业概念及定义 1.1.2 行业产品优点分析 &#xff08;1&#xff09;分辨率高 &#xff08;2&#xff09;反应快速 &#xff08;3&#xff09;色域更宽 1.1.3 本行…...

    2024/4/5 6:14:47
  10. 线性判别准则与线性分类编程实践【人工智能】

    目录一、LDA原理1.LDA的基本思想2.瑞利商和广义瑞利商3.二分类LDA原理4.多分类LDA原理5.LDA算法流程6.小结二、线性分类算法三、算法代码实现1.python编程实现2.对月亮数据集进行SVM分类四、参考文献一、LDA原理 1.LDA的基本思想 LDA是一种监督学习的降维技术&#xff0c;也就…...

    2024/4/20 22:03:04
  11. 2016-2027年全球与中国射频器件行业市场深度调研及投资预测报告

    2016-2027年全球与中国射频器件行业市场深度调研及投资预测报告 2020年中国射频器件市场规模达到了 亿元&#xff0c;预计2027年可以达到 亿元&#xff0c;未来几年年复合增长率(CAGR)为 % (2021-2027)。 本报告研究中国市场射频器件的发展现状及未来发展趋势&#xff0c;分别…...

    2024/4/19 8:17:40
  12. 操作系统OS笔记(未完)

    硬件所做的事情 1.产生某种标记&#xff0c;比如中断标记 2.cpu得到这种标记后就会找到对应的中断处理然后告知操作系统 软件&#xff08;操作系统&#xff09; 1.保存当前程序状态&#xff0c;比如当前寄存器数据等等&#xff0c;以便中断结束后恢复 2.处理中断 3.消除中…...

    2024/4/15 3:37:55
  13. 输出日期是该年中的第几天(代码分享)- -我感觉自己的代码是最牛逼的

    输入在一行中按照格式“yyyy/mm/dd”&#xff08;即“年/月/日”&#xff09;给出日期。注意&#xff1a;闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。 在一行输出日期是该年中的第几天。 nclude <stdio.h> int check(int y…...

    2024/4/20 19:23:16
  14. hbuilder git pull Host key verification failedfatal : Could not read from remote repository

    在安装完hbuilder 后配置好git&#xff0c;git clone正常&#xff0c;而git pull 是出现&#xff1a;Host key verification failedfatal : Could not read from remote repository .Please make sure you have the correct accessriahtsand the repository exists 解决办法&a…...

    2024/4/7 1:11:49
  15. 私域流量电商社群运营营销搭建方案工作流程sop计划表格

    文档下载参考下面方法!! 私域流量电商社群运营营销方案工作流程sop计划表格,企业品牌怎么打造私域电商搭建管理用户体系. 第一部分&#xff0c;我们先来理解一下到底什么叫做私域流量。很多同学可能是第一次接触到这个概念&#xff0c;也有一些人可能有一些模糊的理解&#xf…...

    2024/4/23 16:01:37
  16. 关闭windows10 的防火墙方法——windows10 家庭版

    以管理员方式运行 cmd 打开后便是这样子的&#xff0c;我们将reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender” /v “DisableAntiSpyware” /d 1 /t REG_DWORD /f复制粘贴&#xff0c;然后Enter键确定。 注意&#xff1a; 如果某一天你又想将w…...

    2024/4/20 20:32:11
  17. 看看80万程序员怎么评论:程序员工资为什么这么高?

    往期好文推荐 0基础不用怕&#xff0c;从0到1轻松教你入门Python python系统学习流线图&#xff0c;教你一步一步学会python 先说几句话&#xff1a;为什么程序员被黑的时候&#xff0c;大家都很开心&#xff1b;一看到程序员工资高了&#xff0c;你tm眼红了&#xff0c;我x&a…...

    2024/4/9 0:42:10
  18. python自动化测试学习笔记-5常用模块

    python自动化测试学习笔记-4常用模块 常用模块 1、os 2、sys 3、random 4、string 5、time 6、hashlib 一、os模块 os模块主要用来操作文件、目录&#xff0c;与操作系统无关。要使用os模块首先要导入OS模块&#xff0c;用命令import os 即可。 目录和文件操作 …...

    2024/4/20 22:08:32
  19. 10年开发经验架构用140多个实战案例带你深入讲解Java微服务架构

    前言 本文是由15年开发大牛用140个实战案例&#xff0c;完美演示Java微服务架构实战&#xff1a;SpringBoot SpringCloud Docker RabbitMQ&#xff1b; 用丰富的架构图示手把手步骤学习&#xff0c;带领大家轻松掌握微架构设计与开发&#xff1b; Java微服务架构是当下最为流…...

    2024/4/20 2:14:23
  20. Spring简介

    Spring,一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架,框架的目的很明确,简化开发,轻代码,重实现. Spring的优势 1.方便解耦,简化开发 2.AOP编程的支持 3.声明式事物的支持 4.方便程序的测试 5.方便集成各种优秀框架 6.降低JavaEE API的使用难度 7.Spring框架…...

    2024/4/7 1:11:43

最新文章

  1. Collections.singletonList

    1、Collections.singletonList public static <T> List<T> singletonList(T o) {return new SingletonList<>(o); } 列表只有一个元素&#xff0c;节省内存&#xff0c;返回列表不可以改变。 2、Arrays.asList public static <T> List<T> asL…...

    2024/4/24 8:15:51
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 数据结构--KMP算法

    数据结构–KMP算法 首先我在这里提出以下问题&#xff0c;一会一起进行探讨 1.什么是最长公共前后缀 2. KMP算法怎么实现对匹配原理 3. 最长公共前后缀怎么求解 KMP算法可以用来解决什么问题&#xff1f; 答&#xff1a;在字符串中匹配子串&#xff0c;也称为模式匹配 分析…...

    2024/4/23 6:16:26
  4. JVM_垃圾收集器

    GC垃圾收集器 文章目录 GC垃圾收集器GC垃圾回收算法和垃圾收集器关系GC算法主要有以下几种四种主要的垃圾收集器SerialParallelCMSG1垃圾收集器总结查看默认垃圾收集器 默认垃圾收集器有哪些各垃圾收集器的使用范围部分参数说明 新生代下的垃圾收集器并行GC(ParNew)并行回收GC&…...

    2024/4/18 12:58:38
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/23 20:58:27
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/23 13:30:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/23 13:28:06
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/20 23:26:47
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/23 13:27:44
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/23 13:29:53
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/23 13:27:22
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/23 13:28:42
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/23 22:01:21
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/23 13:29:23
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/23 13:27:46
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/23 13:47:22
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/23 13:28:08
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/23 13:29:47
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/23 13:28:14
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/23 13:27:51
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/23 13:27:19
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57