# 反馈卡智能识别

反馈卡智能识别是针对智能教室、教育信息化、教育解决方案,作业反馈卡实时识别分析能力,通过此能力可以实现实时扫描的同步获得反馈卡识别结果。

# 能力特点

  • 自主研发的深度学习目标检测算法,识别准确率达99%以上。

  • 结合高速扫描,支持多学生、多页面的海量反馈卡识别场景。

  • 能实现边扫描边识别,实时获得识别结果,无需等待所有文稿全部扫描完成后再进行识别处理。

注意

打印的反馈卡需按照模板生成并打印,请联系我们获取模板示例文件

识别样例

# 识别元素

  • 二维码(QR)内容信息

  • 填涂的学号或条形码

  • 章节顺序

  • 各章节内小题的填涂区域位置(已填涂的小题序号)

# 使用流程

img.png

  1. 创建识别任务,传入接收识别结果回调的地址(callback_url),获得直传代理地址(direct_addr)。

  2. 创建扫描任务,开启直传模式,直传地址传入生成的direct_addr,其他参数可自由设置。

  3. 开始扫描并直传到识别模块进行识别。

  4. 识别模块会将每个学生的识别结果分别回调至创建识别任务时传入的回调地址(callback_url)。

注意

  1. 请确保扫描仪放置的纸张顺序,如每个学生有多页反馈卡,每个学生的反馈卡需按顺序放置,不可穿插、正反颠倒。
  2. 反馈卡的正面(带有二维码的一面)需面向扫描仪头向下放置。

# 创建识别任务接口 API

创建识别任务,指定用于接收识别结果回调的地址并生成用于接收扫描实时直传数据的代理地址。每次扫描识别需创建不同的识别任务,同一个识别任务不可用于多个扫描任务。

POST /api/application/ess/create

  • 请求参数(JSON Body):
名称 类型 必选 默认值 说明
callback_url String 用于接收识别结果回调的地址
  • 响应参数(JSON Body):
名称 类型 必选 说明
code Integer 状态码
msg String 状态描述
data Object 响应数据
data.uuid String 此次识别任务的UUID (识别回调通知中会携带此UUID)
data.direct_addr String 识别模块接收此扫描任务直传数据的直传地址
data.expires_at Integer 此次识别任务的过期时间(Unix时间戳,单位:秒。 达到过期时间之后,扫描任务会自动销毁,一般为24小时之后
  • 成功示例:

HTTP Status 200

{
  "code": 0,
  "msg": "ok",
  "data": {
    "uuid": "e3c12d89-xxxx-406d-9350-66906d3318b0",
    "direct_addr": "https://aa-ess.kfbcloud.com/direct/e3c12d89-xxxx-406d-9350-66906d3318b0",
    "expires_at": 1634808477
  }
}
1
2
3
4
5
6
7
8
9
  • 失败示例:

HTTP Status 200

{
  "code": 20005,
  "msg": "未获得应用能力权限",
  "data": null
}
1
2
3
4
5

查看全部状态码

# 接收识别结果回调 Callback

在服务端上实现一个HTTP接口接收识别结果任务完成结果(接口地址为创建识别任务时设置的callback_url,通过HTTP POST请求发送)。

注意

  • 当Web服务接收到回调请求后,需要在 5秒 内给出任意的 HTTP StatusOK (Status Code 200) Response响应(建议返回空字符串)。

  • 若5秒内未完成响应或响应的状态码不是200,则认为此次回调失败。失败后会再进行3次重试,分别在前次回调失败后的 8秒13秒21秒

  • 请求类型(Request Method):POST
  • 请求头(Request Header):
名称 说明
User-Agent 固定为:KIC
Content-Type 固定为:application/json
X-KIC-Callback-ID 回调消息ID,例如:1607df56-5077-478e-a252-2054f1292ba6
  • 请求消息体(Request Body):

消息体固定为JSON 格式,包含以下结构:

名称 类型 必选 说明
uuid String 识别任务的UUID
finish Bool 是否已完成所有的页面识别
error_code Integer 详见 识别模块错误码
pages Object Array 用于识别该学生反馈卡的扫描页面信息
pages[Index].paper_number Integer 此页面的纸张页数
(第几页纸张,当开启双面扫描并开启跳过空白页时,可能出现跳页,识别到空白页不传输)
pages[Index].page_number Integer 此页面的页面数
(第几面,如第二张纸的面为3,当开启双面扫描并开启跳过空白页时,可能出现跳页,识别到空白页不传输)
pages[Index].front Bool 此页面是否为正面(扫描稿件朝向扫描仪的一面为正面)
pages[Index].item_id Integer 扫描数据的批次ID。
与scan.item_data回调通知中的item_id一致。
pages[Index].temp_download_url String 该页面图像(jpg)的临时下载地址,1小时内有效
result Object 识别结果
result.student_id String 学号(学号区域填涂或条形码内容)
result.qrcode String 二维码(QR)内容
result.fills 2D Int Array 填涂位置(二维数组)
第一维:章节数组(对应识别到的章节数量,按顺序排列)
第二维:填涂区域序号(区域序号从左到右,从上到下顺序,从1开始)
  • 请求Body示例1:
{
  "uuid": "e3c12d89-xxxx-406d-9350-66906d3318b0",
  "finish": true,
  "error_code": 0,
  "pages": [
    {
      "front": true,
      "paper_number": 1,
      "page_number": 1,
      "item_id": 1,
      "temp_download_url": "xxxxxx"
    },
    {
      "front": false,
      "paper_number": 1,
      "page_number": 2,
      "item_id": 1,
      "temp_download_url": "xxxxxx"
    }
  ],
  "result": {
    "student_id": "02344444",
    "qrcode": "http://192.168.1.196:5500/anwserSheet.html",
    "fills": [
      [1, 3, 5, 6], // 第一个章节,第1, 3, 5, 6个框填涂
      [1, 3], // 第二个章节,第1, 3个框填涂
      [], // 第三个章节, 无填涂
      [], // 第四个章节,无填涂
      [1, 3, 10, 20],  // 第五个章节,第1, 3, 10, 20个框填涂
      [1, 4],  // 第六个章节,第1,4个框填涂
      [] // 第七个章节,无填涂
    ]
  }
}
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
  • 请求Body示例2:
{
  "uuid": "e3c12d89-xxxx-406d-9350-66906d3318b0",
  "finish": true,
  "error_code": 0,
  "pages": [
    {
      "front": true,
      "paper_number": 1,
      "page_number": 1,
      "item_id": 1,
      "temp_download_url": "xxxxxx"
    },
    {
      "front": false,
      "paper_number": 1,
      "page_number": 2,
      "item_id": 1,
      "temp_download_url": "xxxxxx"
    }
  ],
  "result": {
    "student_id": "02344444",
    "qrcode": "http://192.168.1.196:5500/anwserSheet.html",
    "fills": [
      [], // 第一个章节,无填涂
      [], // 第二个章节,无填涂
      [], // 第三个章节, 无填涂
      [], // 第四个章节,无填涂
      [], // 第五个章节,无填涂
      [], // 第六个章节,无填涂
      []  // 第七个章节,无填涂
    ]
  }
}
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
  • 请求失败Body示例:
{
  "uuid": "e3c12d89-xxxx-406d-9350-66906d3318b0",
  "finish": true,
  "error_code": 1001,
  "pages": [
    {
      "front": true,
      "paper_number": 1,
      "page_number": 1,
      "item_id": 1,
      "temp_download_url": "xxxxxx"
    },
    {
      "front": false,
      "paper_number": 1,
      "page_number": 2,
      "item_id": 1,
      "temp_download_url": "xxxxxx"
    }
  ],
  "result": null
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 接收识别任务结束回调 Callback

在服务端上实现一个HTTP接口并接收识别任务结束回调(接口地址为创建识别任务时设置的callback_url,通过HTTP PUT请求发送)。

当本次识别任务全部结束时,并且在所有学生的识别结果回调完成后,识别模块会 同步的 发出该结束回调。

  • 请求类型(Request Method):PUT
  • 请求头(Request Header):
名称 说明
User-Agent 固定为:KIC
Content-Type 固定为:application/json
X-KIC-Callback-ID 回调消息ID,例如:1607df56-5077-478e-a252-2054f1292ba6
  • 请求消息体(Request Body):

消息体固定为JSON 格式,包含以下结构:

名称 类型 必选 说明
uuid String 识别任务的UUID
finish Bool 识别任务是否已全部完成
  • 请求Body示例:
{
  "uuid": "e3c12d89-xxxx-406d-9350-66906d3318b0",
  "finish": true
}
1
2
3
4

# 识别模块错误码

错误码 说明
0 成功
1001 未识别到学号
1002 未识别到二维码
1003 无法定位章节
1004 获取图像错误
1005 数据通讯错误
50003 无页面数据