首页
壁纸
留言板
友链
更多
统计归档
Search
1
TensorBoard:训练日志及网络结构可视化工具
12,588 阅读
2
主板开机跳线接线图【F_PANEL接线图】
7,043 阅读
3
Linux使用V2Ray 原生客户端
6,155 阅读
4
移动光猫获取超级密码&开启公网ipv6
4,695 阅读
5
NVIDIA 显卡限制功率
3,133 阅读
好物分享
实用教程
linux使用
wincmd
学习笔记
mysql
java学习
nginx
综合面试题
大数据
网络知识
linux
放码过来
python
javascript
java
opencv
蓝桥杯
leetcode
深度学习
开源模型
相关知识
数据集和工具
模型轻量化
语音识别
计算机视觉
杂七杂八
硬件科普
主机安全
嵌入式设备
其它
bug处理
登录
/
注册
Search
标签搜索
好物分享
学习笔记
linux
MySQL
nvidia
typero
内网穿透
webdav
vps
java
cudann
gcc
cuda
树莓派
CNN
图像去雾
ssh安全
nps
暗通道先验
阿里云
jupiter
累计撰写
354
篇文章
累计收到
71
条评论
首页
栏目
好物分享
实用教程
linux使用
wincmd
学习笔记
mysql
java学习
nginx
综合面试题
大数据
网络知识
linux
放码过来
python
javascript
java
opencv
蓝桥杯
leetcode
深度学习
开源模型
相关知识
数据集和工具
模型轻量化
语音识别
计算机视觉
杂七杂八
硬件科普
主机安全
嵌入式设备
其它
bug处理
页面
壁纸
留言板
友链
统计归档
搜索到
354
篇与
的结果
2021-01-24
VOC数据集分为train、val、test、trainval
VOC数据集分为train、val、test、trainval分割示意图代码实现import os import random xml_dir='./labels_voc/' #xml文件路径(Annotations) txt_save_dir = './ImageSets/Main' # txt文件 save path if not os.path.exists(txt_save_path): os.makedirs(txt_save_path) # 设置数据分割比例 trainval_percent = 0.9 train_percent = 0.8 # 获取所有的xml文件名 total_xml = os.listdir(xml_dir) # xml文件计数 num = len(total_xml) # 根据xml文件计数结果生成索引list并根据索引list分割为train、val、test、trainval xml_index_list = range(num) trainval_num = int(num * trainval_percent) train_num = int(trainval_num * train_percent) trainval_index_list = random.sample(xml_index_list, trainval_num) train_index_list = random.sample(trainval_index_list, train_num) # 根据分割完的索引文件将对应的文件名分别写入对应文件 ftrainval = open(txt_save_dir + '/trainval.txt', 'w') ftest = open(txt_save_dir + '/test.txt', 'w') ftrain = open(txt_save_dir + '/train.txt', 'w') fval = open(txt_save_dir + '/val.txt', 'w') for i in xml_index_list: file_name = total_xml[i][:-4] + '\n' if i in trainval_index_list: ftrainval.write(file_name) if i in train_index_list: ftrain.write(file_name) else: fval.write(file_name) else: ftest.write(file_name) ftrainval.close() ftrain.close() fval.close() ftest.close()结果ImageSets/ └── Main ├── test.txt ├── train.txt ├── trainval.txt └── val.txt参考资料制作VOC数据集时生成trainval.txt,train.txt,val.txt代码:https://blog.csdn.net/weixin_41868104/article/details/89886697
2021年01月24日
1,006 阅读
0 评论
0 点赞
2021-01-24
VOC数据集转YOLO数据集
VOC数据集转YOLO数据集VOC数据集样例<annotation> <folder>VOC2007</folder> <filename>009947.jpg</filename> <source> <database>The VOC2007 Database</database> <annotation>PASCAL VOC2007</annotation> <image>flickr</image> <flickrid>317223454</flickrid> </source> <owner> <flickrid>vaio_2002</flickrid> <name>Jonathan</name> </owner> <size> <width>332</width> <height>500</height> <depth>3</depth> </size> <segmented>1</segmented> <object> <name>boat</name> <pose>Left</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>115</xmin> <ymin>92</ymin> <xmax>250</xmax> <ymax>321</ymax> </bndbox> </object> <object> <name>person</name> <pose>Unspecified</pose> <truncated>1</truncated> <difficult>1</difficult> <bndbox> <xmin>165</xmin> <ymin>288</ymin> <xmax>186</xmax> <ymax>312</ymax> </bndbox> </object> </annotation>对应YOLO数据集样例格式说明:每行对应一个box,每个box分别有五个参数label indexcenter_xcenter_ywidthheight10 0.5496987951807228 0.413 0.4066265060240964 0.458 5 0.5286144578313253 0.6 0.06325301204819277 0.048代码实现import xmltodict import os from progressbar import * xml_dir='./labels_voc' #原xml路径 txt_dir='./labels' #转换后txt文件存放路径 # 所有待检测的labels class_names = ['aeroplane', 'cat', 'car', 'dog', 'chair', 'person', 'horse', 'bird', 'tvmonitor', 'bus', 'boat', 'diningtable', 'bicycle', 'bottle', 'sofa', 'pottedplant', 'motorbike', 'cow', 'train', 'sheep'] # 将voc xml中的object转化为对应的一条yolo数据 def get_yolo_data(obj,img_width,img_height): # 获取voc格式的数据信息 name = obj['name'] xmin = float(obj['bndbox']['xmin']) xmax = float(obj['bndbox']['xmax']) ymin = float(obj['bndbox']['ymin']) ymax = float(obj['bndbox']['ymax']) # 计算yolo格式的数据信息 class_idx = class_names.index(name) x_center = (xmin + xmax) / 2 / img_width y_center = (ymin + ymax) / 2 / img_height box_width = (xmax - xmin) / img_width box_height = (ymax - ymin) / img_height yolo_data = "{} {} {} {} {}\n".format(class_idx,x_center,y_center,box_width,box_height) return yolo_data # 逐一处理xml文件,转换为YOLO所需的格式 #进度条支持 count = 0 #计数器 widgets = ['VOC2YOLO: ',Percentage(), ' ', Bar('#'),' ', Timer(),' ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=len(os.listdir(xml_dir))).start() for xml_file in os.listdir(xml_dir): xml_file_path = os.path.join(xml_dir,xml_file) txt_file_path = os.path.join(txt_dir,xml_file[:-4]+".txt") yolo_data = "" with open(xml_file_path) as f: xml_str = f.read() # 转为字典 xml_dic = xmltodict.parse(xml_str) # 获取图片的width、height img_width = float(xml_dic["annotation"]["size"]["width"]) img_height = float(xml_dic["annotation"]["size"]["height"]) # 获取xml文件中的object objects = xml_dic["annotation"]["object"] if isinstance(objects,list): # xml文件中包含多个object for obj in objects: yolo_data += get_yolo_data(obj,img_width,img_height) else: # xml文件中包含1个object obj = objects yolo_data += get_yolo_data(obj,img_width,img_height) with open(txt_file_path,'w') as f: f.write(yolo_data) #更新进度条 count += 1 pbar.update(count) pbar.finish()实现结果原始数据labels_voc ├── 000005.xml ├── 000007.xml ├── 000009.xml ├── 000012.xml ├── 000016.xml ├── 000017.xml ├── 000019.xml ├── 000020.xml ├── 000021.xml生成数据labels ├── 000005.txt ├── 000007.txt ├── 000009.txt ├── 000012.txt ├── 000016.txt ├── 000017.txt ├── 000019.txt ├── 000020.txt ├── 000021.txt参考资料PASCAL VOC 数据集转化为yolo数据集格式:https://blog.csdn.net/guo_python/article/details/107984940
2021年01月24日
715 阅读
0 评论
0 点赞
2021-01-24
VOC数据集类别统计
1.数据统计核心代码import xmltodict import os from tqdm import tqdm xml_dir = input(prompt="请输入xml文件夹地址:") #xml文件路径(Annotations) if not os.path.exists(xml_dir): print("[发生错误]:",xml_dir,"不存在") else: statistical_results = {} #进度条功能 pbar = tqdm(total=len(os.listdir(xml_dir))) pbar.set_description("VOC数据集类别统计:") # 设置前缀 for xml_file in os.listdir(xml_dir): # 拼接xml文件的path xml_file_path = os.path.join(xml_dir,xml_file) # 读取xml文件到字符串 with open(xml_file_path) as f: xml_str = f.read() # xml字符串转为字典 try: xml_dic = xmltodict.parse(xml_str) except Exception as e: print("[发生错误]:",xml_file_path,"解析失败") # 获取xml文件中的所有objects obj_list = xml_dic["annotation"]["object"] if not isinstance(obj_list,list): # xml文件中包含多个object obj_list = [obj_list] # labels分布统计 for obj in obj_list: if not obj['name'] in statistical_results.keys(): statistical_results[obj['name']] = 1 else: statistical_results[obj['name']] += 1 #更新进度条 pbar.update(1) #释放进度条 pbar.close() #输出统计结果 cls_list = list(statistical_results.keys()) print("=================================================") print("[统计报告]:") print("class list:",cls_list) print("类别总数:",len(cls_list)) print("类别分布情况:",statistical_results) print("=================================================")请输入xml文件夹地址:csf [发生错误]: csf 不存在请输入xml文件夹地址:C:\Users\itrb\Desktop\AirportApronDatasetLabel\label-finished\105-normal\Annotations VOC数据集类别统计:: 100%|████████████████████████████████████████████████████████| 1943/1943 [00:01<00:00, 1416.14it/s] ?it/s] ================================================= [统计报告]: class list: ['BridgeVehicle', 'Person', 'FollowMe', 'Plane', 'LuggageTruck', 'RefuelingTruck', 'FoodTruck', 'Tractor'] 类别总数: 8 类别分布情况: {'BridgeVehicle': 1943, 'Person': 2739, 'FollowMe': 4, 'Plane': 1789, 'LuggageTruck': 83, 'RefuelingTruck': 401, 'FoodTruck': 378, 'Tractor': 748} =================================================2.统计结果可视化2.1 根据统计结果绘制条形图# 绘制条形图 import matplotlib.pyplot as plt import numpy as np # 初始化画布 fig = plt.figure(figsize=(13,5),dpi=200) # 添加一个子图 ax = plt.subplot(1,1,1) # 绘制条形图 y_pos = np.arange(len(statistical_results)) ax.barh(y_pos,list(statistical_results.values())) # 设置y轴的ticklabels ax.set_yticks(y_pos) ax.set_yticklabels(list(statistical_results.keys())) # 设置图片的标题 ax.set_title("The total number of objects = {} in {} images".format( np.sum(list(statistical_results.values())),len(os.listdir(xml_dir)) )) plt.show()2.2 根据统计结果绘制折线图# 绘制折线图 import matplotlib.pyplot as plt import numpy as np # 初始化画布 fig = plt.figure(figsize=(13,5),dpi=200) # 添加一个子图x ax = plt.subplot(1,1,1) # 绘制折线图 x_pos = np.arange(len(statistical_results)) ax.plot(x_pos,list(statistical_results.values())) # 设置x轴的ticklabels ax.set_xticks(x_pos) ax.set_xticklabels(list(statistical_results.keys()),rotation = 45) # 设置图片的标题 ax.set_title("The total number of objects = {} in {} images".format( np.sum(list(statistical_results.values())),len(os.listdir(xml_dir)) )) plt.show()
2021年01月24日
896 阅读
0 评论
0 点赞
2021-01-23
显示器常用输出接口介绍
显示器常用输出接口介绍接口性能排序目前市场接口的性能排名是:DP > HDMI > DVI > VGAVGA——最古老的接口VGA 接口,又称 D-Sub 接口,采用的是模拟信号,仅限视频的传输。最早之前使用的 CRT 显示器就是使用的这种接口,因为是模拟信号,所以容易受到干扰,在显示画面之前,要经过多次信号间的转换,信号容易丢失,最后导致画面质量下降。在1080P的分辨率下,用肉眼就能看到画面的损失,所以建议1080P分辨率以下的显示器使用。VGA 缺点:图像质量不高不能传输音频你在一些投影仪和显示器中依然可以看到它的身影,但它已经不是市场的主流,大多数旧款笔记本电脑只有 VGA 接口,但较新的笔记本电脑一般都会有 DisplayPort 或 HDMI 接口。DVI——144hz,1080p为了弥补 VGA 接口的不足,推出了能同时支持模拟信号和数字信号传输的 DVI 接口,它其实是一个过渡产品,它比较明显的缺点是不支持音频信号,局限了它的普及和发展。DVI 接口型号较多,主要分为三种:DVI-A(模拟信号)、DVI-D(数字信号) 和 DVI-I(集成模拟和数字信号),其中 DVI-A 非常罕见。另外, DVI-D 和 DVI-I 又有单通道和双通道之分,区别在于带宽不同。单通道的 DVI-D 或 DVI-I 可以承载 3.96 Gbit / s,最高分辨率为 1920×120。双通道最大带宽为 7.92 Gbit / s,最高分辨率为 2560×1600。数字信号的传输不需要转换,可以直接传送到显示器材,传输速度快,画面质量也更好。但是 DVI 只支持 8bit 的 RGB 信号传输、兼容性考虑,预留了不少引脚以支持模拟设备,造成接口体积较大。目前比较好的DVI接口能够传输 2K 画面,但也基本是极限了。如果你需要一个 1080P 144Hz 的显示器,DVI 还可以胜任,但是如果你需要一个更高的分辨率,你需要使用 HDMI 或 DisplayPort 接口。HDMI——高品质多媒体接口HDMI 是一种数字化的视频和音频接口技术,支持音频的输出,它的出现取代了模拟信号。广泛应用在机顶盒、电视机、显示器、投影仪等设备,由于使用较多,也衍生出三种接口形式:标准 HDMI 接口、Micro HDMI 接口和 Mini HDMI 接口。HDMI 1.4 接口是目前显示器中最常见的,它支持多通道音频传输,能提供逼真的色彩,可以支持 4K 分辨率,但是刷新率最高只有 30Hz。可以提供 75Hz 刷新率 2560×1600 分辨率, 和 144Hz 刷新率 1920×1080 分辨率,非常合适竞技游戏。此外,HDMI 1.4不支持 21:9 视频和 3D 立体格式。HDMI 2.0 进一步扩展了色彩深度,能在 60Hz 刷新率下支持 4K。它还增加了对 21:9 宽高比和 3D 立体格式的支持。此外,HDMI 2.0 允许 144Hz 的 1440p 和 240Hz 的 1080p。1.4 和 2.0 版本都支持自适应同步,即AMD FreeSync技术。HDMI 2.0a 增加了对 HDR(高动态范围)的支持,而HDMI 2.0b 则支持高级 HDR10 格式和HLG标准。HDMI 2.1 增加对动态HDR,4K的4K以及120Hz的8K的支持。DPDP 接口也是一种高清数字显示接口标准,是目前的主流,用于一些高端显示器,可以看做是 HDMI 接口的升级版,但是内部传输方式与 DIV 和 HDMI 完全不同,带宽更高,有更好的性能。如果您在使用 4K 显示器,HDMI 带宽不足,只能传送 30 帧,而 DP 完全可以胜任。DisplayPort 1.2 对于采用 Nvidia G-Sync 的游戏显示器来说是必备接口。在HBR2(高比特率2)模式下,DisplayPort 1.2 的有效带宽达到 17.28 Gbit / s,允许广泛的色域支持和高达 4K 的 75Hz 的高分辨率/刷新率。多个显示器可以通过菊花链(DisplayPort-Out)连接在一起。DisplayPort 1.2 能够支持 3840×2160,4K,刷新率 60Hz 或者 1080p 分辨率,刷新率 144Hz。最新的 DisplayPort 1.4 接口通过使用 3:1 压缩比的 DSC(显示流压缩)编码,增加了对 HDR10 和 Rec2020 色域以及 60Hz 的8K HDR 和 120Hz 的 4K HDR的支持。DP 接口还有一种衍生的形式:Mini DP 接口,尺寸更小,是由苹果公司推出的。【非主流接口】DMS-59一种视频输出接口,可同时输出两路DVI信号。常用在工业领域。接口转换VGA 和 DVI 互转,属于模拟信号和数字信号的转换,视频信号会有损失,造成失真。DVI 和 HDMI 互转,属于数字信号之间的转换,但是从 HDMI 转换 DVI 时会自动舍去音频信号。参考资料显示器常用输出接口介绍:https://www.xianshiqiba.com/knowledge-base/monitor-interfaces/
2021年01月23日
901 阅读
0 评论
0 点赞
2021-01-22
[www.cc148.com]小说爬虫
[www.cc148.com]小说爬虫from bs4 import BeautifulSoup from urllib.request import urlopen from progressbar import * #根据目录页面地址获取目录页面的html、并封装为soup catalogue_url = "https://www.cc148.com/19_19568/" html = urlopen(catalogue_url).read().decode('gbk') soup = BeautifulSoup(html, features='lxml') #根据目录页html获取到小说的titile title = soup.title.text.split("最新章节列表")[0] #根据目录页html获取到小说每一章的地址集合chapter_url_list chapter_url_list = [] for dd in soup.find_all('dd'): chapter_url = catalogue_url + dd.a["href"] chapter_url_list.append(chapter_url) # 加入进度条功能 widgets = ['正在下载--'+title,Percentage(), ' ', Bar('#'),' ', Timer(),' ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=len(chapter_url_list)).start() count = 0 #根据chapter_url_list逐章下载并保存到当前文件夹 txt_file_name = title + ".txt" with open(txt_file_name,'w') as f: for chapter_url in chapter_url_list: chapter_html = urlopen(chapter_url).read().decode('gbk') chapter_soup = BeautifulSoup(chapter_html, features='lxml') chapter_title = chapter_soup.title.text.split('_')[0] chapter_content = chapter_soup.find("div",{"id":"content"}).text chapter_text = chapter_title + "\n" + chapter_content + "\n" f.write(chapter_text) count +=1 pbar.update(count) pbar.finish()
2021年01月22日
682 阅读
0 评论
0 点赞
2021-01-20
统计VOC数据集中的所有标签(class_name_list)
1. PASCAL VOC数据格式<?xml version='1.0' encoding='utf-8'?> <annotation verified="no"> <folder>JPEGImages</folder> <filename>2018_06_05_09_06_55_065</filename> <path>F:\receive\VOC2007\JPEGImages\2018_06_05_09_06_55_065.jpg</path> <source> <database>Unknown</database> </source> <size> <width>2048</width> <height>1536</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>1</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>530</xmin> <ymin>752</ymin> <xmax>1498</xmax> <ymax>1326</ymax> </bndbox> </object> </annotation>2.获取voc数据集标签所有的类别数即下的所有的的import xmltodict import os # VOC xml文件所在文件夹 annotation_dir="./labels_voc/" label_list = list() # 逐一处理xml文件 for file in os.listdir(annotation_dir): annotation_path = os.path.join(annotation_dir,file) # 读取xml文件 with open(annotation_path,'r') as f: xml_str = f.read() #转为字典 xml_dic = xmltodict.parse(xml_str) # 获取label并去重加入到label_list objects = xml_dic["annotation"]["object"] if isinstance(objects,list): # xml文件中包含多个object for obj in objects: label = obj['name'] if label not in label_list: label_list.append(label) else:# xml文件中只包含1个object obj = objects label = object_['name'] if label not in label_list: label_list.append(label) print(label_list)['aeroplane', 'cat', 'car', 'dog', 'chair', 'person', 'horse', 'bird', 'tvmonitor', 'bus', 'boat', 'diningtable', 'bicycle', 'bottle', 'sofa', 'pottedplant', 'motorbike', 'cow', 'train', 'sheep']
2021年01月20日
783 阅读
0 评论
0 点赞
2021-01-17
Python中xml、字典、EasyDict、json格式相互转换(包含json格式化和xml格式化)
Python中xml、字典、EasyDict、json格式相互转换(包含json格式化和xml格式化)依赖包jsonxmltodictxml转字典import xmltodict xmlstr =""" <student> <stid>10213</stid> <info> <name>name</name> <sex>male</sex> </info> <course> <name>math</name> <score>90</score> </course> </student> """ #parse是的xml解析器 dict_ = xmltodict.parse(xmlstr) print(dict_)OrderedDict([('student', OrderedDict([('stid', '10213'), ('info', OrderedDict([('name', 'name'), ('sex', 'male')])), ('course', OrderedDict([('name', 'math'), ('score', '90')]))]))])字典转EasyDictimport xmltodict xmlstr =""" <student> <stid>10213</stid> <info> <name>name</name> <sex>male</sex> </info> <course> <name>math</name> <score>90</score> </course> </student> """ #parse是的xml解析器 dict_ = xmltodict.parse(xmlstr) #转EasyDict from easydict import EasyDict dict_ = EasyDict(dict_) print(dict_){'student': {'stid': '10213', 'info': {'name': 'name', 'sex': 'male'}, 'course': {'name': 'math', 'score': '90'}}}字典转json最简版import json dict_ = { 'name': 'Jack', 'age': 22, 'skills': ['Python', 'Java', 'C++', 'Matlab'], 'major': '计算机技术', 'english': '英语六级', 'school': 'WIT' } #json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。 #dumps()方法的ident=1,格式化json jsonstr = json.dumps(dict_) print(jsonstr){"name": "Jack", "age": 22, "skills": ["Python", "Java", "C++", "Matlab"], "major": "\u8ba1\u7b97\u673a\u6280\u672f", "english": "\u82f1\u8bed\u516d\u7ea7", "school": "WIT"}很明显中文字符被转化了,于是使用:ensure_ascii=Falseimport json dict_ = { 'name': 'Jack', 'age': 22, 'skills': ['Python', 'Java', 'C++', 'Matlab'], 'major': '计算机技术', 'english': '英语六级', 'school': 'WIT' } #json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。 #dumps()方法的ident=1,格式化json jsonstr = json.dumps(dict_,ensure_ascii=False) print(jsonstr){"name": "Jack", "age": 22, "skills": ["Python", "Java", "C++", "Matlab"], "major": "计算机技术", "english": "英语六级", "school": "WIT"}加入行缩进import json dict_ = { 'name': 'Jack', 'age': 22, 'skills': ['Python', 'Java', 'C++', 'Matlab'], 'major': '计算机技术', 'english': '英语六级', 'school': 'WIT' } #json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。 #dumps()方法的ident=1,格式化json jsonstr = json.dumps(dict_,indent=2) #indent=2 表示行缩进=2 print(jsonstr){ "name": "Jack", "age": 22, "skills": [ "Python", "Java", "C++", "Matlab" ], "major": "\u8ba1\u7b97\u673a\u6280\u672f", "english": "\u82f1\u8bed\u516d\u7ea7", "school": "WIT" }很明显中文字符被转化了,于是使用:ensure_ascii=Falseimport json dict_ = { 'name': 'Jack', 'age': 22, 'skills': ['Python', 'Java', 'C++', 'Matlab'], 'major': '计算机技术', 'english': '英语六级', 'school': 'WIT' } #json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。 #dumps()方法的ident=1,格式化json jsonstr = json.dumps(dict_,indent=2,ensure_ascii=False) #indent=2 表示行缩进=2 print(jsonstr){ "name": "Jack", "age": 22, "skills": [ "Python", "Java", "C++", "Matlab" ], "major": "计算机技术", "english": "英语六级", "school": "WIT" }json转字典json.loads(json串),将json字符串转化成字典import json jsonstr = """ { "name": "Jack", "age": 22, "skills": [ "Python", "Java", "C++", "Matlab" ], "major": "计算机技术", "english": "英语六级", "school": "WIT" } """ dict_ = json.loads(jsonstr) print(dict_){'name': 'Jack', 'age': 22, 'skills': ['Python', 'Java', 'C++', 'Matlab'], 'major': '计算机技术', 'english': '英语六级', 'school': 'WIT'}字典转xmlimport xmltodict dict_ = {'student': {'course': {'name': 'math', 'score': '90'}, 'info': {'sex': 'male', 'name': 'name'}, 'stid': '10213'}} xmlstr = xmltodict.unparse(dict_) print(xmlstr)<?xml version="1.0" encoding="utf-8"?> <student><course><name>math</name><score>90</score></course><info><sex>male</sex><name>name</name></info><stid>10213</stid></student>XML格式化(美化)import xmltodict dict_ = {'student': {'course': {'name': 'math', 'score': '90'}, 'info': {'sex': 'male', 'name': 'name'}, 'stid': '10213'}} xmlstr = xmltodict.unparse(dict_) from xml.dom import minidom xml = minidom.parseString(xmlstr) xml_pretty_str = xml.toprettyxml() print(xml_pretty_str)<?xml version="1.0" encoding="utf-8"?> <student> <course> <name>math</name> <score>90</score> </course> <info> <sex>male</sex> <name>name</name> </info> <stid>10213</stid> </student>参考资料Python中xml和json格式相互转换操作示例:https://www.jb51.net/article/152118.htmPython json读写方式和字典相互转化:https://www.jb51.net/article/184983.htmPython如何优雅的格式化XML 【Python XML Format】: https://blog.csdn.net/qq_41958123/article/details/105357692
2021年01月17日
1,091 阅读
0 评论
0 点赞
2021-01-16
Ubuntu上安装tinyproxy搭建HTTP代理服务器
0.什么是TinyProxy它是一个代理服务器,用来实现http或https代理,windows系统一直在用ccproxy, 非windows系统,怎么开放个http代理呢?那就是TinyProxy。1.TinyProxy安装sudo apt-get update apt-get install tinyproxy2.配置参数文件vi /etc/tinyproxy.conf修改下面两个部分:Port 8888 #预设是8888 Port,你可以更改 Allow 127.0.0.1 #将127.0.0.1改成你自己的IP #例如你的IP 是1.2.3.4,你改成Allow 1.2.3.4,那只有你才可以连上这个Proxy #若你想任何IP都可以脸到Proxy在Allow前面打#注释3.TinyProxy打开与关闭service tinyproxy start/restart/stop4.连接测试在另一台客户机上输入curl -x <IP>:<PORT> www.baidu.com其中IP和PORT是代理服务器的IP和代理端口,如果出现百度的源代码,则证明代理配置成功。参考资料Ubuntu上安装tinyproxy搭建HTTP代理服务器:https://blog.csdn.net/weixin_41010318/article/details/85015976腾讯云Ubuntu搭建TinyProxy代理服务器:https://cloud.tencent.com/developer/article/1004731
2021年01月16日
1,300 阅读
0 评论
0 点赞
2021-01-16
CenterOS7防火墙常用命令
查看防火墙是否关闭[root@localhost ~]# firewall-cmd --state not running [root@localhost ~]#开启防火墙[root@localhost ~]# systemctl start firewalld [root@localhost ~]# firewall-cmd --state running关闭防火墙[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# firewall-cmd --state not running禁止firewall开机启动[root@localhost ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. 这样设置的话,下次重启开机的时候就会禁止firewall的启动,即关闭状态。设置firewall开机启动[root@localhost ~]# systemctl enable firewalld Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service. Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.参考资料CENTER OS7关闭防火墙:https://www.cnblogs.com/gucb/p/11156935.html
2021年01月16日
682 阅读
0 评论
0 点赞
2021-01-16
CentOS7设置上网代理
CentOS设置上网代理1、网页上网网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->>Advanced-->>Network在Connection下点击Settings,里面的manual proxy configuration里设置IP和PORT即可,2、系统环境代理设置设置全局代理修改 /etc/profile 文件,添加下面内容:http_proxy=http://username:password@yourproxy:8080/ https_proxy=https://username:password@yourproxy:8080/ export http_proxy export https_proxy如果没有密码限制,则以上内容可以修改为以下内容:http_proxy=http://yourproxy:8080/ https_proxy=https://yourproxy:8080/ export http_proxy export https_proxy针对某个用户设置代理只修改 ~/.bash_profile 文件,文件内容与上面的 /etc/profile 相同http_proxy=http://username:password@yourproxy:8080/ https_proxy=https://username:password@yourproxy:8080/ export http_proxy export https_proxy如果没有密码限制,则以上内容可以修改为以下内容:http_proxy=http://yourproxy:8080/ https_proxy=https://yourproxy:8080/ export http_proxy export https_proxy3、设置yum 的代理对于 yum 的代理,还要另外设置 /etc/yum.conf 文件vi /etc/yum.conf 添加以下代码:http_proxy=http://username:password@yourproxy:8080/ #若无密码限制,则为以下方式 http_proxy=http://yourproxy:8080/4、wget代理设置编辑文件为:/etc/wgetrcvi /etc/wgetrc添加下面两行:http_proxy=http://username:password@yourproxy:8080/ https_proxy=https://username:password@yourproxy:8080/ #若无密码限制,则为以下方式 http_proxy=http://yourproxy:8080/ https_proxy=https://yourproxy:8080/参考资料CentOS设置网络代理:https://blog.csdn.net/u013063153/article/details/78120945CentOS设置上网代理:https://blog.csdn.net/bohenzong1654/article/details/100964835?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control
2021年01月16日
761 阅读
0 评论
0 点赞
2021-01-15
Pytorch 实战:卷积神经网络(CNN)实现MINIST手写数字识别
实验环境torch = 1.6.0torchvision = 0.7.0matplotlib = 3.3.3 # 绘图用progressbar = 2.5 # 绘制进度条用easydict # 超参数字典功能增强使用数据集手写数字集MINIST导入相关的包# 导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader import torchvision from torchvision import datasets,transforms import matplotlib.pyplot as plt import random from progressbar import *设置超参数from easydict import EasyDict #增强python的dict的功能用 # 定义超参数 super_param = { "batch_size":256, "device": torch.device('cuda:0' if torch.cuda.is_available() else 'cpu'), "epochs":10, "lr":0.3, } super_param = EasyDict(super_param) print(super_param){'batch_size': 16, 'device': device(type='cuda', index=0), 'epochs': 10, 'lr': 0.3, 'hidden_num': 15}数据处理(下载、处理、加载数据到DataLoader)# 下载、加载数据 # 构transform(pipeline),对图像做处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,),(0.3081,)) #正则化 ]) # 下载数据 trainsets = datasets.MNIST('data',train=True,download=True,transform=transform) testsets = datasets.MNIST('data',train=False,download=True,transform=transform) # dataloader 加载数据 train_loader = DataLoader(trainsets,batch_size=super_param.batch_size,shuffle=True) test_loader = DataLoader(trainsets,batch_size=super_param.batch_size,shuffle=True)查看数据样例查看数据样例【单张】# 查看数据样例-单张 image,label = trainsets[random.randint(0,len(trainsets))] print('label=',label) plt.imshow(image.permute(1,2,0),cmap='gray') plt.show()查看数据样例【一批】# 查看数据样例-一批 images,labels = next(iter(test_loader)) data_sample_img = torchvision.utils.make_grid(images).numpy().transpose(1,2,0) print('labels=',labels) plt.figure(dpi=200) plt.xticks([]) plt.yticks([]) plt.imshow(data_sample_img) plt.show()构建CNN网络模型 -简单版- 使用Sequential## 构建CNN模型-简单版-使用Sequential model = nn.Sequential( nn.Conv2d(in_channels=1,out_channels=10,kernel_size=5,stride=1,padding=0),# b*1*28*28-->b*10*24*24 nn.ReLU(), nn.MaxPool2d(2),# b*10*24*24-->b*10*12*12 nn.Conv2d(10,20,3,1,0),# b*10*12*12-->b*20*10*10 nn.ReLU(), nn.Flatten(),#b*20*10*10-->b*2000 nn.Linear(2000,500),#b*2000-->b*500 nn.ReLU(), nn.Linear(500,10),#b*500-->b*10 nn.ReLU(), nn.Softmax(), ) print(model)Sequential( (0): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1)) (1): ReLU() (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (3): Conv2d(10, 20, kernel_size=(3, 3), stride=(1, 1)) (4): ReLU() (5): Flatten(start_dim=1, end_dim=-1) (6): Linear(in_features=2000, out_features=500, bias=True) (7): ReLU() (8): Linear(in_features=500, out_features=10, bias=True) (9): ReLU() (10): Softmax(dim=None) )构建CNN网络模型 -使用自定义类# 构建网络模型 - 使用自定义类 class Digit_Rec(nn.Module): def __init__(self): super(Digit_Rec,self).__init__() self.conv1 = nn.Conv2d(1,10,5) #1:灰度图片的通道,10:输出通道,5:kernel self.relu1 = nn.ReLU() self.max_pool = nn.MaxPool2d(2,2) self.conv2 = nn.Conv2d(10,20,3) #10:输入通道,20:输出通道,3:Kernel self.relu2 = nn.ReLU() self.fc1 = nn.Linear(20*10*10,500) # 20*10*10:输入通道,500:输出通道 self.relu3 = nn.ReLU() self.fc2 = nn.Linear(500,10) # 500:输入通道,10:输出通道 self.relu4 = nn.ReLU() self.softmax = nn.Softmax(dim=1) def forward(self,x): batch_size = x.size(0) # x的格式:batch_size x 1 x 28 x 28 拿到了batch_size x = self.conv1(x) # 输入:batch*1*28*28 输出:batch*10*24*24 x = self.relu1(x) x = self.max_pool(x) # 输入:batch*10*24*24输出:batch*10*12*12 x = self.conv2(x) x = self.relu2(x) x = x.view(batch_size,-1) #fatten 展平 -1自动计算维度,20*10*10=2000 x = self.fc1(x) # 输入:batch*2000 输出:batch*500 x = self.relu3(x) x = self.fc2(x) # 输入:batch*500 输出:batch*10 x = self.relu4(x) output = self.softmax(x) # 计算分类后,每个数字的概率值 return output model = Digit_Rec() print(model)Digit_Rec( (conv1): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1)) (relu1): ReLU() (max_pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(10, 20, kernel_size=(3, 3), stride=(1, 1)) (relu2): ReLU() (fc1): Linear(in_features=2000, out_features=500, bias=True) (relu3): ReLU() (fc2): Linear(in_features=500, out_features=10, bias=True) (relu4): ReLU() (softmax): Softmax(dim=1) )定义损失函数和优化器# 定义损失函数和优化 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(),lr=super_param.lr)定义模型训练单个epoch函数# 定义模型训练单个epoch函数 def train_model_epoch(model,train_loader,super_param,criterion,optimzer,epoch): model.train()#训练声明 for batch_index,(images,labels) in enumerate(train_loader): # 数据上device images,labels = images.to(super_param.device),labels.to(super_param.device) # 梯度清零 optimzer.zero_grad() # 前向传播 output = model(images) # 计算损失 loss = criterion(output,labels) # 反向传播,计算梯度 loss.backward() # 参数更新(优化) optimzer.step() # 打印训练参考信息,每1000个batch打印一次 if batch_index % 1000 == 0: print("Epoch:{} Batch Index(batch_size={}):{}/{} Loss:{}". format(epoch,super_param.batch_size,batch_index,len(train_loader),loss.item()))定义模型验证方法# 定义模型验证方法 def test_model(model,test_loader,super_param,criterion): model.eval()#测试声明 # 数据统计 correct_num,test_loss = 0.0,0.0 #正确数,测试损失 #定义进度条 widgets = ['模型测试中: ',Percentage(), ' ', Bar('#'),' ', Timer(),' ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=100).start() # 取消计算梯度,避免更新模型参数 with torch.no_grad(): for batch_index,(images,labels) in enumerate(test_loader): # 数据上devics images,labels = images.to(super_param.device),labels.to(super_param.device) # 模型预测 output = model(images) # 计算测试损失 test_loss += criterion(output,labels).item() # 确定预测结果是哪个数字 pred = output.argmax(dim=1) #argmax返回 值,索引 dim=1表示要索引 # 统计预测正确数量 correct_num += pred.eq(labels.view_as(pred)).sum().item() #更新进度条进度 pbar.update(batch_index/len(test_loader)*100) #释放进度条 pbar.finish() #打印测试信息 test_loss = test_loss/len(test_loader.dataset) test_accuracy = correct_num / len(test_loader.dataset) print("Test --- Avg Loss:{},Accuracy:{}\n".format(test_loss,test_accuracy)) return test_loss,test_accuracy模型训练和测试# 模型训练和测试 #模型上device mode = model.to(super_param.device) #记录每个epoch的测试数据、用于绘图 epoch_list = [] loss_list = [] accuracy_list = [] for epoch in range(super_param.epochs): train_model_epoch(model,train_loader,super_param,criterion,optimizer,epoch) test_loss,test_accuracy = test_model(model,test_loader,super_param,criterion) # 数据统计 epoch_list.append(epoch) loss_list.append(test_loss) accuracy_list.append(test_accuracy)查看数据统计结果# 查看数据统计结果 fig = plt.figure(figsize=(12,12),dpi=70) #子图1 ax1 = plt.subplot(2,1,1) title = "bach_size={},lr={}".format(super_param.batch_size,super_param.lr) plt.title(title,fontsize=15) plt.xlabel('Epochs',fontsize=15) plt.ylabel('Loss',fontsize=15) plt.xticks(fontsize=13) plt.yticks(fontsize=13) plt.plot(epoch_list,loss_list) #子图2 ax2 = plt.subplot(2,1,2) plt.xlabel('Epochs',fontsize=15) plt.ylabel('Accuracy',fontsize=15) plt.xticks(fontsize=13) plt.yticks(fontsize=13) plt.plot(epoch_list,accuracy_list,'r') plt.show()
2021年01月15日
2,230 阅读
2 评论
0 点赞
2021-01-15
Pytorch 实战:BP神经网络实现MINIST实现手写数字识别(单层感知机)
Pytorch 实战:BP神经网络实现MINIST实现手写数字识别(单层感知机)实验环境torch = 1.6.0torchvision = 0.7.0matplotlib = 3.3.3 # 绘图用progressbar = 2.5 # 绘制进度条用easydict # 超参数字典功能增强使用数据集手写数字集MINIST导入相关的包# 导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader import torchvision from torchvision import datasets,transforms import matplotlib.pyplot as plt import random from progressbar import *设置超参数from easydict import EasyDict #增强python的dict的功能用 # 定义超参数 super_param = { "batch_size":128, "device": torch.device('cuda:0' if torch.cuda.is_available() else 'cpu'), "epochs":10, "lr":0.3, 'hidden_num':15, #隐藏层神经元数量 } super_param = EasyDict(super_param) print(super_param){'batch_size': 16, 'device': device(type='cuda', index=0), 'epochs': 10, 'lr': 0.3, 'hidden_num': 15}数据处理(下载、处理、加载数据到DataLoader)# 下载、加载数据 # 构transform(pipeline),对图像做处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,),(0.3081,)) #正则化 ]) # 下载数据 trainsets = datasets.MNIST('data',train=True,download=True,transform=transform) testsets = datasets.MNIST('data',train=False,download=True,transform=transform) # dataloader 加载数据 train_loader = DataLoader(trainsets,batch_size=super_param.batch_size,shuffle=True) test_loader = DataLoader(trainsets,batch_size=super_param.batch_size,shuffle=True)查看数据样例查看数据样例【单张】# 查看数据样例-单张 image,label = trainsets[random.randint(0,len(trainsets))] print('label=',label) plt.imshow(image.permute(1,2,0),cmap='gray') plt.show()查看数据样例【一批】# 查看数据样例-一批 images,labels = next(iter(test_loader)) data_sample_img = torchvision.utils.make_grid(images).numpy().transpose(1,2,0) print('labels=',labels) plt.figure(dpi=200) plt.xticks([]) plt.yticks([]) plt.imshow(data_sample_img) plt.show()构建BP网络模型 -简单版- 使用Sequential## 构建网络模型-BP model = nn.Sequential( nn.Flatten(), nn.Linear(28*28,super_param.hidden_num), nn.ReLU(), nn.Linear(super_param.hidden_num,10), nn.ReLU(), nn.Softmax(), ) print(model)Sequential( (0): Flatten() (1): Linear(in_features=784, out_features=15, bias=True) (2): ReLU() (3): Linear(in_features=15, out_features=10, bias=True) (4): ReLU() (5): Softmax(dim=None) )构建BP网络模型 -使用自定义类## 构建BP网络模型 -使用自定义类 class Digit_Rec(nn.Module): def __init__(self,hidden_num): super(Digit_Rec,self).__init__() self.fc1 = nn.Linear(28*28,hidden_num) self.relu1 = nn.ReLU() self.fc2 = nn.Linear(hidden_num,10) self.relu2 = nn.ReLU() self.softmax = nn.Softmax(dim=1) def forward(self,x): batch_size = x.size(0) # x的格式:batch_size x 1 x 28 x 28 拿到了batch_size x = x.view(batch_size,28*28) # flatten out = self.fc1(x) out = self.relu1(out) out = self.fc2(out) out = self.relu2(out) out = self.softmax(out) return out model = Digit_Rec(super_param.hidden_num) print(model)Digit_Rec( (fc1): Linear(in_features=784, out_features=50, bias=True) (relu1): ReLU() (fc2): Linear(in_features=50, out_features=10, bias=True) (relu2): ReLU() (softmax): Softmax(dim=1) )定义损失函数和优化器# 定义损失函数和优化 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(),lr=super_param.lr)定义模型训练单个epoch函数# 定义模型训练单个epoch函数 def train_model_epoch(model,train_loader,super_param,criterion,optimzer,epoch): model.train()#训练声明 for batch_index,(images,labels) in enumerate(train_loader): # 数据上device images,labels = images.to(super_param.device),labels.to(super_param.device) # 梯度清零 optimzer.zero_grad() # 前向传播 output = model(images) # 计算损失 loss = criterion(output,labels) # 反向传播,计算梯度 loss.backward() # 参数更新(优化) optimzer.step() # 打印训练参考信息,每1000个batch打印一次 if batch_index % 1000 == 0: print("Epoch:{} Batch Index(batch_size={}):{}/{} Loss:{}". format(epoch,super_param.batch_size,batch_index,len(train_loader),loss.item()))定义模型验证方法# 定义模型验证方法 def test_model(model,test_loader,super_param,criterion): model.eval()#测试声明 # 数据统计 correct_num,test_loss = 0.0,0.0 #正确数,测试损失 #定义进度条 widgets = ['模型测试中: ',Percentage(), ' ', Bar('#'),' ', Timer(),' ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=100).start() # 取消计算梯度,避免更新模型参数 with torch.no_grad(): for batch_index,(images,labels) in enumerate(test_loader): # 数据上devics images,labels = images.to(super_param.device),labels.to(super_param.device) # 模型预测 output = model(images) # 计算测试损失 test_loss += criterion(output,labels).item() # 确定预测结果是哪个数字 pred = output.argmax(dim=1) #argmax返回 值,索引 dim=1表示要索引 # 统计预测正确数量 correct_num += pred.eq(labels.view_as(pred)).sum().item() #更新进度条进度 pbar.update(batch_index/len(test_loader)*100) #释放进度条 pbar.finish() #打印测试信息 test_loss = test_loss/len(test_loader.dataset) test_accuracy = correct_num / len(test_loader.dataset) print("Test --- Avg Loss:{},Accuracy:{}\n".format(test_loss,test_accuracy)) return test_loss,test_accuracy模型训练和测试# 模型训练和测试 #模型上device mode = model.to(super_param.device) #记录每个epoch的测试数据、用于绘图 epoch_list = [] loss_list = [] accuracy_list = [] for epoch in range(super_param.epochs): train_model_epoch(model,train_loader,super_param,criterion,optimizer,epoch) test_loss,test_accuracy = test_model(model,test_loader,super_param,criterion) # 数据统计 epoch_list.append(epoch) loss_list.append(test_loss) accuracy_list.append(test_accuracy)查看数据统计结果# 查看数据统计结果 fig = plt.figure(figsize=(12,12),dpi=70) #子图1 ax1 = plt.subplot(2,1,1) title = "hidden_neuron_num={},bach_size={},lr={}".format(super_param.hidden_num,super_param.batch_size,super_param.lr) plt.title(title,fontsize=15) plt.xlabel('Epochs',fontsize=15) plt.ylabel('Loss',fontsize=15) plt.xticks(fontsize=13) plt.yticks(fontsize=13) plt.plot(epoch_list,loss_list) #子图2 ax2 = plt.subplot(2,1,2) plt.xlabel('Epochs',fontsize=15) plt.ylabel('Accuracy',fontsize=15) plt.xticks(fontsize=13) plt.yticks(fontsize=13) plt.plot(epoch_list,accuracy_list,'r') plt.show()隐藏层神经元数量=15隐藏层神经元数量=30隐藏层神经元数量=50
2021年01月15日
744 阅读
0 评论
0 点赞
2021-01-14
linux 路由表设置 之 route 指令详解
linux 路由表设置 之 route 指令详解3 种路由类型主机路由主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。Destination Gateway Genmask Flags Metric Ref Use Iface ----------- ------- ------- ----- ------ --- --- ----- 10.0.0.10 192.168.1.1 255.255.255.255 UH 0 0 0 eth0网络路由网络路由是代表主机可以到达的网络。网络路由的Flags字段为N。例如,在下面的示例中,本地主机将发送到网络192.19.12的数据包转发到IP地址为192.168.1.1的路由器。Destination Gateway Genmask Flags Metric Ref Use Iface ----------- ------- ------- ----- ----- --- --- ----- 192.19.12 192.168.1.1 255.255.255.0 UN 0 0 0 eth0默认路由当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G。例如,在下面的示例中,默认路由是IP地址为192.168.1.1的路由器。Destination Gateway Genmask Flags Metric Ref Use Iface ----------- ------- ------- ----- ------ --- --- ----- default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0route 命令格式设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:# route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]其中:add : 添加一条路由规则del : 删除一条路由规则-net : 目的地址是一个网络-host : 目的地址是一个主机target : 目的网络或主机netmask : 目的地址的网络掩码gw : 路由数据包通过的网关dev : 为路由指定的网络接口route 命令使用查看路由表route命令查看 Linux 内核路由表# route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 # route 目标 网关 子网掩码 标志 跃点 引用 使用 接口 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 route 命令的输出项说明字段含义Destination(目标)目标网段或者主机Gateway(网关)网关地址,”*” 表示目标是本主机所属的网络,不需要路由Genmask(子网掩码)网络掩码Flags(标志)标记。一些可能的标记如下: U — 路由是活动的 H — 目标是一个主机 G — 路由指向网关 R — 恢复动态路由产生的表项 D — 由路由的后台程序动态地安装 M — 由路由的后台程序修改 ! — 拒绝路由Metric(跃点)路由距离,到达指定网络所需的中转数(linux 内核中没有使用)Ref(引用)路由项引用次数(linux 内核中没有使用)Use(使用)此路由项被路由软件查找的次数Iface(接口)该路由表项对应的输出接口修改路由表添加路由添加到主机的路由# route add -host 192.168.1.2 dev eth0 # route add -host 10.20.30.148 gw 10.20.30.40 #添加到10.20.30.148的路由记录添加到网络的路由# route add -net 10.20.30.40 netmask 255.255.255.248 eth0 #添加10.20.30.40的网络 # route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 #添加10.20.30.48的网络 # route add -net 192.168.1.0/24 eth1添加默认路由(网关)# route add default gw 192.168.1.1删除路由删除到主机的路由# route del -host 192.168.1.2 dev eth0:0 # route del -host 10.20.30.148 gw 10.20.30.40删除到网络的路由# route del -net 10.20.30.40 netmask 255.255.255.248 eth0 # route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 # route del -net 192.168.1.0/24 eth1删除默认网关# route del default gw 192.168.1.1屏蔽路由# route add -net 224.0.0.0 netmask 240.0.0.0 reject查看结果Destination Gateway Genmask Flags Metric Ref Use Iface 224.0.0.0 - 240.0.0.0 ! 0 - 0 -说明:增加一条屏蔽的路由,目的地址为 224.x.x.x 将被拒绝参考资料linux 路由表设置 之 route 指令详解:https://blog.csdn.net/chenlycly/article/details/52141854
2021年01月14日
682 阅读
0 评论
0 点赞
2021-01-14
progressbar:python进度条功能
1.安装progressbar安装:pip install progressbar2.使用2.1 用法一import time from progressbar import * total = 1000 def dosomework(): time.sleep(0.01) progress = ProgressBar() for i in progress(range(1000)): dosomework()用法一显示效果5% |### | 100% |#########################################################################|2.2 用法二import time from progressbar import * total = 1000 def dosomework(): time.sleep(0.01) pbar = ProgressBar().start() for i in range(1000): pbar.update(int((i / (total - 1)) * 100)) dosomework() pbar.finish()用法二显示效果5% |### | 100% |#########################################################################|2.3 用法三import time from progressbar import * total = 1000 def dosomework(): time.sleep(0.01) widgets = ['Progress: ',Percentage(), ' ', Bar('#'),' ', Timer(),' ', ETA(), ' ', FileTransferSpeed()] pbar = ProgressBar(widgets=widgets, maxval=10*total).start() for i in range(total): # do something pbar.update(10 * i + 1) dosomework() pbar.finish()widgets可选参数含义:Progress: ' :设置进度条前显示的文字Percentage() :显示百分比Bar('#') : 设置进度条形状Timer() :显示已用时间ETA() : 显示预计剩余时间用法三显示效果Progress: 100% |#############| Elapsed Time: 0:00:10 Time: 0:00:10 981.79 B/s
2021年01月14日
729 阅读
0 评论
0 点赞
2021-01-13
Python中将dataframe转换为字典
Python中将dataframe转换为字典有时候,在Python中需要将dataframe类型转换为字典类型,下面的方法帮助我们解决这一问题。构造dataframeimport pandas as pd a = ['Name', 'Age', 'Gender'] b = ['Ali', '19', 'China'] data = pd.DataFrame(zip(a, b), columns=['project', 'attribute']) print datadataframe转换为字典dict_country = data.set_index('project').T.to_dict('list') print dict_country结果 project attribute 0 Name Ali 1 Age 19 2 Gender China {'Gender': ['China'], 'Age': ['19'], 'Name': ['Ali']}注意事项转置之前需要设置指定的索引,否则会按照默认索引转换成这样:{0: ['Name', 'Ali'], 1: ['Age', '19'], 2: ['Gender', 'China']}参考资料Python中将dataframe转换为字典:https://blog.csdn.net/yuanxiang01/article/details/79634632
2021年01月13日
611 阅读
0 评论
0 点赞
1
...
20
21
22
...
24