The Bolg of WoodyBuendia
WoodyBuendia个人博客

【解决办法】win10华硕笔记本音频服务未响应或者播放失败请切换输出设备

woody阅读(36)

我要被我的笔记本逼疯了,平时很少用到音频,基本也不用笔记本听声音。

但是我的笔记本一直有问题,总是音频服务未响应,表现为chrome播放在线视频没有声音,网易云音乐播放时提示:播放失败 请切换输出设备。

之前可以重启或者重启音频服务解决问题,但是今天上午无论无任何都不能使笔记本出声。一度想砸了电脑。

反复卸载重装声卡驱动也无法解决。

最终找到问题所在:windows音频服务的登陆设置有错误。

打开Windows Audio服务,选择登陆选项卡,选择第二项:此账户,浏览,输入local会自动选择本地服务,密码为空,选择应用。电脑立马出声。

我的第一个Pyhton程序:通过百度地图API自动查询路况

woody阅读(187)

说明

——人生苦短,我学Python。

说学Python说了很久,书买了很多,网上资源也下载和保存了很多,然后依然没有开始动手写过一句python。终于,今天写了第一段我的Python代码。

本文面向Python小白,大神请无视。

推荐使用Spyder

功能

根据百度地图Web API,查询指定地点或区域的路况信息,并记录在txt文件中。根据一天中不同的时段,分别间隔2min、10min和30min自动查询。

准备

1.申请百度地图开发者账号,获得百度地图Web API的AccessKey。

2.准备Python环境

有句名言,学Python的人,一半都被Python的环境劝退了。这是真的,太复杂了。经过不断的摸索和报错,我建议使用Spyder作为Python的集成开发环境(IDE),Spyder是一款科学python开发环境,极度适合习惯Matlab的用户。通过Anaconda Navigator主页中打开。

Python程序

import requests
import sys
import re
from datetime import datetime
import time

def getAK():
    f = open('AK.txt','r')
    AccessKey = f.read()
    f.close()
    return AccessKey

def getcenter(address):
    AK = getAK()
    #url = 'http://api.map.baidu.com/geocoding/v3/?address=烟台市玲珑路与金城路交叉口&output=json&ak='+AK+'&callback=showLocation'
    url = 'http://api.map.baidu.com/geocoding/v3/?address='+address+'&output=json&ak='+AK+'&callback=showLocation'
    response = requests.get(url)
    datas = response.text
    numAll = re.findall('\d+',datas)
    lng = numAll[1]
    lng2 = numAll[2]
    lat = numAll[3]
    lat2 = numAll[4]
    center = str(lat)+'.'+str(lat2)+','+str(lng)+'.'+str(lng2)
    return center

AK = getAK()
modeltpye = 1

if modeltpye == 1:
    #model 1 center location of given longitude and latitude
    address = '烟台市轸大路与澳柯玛大街交叉口'
    #address = '烟台市红旗中路与上夼西路'
    Center = getcenter(address)
    url = 'http://api.map.baidu.com/traffic/v1/around?ak='+AK+'&center='+Center+'&radius=500&coord_type_input=gcj02&coord_type_output=gcj02'
elif modeltpye == 2:
    #model 2 given road and city
    roadname = '红旗中路'
    city = '烟台市'
    url = 'http://api.map.baidu.com/traffic/v1/road?road_name='+roadname+'&city='+city+'&ak='+AK

datatime = datetime.now().strftime("%Y-%m-%d %H_%M_%S")

f = open('data_'+datatime+'.txt','w')

try:
    while True:
        datatime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        datatime_H = int(datetime.now().strftime('%H'))
        busytime = [6,7,8,10,11,12,13,16,17,18]
        cleartime = [0,1,2,3,4,5,23]
        if datatime_H in busytime:
            timestep = 60*2
        elif datatime_H in cleartime:
            timestep = 60*30   
        else:
            timestep = 60*10

        f.write(datatime)
        f.write('\n')
        response = requests.get(url)
        datas = response.text
        count = datas.split("\r\n")
        f.write(datas)
        f.write('\n')
        f.flush()
        print(datatime)
        time.sleep(timestep)
except KeyboardInterrupt:
     print(datatime)
    
f.close()
 

解释

导入依赖的库

import requests
import sys
import re
from datetime import datetime
import time

定义两个函数

函数 getAK(),用来获取事先保存在同一目录下的AK.txt文件,文本中实现写入了你的百度AccessKey。通过这种方式让AccessKey适当隐藏一下。

函数 getcenter() 通过给定的地点,从百度API中查询对应的经纬度,默认是BD09:为百度坐标系。

主要功能实现

通过request模块,来实现对链接的访问,以及读取返回的信息。url的构造参考百度Web API的说明。

url = 'http://api.map.baidu.com/geocoding/v3/?address='+address+'&output=json&ak='+AK+'&callback=showLocation'
    response = requests.get(url)
    datas = response.text

定时与写入文本

通过time.sleep控制程序查询时间间隔,使用try和except循环和中断。

try:
    while True:
        datatime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
       ...
        time.sleep(timestep)
except KeyboardInterrupt:
     print(datatime)

通过f.open(), f.write()读写文本。并且通过每次写入后添加f.flush()来将缓存及时写入磁盘,这样就可以在运行过程中随时写入和保存,方便查看结果。

存在的问题

由于区分了忙碌时间和空闲时间,忙碌时间查询间隔为2分钟一次,空闲时段查询时间为30分钟一次,其余时间查询间隔为10分钟。

使用time.sleep()来是循环等待对应时间,通过Crt+C来中断循环。但是发现程序进去time.sleep()之后就无法中断,必须等待sleep时间结束,才会中断进程。例如,空闲时段中,按下Ctrl+C无法立刻结束进程,必须等待当前time.sleep(60*30)走完才可以结束。

效果

丢到服务器里面自动跑。

题外话

Python的模式匹配很好用啊,但是正则表达式还没学会。。另外能不能得到百度地图的实时用户数量分布?这样及时不堵车,也能看到车流量。

深度学习之图像目标检测分类-真手把手教程

woody阅读(352)

0.吐槽

本人python零基础(16年就买了py学习手册一直没看完),深度学习零基础(17年买的花书翻了三页纸),突发奇想(领导要求),上马深度学习图像分类,三天时间跑起来python识别图像并对图片内容进行识别和框选分类。

吐槽:都说Python编程简洁,python的宗旨是:优美胜于丑陋、明了胜于晦涩、简洁胜于复杂、复杂胜于凌乱…..可是python的安装和各种编译器、各种库、各种pip、pip3、conda、wheel完全就把我弄昏了头。好不容易装起来了,又是各种路径、环境、配置乱七八糟各种问题,日了狗了。。真还不如MATLAB来的简单。。。好了吐槽归吐槽,本文让你从小白到运行py如飞。

1.清单

为避免文章冗长无章,先把所需清单和背景知识列举一下。

关键参考文献:Object detection and tracking in PyTorch,原作者简介: Chris Fotache is an AI researcher with CYNET.ai based in New Jersey. He covers topics related to artificial intelligence in our life, Python programming, machine learning, computer vision, natural language processing and more.

该文章中英文对照 用PyTorch来做物体检测和追踪

所需软件:python3.7、Anaconda

本来用的是PyCharm作为编辑器,Anaconda为python库环境,但是PyCharm使用的时候总是遇到问题,后面在Anaconda里面也找到了python的命令行窗口,总算把程序跑起来了。

运行平台:windows 10

2.安装和下载

2.1 安装python

打开python官网,下载win平台最新版3.7,

https://www.python.org/downloads/windows/

安装python,需要注意的是,勾选添加至系统路径。

2.2 安装anaconda

Anaconda安装文件较大,下载安装。Anaconda 是一个管理python的库的平台,众所周知,python之所以强大,是因为有各种库。需要什么功能,首先寻找有没有库,这也导致了python的库版本众多,管理困难,开发环境混乱。

下载链接

2.3 下载文件

根据 参考文献:Object detection and tracking in PyTorch, 下载所需文件,下载地址为GitHub:https://github.com/cfotache/pytorch_objectdetecttrack

下载权重文件 yolov3.weights (236MB), 将该文件放入config文件夹中,下载地址:https://pjreddie.com/media/files/yolov3.weights

2.4 安装python库

所需库:pytorch、opencv、matplotlib

运行Anaconda Prompt

在Pytorch官网选择自己的版本和平台,找到相应安装的命令。

https://pytorch.org/

我这里选择python3.7 ,conda安装,无CPU版。

在打开的 Anaconda Prompt 中输入下面命令安装pytorch

conda install pytorch-cpu torchvision-cpu -c pytorch

在Anaconda Prompt中输入:conda install matplotlib安装matplot库

打开Anaconda Navigator

左侧选择Environment

搜索opencv,会出来三个,勾选后点击右下角的apply安装。

注意:如果勾选后选择安装出现错误,那么在creat中新建一个环境

我的就报错了,新建了一个名为opencv的环境,注意,这个环境与默认的base环境是独立的,之前安装的pytorch和matplot都还需要在安装一边。

由于anaconda环境不同,在anaconda prompt中,输入:

activate opencv (此处是你新建的环境名称)

切换到新环境之后,重新安装 pytorch和matplot

3 物体检测代码Object Detection in Images

在从GitHub下载到的文件夹,名为:pytorch_objectdetecttrack-master,中新建python脚本:test.py

3.1脚本

输入以下代码:

from models import *
from utils import *
import os, sys, time, datetime, random
import torch
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from torch.autograd import Variable
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

config_path='config/yolov3.cfg'
weights_path='config/yolov3.weights'
class_path='config/coco.names'
img_size=416
conf_thres=0.8
nms_thres=0.4
# Load model and weights
model = Darknet(config_path, img_size=img_size)
model.load_weights(weights_path)
model.cuda()
#model.cpu()

model.eval()
classes = utils.load_classes(class_path)
Tensor = torch.cuda.FloatTensor

def detect_image(img):
    # scale and pad image
    ratio = min(img_size/img.size[0], img_size/img.size[1])
    imw = round(img.size[0] * ratio)
    imh = round(img.size[1] * ratio)
    img_transforms=transforms.Compose([transforms.Resize((imh,imw)),
         transforms.Pad((max(int((imh-imw)/2),0),
              max(int((imw-imh)/2),0), max(int((imh-imw)/2),0),
              max(int((imw-imh)/2),0)), (128,128,128)),
         transforms.ToTensor(),
         ])
    # convert image to Tensor
    image_tensor = img_transforms(img).float()
    image_tensor = image_tensor.unsqueeze_(0)
    input_img = Variable(image_tensor.type(Tensor))
    # run inference on the model and get detections
    with torch.no_grad():
        detections = model(input_img)
        detections = utils.non_max_suppression(detections, 80,
                        conf_thres, nms_thres)
    return detections[0]

# load image and get detections
img_path = "images/blueangels.jpg"

prev_time = time.time()
img = Image.open(img_path)
detections = detect_image(img)
inference_time = datetime.timedelta(seconds=time.time() - prev_time)
print ('Inference Time: %s' % (inference_time))
# Get bounding-box colors
cmap = plt.get_cmap('tab20b')
colors = [cmap(i) for i in np.linspace(0, 1, 20)]
img = np.array(img)
plt.figure()
fig, ax = plt.subplots(1, figsize=(12,9))
ax.imshow(img)
pad_x = max(img.shape[0] - img.shape[1], 0) * (img_size / max(img.shape))
pad_y = max(img.shape[1] - img.shape[0], 0) * (img_size / max(img.shape))
unpad_h = img_size - pad_y
unpad_w = img_size - pad_x
if detections is not None:
    unique_labels = detections[:, -1].cpu().unique()
    n_cls_preds = len(unique_labels)
    bbox_colors = random.sample(colors, n_cls_preds)
    # browse detections and draw bounding boxes
    for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:
        box_h = ((y2 - y1) / unpad_h) * img.shape[0]
        box_w = ((x2 - x1) / unpad_w) * img.shape[1]
        y1 = ((y1 - pad_y // 2) / unpad_h) * img.shape[0]
        x1 = ((x1 - pad_x // 2) / unpad_w) * img.shape[1]
        color = bbox_colors[int(np.where(
             unique_labels == int(cls_pred))[0])]
        bbox = patches.Rectangle((x1, y1), box_w, box_h,
             linewidth=2, edgecolor=color, facecolor='none')
        ax.add_patch(bbox)
        plt.text(x1, y1, s=classes[int(cls_pred)],
                color='white', verticalalignment='top',
                bbox={'color': color, 'pad': 0})
plt.axis('off')
# save image
plt.savefig(img_path.replace(".jpg", "-det.jpg"),
                  bbox_inches='tight', pad_inches=0.0)
plt.show()

3.2 运行python

在打开的Anaconda Navigator中,选择环境,点击三角形箭头,在菜单中选择open with python

输入import torch,导入模块;

输入torch.cuda.is_available(),测试计算机是否有显卡。

讲道理pytorch是支持无显卡,纯CPU模式的,但是需要改代码,我不会,下载到的这个代码是GPU模式的。。好在我的笔记本有显卡,虽然很破,但是不会报错。另外,一般讲道理这里不应该通过anaconda来运行python的,而是通过PyCharm来编辑py代码和运行的。但是我的pycharm运行显卡测试时,总是Fase,换成anaconda打开的python,就显示Ture。这可能和笔记本的独显和集显有关。

3.3切换工作目录

把通过anaconda启动的python命令行的工作目录切换到保存pytorch_objectdetecttrack-master的目录

输入:import os

输入:os.getcwd() 获取当前工作目录

输入os.chdir(”) 改变工作目录,我这里输入

import os
os.chdir('D:/Python/pytorch_objectdetecttrack-master/pytorch_objectdetecttrack-master/')

3.4运行代码

在命令行输入:exec(open(‘test.py’).read()) 来执行test.py,即可检测图片中的物体。

4效果

内网穿透frp部署记录总结

woody阅读(908)

根据网上教程摸索出来一套可用的方法,记录如下。

frp介绍

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

项目地址:https://github.com/fatedier/frp/blob/master/README_zh.md

ubuntu上搭建frp

本人ubuntu小白,根据网上教程摸索出来一套可用的方法,记录如下。防止再次检索。

一键安装:https://github.com/MvsCode/frp-onekey

Frps服务端一键配置脚本,最新版本:0.27.1

ubuntu安装方法:

以管理员身份运行:(ubuntu中,sudo代表以管理员身份运行)

sudo wget https://raw.githubusercontent.com/MvsCode/frp-onekey/master/install-frps.sh -O ./install-frps.sh

sudo chmod 700 ./install-frps.sh
sudo ./install-frps.sh install

frps默认安装路径:/usr/local/frps/

根据提示一步一步完成配置,默认选项即可。可修改端口以防止扫描。

配置完成之后,会提示配置信息,主要保存。尤其是dashboard登陆密码和token。

客户端配置

根据平台不同,下载不同客户端,修改客户端中frpc.ini文件,需要填写的信息如下:

[common]
server_addr = 35.229.160.101
server_port = 65500
token = ************

[IoT_223]
type = tcp
local_ip = 0.0.0.0
local_port = 3389
remote_port = 6006

[S223]
type = http
local_port = 8080
subdomain =iot

上述frpc.ini配置中,common中的token为服务器的token。第二项[IoT_223]为当前客户端的名称,可以任意修改。本地端口和远程端口按照需要修改,这里3389为本地远程连接端口,服务器远程端口6006为任意可用端口。

这样,客户端在frpc.exe文件夹中运行cmd,cmd中输入fprc即可。显示如下信息即表明运行成功:

frp管理平台

我的管理平台为:http://woodybuendia.site:****

服务器配置中,dashboard意为管理平台,打开方式为在浏览器中输入IP/域名:dashboardPort

打开之后需要输入用户名和密码,打开之后的效果如下:默认显示Overview

在左侧点击TCP可以看到当前连接的客户端

frp内网穿透的意义

1.远程桌面

例如:客户端(公司内网的计算机),需要在公司以外的地方访问,传统方法可以使用TeamView软件等,进行连接。

使用frp内网穿透之后,可以直接在windows自带的远程桌面中,输入****.woodybuendia.site:****

注意到,这里的前缀和端口是frpc.ini文件中自己配置的。

2.远程访问家里/办公室的NAS

使用NAS的同学知道,在局域网中的NAS设备,是通过固定IP访问。如果使用frp内网穿透,可以直接使用次级域名加端口形式直接访问,比如我家里的NAS可以任何网络,在浏览器中输入地址: http://***.woodybuendia.site:****/ 访问。

该项属于:通过自定义域名访问部署于内网的 web 服务

frp服务背景运行和自动启动

windows平台:设置开机启动和后台运行

NAS: https://blog.ysoup.org/tech/synology-nas-frp-frpc.html

Ubuntu: https://free-e.net/109

Frp与架设在Google Cloud platform(GCP)上的VPS端口问题

在将VPS送Linode迁徙到Google Cloud platform(GCP)上时,重新部署Frp,总是遇到配置完成之后无法访问 frp的dashboard ,经查证,是由于GCP实例主机的防火墙没有开发对应端口导致,GCP默认只开放几个常用端口,需要在GCP控制面板配置防火墙出入站规则。