当前位置:   article > 正文

Opencv造出属于自己的xml训练器_opencv训练xml模型

opencv训练xml模型

一、基本步骤

1.利用python爬虫爬取(也可以手动收集)图片集,分为pos(正相关,要识别的)和neg(负相关,里面没有pos,一般是背景之类的无关图)一般1:3即可,笔主这里准备500:1500.

爬虫随便搜一个就行,忘了从哪个大佬那里copy的了(仅供参考侵删) 里面 地面 是搜索词,替换即可,倒数第三行改一下路径即可。

  1. import time
  2. import requests
  3. import urllib
  4. page = input("请输入要爬取多少页:")
  5. page = int(page) + 1 # 确保其至少是一页,因为 输入值可以是 0
  6. header = {
  7. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
  8. }
  9. n = 0 # 图片的前缀 如 0.png
  10. pn = 1 # pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
  11. for m in range(1, page):
  12. url = 'https://image.baidu.com/search/acjson?'
  13. param = {
  14. 'tn': 'resultjson_com',
  15. 'logid': '8846269338939606587',
  16. 'ipn': 'rj',
  17. 'ct': '201326592',
  18. 'is': '',
  19. 'fp': 'result',
  20. 'queryWord': '地面',
  21. 'cl': '2',
  22. 'lm': '-1',
  23. 'ie': 'utf-8',
  24. 'oe': 'utf-8',
  25. 'adpicid': '',
  26. 'st': '-1',
  27. 'z': '',
  28. 'ic': '',
  29. 'hd': '',
  30. 'latest': '',
  31. 'copyright': '',
  32. 'word': '地面',
  33. 's': '',
  34. 'se': '',
  35. 'tab': '',
  36. 'width': '',
  37. 'height': '',
  38. 'face': '0',
  39. 'istype': '2',
  40. 'qc': '',
  41. 'nc': '1',
  42. 'fr': '',
  43. 'expermode': '',
  44. 'force': '',
  45. 'cg': 'girl',
  46. 'pn': pn,
  47. 'rn': '30',
  48. 'gsm': '1e',
  49. }
  50. page_info = requests.get(url=url, headers=header, params=param)
  51. page_info.encoding = 'utf-8' # 确保解析的格式是utf-8的
  52. page_info = page_info.json() # 转化为json格式在后面可以遍历字典获取其值
  53. info_list = page_info['data'] # 观察发现data中存在 需要用到的url地址
  54. del info_list[-1] # 每一页的图片30张,下标是从 0 开始 29结束 ,那么请求的数据要删除第30个即 29为下标结束点
  55. img_path_list = []
  56. for i in info_list:
  57. img_path_list.append(i['thumbURL'])
  58. for index in range(len(img_path_list)):
  59. print(img_path_list[index]) # 所有的图片的访问地址
  60. time.sleep(1)
  61. urllib.request.urlretrieve(img_path_list[index], "D:/Awangyefu/" + str(n) + '.jpg')
  62. n = n + 1
  63. pn += 29

有改动的话,改名

  1. import os
  2. files = os.listdir("D:/python_work/mongfang_xml/pos/")#原来文件夹的路径
  3. i = 0
  4. for file in files:
  5. original = "D:/python_work/mongfang_xml/pos/" + os.sep + files[i]
  6. #修改后放置图片的路径 F:/ns,也可将 img_ 换成其他标注
  7. new = "D:/python_work/mongfang_xml/pos1/" + os.sep + str(i + 1) + ".jpg"
  8. os.rename(original, new)
  9. i += 1

灰度处理

  1. #处理正样本
  2. import cv2
  3. path = "C:/pos/" #pos文件所在地址
  4. for i in range(1, 27): #pos文件中图片数量
  5. print(path+str(i)+'.jpg')
  6. img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
  7. img5050=cv2.resize(img,(50,50)) #将pos文件中图片压缩为50*50
  8. cv2.imshow("img", img5050)
  9. cv2.waitKey(20)
  10. cv2.imwrite('C:/pos1/'+str(i)+'.jpg', img5050)
  11. #处理负样本
  12. import cv2
  13. path = "C:/neg/"
  14. for i in range(1, 30):
  15. print(path+str(i)+'.jpg')
  16. img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
  17. cv2.imwrite('C:/neg1/'+str(i)+'.jpg', img)

2.创建正负样本txt,将正样本图片压缩,和将正负样本灰度处理后,在文件夹中生成它们的路径图txt(不知道叫啥)

点击目录,输入cmd进入命令行控制器,输入

dir /b >pos.txt

3.修改正负样本txt,通过python写个程序(3,4合并)或者sublime给txt文件添加路径和正样本添加调整大小。

  1. import os
  2. def create_pos_n_neg():
  3. for file_type in ['pos']: #运行一次之后修改pos为neg
  4. for img in os.listdir(file_type):
  5. if (file_type == 'neg'):
  6. line = file_type + '/' + img + '\n'
  7. with open('neg.txt', 'a') as f:
  8. f.write(line)
  9. elif (file_type == 'pos'):
  10. line = file_type + '/' + img + ' 1 0 0 50 50\n'
  11. with open('pos.txt', 'a') as f:
  12. f.write(line)
  13. if __name__ == '__main__':
  14. create_pos_n_neg()

4.创建vec文件

点击根目录,输入构造

opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -w 50 -h 50

注意:如果报错如读取不到图片pos\pos.txt,把pos.txt文件中最后一行带txt的删掉即可 

如果警告无法启动此程序,因为计算机丢失opencv_..balabala,就搜这个,添加到环境配置PATH中即可。

 5.文件夹中创建data文件夹,点击根目录,输入构造

opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 500 -numNeg 1500 -numStages 15 -featureType LBP -w 50 -h 50 -minHitRate 0.9999 -maxFalseAlarmRate 0.5

 6.得到xml文件

python中运行即可

  1. import cv2
  2. def detect():
  3. print("识别项目")
  4. cascade_xpider=cv2.CascadeClassifier("./data/cascade.xml")
  5. cap=cv2.VideoCapture(0)
  6. # cv2.nameWindow("camera")
  7. while True:
  8. ret,frame=cap.read()
  9. # frame=cv2.resize(frame,(320,240))
  10. gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  11. xpiders=cascade_xpider.detectMultiScale(gray, 1.1, 20, cv2.CASCADE_SCALE_IMAGE, (100, 100),
  12. (150, 150))
  13. for (x,y,w,h) in xpiders:
  14. cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
  15. cv2.imshow("camera",frame)
  16. if cv2.waitKey(10)& 0xFF == ord("q"):
  17. break
  18. cap.release()
  19. cv2.desstoryAllWindows()
  20. detect()

效果

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号