README.md 3.1 KB
Newer Older
H
haoyuying 已提交
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
## 模型概述

barometer_reader是基于PaddleX实现对传统机械式指针表计的检测与自动读数功能的模型。该模型首先使用目标检测模型检测出图像中的表计,随后使用语义分割模型将各表计的指针和刻度分割,最后根据指针的相对位置和预知的量程计算出各表计的读数。

## 命令行预测

```
$ hub run barometer_reader --input_path "/PATH/TO/IMAGE"

```

## API

```python
def predict(self, 
            im_file: Union[str, np.ndarray], 
            score_threshold: float = 0.5, 
            seg_batch_size: int = 2, 
            erode_kernel: int = 4, 
            use_erode: bool = True, 
            visualization: bool = False, 
            save_dir: str ='output'):
```

预测API,用于表针读数。

**参数**

* im_file (Union\[str, np.ndarray\]): 图片路径或者图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* score\_threshold (float): 检测模型输出结果中,预测得分低于该阈值的框将被滤除,默认值为0.5;
* seg\_batch\_size (int): 分割的批量大小,默认为2;
* erode\_kernel (int): 图像腐蚀操作时的卷积核大小,默认值为4;
* use\_erode (str): 是否使用图像腐蚀对分割预测图进行细分,默认为False;
* visualization (bool): 是否将可视化图片保存;
* save_dir (str): 保存图片到路径, 默认为"output"。

**返回**

* res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,关键字有 'category\_id', 'bbox', 'score','category', 对应的取值为:
  * category\_id (int): bounding box框出的图片的类别号;
  * bbox (list): bounding box数值;
  * score (float): bbox类别得分;
  * category (str):  bounding box框出的图片的类别名称。


## 代码示例

```python
import cv2
import paddlehub as hub

model = hub.Module(name='barometer_reader')
res = model.predict('/PATH/TO/IMAGE')
print(res)
```

## 服务部署

PaddleHub Serving可以部署一个表计识别的在线服务。

## 第一步:启动PaddleHub Serving

运行启动命令:

```shell
$ hub serving start -m barometer_reader
```

默认端口号为8866。

**NOTE:** 如使用GPU预测,则需要在启动服务之前,设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。

## 第二步:发送预测请求

配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果

```python
import requests
import json
import cv2
import base64


def cv2_to_base64(image):
    data = cv2.imencode('.jpg', image)[1]
    return base64.b64encode(data.tostring()).decode('utf8')


if __name__ == '__main__':
    # 获取图片的base64编码格式
    img = cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))
    data = {'image': img}
    # 指定content-type
    headers = {"Content-type": "application/json"}
    # 发送HTTP请求
    url = "http://127.0.0.1:8866/predict/barometer_reader"
    r = requests.post(url=url, headers=headers, data=json.dumps(data))
    # 打印预测结果
    print(r.json())
```

### 查看代码

https://github.com/PaddlePaddle/PaddleX


### 依赖

paddlepaddle >= 2.0.0

paddlehub >= 2.0.0

paddlex >= 1.3.0