116 篇文章带有标签 “python”

基于模板创建Job

基于一个公共的模板运行多个Jobs。 你可以用这种方法来并行执行批处理任务。

使用 Shell 脚本

创建 Job 模板(job-tmpl.yaml)

apiVersion: batch/v1
kind: Job
metadata:
  name: process-item-$ITEM
  labels:
    jobgroup: jobexample
spec:
  template:
    metadata:
      name: jobexample
      labels:
        jobgroup: jobexample
    spec:
      containers:
      - name: c
        image: busybox
        command: ["sh", "-c", "echo Processing item $ITEM && sleep 5"]
      restartPolicy: Never

$ITEM 是占位符,在使用的时候进行替换。

基于模板生成多个 Job YAML

mkdir ./jobs
for i in apple banana cherry
do
  cat job-tmpl.yaml | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml
done

查看 jobs 目录,可以看到下面的结果。

Thonny Python IDE

Thonny

连接 MicroPython 设备进行开发

1. 选择解释器

菜单:运行 -> 选择解释器

2. 打开设备上的文件

菜单:文件 -> 打开

工具栏:打开

单击 MicroPython设备 按钮后,可以看到设备上的文件和目录,选择相应的文件打开。

3. 开发

在编辑器中修改代码,可以保存回 MicroPython 设备。如果需要即时解释执行 Python 语句,只需要在下面的 Shell 窗口输入即可。

4. 上传代码

打开本机上的 Python 代码文件,选择菜单:文件 -> 保存一个副本,选择保存 MicroPython设备。

参考资料

IoT 硬件:Raspberry Pi Camera

配置

Camera

$ sudo raspi-config
  • 3 Interface Options Configure connections to peripherals
  • P1 Camera Enable/disable connection to the Raspberry Pi Camera
  • Yes
reboot

显存

保证显存 >= 128

  • 查看
$ cat /boot/config.txt | grep gpu_mem
gpu_mem=128
  • 修改
$ vim /boot/config.txt

检测 Camera

如果没有检测出来,可以考虑重新插拔试试。

$ vcgencmd get_camera
supported=1 detected=1

验证

拍照 raspistill

  • 打开摄像头,预览2秒后关闭。
raspistill -t 2000
  • 打开摄像头,5秒后拍照(默认),保存为 image.jpg。
raspistill -o image.jpg
  • 打开摄像头,3秒后拍照,保存为 image.png,宽640:高480。
raspistill -t 3000 -o image.png -e png -w 640 -h 480
  • 打开摄像头,30秒内每2秒保存一张照片。
raspistill -t 30000 -tl 2000 -o image%04d.jpg

Python实践

语言

变量

  • 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
  • 可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量。
  • 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。
  • 变量可以被删除,但是对象无法被删除。

函数参数传递

Python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说。

  • 不可变参数
>>> def func(x):
...     x=2
... 
>>> n=1
>>> func(n)
>>> n
1
  • 可变参数
>>> def func(x):
...     x.append(2)
... 
>>> l=[1]
>>> func(l)
>>> l
[1, 2]
  • 最佳实践(不管参数是可变还是不可变,明确地返回值。)
>>> def func(x):
...     pass
...     return x
... 
>>> n=1
>>> n = func(n)
>>> n
1

Python爬虫实践

HTTP Status Code

418 I'm a teapot

import requests

url = "https://movie.douban.com/cinema/later/beijing/"
page = requests.get(url)
print(page.status_code)
418

在头信息中加入 User-Agent 来解决。在 Safari 浏览器中通过选择菜单[开发]->[显示JavaScript控制台],然后选择[网络]->[文稿]->[标头],在内容里的[请求]节可以找到 User-Agent。 import requests url = "https://movie.douban.com/cinema/later/beijing/" headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15'} page = requests.get(url, headers=headers) print(page.

基于NodeMCU(ESP32)搭建Python开发环境

准备

硬件

  • NodeMCU(ESP32) 开发板
  • 数据线,一头是 USB-A 接口,另一头是 Micro-USB 接口。

软件

PINOUT

搭建 MicroPython 开发环境

  • 运行 esptool.py read_mac 命令,确认连接成功。
$ esptool.py read_mac
esptool.py v3.0
Found 2 serial ports
Serial port /dev/cu.usbserial-1410
Connecting....
Detecting chip type... ESP32
Chip is ESP32-D0WD (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 3c:61:05:06:81:9c
Uploading stub...
Running stub...
Stub running...
MAC: 3c:61:05:06:81:9c
Hard resetting via RTS pin...

烧录固件 下载 ESP32固件,选择Firmware with ESP-IDF v3.x下面的GENERIC类别。

基于NodeMCU(ESP8266)搭建Python开发环境

准备

硬件

  • NodeMCU 开发板
  • 数据线,一头是 USB-A 接口,另一头是 Micro-USB 接口。

软件

PINOUT

搭建 MicroPython 开发环境

安装工具

  1. 安装烧录工具 esptool
pip3 install esptool
  1. 运行 esptool.py read_mac 命令,确认连接成功。
$ esptool.py read_mac
esptool.py v3.0
Found 2 serial ports
Serial port /dev/cu.usbserial-0001
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: f4:cf:a2:ec:0a:86
Uploading stub...
Running stub...
Stub running...
MAC: f4:cf:a2:ec:0a:86
Hard resetting via RTS pin...
  1. 查看设备文件
$ ls /dev/cu*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.usbserial-0001

烧录固件 下载 ESP8266固件 wget https://micropython.

基于PyPIServer创建私有Python软件包存储库

服务端

拉取PyPIServer镜像

docker pull pypiserver/pypiserver:latest

部署PyPIServer

  • 只用于客户端下载(用作缓存加速)
docker run -d --restart=always --name pypiserver -p 8080:8080 \
    -v /data/pypi-packages/:/data/packages \
    pypiserver/pypiserver:latest
  • 客户端不仅可以下载还可以上传(当我们自己开发了Python的软件时)
#创建用户名和密码
sudo apt install apache2-utils -y
sudo mkdir /data/pypi-packages
sudo htpasswd -sc /data/pypi-packages/htpasswd.txt wjj
#当您需要再创建用户名时就不需要加参数 -c
sudo htpasswd -s /data/pypi-packages/htpasswd.txt test
#容器部署
docker run -d --restart=always --name pypiserver -p 8080:8080 \
    -v /data/pypi-packages/:/data/packages \
    pypiserver/pypiserver:latest -P /data/packages/htpasswd.txt

Dockerfile OpenCV4 Ubuntu20.04

Dockerfile

FROM ubuntu:20.04
LABEL maintainer="wang-junjian@qq.com"

#auto install tzdata(opencv depend)
ENV DEBIAN_FRONTEND=noninteractive

RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
    python3 python3-pip \
    libglib2.0-dev libgl1-mesa-glx \
    && rm -rf /var/lib/apt/lists/*

RUN ln -s /usr/bin/python3 /usr/bin/python && \
    ln -s /usr/bin/pip3 /usr/bin/pip
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ \
    opencv-python opencv-contrib-python

#set your localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /

CMD bash

在YOLOv5中运行JupyterLab和TensorBoard

构建可用的JupyterLab和TensorBoard

  • 启动YOLOv5容器
docker run --ipc=host --runtime nvidia -it -p 8888:8888 \
    -v ${dataset_dir}:/usr/src/app/project \
    ultralytics/yolov5:latest
  • 安装版本1的TensorBoard。(解决FAQ1的问题:jupyter-tensorboard 0.2.0不支持高于TensorBoard 2.0的版本。YOLOv5镜像中安装的TensorBoard 2.4的版本。)
pip uninstall tensorboard -y && pip install tensorboard==1.15
  • 运行JupyterLab
jupyter lab --no-browser --ip 0.0.0.0 --port 8888
  • 本地浏览器进行访问
http://ip:8888/lab

FAQ Launcher Error - Invalid response: 500 Internal Server Error Uncaught exception POST /api/tensorboard?1609481325314 (192.168.1.

配置pip镜像源

加速 pip 下载安装包的速度。下面使用的是来自于阿里云的镜像源:https://mirrors.aliyun.com/pypi/simple/

国内可用的pip镜像源

https://mirrors.aliyun.com/pypi/simple/
https://pypi.tuna.tsinghua.edu.cn/simple/
http://pypi.douban.com/simple/
https://pypi.mirrors.ustc.edu.cn/simple/
http://pypi.hustunique.com/
http://pypi.sdutlinux.org/

更新pip

# pip install --upgrade pip
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages (20.2.4)

临时使用pip镜像

# pip install -i https://mirrors.aliyun.com/pypi/simple/ package

列出加载配置的路径和配置信息 # pip confi

Python文件、目录、路径操作

导入包

>>> import os
>>> import shutil

文件

拷贝文件

目录路径可以是目录名

>>> shutil.copy('/home/python/main.py', '/home/python/main.py.bak')
>>> shutil.copy('/home/python/main.py', '/home/python/bak/')

创建文件

  • 方法1
open(filename, 'w').close()
  • 方法2
def touch(path):
    with open(path, 'a'):
        os.utime(path, None)
  • 方法3

OS X需要root特权

os.mknod(filename)

修改文件名

>>> os.rename('filename', 'new_filename')

删除文件

>>> os.remove('/home/python/main.py')

目录

拷贝目录树 >>> shutil.

使用YOLOv5训练自定义数据集

在 Ubuntu20.04 系统上使用4张GPU卡基于容器训练模型。

准备数据

project
├── data.yaml           #数据集配置文件
├── models              #网络模型(可以使用下面的脚本自动生成)
│   ├── yolov5s.yaml    #Small
│   ├── yolov5m.yaml    #Medium
│   ├── yolov5l.yaml    #Large
│   └── yolov5x.yaml    #XLarge
├── images              #图片
│   ├── train           #训练集
│   │   ├── 000001.jpg
│   │   ├── 000002.jpg
│   │   └── 000003.jpg
│   └── val             #验证集
│       ├── 000010.jpg
│       └── 000011.jpg
├── labels              #YOLO格式的标注
│   ├── train           #训练集
│   │   ├── 000001.txt
│   │   ├── 000002.txt
│   │   └── 000003.txt
│   └── val             #验证集
│       ├── 000010.txt
│       └── 000011.txt
├── test                #测试图片
└── output              #推理后的标注图片

构建环境

  • 拉取镜像
$ docker pull ultralytics/yolov5:latest
  • 运行容器
$ docker run --ipc=host --runtime=nvidia -it --name project_name-yolov5 \
    -v project_dir:/usr/src/app/project ultralytics/yolov5:latest

使用RetinaNet算法训练自定义数据集

训练自己的数据集

标注数据

LabelImg

#标注后的目录结构
project
└── labelimg
    ├── 20190128155421222575013.jpg
    ├── 20190128155421222575013.xml
    ├── 20190128155703035712899.jpg
    ├── 20190128155703035712899.xml
    ├── 20190129091126392737624.jpg
    └── 20190129091126392737624.xml

构建镜像

  • 拉取
$ sudo docker pull gouchicao/keras-retinanet:latest
  • 手动构建
FROM gouchicao/tensorflow:2.2.0-gpu-jupyter-opencv4-pillow-wget-curl-git-nano
LABEL maintainer="wang-junjian@qq.com"
WORKDIR /
RUN mkdir -p /root/.keras/models/ && \
    wget -O /root/.keras/models/ResNet-50-model.keras.h5 https://github.com/fizyr/keras-models/releases/download/v0.0.1/ResNet-50-model.keras.h5
RUN git clone --depth 1 --recurse-submodules https://github.com/gouchicao/keras-retinanet.git
WORKDIR /keras-retinanet/keras-retinanet
# 提前安装指定版本 keras==2.3.1 解决错误 TypeError: type object got multiple values for keyword argument 'training'
RUN pip install keras==2.3.1 && \
    pip install . && \
    python setup.py build_ext --inplace
WORKDIR /keras-retinanet

将注释从PASCAL VOC转换为YOLO Darknet

PASCAL VOC(Visual Object Classes) 格式

格式

  • 每张图片对应一个xml标注文件。
  • object  标注的对象,一张图片可以有1个或者多个
  • name  类别名
  • bndbox 标注的边框(使用的坐标信息)
  • difficult 目标是否难以识别(0表示容易识别)

0001.xml <annotation> <folder>car</folder> <filename>0001.jpg</filename> <path>/dataset/car/0001.

Jupyter Notebook实践

本地安装

云端环境

Binder

Google Colab

多用户版本

部署