0%

1
from data import aclass

data是当前目录下的文件夹
aclass 在data文件夹里的__init__.py文件里
__init__.py的作用是可以看作是aclass文件夹的基本/默认py文件,有它就可以把data文件夹看作一个py文件。
另一个好处是,在__init__.py使用from .aae import bb,这样就把data文件夹下的所有类聚合到一起了。

使用捷径社区安装快捷指令时,跳转后无法安装,设置中开关是灰色的,其实只要打开快捷指令随便运行一个,就可以输入密码设置打开安装不受信任快捷指令功能了。

1
2
checkpoint = torch.load("checkpoint.pth", map_location=torch.device('cpu'))
model.load_state_dict(checkpoint["state_dict"])
阅读全文 »

“ 你数学那么好 你知道一万年是多久吗 ”

“ 就一万年啊 ”

“ 错 ”

“ 一万年就是当有一个人跟你说 他想当正常人 然后离开了你 从那一天开始之后的每一天 就是一万年 ”

1
2
3
4
5
6
7
sudo su
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

apt-get update && apt-get install -y nvidia-container-toolkit
systemctl restart docker
阅读全文 »

tornado h5跨域会报一种XMLHttpRequest错误,错误代码405。
即使在tornado里设置了跨域,依然报错,这是因为h5跨域请求时要先发一个options请求,需要在Handler里处理一下options请求,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class BaseHandler(tornado.web.RequestHandler):
def set_default_headers(self):
self.set_header('Access-Control-Allow-Origin', '*')
self.set_header('Access-Control-Allow-Headers', '*')
self.set_header('Access-Control-Max-Age', 1000)
self.set_header("Content-Type", "application/json; charset=UTF-8")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
self.set_header('Access-Control-Allow-Headers',
'authorization, Authorization, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods')

class MainHandler(BaseHandler):

async def post(self):
# 接收到图片的base64字符串
jsonbyte = self.request.body.decode('utf8')
jsondict = json.loads(jsonbyte)
picdata = re.sub('^data:image/.+;base64,', '', jsondict["pic"]+"==")
r.sadd("palm",picdata)
# 将图片转换成PIL读取的图片矩阵
binary_data = base64.b64decode(picdata)
img_data = BytesIO(binary_data)
imgtmp = Image.open(img_data).convert("RGB")
res = await predictHandler(imgtmp)
self.finish(res)#finish方法也是调用的write方法

async def options(self):
self.finish()

options方式请求只要通了就行,options请求之后就是正常的post请求了。

在Dockerfile中这么写:

1
2
3
4
5
6
7
FROM face_pytorch:latest

WORKDIR /face_version1

EXPOSE 5015

CMD ["sh","auto.sh"]

在auto.sh中设置多个要执行的命令,如启动redis、运行程序、定期保存文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nohup ./redis-5.0.5/src/redis-server > myredis.txt 2>&1 &
echo "nohup redis-server complete!"
nohup python palm_re_v3.py > mypalmpy.txt 2>&1 &
echo "nohup python palm_re_v3.py complete!"
thetime=$(date "+%H%M") # the time is UTC0 not UTC8
while true
do
thetime=$(date "+%M")
if [ $thetime = '00' ]
then
echo "save pics every hour"
python save_palm_pics.py
fi

done

测试在cpu下一次预测一个图片和一次预测两个消耗时间的对比。
实验中有两个模型,也就是说每个预测里面预测了两次。

实验部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
async def predictHandler3():
global pic_dict,pic_dict_res
keylist = list(pic_dict.keys())
keylist2=list(pic_dict.keys())*2
print("keylist",keylist)
print("keylist2",keylist2)

time1 = time.time()
img = [transform(pic_dict[_]).numpy().tolist() for _ in keylist]
img = torch.FloatTensor(img).cpu()
with torch.no_grad():
outputs1 = palmmodel(img)
outputs2 = handmodel(img)
time2 = time.time()
print(time2-time1)

time3 = time.time()
img = [transform(pic_dict[_]).numpy().tolist() for _ in keylist2]
img = torch.FloatTensor(img).cpu()
with torch.no_grad():
outputs1 = palmmodel(img)
outputs2 = handmodel(img)
time4 = time.time()
print(time4-time3)

然而在gpu上则快非常多。

阅读全文 »