nalg 1.1.0
nalg - no-chip ai alogrithm
Requires Python: >= 3.9

# nALG-V1.1.0

这是S1000e系统中SiC的无图案缺陷检测业务的说明文档，该文档包含安装、使用及调试说明。

## 目录

- [nALG-V1.1.0](#nalg-v110)
  - [需求](#需求)
  - [安装](#安装)
  - [使用教程](#使用教程)

## 需求

- python 3.9+
- Ubuntu 22.04+

## 安装

- 如果是在97服务器上使用，请执行下列命令

```shell
# 安装nalg
git clone -b larry http://192.168.20.98:313/alphabetter/nalg-v1.1.0.git
cd nalg-v1.1.0
# 激活nalg环境
conda activate nalg
```

- 如果是在新机器上使用，请执行下列命令

```shell
# 安装nalg
git clone -b larry http://192.168.20.98:313/alphabetter/nalg-v1.1.0.git
cd nalg-v1.1.0
# 安装torch
# 如果是conda环境
ipython# 如果是pip环境
pip install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install -r requirements.txt
pip install -e .
```

## 使用教程

1. 如果在服务器上运行，请将`configs/dic_demo.yaml`修改成以下格式：

```yaml
DEVICE: "cuda"

# 图像增强相关参数
IMAGE_AUGMENT:
  GAMMA: 1.667  # gamma变换的参数

# 模型相关参数
MODEL:
  # FOV级别的SiC下的DIC检测模型
  FOV:
    WEIGHTS_PATH: "/mnt/data/larry/Weights/S1000e/SiC/DIC/S1000e-SiC-DIC-fov_anomaly_detection.pkl"  # 服务器

    MASK_IMAGE:
      HEIGHT: 224  # 视野级推理时的图片高度
      WIDTH: 224  # 视野级推理时的图片宽度

    ABNORMAL_THRESHOLD: 0.99  # 图片为正常样本的概率阈值，0~1之间，越大越严格

  # FOV级别的SiC下的PL检测模型
  PIX:
    WEIGHTS_PATH: "/mnt/data/larry/Weights/S1000e/SiC/DIC/S1000e-SiC-DIC-pix_defect_detection_x-cpu.onnx"  # 服务器

    CONFIDENCE_THRESHOLD: 0.3  # DIC检出缺陷阈值，0~1之间，越大越严格但会降低召回率

  CLS:
    WEIGHTS_PATH: "/mnt/data/larry/Weights/S1000e/SiC/DIC/S1000e-SiC-DIC-defect_classification.pkl"  # 服务器

# 图像分割相关参数
IMAGE_SLICING:
  HEIGHT: 640  # 像素级推理时的图片高度
  WIDTH: 640  # 像素级推理时的图片高度

  OVERLAP:
    HEIGHT_RATIO: 0.1  # 重叠区域的高度占比
    WIDTH_RATIO: 0.1  # 重叠区域的宽度占比

  POSTPROCESS_TYPE: "NMS"  # 后处理类型
```

2. 具体推理脚本在`tools/surface_defect_detection.py`,其main函数主要流程如下所示：

```python
import logging
from pathlib import Path

from nalg.enigine import Inference
from nalg.utils.logger import configure_logger

logger = logging.getLogger("S1000e")


def main():
  configure_logger(level=logging.INFO)

  # 初始化nalg主业务类，会加载模型,具体参数配置在 configs/dic_demo.yaml 和 configs/pl_demo.yaml中
  inference = Inference("../configs/dic_demo.yaml")  # DIC检测
  # inference = Inference("../configs/pl_demo.yaml")  # PL检测
  
  image_path = Path("../test/images/DIC/defect.png")
  # image_path = Path("../test/images/PL/defect.png")
  
  results_path = Path("../test/labels/DIC/defect.csv")
  # results_path = Path("../test/labels/PL/defect.csv")
  
  final_results_path = Path("../test/labels/DIC/defect_final.csv")
  # final_results_path = Path("../test/labels/PL/defect_final.csv")
  
  # 业务开始
  # 读取图片
  image = inference.read_image(image_path)
  # 预测一张图片是是否存在缺陷，对应方案设计当中 缺陷检测模型I 阶段
  defect_image_type = inference.fov_anomaly_detection(image)
  if defect_image_type:
      logger.info(f"'{image_path}' is normal image")
  else:
      logger.info(f"'{image_path}' is defect image")
      # 本阶段使用图像增强后提升灰阶检出能力
      image = inference.augment_image(image)
      # 预测一张图片的缺陷位置，对应方案设计当中 缺陷检测模型II 阶段
      # 返回的是缺陷位置的坐标，格式为 [[x1, y1, x2, y2], ...]
      predictions_boxes = inference.pix_defect_detection(image)
      # 保存检测结果，csv格式，category_index,x1,y1,x2,y2
      # 保存的txt文件名称与图片名称一致，保存的路径与图片路径一致
      inference.save_predict_pix_predictions(predictions_boxes, results_path)
      # 缺陷分类
      inference.defect_classification(image, predictions_boxes, final_results_path)

if __name__ == "__main__":
    main()
```

最终结果保存在`final_results_path`中，格式为`category_index,x1,y1,x2,y2`，其中`category_index`为缺陷类别，`x1,y1,x2,y2`为缺陷位置的坐标。

### FQA

Q001: 推理时候图像分辨率选择

A001: 目前在代码中增加了图像裁图功能，理论上可以支持任意640倍数的图像，例如1280x1280, 2560x2560 **请注意后续会从算法中删除掉**

Q002: 支持哪些图像格式

A002: jpg, png, bmp

Q003: DIC和PL功能目前是否完整（不包括决策系统）

A003: 目前DIC和PL功能除PL分类算法未研发完成以外，其余部分已经完整，但是还没有经过大量的测试，如果有问题请及时反馈