一、基本步骤
1.利用python爬虫爬取(也可以手动收集)图片集,分为pos(正相关,要识别的)和neg(负相关,里面没有pos,一般是背景之类的无关图)一般1:3即可,笔主这里准备500:1500.
爬虫随便搜一个就行,忘了从哪个大佬那里copy的了(仅供参考侵删) 里面 地面 是搜索词,替换即可,倒数第三行改一下路径即可。
import time
import requests
import urllib
page = input("请输入要爬取多少页:")
page = int(page) + 1 # 确保其至少是一页,因为 输入值可以是 0
header = {
'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'
}
n = 0 # 图片的前缀 如 0.png
pn = 1 # pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
for m in range(1, page):
url = 'https://image.baidu.com/search/acjson?'
param = {
'tn': 'resultjson_com',
'logid': '8846269338939606587',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': '地面',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '-1',
'z': '',
'ic': '',
'hd': '',
'latest': '',
'copyright': '',
'word': '地面',
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '0',
'istype': '2',
'qc': '',
'nc': '1',
'fr': '',
'expermode': '',
'force': '',
'cg': 'girl',
'pn': pn,
'rn': '30',
'gsm': '1e',
}
page_info = requests.get(url=url, headers=header, params=param)
page_info.encoding = 'utf-8' # 确保解析的格式是utf-8的
page_info = page_info.json() # 转化为json格式在后面可以遍历字典获取其值
info_list = page_info['data'] # 观察发现data中存在 需要用到的url地址
del info_list[-1] # 每一页的图片30张,下标是从 0 开始 29结束 ,那么请求的数据要删除第30个即 29为下标结束点
img_path_list = []
for i in info_list:
img_path_list.append(i['thumbURL'])
for index in range(len(img_path_list)):
print(img_path_list[index]) # 所有的图片的访问地址
time.sleep(1)
urllib.request.urlretrieve(img_path_list[index], "D:/Awangyefu/" + str(n) + '.jpg')
n = n + 1
pn += 29
有改动的话,改名
import os
files = os.listdir("D:/python_work/mongfang_xml/pos/")#原来文件夹的路径
i = 0
for file in files:
original = "D:/python_work/mongfang_xml/pos/" + os.sep + files[i]
#修改后放置图片的路径 F:/ns,也可将 img_ 换成其他标注
new = "D:/python_work/mongfang_xml/pos1/" + os.sep + str(i + 1) + ".jpg"
os.rename(original, new)
i += 1
灰度处理
#处理正样本
import cv2
path = "C:/pos/" #pos文件所在地址
for i in range(1, 27): #pos文件中图片数量
print(path+str(i)+'.jpg')
img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
img5050=cv2.resize(img,(50,50)) #将pos文件中图片压缩为50*50
cv2.imshow("img", img5050)
cv2.waitKey(20)
cv2.imwrite('C:/pos1/'+str(i)+'.jpg', img5050)
#处理负样本
import cv2
path = "C:/neg/"
for i in range(1, 30):
print(path+str(i)+'.jpg')
img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imwrite('C:/neg1/'+str(i)+'.jpg', img)
2.创建正负样本txt,将正样本图片压缩,和将正负样本灰度处理后,在文件夹中生成它们的路径图txt(不知道叫啥)
点击目录,输入cmd进入命令行控制器,输入
dir /b >pos.txt
3.修改正负样本txt,通过python写个程序(3,4合并)或者sublime给txt文件添加路径和正样本添加调整大小。
import os
def create_pos_n_neg():
for file_type in ['pos']: #运行一次之后修改pos为neg
for img in os.listdir(file_type):
if (file_type == 'neg'):
line = file_type + '/' + img + '\n'
with open('neg.txt', 'a') as f:
f.write(line)
elif (file_type == 'pos'):
line = file_type + '/' + img + ' 1 0 0 50 50\n'
with open('pos.txt', 'a') as f:
f.write(line)
if __name__ == '__main__':
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中运行即可
import cv2
def detect():
print("识别项目")
cascade_xpider=cv2.CascadeClassifier("./data/cascade.xml")
cap=cv2.VideoCapture(0)
# cv2.nameWindow("camera")
while True:
ret,frame=cap.read()
# frame=cv2.resize(frame,(320,240))
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
xpiders=cascade_xpider.detectMultiScale(gray, 1.1, 20, cv2.CASCADE_SCALE_IMAGE, (100, 100),
(150, 150))
for (x,y,w,h) in xpiders:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("camera",frame)
if cv2.waitKey(10)& 0xFF == ord("q"):
break
cap.release()
cv2.desstoryAllWindows()
detect()
效果