改进Face/Detect

##改进Face/Detect

现在Face/Detect和Face/Verify将支持将用户提交的结果持久化。我们先考虑下Face/Detect现在的变化,原先我们的流程是:从微信客户端获得mediaID,通过这个mediaID从微信服务器下载图片,然后将这个图片提交给牛津,以获得FaceID

Created with Raphaël 2.2.0 开始 get mediaid from weixinclient download img from weixin server post img to projectoxford get faceid return faceid 结束

现在我们需要考虑的更周到了:当从微信客户端得到mediaID,我们需要查看下本地文件夹中是否有匹配的文件,在提交给牛津之前我们也需要从Mango数据库中查询是否有匹配的上次的提交结果

Created with Raphaël 2.2.0 开始 get mediaid from weixinclient mongodb file collection exists mediaid return imgid mongodb face collection exists filename return faceid 结束 post img to projectoxford get faceid create doc(faceid) insert doc to mongodb download img from weixin server create doc(mediaid,filenmae) insert doc to mongodb yes no yes no

我们先改进微信服务的代码,使得只有Mongo没有存储mediaID和对应的文件再从微信的服务器去下载图片

public async Task<string> Get(string mediaid)
{
    var mongo = new MongoDBHelper("weixinImgFile");

    //查询mongo中是否存储了mediaid对应的照片文件
    var doc = await mongo.SelectOneAsync(x => x["mediaid"] == mediaid);
    if (doc != null)
    {
        return doc["filename"].ToString();
    }

    //http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
    var queryString = HttpUtility.ParseQueryString(string.Empty);
    queryString["access_token"] = await Get();
    queryString["media_id"] = mediaid;

    var uri = "http://file.api.weixin.qq.com/cgi-bin/media/get?" + queryString;

    HttpResponseMessage response;
    response = await client.GetAsync(uri);

    var msg = await response.Content.ReadAsStreamAsync();
    var fileName = response.Content.Headers.ContentDisposition.FileName.Replace("\"", "");

    var helper = new ProjecToxfordClientHelper();

    var content = await FileHelper.ReadAsync(msg);

    FileHelper.SaveFile(content, fileName);

    await mongo.InsertAsync(Newtonsoft.Json.JsonConvert.SerializeObject(
        new {
            Mediaid = mediaid,
            FileName = fileName
        }
        ));

    return fileName;
}

然后我们来改进FaceController的DetectAPI,使得先在Mongo中查询对应照片的分析结果,当没有之前查询的结果,再去牛津进行分析。

[HttpGet]
[Route("face/detect/{weixnmediaid}")]
public async Task<HttpResponseMessage> Detect(string weixnmediaid)
{
    var key = "detect";

    //得到从微信服务器下载的文件名
    var fileName = await new WeixinController().Get(weixnmediaid);

    var mongo = new MongoDBHelper<DetectResultModels>("facedetect");

    //照片之前有没有下载过
    var docArr = await mongo.SelectMoreAsync(x => x.FileName == fileName);
    if (docArr.Count > 0)
    {
        var resultJson = docArr.Select(
            doc => new
            {
                faceId = doc.faceId,
                filename = doc.FileName,
                age = doc.Age,
                gender = doc.Gender,
                smile = doc.Smile
            }
            ).ToJson();

        return client.CreateHttpResponseMessage(
            Request,
            new Models.ProjecToxfordResponseModels(resultJson, HttpStatusCode.OK));
    }
    //如果Mongo中没有该照片对应的Face信息
    var content = await FileHelper.ReadAsync(fileName);

    if (content != null)
    {
        var result = await client.PostAsync(key,
            content,
            new Dictionary<string, string> {
            {"returnFaceId","true"},
            {"returnFaceLandmarks","flase"},
            {"returnFaceAttributes","age,gender,smile"}
            }
            );

        if (result.StatusCode == HttpStatusCode.OK)
        {
            var tmpJArr = Newtonsoft.Json.Linq.JArray.Parse(result.Message);
            //将牛津结果写入数据库
            foreach (var tmp in tmpJArr)
            {
                await mongo.InsertAsync(new DetectResultModels()
                {
                    FileName = fileName,
                    faceId = (string)tmp["faceId"],
                    Age = (double)tmp["faceAttributes"]["age"],
                    Gender = (string)tmp["faceAttributes"]["gender"],
                    Smile = tmp["faceAttributes"]["smile"] != null ? (double)tmp["faceAttributes"]["smile"] : 0
                });
            }
            var resultJson = tmpJArr.Select(x => new
              {
                  faceId = x["faceId"],
                  age = (double)x["faceAttributes"]["age"],
                  gender = (string)x["faceAttributes"]["gender"],
                  smile = x["faceAttributes"]["smile"] != null ? (double)x["faceAttributes"]["smile"] : 0
              }).ToJson();

            return client.CreateHttpResponseMessage(
                Request,
                new Models.ProjecToxfordResponseModels(resultJson, HttpStatusCode.OK));
        }
    }
    throw new HttpResponseException(HttpStatusCode.BadRequest);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `/detect` 是一个 URL 路径,它是 Flask 应用程序中的一个端点。在 Flask 中,可以使用装饰器`@app.route('/path')`来定义路由,其中 `/path` 是路径部分,也就是这个路由处理的请求的 URL。当浏览器或客户端向服务器发送请求时,请求 URL 的路径部分将与 Flask 应用程序中定义的路由进行匹配,从而决定哪个函数将处理这个请求。在这种情况下,`/detect` 表示这个路由将处理发送到 `/detect` 路径的 POST 请求。 ### 回答2: 在 Flask 框架中,`@app.route('/detect', methods=['POST'])` 语句是定义一个路由的装饰器,用来接受 POST 请求,并将其发送到指定的 URL 地址。其中 `/detect` 是指该路由的路径部分,可以用来指定访问该路由的具体 URL 地址。这个路径通常用来表示某个具体的功能或页面。在这个例子中,`/detect` 可能表示的是一个用于执行某种检测功能的 API 接口。 根据 Flask 的路由匹配规则,当客户端向服务器发送一个 POST 请求,且 URL 地址匹配 `/detect` 时,Flask 将会调用与该 URL 路径对应的视图函数来处理该请求。视图函数可以执行一些逻辑操作,例如接收请求的数据、对数据进行处理,并最终向客户端返回结果。 这里的 `methods=['POST']` 表示该路由只允许接收 POST 请求,限制了访问方式。如果客户端使用 GET 或其他方法访问 `/detect` 路径,服务器将会拒绝该请求。 使用 `@app.route('/detect', methods=['POST'])` 定义路由装饰器可以使开发者方便地为特定 URL 地址绑定相应的视图函数,实现对特定请求的处理逻辑。 ### 回答3: 在这个情况下,'/detect'是一个路由地址,它指明了一个特定的URL路径,用于处理HTTP POST请求。在Flask框架中,我们可以使用@app.route装饰器来定义路由地址及其对应的处理函数(视图函数)。在这个例子中,'/detect'表示该视图函数将处理来自客户端的针对该URL路径的POST请求。 当客户端发起一个发送到'/detect'路径的POST请求时,Flask框架将会调用被装饰器装饰的处理函数来执行相应的操作。这个处理函数可以根据需要执行一些特定的任务,例如处理表单数据、查询数据库、调用其他函数等等。 总之,'/detect'在这里可理解为一个可以通过POST请求来访问的特定路径,而@app.route装饰器则用于将该路径与对应的处理函数绑定在一起。这样,当有POST请求发送到/detect路径时,Flask框架就会自动调用相应的处理函数来处理该请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值