关于在一张图片中查找目标物体的方法 —— EasyDL和opencv结合使用


1. 概括

  EasyDL是百度AI中一个自动化的深度学习模型训练和服务平台

  使用EasyDL训练得到模型,在python下调用对应模型的api,可以实现对图片上传至云端进行识别,并接收返回的识别结果,再使用opencv通过返回的结果在图片上进行绘制,框出目标物体,还可以得到其中心坐标值
  进一步,其提供了多种部署方式,后面还可以将模型部署到私有云或者本地,可以更方便的拓展使用


2. 使用EasyDL训练模型

使用EasyDL的链接,使用之前需要先注册或登录百度账号,使用百度网盘账号登录也可以,都需要实名才能使用

 点击开始训练,使用经典版,这里以物体检测为例

 先进入我的模型,然后创建模型,填写相关信息即可,下一步,然后就可以可到新的模型已经创建

 需要新创建一个数据集,选择下面的选项之后上传照片,要求图片命名不要有中文名,并且图片的场景最好和后面要识别的场景一样,多个角度,多个光线,25+张照片就可以,不过最好有40+,上传完成之后,点击确认并返回

 可以看到数据集的状态还在处理中,等待处理完成即可;然后点击后面的标注,对需要训练的图片进行标注需要识别的目标物体;先添加标签,不能使用中文名,然后将目标物体框起来,再点击对应的便签即可
 通过多个标签可以做到识别多个目标的目的,然后按下面的保存;接着需要手动点上方图片进行选择下一张需要标注的图片,以此方法对所有图片进行标注即可,完成后回到我的模型页面

 回到我的模型页面,选择下面的训练,选择需要训练的模型,这里以公有云部署为例,添加数据集,开始训练之后,可以在我的模型页面看到训练的状态,还可以设置短信提醒,40张照片的训练预计30分钟左右

 训练完成之后,可以对模型进行检验,然后进行申请上线,这个过程可能也有点久,快的话当天可以完成,最慢就是第二天,可能会有百度云的客服打电话过来询问(类似于推广告吧),最好接一下,说明你是在学习,测试一下,准备做项目,如果她继续问更深入信息,你就说不方便透露,如果有需要再和你们联系就好了


3.在python调用EasyDL的api

 审核结束,然后在我的模型页面,点击服务详情,就可以看到模型的url(后面会用到),然后点击立即使用

 在EasyDL经典版控制台创建应用,填写相关信息即可,然后在应用详情页获取AK和SK

 接着需要获取access_token,使用到上文的AK和SK,及应用详情里的API Key和Secret Key,复制以下链接,将AK和SK修改成自己的(注意是没有【】的),然后用浏览器打开该链接,即可得到access_token,获取access_token这部分也可以在代码中实现

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】

 可查阅使用文档 经典版物体检测API调用文档

 以下是官方提供的python示例,需要注意的是python3中使用的不是urllib2

# encoding:utf-8
import urllib2

'''
easydl物体检测
'''

request_url = "【接口地址】"

params = "{\"image\":\"sfasq35sadvsvqwr5q...\"}"

access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
request = urllib2.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/json')
response = urllib2.urlopen(request)
content = response.read()
if content:
    print content


 按照服务API的说明,针对V1版(YOLOV3)的服务,编写调用代码(Python3)。需要注意的是与其他图像识别服务不同的是定制化图像识别服务以json方式请求。

 下面是我的代码,仅供参考,如有错误,还望指正!


import time
import base64
import urllib3,json
import cv2


test_img_path = "E:/study/python/test4.jpg"
save_img_path = "E:/study/python/resule.jpg"

#access_token = "24.ee098060f9d444677770e289b6d8780b.*****************" #自己的access_token
#module_url = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/d********' #当审核通过后,可以在我的模型页面,进入服务详情可以查看到

def img_show(name,img_path):
    img = cv2.imread(img_path)
    print('shape:',img.shape)
    img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)
    cv2.imshow(name ,img)
    cv2.waitKey(0)

def draw_result_img(originfilename,results,resultfilename):
    from PIL import Image, ImageDraw,ImageFont
    image_origin = Image.open(originfilename)
    draw = ImageDraw.Draw(image_origin)
    setFont = ImageFont.truetype('C:/windows/fonts/simhei.ttf', 66)
    for result in results:
        location = result['location']
        top_x,top_y = location['left'],location['top']
        button_x,button_y = (location['left']+location['width']),(location['top']+location['height'])
        center_x,cenrer_y = int(top_x+(location['width']/2)),int(top_y+(location['height']/2))
        print('目标物体中心坐标:',center_x,cenrer_y)
        draw.rectangle((top_x,top_y,button_x,button_y),outline = "red")
        draw.ellipse((center_x-10,cenrer_y-10, center_x+10,cenrer_y+10), fill = (255, 0, 0))
        draw.text((top_x,top_y), result['name']+', Score:'+str(round(result['score'],3)),"yellow",font=setFont)
    image_origin.save(resultfilename, "JPEG")
    img_show('result',save_img_path)

def get_test_img():
    img_show('test_img',test_img_path)
    with open(test_img_path, 'rb') as f:
        img = base64.b64encode(f.read())
        #img参数进行一下str转换    
        params={'image':''+str(img,'utf-8')+''}
        #对参数params数据进行json处理
        encoded_data = json.dumps(params).encode('utf-8')
        return encoded_data

def get_result():
    encoded_data = get_test_img()
    url = "{}?access_token={}".format(module_url,access_token)
    begin = time.perf_counter()
    request = urllib3.PoolManager().request('POST', 
                          url,
                          body = encoded_data,
                          headers={'Content-Type':'application/json'})
    #对返回的byte字节进行处理。Python3输出位串,而不是可读的字符串,需要进行转换
    content = str(request.data,'utf-8')
    end = time.perf_counter()
    if content:
        data = json.loads(content)
        utime = end - begin
        return data,utime
    else:
        return False


data,utime = get_result()
results = data['results']
print(results)
print('处理时长:'+'%.2f'%(utime)+'秒')
draw_result_img(test_img_path,results,save_img_path)



发布了17 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fengge2018/article/details/105048268
今日推荐