据网约车监管信息交互平台统计,截至2022年7月31日,全国共有279家网约车平台公司取得网约车平台经营许可,各地共发放网约车驾驶员证460.0万本、车辆运输证188.2万本,至7月份共收到订单信息6.95亿单。网约车司机的身份、驾驶证、行驶证、车辆信息的收集和管理是一项非常艰巨的任务,安全合规地收集管理网约车的信息可以有效的保障乘客的安全,加强对驾驶员的审核,提升出行的安全。
那么,AI技术如何赋能网约车平台企业提质增效呢?
下面,详细介绍如何使用腾讯云智能文字识别实现网约车相关信息收集的实现过程。
一、准备工作
为了使用腾讯云汽车相关识别能力,需要做以下几个准备工作。
1.1、 免费体验汽车相关识别
在使用腾讯云汽车相关识别之前,通过腾讯云官网体验汽车相关识别服务。
腾讯云智能文字识别赠送了免费的资源包,其中行驶证/驾驶证识别月免费资源包、车辆vin码识别和车牌识别分别有月免费资源包1000次免费额度,可以在资源包管理页面查看资源包使用情况。
1.2、控制台监控信息
经过使用,我了解到所有文字识别服务的使用情况都可以在控制台中查看使用信息,可以从下图看到统计出当前月份的调用情况、计费情况、成功数、成功率等。
二、操作流程
通过以下几个步骤,就可以使用腾讯云智能文字识别的汽车相关识别功能实现网约车司机信息收集。
- 获取个人密钥
- 查看汽车识别相关API文档
- 使用腾讯云智能文字识别的汽车相关识别功能实现网约车司机信息收集
2.1、获取个人密钥
在腾讯云访问管理的API密钥管理页面,我们新建一个个人密钥。
2.2、查看汽车识别相关API文档
网约车驾驶证识别API接口、行驶证识别API接口、车牌识别API接口
2.3、使用腾讯云AI文字识别的汽车相关识别功能实现网约车公司信息收集
网约车公司信息收集实现过程中主要分为以下几个步骤:
- 安装环境依赖的SDK、调用汽车相关识别接口
- 体验网约车公司信息收集的效果
2.3.1 安装环境依赖的SDK、调用汽车相关识别接口
package test
import (
"encoding/base64"
"encoding/csv"
"encoding/json"
"fmt"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
ocr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ocr/v20181119"
"io"
"io/ioutil"
"log"
"os"
)//Resp 响应体
type Resp struct {
Response map[string]string
}//RespFrontInfo 响应体
type RespFrontInfo struct {
Response FrontMsg
}
//FrontMsg 行驶证识别正面
type FrontMsg struct {
FrontInfo map[string]string
}//ImageCarIdentify 网约车公司信息收集入口函数
func ImageCarIdentify(path string, fileName string, infoType int64) (string, error) {
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
credential := common.NewCredential(
"secretId",
"secretKey",
)
// 实例化一个client选项,可选的,没有特殊需求可以跳过
cpf := profile.NewClientProfile()
cpf.HttpProfile.Endpoint = "ocr.tencentcloudapi.com"
// 实例化要请求产品的client对象,clientProfile是可选的
client, _ := ocr.NewClient(credential, "ap-guangzhou", cpf)
//读取图片base64
toBase64Str, err := imageToBase64(path + fileName)
resp := ""
if infoType == 1 {
resp, err = imageType1(*client, toBase64Str)
WriteOnlineCarDriverToCsv(resp)
}
if infoType == 2 {
resp, err = imageType2(*client, toBase64Str)
WriteOnlineCarDrivingToCsv(resp)
}
if infoType == 3 {
resp, err = imageType3(*client, toBase64Str)
WriteLicensePlateToCsv(resp)
}
if err != nil {
return "", err
}
fmt.Println(resp)
return resp, nil
}//imageType1 网约车驾驶证识别
func imageType1(client ocr.Client, toBase64Str string) (string, error) {
// 实例化一个请求对象,每个接口都会对应一个request对象
request := ocr.NewRideHailingDriverLicenseOCRRequest()
request.ImageBase64 = common.StringPtr(toBase64Str)
// 返回的resp是一个ImageEnhancementResponse的实例,与请求对象对应
response, err := client.RideHailingDriverLicenseOCR(request)
if _, ok := err.(*errors.TencentCloudSDKError); ok {
fmt.Printf("An API error has returned: %s", err)
return "", err
}
if err != nil {
return "", err
}
return response.ToJsonString(), nil
}//imageType2 行驶证识别
func imageType2(client ocr.Client, toBase64Str string) (string, error) {
// 实例化一个请求对象,每个接口都会对应一个request对象
request := ocr.NewVehicleLicenseOCRRequest()
request.ImageBase64 = common.StringPtr(toBase64Str)
request.CardSide = common.StringPtr("FRONT")
// 返回的resp是一个ImageEnhancementResponse的实例,与请求对象对应
response, err := client.VehicleLicenseOCR(request)
if _, ok := err.(*errors.TencentCloudSDKError); ok {
fmt.Printf("An API error has returned: %s", err)
return "", err
}
if err != nil {
return "", err
}
return response.ToJsonString(), nil
}//imageType3 车牌识别
func imageType3(client ocr.Client, toBase64Str string) (string, error) {
// 实例化一个请求对象,每个接口都会对应一个request对象
request := ocr.NewLicensePlateOCRRequest()
request.ImageBase64 = common.StringPtr(toBase64Str)
// 返回的resp是一个ImageEnhancementResponse的实例,与请求对象对应
response, err := client.LicensePlateOCR(request)
if _, ok := err.(*errors.TencentCloudSDKError); ok {
fmt.Printf("An API error has returned: %s", err)
return "", err
}
if err != nil {
return "", err
}
return response.ToJsonString(), nil
}//WriteOnlineCarDriverToCsv 网约车驾驶证写入csv
func WriteOnlineCarDriverToCsv(str string) {
jsondata := Resp{}
err := json.Unmarshal([]byte(str), &jsondata)
if err != nil {
fmt.Println(err)
}
nfs, err := os.OpenFile("./data.csv", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
log.Fatalf("can not create file, err is %+v", err)
}
defer nfs.Close()
nfs.Seek(0, io.SeekEnd)
writer := csv.NewWriter(nfs)
writer.Write([]string{"姓名", "从业资格证号", "发证日期"})
var record []string
record = append(record, jsondata.Response["Name"])
record = append(record, jsondata.Response["LicenseNumber"])
record = append(record, jsondata.Response["ReleaseDate"])
writer.Write(record)
writer.Flush() //将内存中的数据刷回到硬盘保存
}//WriteLicensePlateToCsv 车牌写入csv
func WriteLicensePlateToCsv(str string) {
jsondata := Resp{}
err := json.Unmarshal([]byte(str), &jsondata)
if err != nil {
fmt.Println(err)
}
nfs, err := os.OpenFile("./data.csv", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
log.Fatalf("can not create file, err is %+v", err)
}
defer nfs.Close()
nfs.Seek(0, io.SeekEnd)
writer := csv.NewWriter(nfs)
writer.Write([]string{"车牌号", "车牌颜色"})
var record []string
record = append(record, jsondata.Response["Number"])
record = append(record, jsondata.Response["Color"])
writer.Write(record)
writer.Flush() //将内存中的数据刷回到硬盘保存
}//WriteOnlineCarDrivingToCsv 网约车行驶证写入csv
func WriteOnlineCarDrivingToCsv(str string) {
jsondata := RespFrontInfo{}
err := json.Unmarshal([]byte(str), &jsondata)
if err != nil {
fmt.Println(err)
}
nfs, err := os.OpenFile("./data.csv", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
log.Fatalf("can not create file, err is %+v", err)
}
defer nfs.Close()
nfs.Seek(0, io.SeekEnd)
writer := csv.NewWriter(nfs)
writer.Write([]string{"号牌号码", "车辆类型", "所有人", "地址", "使用性质", "品牌型号", "车辆识别代号", "发动机编号", "注册日期", "发证单位"})
var record []string
record = append(record, jsondata.Response.FrontInfo["PlateNo"])
record = append(record, jsondata.Response.FrontInfo["VehicleType"])
record = append(record, jsondata.Response.FrontInfo["Owner"])
record = append(record, jsondata.Response.FrontInfo["Address"])
record = append(record, jsondata.Response.FrontInfo["UseCharacter"])
record = append(record, jsondata.Response.FrontInfo["Model"])
record = append(record, jsondata.Response.FrontInfo["Vin"])
record = append(record, jsondata.Response.FrontInfo["EngineNo"])
record = append(record, jsondata.Response.FrontInfo["RegisterDate"])
record = append(record, jsondata.Response.FrontInfo["Seal"])
writer.Write(record)
writer.Flush() //将内存中的数据刷回到硬盘保存
}
//imageToBase64 img转base64
func imageToBase64(filePath string) (string, error) {
srcByte, err := ioutil.ReadFile(filePath)
if err != nil {
return "", err
}
res := base64.StdEncoding.EncodeToString(srcByte)
return res, nil
}
2.3.2 体验网约车公司信息收集的效果
将网约车驾驶证信息、行驶证信息、车辆信息分批传入,网约车驾驶证识别能力可以识别姓名、证号、起始日期、截止日期、发证日期等;驾驶证识别能力可以对驾驶证的主页和副页所有字段的自动定位与识别,主页识别字段包括证号、姓名、性别、国籍、住址、出生日期、初次领证日期、准驾车型、有效期限、发证单位,副页识别字段包括证号、姓名、档案编号、记录;车牌识别能力可以对中国大陆机动车车牌的自动定位和识别,返回地域编号和车牌号码与车牌颜色信息,最终将输出结果汇总到csv文件中。通过结果和实际图片对比,使用腾讯云智能文字识别的汽车相关识别功能可以准确高效地实现网约车公司信息收集。
1)第一组
识别的结果,以csv方式导出:
2)第二组
识别结果,以csv方式导出:
2.3.3 总结
网约车不同于其他服务模式,在整个行程过程中,驾驶员和乘客长时间共处在一个狭小的封闭空间中,双方直接产生了面对面的近距离接触,安全问题尤其是人身安全是司乘双方最关切的问题。使用腾讯云智能文字识别的汽车相关识别功能可以快速高效地收集网约车司机信息、审核网约车司机身份,有效的保障乘客的安全,加强对驾驶员的审核,提升出行的安全。