基于Oxford-IIIT Pet数据集实现PaddleHub猫咪一键抠图

本文基于Oxford-IIIT Pet数据集,用PaddleSeg实现猫咪一键抠图。提取猫数据集并重新制作标签(背景为0、图像为1),划分训练、测试、评估集后,配置FCN模型(HRNet骨干)训练,2100轮时mIoU达0.7874,导出静态模型并通过PaddleHub部署,可实现猫咪抠图,用于制作证件照等。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

基于oxford-iiit pet数据集实现paddlehub猫咪一键抠图 - 创想鸟

一、 基于Oxford-IIIT Pet数据集实现PaddleHub猫咪一键抠图

1.主要工作

从Oxford-IIIT Pet宠物数据集提取cat据集重新制作label,背景设置为0,图像设置为1最终iter 2100时, mIoU =0.7874,仍有上升空间,只是耗时较长,不再训练通过paddlehub部署导出的静态模型

模型文件见当前目录 model.gz , paddlehub部署见 catseg_mobile.zip 。

最后就可以完美抠图了,可以制作猫猫证件照了。

2.PaddleSeg简介

PaddleSeg是基于飞桨PaddlePaddle开发的端到端图像分割开发套件,涵盖了高精度和轻量级等不同方向的大量高质量分割模型。通过模块化的设计,提供了配置化驱动和API调用两种应用方式,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。

特性

高精度模型: 基于百度自研的半监督标签知识蒸馏方案(SSLD)训练得到高精度骨干网络,结合前沿的分割技术,提供了50+的高质量预训练模型,效果优于其他开源实现。模块化设计: 支持15+主流 分割网络 ,结合模块化设计的 数据增强策略 、骨干网络、损失函数 等不同组件,开发者可以基于实际应用场景出发,组装多样化的训练配置,满足不同性能和精度的要求。高性能: 支持多进程异步I/O、多卡并行训练、评估等加速策略,结合飞桨核心框架的显存优化功能,可大幅度减少分割模型的训练开销,让开发者更低成本、更高效地完成图像分割训练。In [ ]

! git clone https://gitee.com/paddlepaddle/PaddleSeg.git  --depth=1

       

Cloning into 'PaddleSeg'...remote: Enumerating objects: 1589, done.remote: Counting objects: 100% (1589/1589), done.remote: Compressing objects: 100% (1354/1354), done.remote: Total 1589 (delta 309), reused 1117 (delta 142), pack-reused 0Receiving objects: 100% (1589/1589), 88.49 MiB | 5.57 MiB/s, done.Resolving deltas: 100% (309/309), done.Checking connectivity... done.

       

3.数据集制作

需要手动删除dataset/annotations/list.txt文件头,便于pandas读取,如麻烦,可以直接使用已制作好的数据集二,cat数据集。

In [1]

# 解压缩数据集!mkdir dataset!tar -xvf data/data50154/images.tar.gz -C dataset/!tar -xvf data/data50154/annotations.tar.gz -C dataset/

   In [3]

# 查看list文件!head -n 10 dataset/annotations/list.txt

       

#Image CLASS-ID SPECIES BREED ID#ID: 1:37 Class ids#SPECIES: 1:Cat 2:Dog#BREED ID: 1-25:Cat 1:12:Dog#All images with 1st letter as captial are cat images#images with small first letter are dog imagesAbyssinian_100 1 1 1Abyssinian_101 1 1 1Abyssinian_102 1 1 1Abyssinian_103 1 1 1

       In [13]

# 删除文件前6行描述头,方便pandas读取!sed -i '1,6d' dataset/annotations/list.txt

   In [14]

!head dataset/annotations/list.txt

       

Abyssinian_100 1 1 1Abyssinian_101 1 1 1Abyssinian_102 1 1 1Abyssinian_103 1 1 1Abyssinian_104 1 1 1Abyssinian_105 1 1 1Abyssinian_106 1 1 1Abyssinian_107 1 1 1Abyssinian_108 1 1 1Abyssinian_109 1 1 1

       In [ ]

import pandas as pdimport shutilimport os# Image CLASS-ID SPECIES BREED ID# ID: 1:37 Class ids# SPECIES: 1:Cat 2:Dog# BREED ID: 1-25:Cat 1:12:Dog# All images with 1st letter as captial are cat images# images with small first letter are dog images# ._Abyssinian_100.pngdef copyfile(animal, filename):    # imagelabel列表    file_list = []    image_file = filename + '.jpg'    label_file = filename + '.png'    if os.path.exists(os.path.join('dataset/images', image_file)):        shutil.copy(os.path.join('dataset/images', image_file), os.path.join(f'{animal}/images', image_file))        shutil.copy(os.path.join('dataset/annotations/trimaps', label_file),                    os.path.join(f'{animal}/labels', label_file))        temp = os.path.join('images/', image_file) + ' ' + os.path.join('labels/',label_file) + 'n'        file_list.append(temp)    with open(os.path.join(animal, animal + '.txt'), 'a') as f:        f.writelines(file_list)if __name__ == "__main__":    data = pd.read_csv('dataset/annotations/list.txt', header=None, sep=' ')    data.head()    cat = data[data[2] == 1]    dog = data[data[2] == 2]    for item in cat[0]:        copyfile('cat', item)    for item in dog[0]:        copyfile('dog', item)

   In [ ]

# 删除无用数据!rm dataset/ -rf

   

4.训练自定义的数据集

4.1文件结构

├── cat.txt├── images│   ├── Abyssinian_100.jpg│   ├── Abyssinian_101.jpg│   ├── ...├── labels│   ├── Abyssinian_100.png│   ├── Abyssinian_101.png│   ├── ...

       

4.2 列表内容:

images/Abyssinian_1.jpg labels/Abyssinian_1.pngimages/Abyssinian_10.jpg labels/Abyssinian_10.pngimages/Abyssinian_100.jpg labels/Abyssinian_100.png...

   

4.3.数据查看

In [3]

%cd ~from PIL import Imageimg=Image.open('cat/images/Abyssinian_123.jpg')print(img)img

       

/home/aistudio

       


               In [5]

img=Image.open('cat/labels/Abyssinian_123.png')print(img)img

       


       


               

5.标签处理

标签是从0开始排序,本项目的数据提取自Oxford-IIIT Pet https://www.robots.ox.ac.uk/~vgg/data/pets 宠物数据集,该数据集是从1开始编码,所以需要重新编码。背景设置为0,图像设置为1.

In [ ]

# 执行一次即可import pandas as pdimport osimport matplotlib.pyplot as pltimport numpy as npfrom PIL import Imagedef re_label(filename):    img = plt.imread(filename) * 255.0    img_label = np.zeros((img.shape[0], img.shape[1]), np.uint8)    for i in range(img.shape[0]):        for j in range(img.shape[1]):            value = img[i, j]            if value == 2:                img_label[i, j] = 1    label0 = Image.fromarray(np.uint8(img_label))    label0.save( filename)data=pd.read_csv("cat/cat.txt", header=None, sep=' ') for item in data[1]:    re_label(os.path.join('cat', item))print('处理完毕!')

       

处理完毕!

       

二、数据集预处理

In [ ]

import osfrom sklearn.model_selection import train_test_splitimport pandas as pddef break_data(target, rate=0.2):    origin_dataset = pd.read_csv("cat/cat.txt", header=None, sep=' ')  # 加入参数    train_data, test_data = train_test_split(origin_dataset, test_size=rate)    train_data,eval_data=train_test_split(train_data, test_size=rate)    train_filename = os.path.join(target, 'train.txt')    test_filename = os.path.join(target, 'test.txt')    eval_filename = os.path.join(target, 'eval.txt')    train_data.to_csv(train_filename, index=False, sep=' ',  header=None)    test_data.to_csv(test_filename, index=False, sep=' ', header=None)    eval_data.to_csv(eval_filename, index=False, sep=' ', header=None)    print('train_data:',len(train_data))    print('test_data:',len(test_data))    print('eval_data:',len(eval_data))if __name__ == '__main__':    break_data(target='cat', rate=0.2)

       

train_data: 1516test_data: 475eval_data: 380

       In [ ]

# 查看!head cat/train.txt

       

images/Bengal_173.jpg labels/Bengal_173.pngimages/Siamese_179.jpg labels/Siamese_179.pngimages/British_Shorthair_201.jpg labels/British_Shorthair_201.pngimages/Russian_Blue_60.jpg labels/Russian_Blue_60.pngimages/British_Shorthair_93.jpg labels/British_Shorthair_93.pngimages/British_Shorthair_26.jpg labels/British_Shorthair_26.pngimages/British_Shorthair_209.jpg labels/British_Shorthair_209.pngimages/British_Shorthair_101.jpg labels/British_Shorthair_101.pngimages/British_Shorthair_269.jpg labels/British_Shorthair_269.pngimages/Ragdoll_59.jpg labels/Ragdoll_59.png

       

三、配置

In [ ]

# 已配置好,可以不用复制了# !cp PaddleSeg/configs/quick_start/bisenet_optic_disc_512x512_1k.yml ~/bisenet_optic_disc_512x512_1k.yml

   

修改 bisenet_optic_disc_512x512_1k.yml,要注意一下几点:

1.数据集路径配置2.num_classes设置,背景不算3.transforms设置4.loss设置

batch_size: 600iters: 5000train_dataset:     type: Dataset  dataset_root: /home/aistudio/cat/  train_path: /home/aistudio/cat/train.txt  num_classes: 2  transforms:    - type: ResizeStepScaling      min_scale_factor: 0.5      max_scale_factor: 2.0      scale_step_size: 0.25    - type: RandomPaddingCrop      crop_size: [224, 224]    - type: RandomHorizontalFlip    - type: RandomDistort      brightness_range: 0.4      contrast_range: 0.4      saturation_range: 0.4    - type: Normalize  mode: trainval_dataset:   type: Dataset  dataset_root: /home/aistudio/cat/  val_path: /home/aistudio/cat/eval.txt  num_classes: 2  transforms:    - type: Normalize  mode: valoptimizer:  type: sgd  momentum: 0.9  weight_decay: 0.0005lr_scheduler:  type: PolynomialDecay  learning_rate: 0.05  end_lr: 0  power: 0.9loss:  types:    - type: CrossEntropyLoss  coef: [1]model:  type: FCN  backbone:    type: HRNet_W18_Small_V1    align_corners: False  num_classes: 2  pretrained: Null

   

四、训练

In [1]

%cd ~/PaddleSeg/! python train.py --config  ../bisenet_optic_disc_512x512_1k.yml    --do_eval     --use_vdl     --save_interval 100     --save_dir output

   

2021-11-13 19:30:52 [INFO][TRAIN] epoch: 1105, iter: 2210/5000, loss: 0.1849, lr: 0.029586, batch_cost: 8.8180, reader_cost: 7.73956, ips: 68.0427 samples/sec | ETA 06:50:022021-11-13 19:32:18 [INFO][TRAIN] epoch: 1110, iter: 2220/5000, loss: 0.1768, lr: 0.029490, batch_cost: 8.6004, reader_cost: 7.52235, ips: 69.7641 samples/sec | ETA 06:38:292021-11-13 19:33:47 [INFO][TRAIN] epoch: 1115, iter: 2230/5000, loss: 0.1791, lr: 0.029395, batch_cost: 8.8851, reader_cost: 7.80702, ips: 67.5288 samples/sec | ETA 06:50:112021-11-13 19:35:14 [INFO][TRAIN] epoch: 1120, iter: 2240/5000, loss: 0.1835, lr: 0.029299, batch_cost: 8.6699, reader_cost: 7.59314, ips: 69.2053 samples/sec | ETA 06:38:482021-11-13 19:36:41 [INFO][TRAIN] epoch: 1125, iter: 2250/5000, loss: 0.1815, lr: 0.029204, batch_cost: 8.7713, reader_cost: 7.68169, ips: 68.4051 samples/sec | ETA 06:42:002021-11-13 19:38:08 [INFO][TRAIN] epoch: 1130, iter: 2260/5000, loss: 0.1833, lr: 0.029108, batch_cost: 8.7045, reader_cost: 7.62504, ips: 68.9299 samples/sec | ETA 06:37:302021-11-13 19:39:35 [INFO][TRAIN] epoch: 1135, iter: 2270/5000, loss: 0.1741, lr: 0.029013, batch_cost: 8.7032, reader_cost: 7.61708, ips: 68.9401 samples/sec | ETA 06:35:592021-11-13 19:41:03 [INFO][TRAIN] epoch: 1140, iter: 2280/5000, loss: 0.1810, lr: 0.028917, batch_cost: 8.8020, reader_cost: 7.72264, ips: 68.1664 samples/sec | ETA 06:39:012021-11-13 19:42:33 [INFO][TRAIN] epoch: 1145, iter: 2290/5000, loss: 0.1799, lr: 0.028821, batch_cost: 8.9336, reader_cost: 7.84692, ips: 67.1623 samples/sec | ETA 06:43:302021-11-13 19:44:02 [INFO][TRAIN] epoch: 1150, iter: 2300/5000, loss: 0.1756, lr: 0.028726, batch_cost: 8.9216, reader_cost: 7.84517, ips: 67.2524 samples/sec | ETA 06:41:282021-11-13 19:44:02 [INFO]Start evaluating (total_samples: 380, total_iters: 380)...380/380 [==============================] - 15s 40ms/step - batch_cost: 0.0394 - reader cost: 0.0012021-11-13 19:44:17 [INFO][EVAL] #Images: 380 mIoU: 0.7640 Acc: 0.8681 Kappa: 0.7330 2021-11-13 19:44:17 [INFO][EVAL] Class IoU: [0.7378 0.7902]2021-11-13 19:44:17 [INFO][EVAL] Class Acc: [0.7925 0.9347]2021-11-13 19:44:17 [INFO][EVAL] The model with the best validation mIoU (0.7874) was saved at iter 2100.

   

五、测试

In [2]

!python val.py        --config  /home/aistudio/bisenet_optic_disc_512x512_1k.yml       --model_path output/best_model/model.pdparams

       

2021-11-13 19:48:13 [INFO]---------------Config Information---------------batch_size: 600iters: 5000loss:  coef:  - 1  types:  - type: CrossEntropyLosslr_scheduler:  end_lr: 0  learning_rate: 0.05  power: 0.9  type: PolynomialDecaymodel:  backbone:    align_corners: false    type: HRNet_W18_Small_V1  num_classes: 2  pretrained: null  type: FCNoptimizer:  momentum: 0.9  type: sgd  weight_decay: 0.0005train_dataset:  dataset_root: /home/aistudio/cat/  mode: train  num_classes: 2  train_path: /home/aistudio/cat/train.txt  transforms:  - max_scale_factor: 2.0    min_scale_factor: 0.5    scale_step_size: 0.25    type: ResizeStepScaling  - crop_size:    - 224    - 224    type: RandomPaddingCrop  - type: RandomHorizontalFlip  - brightness_range: 0.4    contrast_range: 0.4    saturation_range: 0.4    type: RandomDistort  - type: Normalize  type: Datasetval_dataset:  dataset_root: /home/aistudio/cat/  mode: val  num_classes: 2  transforms:  - type: Normalize  type: Dataset  val_path: /home/aistudio/cat/eval.txt------------------------------------------------W1113 19:48:13.707370  4265 device_context.cc:404] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1W1113 19:48:13.707428  4265 device_context.cc:422] device: 0, cuDNN Version: 7.6.2021-11-13 19:48:19 [INFO]Loading pretrained model from output/best_model/model.pdparams2021-11-13 19:48:19 [INFO]There are 363/363 variables loaded into FCN.2021-11-13 19:48:19 [INFO]Loaded trained params of model successfully2021-11-13 19:48:19 [INFO]Start evaluating (total_samples: 380, total_iters: 380).../opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/math_op_patch.py:239: UserWarning: The dtype of left and right variables are not the same, left dtype is paddle.int32, but right dtype is paddle.bool, the right dtype will convert to paddle.int32  format(lhs_dtype, rhs_dtype, lhs_dtype))/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/math_op_patch.py:239: UserWarning: The dtype of left and right variables are not the same, left dtype is paddle.int64, but right dtype is paddle.bool, the right dtype will convert to paddle.int64  format(lhs_dtype, rhs_dtype, lhs_dtype))380/380 [==============================] - 15s 41ms/step - batch_cost: 0.0405 - reader cost: 0.002021-11-13 19:48:35 [INFO][EVAL] #Images: 380 mIoU: 0.7874 Acc: 0.8838 Kappa: 0.7616 2021-11-13 19:48:35 [INFO][EVAL] Class IoU: [0.7566 0.8181]2021-11-13 19:48:35 [INFO][EVAL] Class Acc: [0.8349 0.9211]

       

380/380 [==============================] - 15s 41ms/step - batch_cost: 0.0405 - reader cost: 0.002021-11-13 19:48:35 [INFO][EVAL] #Images: 380 mIoU: 0.7874 Acc: 0.8838 Kappa: 0.7616 2021-11-13 19:48:35 [INFO][EVAL] Class IoU: [0.7566 0.8181]2021-11-13 19:48:35 [INFO][EVAL] Class Acc: [0.8349 0.9211]

   

六、导出静态模型

In [3]

!python export.py        --config /home/aistudio/bisenet_optic_disc_512x512_1k.yml       --model_path output/best_model/model.pdparams

   

 op_type, op_type, EXPRESSION_MAP[method_name]))/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/math_op_patch.py:322: UserWarning: /tmp/tmp_l3u6xjv.py:58The behavior of expression A + B has been unified with elementwise_add(X, Y, axis=-1) from Paddle 2.0. If your code works well in the older versions but crashes in this version, try to use elementwise_add(X, Y, axis=0) instead of A + B. This transitional warning will be dropped in the future.  op_type, op_type, EXPRESSION_MAP[method_name]))2021-11-03 01:01:11 [INFO]Model is saved in ./output.

   

七、预测

deploy.yaml

Deploy:  model: model.pdmodel  params: model.pdiparams  transforms:  - type: Normalize

   In [3]

# 安装paddleseg!pip install -e .

   In [5]

# 预测%cd ~/PaddleSeg/!python deploy/python/infer.py --config output/deploy.yaml  --image_path /home/aistudio/cat/images/Bombay_130.jpg

       

/home/aistudio/PaddleSeg

       In [6]

# 打印原图from PIL import Imageimg=Image.open('/home/aistudio/cat/images/Bombay_130.jpg')img

       


               In [7]

# 打印输出图,颜色可调from PIL import Imageimg=Image.open('/home/aistudio/PaddleSeg/output/Bombay_130.png')img

       


               

八、hub部署

hub部署可参考:PaddleHub Module转换

已用hub部署,可通过命令行或者python来抠图啦!,具体hub文件见目录压缩包catseg_mobile.zip

hub run catseg_mobile --input_path .cat1.jpg

       

基于Oxford-IIIT Pet数据集实现PaddleHub猫咪一键抠图 - 创想鸟        

基于Oxford-IIIT Pet数据集实现PaddleHub猫咪一键抠图 - 创想鸟        

In [ ]


   

以上就是基于Oxford-IIIT Pet数据集实现PaddleHub猫咪一键抠图的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/47049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 21:40:43
下一篇 2025年11月7日 21:44:50

相关推荐

  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 旋转长方形后,如何计算其相对于画布左上角的轴距?

    绘制长方形并旋转,计算旋转后轴距 在拥有 1920×1080 画布中,放置一个宽高为 200×20 的长方形,其坐标位于 (100, 100)。当以任意角度旋转长方形时,如何计算它相对于画布左上角的 x、y 轴距? 以下代码提供了一个计算旋转后长方形轴距的解决方案: const x = 200;co…

    2025年12月24日
    000
  • 旋转长方形后,如何计算它与画布左上角的xy轴距?

    旋转后长方形在画布上的xy轴距计算 在画布中添加一个长方形,并将其旋转任意角度,如何计算旋转后的长方形与画布左上角之间的xy轴距? 问题分解: 要计算旋转后长方形的xy轴距,需要考虑旋转对长方形宽高和位置的影响。首先,旋转会改变长方形的长和宽,其次,旋转会改变长方形的中心点位置。 求解方法: 计算旋…

    2025年12月24日
    000
  • 旋转长方形后如何计算其在画布上的轴距?

    旋转长方形后计算轴距 假设长方形的宽、高分别为 200 和 20,初始坐标为 (100, 100),我们将它旋转一个任意角度。根据旋转矩阵公式,旋转后的新坐标 (x’, y’) 可以通过以下公式计算: x’ = x * cos(θ) – y * sin(θ)y’ = x * …

    2025年12月24日
    000
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 如何计算旋转后长方形在画布上的轴距?

    旋转后长方形与画布轴距计算 在给定的画布中,有一个长方形,在随机旋转一定角度后,如何计算其在画布上的轴距,即距离左上角的距离? 以下提供一种计算长方形相对于画布左上角的新轴距的方法: const x = 200; // 初始 x 坐标const y = 90; // 初始 y 坐标const w =…

    2025年12月24日
    200
  • CSS元素设置em和transition后,为何载入页面无放大效果?

    css元素设置em和transition后,为何载入无放大效果 很多开发者在设置了em和transition后,却发现元素载入页面时无放大效果。本文将解答这一问题。 原问题:在视频演示中,将元素设置如下,载入页面会有放大效果。然而,在个人尝试中,并未出现该效果。这是由于macos和windows系统…

    2025年12月24日
    200
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 如何利用 CSS 选中激活标签并影响相邻元素的样式?

    如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…

    2025年12月24日
    100
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 如何计算旋转后的长方形在画布上的 XY 轴距?

    旋转长方形后计算其画布xy轴距 在创建的画布上添加了一个长方形,并提供其宽、高和初始坐标。为了视觉化旋转效果,还提供了一些旋转特定角度后的图片。 问题是如何计算任意角度旋转后,这个长方形的xy轴距。这涉及到使用三角学来计算旋转后的坐标。 以下是一个 javascript 代码示例,用于计算旋转后长方…

    2025年12月24日
    000
  • 为什么我的 Safari 自定义样式表在百度页面上失效了?

    为什么在 Safari 中自定义样式表未能正常工作? 在 Safari 的偏好设置中设置自定义样式表后,您对其进行测试却发现效果不同。在您自己的网页中,样式有效,而在百度页面中却失效。 造成这种情况的原因是,第一个访问的项目使用了文件协议,可以访问本地目录中的图片文件。而第二个访问的百度使用了 ht…

    2025年12月24日
    000
  • 如何用前端实现 Windows 10 设置界面的鼠标移动探照灯效果?

    如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信