Bài viết chuyên sâu

Vài trải nghiệm về công việc tìm class để index ảnh

Vài trải nghiệm về công việc tìm class để index ảnh

by Admin Dathoc -
Number of replies: 0

#koolj_dataengineering

#resnet

#imagenet

#yolo

#imageannotation


Vài trải nghiệm về công việc tìm class để index ảnh, cũng như tag annotation phần ảnh đó....để tập train ra được kết quả class mình mong muốn trong model.


Dạo này mình thấy nhiều bạn làm phân loại ảnh (sau khi đã chán phân loại text và những con số), và một câu hỏi rất đau đầu trong bạn ý mà mình thấy...90% những bài học, clip học ra rả online đang KHÔNG DẠY các bạn sâu hơn là:

- Tôi muốn tìm ảnh khuôn mặt châu á

- Tôi muốn có class "ống khói", "hoa huệ" ... để nhận diện

- Tôi muốn annotation class "vết hàn cơ khí" "vết thô khi gia công sp nhựa" để phân loại sp

Vậy tôi phải làm thế nào??

-------------------------------

Theo trải nghiệm mình làm với yolo, resnet, coco, imagenet mình thấy như sau:


A. Nỗi Khổ:

- 99% bài viết trên mạng, chính xác là như vậy. Các ông toàn lấy những image có sẵn, rồi abc def... toàn thấy xào xáo lại công việc ...SAU KHI ĐÃ CÓ ẢNH VÀ XÁC ĐỊNH OBJECT cần làm class trên ảnh. Vậy thì còn cái gì...để làm nữa. Theo mình hiểu như thế. Vì mọi thứ (sau việc XÁC ĐỊNH OBJECT trên ảnh) nó đã là chuỗi luồng tự động rồi. Bạn có thể lấy bất cứ cái git nào trainning ảnh để làm các việc còn lại ra model. Chỉ là... bạn chọn đúng cách làm tối ưu, nhanh, không lỗi là ok.

- 90% các tò te teen teen... chỉ làm đc những cái (ở trên) còn khi đi sâu hỏi.. muốn tag obj trong 100 ảnh, hoặc anno class mới thì... rất NGẠI. Tức là rất ngại cái việc mà... internet nó KHÔNG NÓI. Còn làm RẤT TỐT cái việc mà internet Ở ĐÂU CŨNG NÓI.

.

.

B. Chút lý thuyết

- Tại sao Yolo, đơn giản là cơ chế training và detect khác hẳn các logic truyên thống. Tuy là nó không tương hợp với các thiết bị edge computing, xong nó đủ nhanh để làm các bài toán đưa về máy tính intel, xeon, card nvidia rtx xử lý nhanh tối ưu nhất bây giờ theo ý mình

- Tại sao Coco, theo mình biết Yolo 3-4 đang lấy cơ sở Coco để triển khai theo logic của họ. Bạn dùng edge computing và hơi đặc thù thì ko nên yolo, nên coco, restnet, và dùng các logic của rcnn. 

- Tại sao Resnet, từ a Keras tinh gọn hơn, và phát triển từ ImageNet

- Tại sao Imagenet, đây là model đầu tiên, và tương đối chuẩn cũng như ổn định về nhận diện ảnh (theo mình biết). Những thằng còn lại sau này resnet, yolo... đều học từ nó, phát triển tiêm từ nó mà ra.


Nếu nói chưa đúng chưa chuẩn nhờ fans khác bổ sung.

.

.

C. Giải pháp:

1. Bạn cần phân loại và tìm kiếm những class thông thường:

- Thông thường ở đây nghĩa là những cái đã chung chung với Thế Giới quá rồi... bạn Yolo từ Coco lẫn Resnet bạn ý đã chọn ra 80 class rất chuyên biệt để giúp bạn detect ra những cái đối tượng chuyên biệt nhất. Bạn chưa rõ chưa hiểu class nào tên là gì của Yolo bạn search Google 80 class index yolov5, lấy 2 kq đầu tiên sẽ cho bạn biết số index và tên class đó là gì để bạn tiện khảo cứu.

- Ví dụ tôi train yolo về ô tô tôi thường nhắm mắt và lấy tất cả các loại của ảnh trước, từ --class 1 2 3 5 6 7, đó tương tự là: “bicycle”, “car”, “motorbike”,  “bus”, “train”, “truck”... sau đó tôi lọc tiếp các mẫu xe.

- Với mẫu xe: tôi phải nhìn bằng MẮT, rồi lấy chính cái label sinh ra từ yolo trên để tag bằng tay lại: vị trí nào class đó, obj đó là xe: Toyota, vị trí nào class đó là Mẹc, vị trí nào class đó là Maxxford


Kết luận là: chính xác là tôi cần tool yolo để tag và label sẵn rồi lấy ra vị trí của object đó, sau đó mới tạo riêng phân loại tiếp của mình. Vậy cái việc tạo riêng các ảnh, label nó thêm, thì cần coding để tạo riêng ảnh ra (đã nêu trong clip trước). Bạn cũng nên làm như vậy

.

.

2. Bạn cần phân loại và tìm kiếm những class trên ảnh hiếm hiếm chút

- Đúng rồi tức là khi bạn làm yolo, nó chỉ có 80 class thôi. Thế vậy những cái mà nó không có, xong vẫn có model khác có gì quy trình là:

- Lấy model đó về, chạy model đó để tìm vị trí những cái mình cần, và nhận diện trên data của mình. Cụ thể: bạn muốn tìm trong data của mình có "ống khói" hay "hoa huệ" nên dùng ImageNet đi. Vì nó có 1000 class, vậy rất có thể nó sẽ giúp bạn anno các object bạn đang thiếu ở yolo

- Sau đó bạn lại cần phải code từ yolo để lấy theo class của imagenet (yolov5 dùng resnet101, để transfer class) mà các fan đều biết resnet lại là bản nâng cấp từ imagenet


Vậy kết luận là: những class mà nó hạn chế trong training model của yolo, bận bạn cần đọc code của yolo để mở rộng hơn các class từ resnet101, nhiều hơn là resnet152. Và hãy code để nó position, để nó annotation vào class bạn cần trong đống data của bạn. Rồi sau đó bạn mới cần tới tay chân để tinh chỉnh

.

.

3. Bạn cần phân loại và tìm kiếm những class chỉ của riêng bạn

- Tức là, ví dụ "ảnh mối hàn" từ nhà xưởng của bạn bị lỗi hoặc đúng chuẩn, ví dụ ảnh vật liệu nhựa sau khi máy tự động đóng khuôn còn lỗi. Đơn giản quy trình là:

- Bạn cùng cvat, tra Google cvat git, chỉ 5 phút cài trên linux là xong

- Tiếp tới nếu bạn đang có 3k-4k ảnh, ko hề gì. Bạn tay chân cvat hộ mình khoảng 50 ảnh. Rồi bạn train luôn lên yolov5 đi, cỡ 20-30 epoche cho 30 ảnh bạn đã tag/annotation

- Sau đó bạn lấy chính yolov5 với model vừa train detect 3k-4k ảnh còn lại của bạn, đảm bảo yolo sẽ detect nhanh gọn những object của riêng bạn.

- Bạn làm tương tự với các model khó khác.


Tóm lại là: riêng class mới, thì cần logic thuật toán phân vùng đảm nhanh hơn fast rcnn là yolo thì mới trị đc.

.

.

Tóm lại là,

Bạn teen teen, mới học, các bạn nên làm những cái sau, trước khi học những cái cao xa hơn, trước khi đòi lương 10 tr, 20 tr, 30 tr...:

- Động cái lỗi là hỏi nhoặng lên. Mà hỏi theo kiểu không đầu không cuối. Không có dữ liệu. Chỉ là cái ảnh và hỏi: em bị lỗi gì. Bố anh cũng ko trả lời đc.

- Tìm class và train ảnh cũng cần cải tiến, không chỉ có tay chân. Nên dùng những class đang có để tạo theo class mới của mình qua coding.

- Ít nhất chịu khó đọc hiểu các coding từ git các bạn lấy về chút đi. Đừng cứ abc lấy git về là nhắm mắt chạy. Chạy xong tới cái mở rộng chút là ...chỉ là tìm hiểu ...một vài dòng code của các git thôi...cũng ko đọc để hiểu nó viết cái gì.

- Ít nhất cũng chịu khó đọc học tiếng Anh đi. Đơn giản để hiểu cái lỗi nó đang bị là Ý NGHĨA gì, rồi tự fix

- Ít nhất cũng học debug đi. Tức là bạn hiểu biến bạn lưu và biến bạn xử lý nó chạy thế nào từ class/hàm này sang hàm/class khác

- Đọc xong 4 cái trên, làm xong 4 gạch đầu dòng trên thì đảm bảo bạn sẽ coding ra đc tag cái gì, annotation cái gì và ra label cái bạn muốn.


Gluk!